Compare commits
30 Commits
Author | SHA1 | Date | |
---|---|---|---|
d43cc35eda | |||
3ccfdf1c93 | |||
b703ed1a0c | |||
25de43ac90 | |||
1b4835eb4d | |||
be1ce45060 | |||
0f6cd70920 | |||
754310f488 | |||
c2d5468556 | |||
980afdc10a | |||
791128c0fd | |||
639430383f | |||
8e98c5c0ab | |||
539884cd5d | |||
8ce4adb1b1 | |||
b787a8002e | |||
ba9c0e6166 | |||
25b8840f2a | |||
045ba7e67e | |||
18c85d3a4f | |||
f6c45045f0 | |||
f95a951b26 | |||
e1ed228b8b | |||
0b3495a081 | |||
53c25b2e9a | |||
fcf8c4fd01 | |||
e91cb1a3b7 | |||
1f6c80c326 | |||
f06ff4d2c2 | |||
ef281889ab |
@ -2,7 +2,7 @@
|
||||
|
||||
namespace Gregwar\CaptchaBundle\Controller;
|
||||
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
|
||||
@ -11,7 +11,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
*
|
||||
* @author Jeremy Livingston <jeremy.j.livingston@gmail.com>
|
||||
*/
|
||||
class CaptchaController extends Controller
|
||||
class CaptchaController extends AbstractController
|
||||
{
|
||||
/**
|
||||
* Action that is used to generate the captcha, save its code, and stream the image
|
||||
|
@ -14,8 +14,14 @@ class Configuration implements ConfigurationInterface
|
||||
*/
|
||||
public function getConfigTreeBuilder()
|
||||
{
|
||||
$treeBuilder = new TreeBuilder();
|
||||
$rootNode = $treeBuilder->root('gregwar_captcha');
|
||||
$treeBuilder = new TreeBuilder('gregwar_captcha');
|
||||
|
||||
if (method_exists($treeBuilder, 'getRootNode')) {
|
||||
$rootNode = $treeBuilder->getRootNode();
|
||||
} else {
|
||||
// BC for symfony/config <= 4.1
|
||||
$rootNode = $treeBuilder->root('gregwar_captcha');
|
||||
}
|
||||
|
||||
$rootNode
|
||||
->addDefaultsIfNotSet()
|
||||
@ -33,7 +39,7 @@ class Configuration implements ConfigurationInterface
|
||||
->scalarNode('web_path')->defaultValue('%kernel.root_dir%/../web')->end()
|
||||
->scalarNode('gc_freq')->defaultValue(100)->end()
|
||||
->scalarNode('expiration')->defaultValue(60)->end()
|
||||
->scalarNode('quality')->defaultValue(30)->end()
|
||||
->scalarNode('quality')->defaultValue(50)->end()
|
||||
->scalarNode('invalid_message')->defaultValue('Bad code value')->end()
|
||||
->scalarNode('bypass_code')->defaultValue(null)->end()
|
||||
->scalarNode('whitelist_key')->defaultValue('captcha_whitelist_key')->end()
|
||||
@ -47,6 +53,7 @@ class Configuration implements ConfigurationInterface
|
||||
->arrayNode('background_images')->prototype('scalar')->end()->end()
|
||||
->scalarNode('disabled')->defaultValue(false)->end()
|
||||
->scalarNode('ignore_all_effects')->defaultValue(false)->end()
|
||||
->scalarNode('session_key')->defaultValue('captcha')->end()
|
||||
->end()
|
||||
;
|
||||
|
||||
|
@ -34,6 +34,6 @@ class GregwarCaptchaExtension extends Extension
|
||||
$container->setParameter('gregwar_captcha.config.whitelist_key', $config['whitelist_key']);
|
||||
|
||||
$resources = $container->getParameter('twig.form.resources');
|
||||
$container->setParameter('twig.form.resources', array_merge(array('GregwarCaptchaBundle::captcha.html.twig'), $resources));
|
||||
$container->setParameter('twig.form.resources', array_merge(array('@GregwarCaptcha/captcha.html.twig'), $resources));
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,13 @@
|
||||
Gregwar's CaptchaBundle
|
||||
=====================
|
||||
|
||||
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=YUXRLWHQSWS6L)
|
||||
|
||||
The `GregwarCaptchaBundle` adds support for a captcha form type for the
|
||||
Symfony form component.
|
||||
|
||||
It uses [gregwar/captcha](https://github.com/Gregwar/Captcha) as captcha generator, which is a separate standalone library that can be used for none-symfony projects.
|
||||
|
||||
Compatibility with Symfony
|
||||
==========================
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
gregwar_captcha.generate_captcha:
|
||||
pattern: /generate-captcha/{key}
|
||||
defaults: { _controller: GregwarCaptchaBundle:Captcha:generateCaptcha }
|
||||
path: /generate-captcha/{key}
|
||||
defaults: { _controller: Gregwar\CaptchaBundle\Controller\CaptchaController::generateCaptchaAction }
|
||||
|
@ -7,17 +7,19 @@ parameters:
|
||||
|
||||
services:
|
||||
captcha.type:
|
||||
class: %gregwar_captcha.captcha_type.class%
|
||||
class: '%gregwar_captcha.captcha_type.class%'
|
||||
public: true
|
||||
arguments:
|
||||
- '@session'
|
||||
- '@gregwar_captcha.generator'
|
||||
- '@translator'
|
||||
- %gregwar_captcha.config%
|
||||
- '%gregwar_captcha.config%'
|
||||
tags:
|
||||
- { name: form.type, alias: captcha }
|
||||
|
||||
gregwar_captcha.generator:
|
||||
class: %gregwar_captcha.captcha_generator.class%
|
||||
class: '%gregwar_captcha.captcha_generator.class%'
|
||||
public: true
|
||||
arguments:
|
||||
- '@router'
|
||||
- '@gregwar_captcha.captcha_builder'
|
||||
@ -25,15 +27,18 @@ services:
|
||||
- '@gregwar_captcha.image_file_handler'
|
||||
|
||||
gregwar_captcha.image_file_handler:
|
||||
class: %gregwar_captcha.image_file_handler.class%
|
||||
class: '%gregwar_captcha.image_file_handler.class%'
|
||||
public: true
|
||||
arguments:
|
||||
- %gregwar_captcha.config.image_folder%
|
||||
- %gregwar_captcha.config.web_path%
|
||||
- %gregwar_captcha.config.gc_freq%
|
||||
- %gregwar_captcha.config.expiration%
|
||||
- '%gregwar_captcha.config.image_folder%'
|
||||
- '%gregwar_captcha.config.web_path%'
|
||||
- '%gregwar_captcha.config.gc_freq%'
|
||||
- '%gregwar_captcha.config.expiration%'
|
||||
|
||||
gregwar_captcha.captcha_builder:
|
||||
class: %gregwar_captcha.captcha_builder.class%
|
||||
class: '%gregwar_captcha.captcha_builder.class%'
|
||||
public: true
|
||||
|
||||
gregwar_captcha.phrase_builder:
|
||||
class: %gregwar_captcha.phrase_builder.class%
|
||||
class: '%gregwar_captcha.phrase_builder.class%'
|
||||
public: true
|
||||
|
@ -2,8 +2,8 @@
|
||||
{% if is_human %}
|
||||
-
|
||||
{% else %}
|
||||
{% spaceless %}
|
||||
<img id="{{ image_id }}" src="{{ captcha_code }}" alt="" title="captcha" width="{{ captcha_width }}" height="{{ captcha_height }}" />
|
||||
{% apply spaceless %}
|
||||
<img class="captcha_image" id="{{ image_id }}" src="{{ captcha_code }}" alt="" title="captcha" width="{{ captcha_width }}" height="{{ captcha_height }}" />
|
||||
{% if reload %}
|
||||
<script type="text/javascript">
|
||||
function reload_{{ image_id }}() {
|
||||
@ -14,6 +14,6 @@
|
||||
<a class="captcha_reload" href="javascript:reload_{{ image_id }}();">{{ 'Renew'|trans({}, 'gregwar_captcha') }}</a>
|
||||
{% endif %}
|
||||
{{ form_widget(form) }}
|
||||
{% endspaceless %}
|
||||
{% endapply %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
@ -22,6 +22,8 @@ use Gregwar\CaptchaBundle\Generator\CaptchaGenerator;
|
||||
*/
|
||||
class CaptchaType extends AbstractType
|
||||
{
|
||||
const SESSION_KEY_PREFIX = '_captcha_';
|
||||
|
||||
/**
|
||||
* @var SessionInterface
|
||||
*/
|
||||
@ -53,7 +55,7 @@ class CaptchaType extends AbstractType
|
||||
{
|
||||
$this->session = $session;
|
||||
$this->generator = $generator;
|
||||
$this->translator = $translator;
|
||||
$this->translator = $translator;
|
||||
$this->options = $options;
|
||||
}
|
||||
|
||||
@ -65,10 +67,11 @@ class CaptchaType extends AbstractType
|
||||
$validator = new CaptchaValidator(
|
||||
$this->translator,
|
||||
$this->session,
|
||||
sprintf('gcb_%s', $builder->getForm()->getName()),
|
||||
sprintf('%s%s', self::SESSION_KEY_PREFIX, $options['session_key']),
|
||||
$options['invalid_message'],
|
||||
$options['bypass_code'],
|
||||
$options['humanity']
|
||||
$options['humanity'],
|
||||
$options['request']
|
||||
);
|
||||
$event = \Symfony\Component\HttpKernel\Kernel::VERSION >= 2.3 ? FormEvents::POST_SUBMIT : FormEvents::POST_BIND;
|
||||
$builder->addEventListener($event, array($validator, 'validate'));
|
||||
@ -83,7 +86,7 @@ class CaptchaType extends AbstractType
|
||||
throw new \InvalidArgumentException('GregwarCaptcha: The reload option cannot be set without as_url, see the README for more information');
|
||||
}
|
||||
|
||||
$sessionKey = sprintf('gcb_%s', $form->getName());
|
||||
$sessionKey = sprintf('%s%s', self::SESSION_KEY_PREFIX, $options['session_key']);
|
||||
$isHuman = false;
|
||||
|
||||
if ($options['humanity'] > 0) {
|
||||
@ -113,7 +116,8 @@ class CaptchaType extends AbstractType
|
||||
));
|
||||
|
||||
$persistOptions = array();
|
||||
foreach (array('phrase', 'width', 'height', 'distortion', 'length', 'quality', 'background_color', 'text_color') as $key) {
|
||||
foreach (array('phrase', 'width', 'height', 'distortion', 'length',
|
||||
'quality', 'background_color', 'background_images', 'text_color') as $key) {
|
||||
$persistOptions[$key] = $options[$key];
|
||||
}
|
||||
|
||||
@ -126,6 +130,7 @@ class CaptchaType extends AbstractType
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
{
|
||||
$this->options['mapped'] = false;
|
||||
$this->options['request'] = null;
|
||||
$resolver->setDefaults($this->options);
|
||||
}
|
||||
|
||||
@ -143,7 +148,7 @@ class CaptchaType extends AbstractType
|
||||
*/
|
||||
public function getParent()
|
||||
{
|
||||
// Not using ::class to support Symfony 2.8 w/ php<5.5
|
||||
// Not using ::class to support Symfony 2.8 w/ php>=5.3.9
|
||||
return 'Symfony\Component\Form\Extension\Core\Type\TextType';
|
||||
}
|
||||
|
||||
@ -151,6 +156,14 @@ class CaptchaType extends AbstractType
|
||||
* @return string
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return $this->getBlockPrefix();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getBlockPrefix()
|
||||
{
|
||||
return 'captcha';
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ use Symfony\Component\HttpFoundation\Session\SessionInterface;
|
||||
use Symfony\Component\Form\FormError;
|
||||
use Symfony\Component\Form\FormEvent;
|
||||
use Symfony\Component\Translation\TranslatorInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
/**
|
||||
* Captcha validator
|
||||
@ -46,6 +47,13 @@ class CaptchaValidator
|
||||
*/
|
||||
private $translator;
|
||||
|
||||
/**
|
||||
* Request
|
||||
*
|
||||
* @var Request
|
||||
*/
|
||||
private $req;
|
||||
|
||||
/**
|
||||
* @param TranslatorInterface $translator
|
||||
* @param SessionInterface $session
|
||||
@ -54,7 +62,7 @@ class CaptchaValidator
|
||||
* @param string $bypassCode
|
||||
* @param int $humanity
|
||||
*/
|
||||
public function __construct(TranslatorInterface $translator, SessionInterface $session, $key, $invalidMessage, $bypassCode, $humanity)
|
||||
public function __construct(TranslatorInterface $translator, SessionInterface $session, $key, $invalidMessage, $bypassCode, $humanity, Request $req = null)
|
||||
{
|
||||
$this->translator = $translator;
|
||||
$this->session = $session;
|
||||
@ -62,6 +70,7 @@ class CaptchaValidator
|
||||
$this->invalidMessage = $invalidMessage;
|
||||
$this->bypassCode = (string)$bypassCode;
|
||||
$this->humanity = $humanity;
|
||||
$this->req = $req;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -90,10 +99,11 @@ class CaptchaValidator
|
||||
}
|
||||
}
|
||||
|
||||
$this->session->remove($this->key);
|
||||
|
||||
if ($this->session->has($this->key . '_fingerprint')) {
|
||||
$this->session->remove($this->key . '_fingerprint');
|
||||
if (null == $this->req || 1 < $this->req->get('flow_registration_step')) {
|
||||
$this->session->remove($this->key);
|
||||
if ($this->session->has($this->key.'_fingerprint')) {
|
||||
$this->session->remove($this->key.'_fingerprint');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
{
|
||||
"name": "gregwar/captcha-bundle",
|
||||
"name": "cadoles/captcha",
|
||||
"type": "captcha-bundle",
|
||||
"description": "Captcha bundle",
|
||||
"keywords": ["symfony2", "captcha", "bot", "visual", "code", "security", "spam"],
|
||||
"homepage": "https://github.com/Gregwar/CaptchaBundle",
|
||||
"homepage": "https://github.com/Cadoles/CaptchaBundle",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
@ -19,8 +19,9 @@
|
||||
"require": {
|
||||
"php": ">=5.3.9",
|
||||
"gregwar/captcha": "~1.1",
|
||||
"symfony/framework-bundle": "~2.1|~3.0",
|
||||
"symfony/form": "~2.1|~3.0"
|
||||
"symfony/framework-bundle": "~2.8|~3.0|~4.0",
|
||||
"symfony/form": "~2.8|~3.0|~4.0",
|
||||
"twig/twig": "^1.40|^2.9"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
Reference in New Issue
Block a user