Compare commits

..

2 Commits

Author SHA1 Message Date
phil
ca4052740c [BUGFIX] Mark function getRandomString as static 2025-08-20 13:16:39 +02:00
wadichaabene
a329a52505 [BUGFIX] Fix Captcha Validator 2025-06-20 09:31:20 +01:00
4 changed files with 28 additions and 30 deletions

View File

@ -28,6 +28,7 @@ use TYPO3\CMS\Extbase\Service\EnvironmentService;
use TYPO3\CMS\Extbase\Service\ExtensionService; use TYPO3\CMS\Extbase\Service\ExtensionService;
use TYPO3\CMS\Extbase\Utility\LocalizationUtility; use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
use Blueways\BwCaptcha\Validation\Validator\CaptchaValidator; use Blueways\BwCaptcha\Validation\Validator\CaptchaValidator;
use TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication;
class ActionController extends BaseController class ActionController extends BaseController
{ {
@ -839,23 +840,40 @@ class ActionController extends BaseController
/** **/ /** **/
protected function valideCaptcha($captchaId, $value protected function valideCaptcha($captchaId, $value
) { ) {
$cacheIdentifier = $GLOBALS['TSFE']->fe_user->getKey('ses', $captchaId); $captchaPhrases = $this->getFeUser()->getKey('ses', 'captchaPhrases');
if (!$captchaPhrases || !is_array($captchaPhrases) || !is_string($value)) {
if (!$cacheIdentifier) {
$this->addValidationError( $this->addValidationError(
'captcha', 'captcha',
'validator.notvalid' 'validator.notvalid'
); );
} }
// get captcha secret from cache and compare // get captcha secret from cache and compare
$cache = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Cache\CacheManager::class)->getCache('bwcaptcha'); $time = time();
$phrase = $cache->get($cacheIdentifier); $captchaPhrases = array_filter(
if ($phrase && $phrase === $value) { $captchaPhrases,
return true; function ($captchaLifetime) use ($time) {
return $captchaLifetime > $time;
},
ARRAY_FILTER_USE_KEY
);
foreach ($captchaPhrases as $lifetime => $captchaPhrase) {
$isValid = !empty($captchaPhrase) && $captchaPhrase === $value;
if ($isValid) {
// remove solved captcha
unset($captchaPhrases[$lifetime]);
$this->getFeUser()->setKey('ses', 'captchaPhrases', $captchaPhrases);
$this->getFeUser()->storeSessionData();
return true;
}
} }
$this->addValidationError( $this->addValidationError(
'captcha', 'captcha',
'validator.notvalid' 'validator.notvalid'
); );
} }
protected function getFeUser(): FrontendUserAuthentication
{
return $GLOBALS['TSFE']->fe_user;
}
} }

View File

@ -45,7 +45,7 @@ class StringUtility
return $string; return $string;
} }
function getRandomString( public static function getRandomString(
int $length = 64, int $length = 64,
string $keyspace = null string $keyspace = null
): string { ): string {

View File

@ -30,17 +30,7 @@ return [
'exclude' => true, 'exclude' => true,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.language', 'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.language',
'config' => [ 'config' => [
'type' => 'select', 'type' => 'language',
'renderType' => 'selectSingle',
'special' => 'languages',
'items' => [
[
'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.allLanguages',
-1,
'flags-multiple'
]
],
'default' => 0,
], ],
], ],
'l10n_parent' => [ 'l10n_parent' => [

View File

@ -30,17 +30,7 @@ return [
'exclude' => true, 'exclude' => true,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.language', 'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.language',
'config' => [ 'config' => [
'type' => 'select', 'type' => 'language',
'renderType' => 'selectSingle',
'special' => 'languages',
'items' => [
[
'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.allLanguages',
-1,
'flags-multiple'
]
],
'default' => 0,
], ],
], ],
'l10n_parent' => [ 'l10n_parent' => [