diff --git a/Controller/CaptchaController.php b/Controller/CaptchaController.php index d21b93c..d3c5751 100644 --- a/Controller/CaptchaController.php +++ b/Controller/CaptchaController.php @@ -10,7 +10,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; /** - * Generates a captcha via a URL + * Generates a captcha via a URL. * * @author Jeremy Livingston */ diff --git a/DependencyInjection/GregwarCaptchaExtension.php b/DependencyInjection/GregwarCaptchaExtension.php index 5689a30..060fff8 100755 --- a/DependencyInjection/GregwarCaptchaExtension.php +++ b/DependencyInjection/GregwarCaptchaExtension.php @@ -11,15 +11,16 @@ use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; use Symfony\Component\Config\FileLocator; /** - * Extension used to load the configuration, set parameters, and initialize the captcha view + * Extension used to load the configuration, set parameters, and initialize the captcha view. * * @author Gregwar */ class GregwarCaptchaExtension extends Extension { /** - * @param array $configs + * @param array $configs * @param ContainerBuilder $container + * * @throws Exception */ public function load(array $configs, ContainerBuilder $container): void diff --git a/Generator/CaptchaGenerator.php b/Generator/CaptchaGenerator.php index a6c98b9..08b33dc 100644 --- a/Generator/CaptchaGenerator.php +++ b/Generator/CaptchaGenerator.php @@ -7,12 +7,11 @@ namespace Gregwar\CaptchaBundle\Generator; use Gregwar\Captcha\CaptchaBuilder; use Gregwar\Captcha\PhraseBuilder; use Symfony\Component\Routing\RouterInterface; - use Gregwar\Captcha\CaptchaBuilderInterface; use Gregwar\Captcha\PhraseBuilderInterface; /** - * Uses configuration parameters to call the services that generate captcha images + * Uses configuration parameters to call the services that generate captcha images. * * @author Gregwar * @author Jeremy Livingston @@ -32,10 +31,10 @@ class CaptchaGenerator protected $imageFileHandler; /** - * @param RouterInterface $router + * @param RouterInterface $router * @param CaptchaBuilderInterface $builder - * @param PhraseBuilderInterface $phraseBuilder - * @param ImageFileHandler $imageFileHandler + * @param PhraseBuilderInterface $phraseBuilder + * @param ImageFileHandler $imageFileHandler */ public function __construct( RouterInterface $router, @@ -43,10 +42,10 @@ class CaptchaGenerator PhraseBuilderInterface $phraseBuilder, ImageFileHandler $imageFileHandler ) { - $this->router = $router; - $this->builder = $builder; - $this->phraseBuilder = $phraseBuilder; - $this->imageFileHandler = $imageFileHandler; + $this->router = $router; + $this->builder = $builder; + $this->phraseBuilder = $phraseBuilder; + $this->imageFileHandler = $imageFileHandler; } public function getCaptchaCode(array &$options): string @@ -62,11 +61,13 @@ class CaptchaGenerator // Returns the image generation URL if ($options['as_url']) { - return $this->router->generate('gregwar_captcha.generate_captcha', - array('key' => $options['session_key'], 'n' => md5(microtime(true).mt_rand()))); + return $this->router->generate( + 'gregwar_captcha.generate_captcha', + array('key' => $options['session_key'], 'n' => md5(microtime(true).mt_rand())) + ); } - return 'data:image/jpeg;base64,' . base64_encode($this->generate($options)); + return 'data:image/jpeg;base64,'.base64_encode($this->generate($options)); } public function setPhrase(string $phrase): void @@ -82,7 +83,7 @@ class CaptchaGenerator $this->builder->setMaxBehindLines($options['max_behind_lines']); if (isset($options['text_color']) && $options['text_color']) { - if (count($options['text_color']) !== 3) { + if (3 !== count($options['text_color'])) { throw new \RuntimeException('text_color should be an array of r, g and b'); } @@ -91,7 +92,7 @@ class CaptchaGenerator } if (isset($options['background_color']) && $options['background_color']) { - if (count($options['background_color']) !== 3) { + if (3 !== count($options['background_color'])) { throw new \RuntimeException('background_color should be an array of r, g and b'); } @@ -136,7 +137,7 @@ class CaptchaGenerator $phrase = $this->phraseBuilder->build($options['length'], $options['charset']); $options['phrase'] = $phrase; } - + return $phrase; } } diff --git a/Generator/ImageFileHandler.php b/Generator/ImageFileHandler.php index 0a3c407..616d6f2 100644 --- a/Generator/ImageFileHandler.php +++ b/Generator/ImageFileHandler.php @@ -7,7 +7,7 @@ namespace Gregwar\CaptchaBundle\Generator; use Symfony\Component\Finder\Finder; /** - * Handles actions related to captcha image files including saving and garbage collection + * Handles actions related to captcha image files including saving and garbage collection. * * @author Gregwar * @author Jeremy Livingston @@ -15,25 +15,29 @@ use Symfony\Component\Finder\Finder; class ImageFileHandler { /** - * Name of folder for captcha images + * Name of folder for captcha images. + * * @var string */ protected $imageFolder; /** - * Absolute path to public web folder + * Absolute path to public web folder. + * * @var string */ protected $webPath; /** - * Frequency of garbage collection in fractions of 1 + * Frequency of garbage collection in fractions of 1. + * * @var int */ protected $gcFreq; /** - * Maximum age of images in minutes + * Maximum age of images in minutes. + * * @var int */ protected $expiration; @@ -47,25 +51,25 @@ class ImageFileHandler public function __construct(string $imageFolder, string $webPath, string $gcFreq, string $expiration) { $this->imageFolder = $imageFolder; - $this->webPath= $webPath; + $this->webPath = $webPath; $this->gcFreq = $gcFreq; $this->expiration = $expiration; } - public function saveAsFile($contents):string + public function saveAsFile($contents): string { $this->createFolderIfMissing(); - $filename = md5(uniqid()) . '.jpg'; - $filePath = $this->webPath . '/' . $this->imageFolder . '/' . $filename; + $filename = md5(uniqid()).'.jpg'; + $filePath = $this->webPath.'/'.$this->imageFolder.'/'.$filename; imagejpeg($contents, $filePath, 15); - return '/' . $this->imageFolder . '/' . $filename; + return '/'.$this->imageFolder.'/'.$filename; } public function collectGarbage(): bool { - if (!mt_rand(1, $this->gcFreq) == 1) { + if (1 == !mt_rand(1, $this->gcFreq)) { return false; } @@ -73,10 +77,10 @@ class ImageFileHandler $finder = new Finder(); $criteria = sprintf('<= now - %s minutes', $this->expiration); - $finder->in($this->webPath . '/' . $this->imageFolder) + $finder->in($this->webPath.'/'.$this->imageFolder) ->date($criteria); - foreach($finder->files() as $file) { + foreach ($finder->files() as $file) { unlink($file->getPathname()); } @@ -85,8 +89,8 @@ class ImageFileHandler protected function createFolderIfMissing(): void { - if (!file_exists($this->webPath . '/' . $this->imageFolder)) { - mkdir($this->webPath . '/' . $this->imageFolder, 0755); + if (!file_exists($this->webPath.'/'.$this->imageFolder)) { + mkdir($this->webPath.'/'.$this->imageFolder, 0755); } } } diff --git a/Type/CaptchaType.php b/Type/CaptchaType.php index 13d270b..8e659ea 100644 --- a/Type/CaptchaType.php +++ b/Type/CaptchaType.php @@ -17,7 +17,7 @@ use Gregwar\CaptchaBundle\Validator\CaptchaValidator; use Gregwar\CaptchaBundle\Generator\CaptchaGenerator; /** - * Captcha type + * Captcha type. * * @author Gregwar */ @@ -78,7 +78,7 @@ class CaptchaType extends AbstractType } $sessionKey = sprintf('%s%s', self::SESSION_KEY_PREFIX, $options['session_key']); - $isHuman = false; + $isHuman = false; if ($options['humanity'] > 0) { $humanityKey = sprintf('%s_humanity', $sessionKey); @@ -97,18 +97,18 @@ class CaptchaType extends AbstractType } $view->vars = array_merge($view->vars, array( - 'captcha_width' => $options['width'], - 'captcha_height' => $options['height'], - 'reload' => $options['reload'], - 'image_id' => uniqid('captcha_'), - 'captcha_code' => $this->generator->getCaptchaCode($options), - 'value' => '', - 'is_human' => $isHuman + 'captcha_width' => $options['width'], + 'captcha_height' => $options['height'], + 'reload' => $options['reload'], + 'image_id' => uniqid('captcha_'), + 'captcha_code' => $this->generator->getCaptchaCode($options), + 'value' => '', + 'is_human' => $isHuman, )); $persistOptions = array(); foreach (array('phrase', 'width', 'height', 'distortion', 'length', - 'quality', 'background_color', 'background_images', 'text_color') as $key) { + 'quality', 'background_color', 'background_images', 'text_color', ) as $key) { $persistOptions[$key] = $options[$key]; } diff --git a/Validator/CaptchaValidator.php b/Validator/CaptchaValidator.php index 4bab9a5..cdabc8e 100644 --- a/Validator/CaptchaValidator.php +++ b/Validator/CaptchaValidator.php @@ -10,7 +10,7 @@ use Symfony\Component\Form\FormEvent; use Symfony\Contracts\Translation\TranslatorInterface; /** - * Captcha validator + * Captcha validator. * * @author Gregwar */ @@ -20,31 +20,36 @@ class CaptchaValidator private $session; /** - * Session key to store the code + * Session key to store the code. + * * @var string */ private $key; /** - * Error message text for non-matching submissions + * Error message text for non-matching submissions. + * * @var string */ private $invalidMessage; /** - * Configuration parameter used to bypass a required code match + * Configuration parameter used to bypass a required code match. + * * @var string */ private $bypassCode; /** - * Number of form that the user can submit without captcha + * Number of form that the user can submit without captcha. + * * @var int */ private $humanity; /** - * Translator + * Translator. + * * @var TranslatorInterface */ private $translator; @@ -57,12 +62,12 @@ class CaptchaValidator ?string $bypassCode, int $humanity ) { - $this->translator = $translator; - $this->session = $session; - $this->key = $key; - $this->invalidMessage = $invalidMessage; - $this->bypassCode = $bypassCode; - $this->humanity = $humanity; + $this->translator = $translator; + $this->session = $session; + $this->key = $key; + $this->invalidMessage = $invalidMessage; + $this->bypassCode = $bypassCode; + $this->humanity = $humanity; } public function validate(FormEvent $event): void @@ -75,12 +80,13 @@ class CaptchaValidator if ($this->humanity > 0) { $humanity = $this->getHumanity(); if ($humanity > 0) { - $this->updateHumanity($humanity-1); + $this->updateHumanity($humanity - 1); + return; } } - if (!($code !== null && is_string($code) && ($this->compare($code, $expectedCode) || $this->compare($code, $this->bypassCode)))) { + if (!(null !== $code && is_string($code) && ($this->compare($code, $expectedCode) || $this->compare($code, $this->bypassCode)))) { $form->addError(new FormError($this->translator->trans($this->invalidMessage, array(), 'validators'))); } else { if ($this->humanity > 0) { @@ -90,13 +96,13 @@ class CaptchaValidator $this->session->remove($this->key); - if ($this->session->has($this->key . '_fingerprint')) { - $this->session->remove($this->key . '_fingerprint'); + if ($this->session->has($this->key.'_fingerprint')) { + $this->session->remove($this->key.'_fingerprint'); } } /** - * Retrieve the expected CAPTCHA code + * Retrieve the expected CAPTCHA code. * * @return mixed|null */ @@ -112,21 +118,21 @@ class CaptchaValidator } /** - * Retrieve the humanity + * Retrieve the humanity. * * @return mixed|null */ protected function getHumanity() { - return $this->session->get($this->key . '_humanity', 0); + return $this->session->get($this->key.'_humanity', 0); } protected function updateHumanity(int $newValue): void { if ($newValue > 0) { - $this->session->set($this->key . '_humanity', $newValue); + $this->session->set($this->key.'_humanity', $newValue); } else { - $this->session->remove($this->key . '_humanity'); + $this->session->remove($this->key.'_humanity'); } } @@ -136,14 +142,15 @@ class CaptchaValidator } /** - * Run a match comparison on the provided code and the expected code + * Run a match comparison on the provided code and the expected code. * - * @param string $code + * @param string $code * @param string|null $expectedCode + * * @return bool */ protected function compare($code, $expectedCode): bool { - return ($expectedCode !== null && is_string($expectedCode) && $this->niceize($code) == $this->niceize($expectedCode)); + return null !== $expectedCode && is_string($expectedCode) && $this->niceize($code) == $this->niceize($expectedCode); } }