Compare commits

..

11 Commits

Author SHA1 Message Date
Philipp Dieter
0e77b7a75a [BUGIFX] Translations action only returning default language 2026-03-12 17:22:28 +01:00
Philipp Dieter
b2f9fa6846 [MERGE] Branch 'task-customerportal-paidfeatures-pr555' 2026-03-03 12:03:50 +01:00
Philipp Dieter
a38cc25301 [TASK] Add features to apiUtility and interfaceUtility 2026-03-03 12:03:26 +01:00
Philipp Dieter
52f18c53ea [CLEANUP] Code formatting 2026-02-17 11:43:51 +01:00
Wadii Chaaben
115ba55cd5 [BUGFIX] Change Translation fit 2026-02-17 10:10:16 +01:00
Wadii Chaaben
e53cca6393 [BUGFIX] Fix Translation in Typo3 11.5 2025-11-05 21:33:24 +01:00
Wadii Chaaben
b33989a340 [TASK] Update CaptchaValidtor 2025-10-24 13:29:21 +01:00
Wadii Chaaben
8ea39bd09c [BUGFIX] Fix PageRepository in Typo3 11.5 2025-10-13 15:40:37 +01:00
2b549c7b38 [TASK] Work on compatibility for TYPO3 11 2025-08-21 15:55:33 +02:00
5b0ef1ccdf [BUGFIX] Mark function getRandomString as static 2025-08-20 13:17:29 +02:00
wadichaabene
a329a52505 [BUGFIX] Fix Captcha Validator 2025-06-20 09:31:20 +01:00
10 changed files with 127 additions and 93 deletions

View File

@@ -17,11 +17,19 @@ use Cjel\TemplatesAide\Traits\ValidationTrait;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Core\Cache\CacheManager;
use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\Restriction\DefaultRestrictionContainer;
use TYPO3\CMS\Core\Http\Response;
use TYPO3\CMS\Core\Http\ServerRequestFactory;
use TYPO3\CMS\Core\Localization\LanguageService;
use TYPO3\CMS\Core\Localization\LanguageServiceFactory;
use TYPO3\CMS\Core\Log\LogManager;
use TYPO3\CMS\Core\Routing\SiteMatcher;
use TYPO3\CMS\Core\Site\SiteFinder;
use TYPO3\CMS\Core\TypoScript\TemplateService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\RootlineUtility;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper;
@@ -148,15 +156,26 @@ class AbstractEIDController
$this->importLogger = $this->logManager->getLogger(
'importLogger'
);
$this->reflectionService = GeneralUtility::makeInstance(
ReflectionService::class, GeneralUtility::makeInstance(
CacheManager::class
)
);
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$this->reflectionService = GeneralUtility::makeInstance(
ReflectionService::class
);
} else {
$this->reflectionService = GeneralUtility::makeInstance(
ReflectionService::class, GeneralUtility::makeInstance(
CacheManager::class
)
);
}
$classInfo = $this->reflectionService->getClassSchema(
get_class($this)
);
foreach ($classInfo->getInjectMethods() as $method => $className) {
if (version_compare(TYPO3_branch, '10.0', '>=')) {
$className = $className
->getFirstParameter()
->getDependency();
}
$class = $this->objectManager->get(
$className
);
@@ -169,47 +188,37 @@ class AbstractEIDController
*/
private function initFrontendController()
{
$currentDomain = strtok(GeneralUtility::getIndpEnv('HTTP_HOST'), ':');
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('sys_domain');
$queryBuilder->setRestrictions(
GeneralUtility::makeInstance(DefaultRestrictionContainer::class)
$request = ServerRequestFactory::fromGlobals();
$context = GeneralUtility::makeInstance(Context::class);
$siteFinder = GeneralUtility::makeInstance(SiteFinder::class);
$siteMatcher = GeneralUtility::makeInstance(SiteMatcher::class);
$site = $siteMatcher->matchRequest($request);
$pageId = $site->getSite()->getRootPageId();
$template = GeneralUtility::makeInstance(TemplateService::class);
$template->tt_track = false;
$rootline = GeneralUtility::makeInstance(
RootlineUtility::class, $pageId
)->get();
$template->runThroughTemplates($rootline, 0);
$template->generateConfig();
$setup = $template->setup;
$setup = GeneralUtility::removeDotsFromTS($setup);
$extKey = 'tx_' . $this->getExtensionKey();
if (array_key_exists('plugin', $setup)
&& array_key_exists($extKey, $setup['plugin'])
&& array_key_exists('persistence', $setup['plugin'][$extKey])
&& array_key_exists('storagePid', $setup['plugin'][$extKey]['persistence'])
) {
$storagePids = $setup['plugin'][$extKey]['persistence']['storagePid'];
$this->storagePids = GeneralUtility::trimExplode(
',',
$storagePids
);
}
$languageServiceFactory = GeneralUtility::makeInstance(
LanguageServiceFactory::class
);
$result = $queryBuilder
->select('uid', 'pid', 'domainName')
->from('sys_domain')
->where(
$queryBuilder->expr()->eq(
'domainName',
$queryBuilder->createNamedParameter(
$currentDomain,
\PDO::PARAM_STR
)
)
)
->orderBy('sorting', 'ASC')
->execute()
->fetchAll();
//if (count($result) < 1) {
// throw new \Exception('Domain not configured');
//}
$frontendController = GeneralUtility::makeInstance(
\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController::class,
$GLOBALS['TYPO3_CONF_VARS'],
null,
0,
true
);
$GLOBALS['LANG'] = GeneralUtility::makeInstance(LanguageService::class);
$GLOBALS['LANG']->init('default');
$GLOBALS['TSFE'] = $frontendController;
$frontendController->connectToDB();
$frontendController->fe_user = EidUtility::initFeUser();
$frontendController->id = $result[0]['pid'];
$frontendController->determineId();
$frontendController->initTemplate();
$frontendController->getConfigArray();
EidUtility::initTCA();
$GLOBALS['LANG'] = $languageServiceFactory->create('default');
}
/**
@@ -271,6 +280,7 @@ class AbstractEIDController
. 'Request';
}
}
$response = new Response();
if (method_exists($this, $requestMethod)) {
$responseData = $this->$requestMethod($request, $response);
$response = $response->withHeader(

View File

@@ -27,7 +27,8 @@ use TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationBuilder;
use TYPO3\CMS\Extbase\Service\EnvironmentService;
use TYPO3\CMS\Extbase\Service\ExtensionService;
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
use Blueways\BwCaptcha\Validation\Validator\CaptchaValidator;
use TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication;
use TYPO3\CMS\Core\Utility\DebugUtility;
class ActionController extends BaseController
{
@@ -837,25 +838,42 @@ class ActionController extends BaseController
}
}
/** **/
protected function valideCaptcha($captchaId, $value
) {
$cacheIdentifier = $GLOBALS['TSFE']->fe_user->getKey('ses', $captchaId);
if (!$cacheIdentifier) {
protected function valideCaptcha($value
): void {
$captchaPhrases = $this->getFeUser()->getKey('ses', 'captchaPhrases');
if (!$captchaPhrases || !is_array($captchaPhrases) || !is_string($value)) {
$this->addValidationError(
'captcha',
'validator.notvalid'
);
}
// get captcha secret from cache and compare
$cache = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Cache\CacheManager::class)->getCache('bwcaptcha');
$phrase = $cache->get($cacheIdentifier);
if ($phrase && $phrase === $value) {
return true;
$time = time();
$captchaPhrases = array_filter(
$captchaPhrases,
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 ;
}
}
$this->addValidationError(
'captcha',
'validator.notvalid'
);
}
protected function getFeUser(): FrontendUserAuthentication
{
return $GLOBALS['TSFE']->fe_user;
}
}

View File

@@ -46,18 +46,18 @@ class TranslationController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionCont
} else {
$language = $GLOBALS['TYPO3_REQUEST']->getAttribute('language');
}
$locale = $language->getLocale();
//\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(
// $locale, '$locale', 3, true, false
//);
$language = $language->getTypo3language();
$langfileContent = $languageFactory->getParsedData(
$langfilePath,
$locale
$language
);
$langfileResult = [];
foreach (reset($langfileContent) as $key => $row) {
$langfileResult[$key] = reset($row)['target'];
}
foreach ($langfileContent[$language] as $key => $row) {
$langfileResult[$key] = reset($row)['target'];
}
$result[$extension] = $langfileResult;
}
$GLOBALS['TSFE']->setContentType('application/json');

View File

@@ -44,7 +44,8 @@ class ApiUtility
$queryResult,
$additionalAttributes = [],
$mapping = [],
$rootRowClass = null
$rootRowClass = null,
$options = []
) {
$this->objectManager = GeneralUtility::makeInstance(
ObjectManager::class
@@ -130,7 +131,8 @@ class ApiUtility
$methodResult,
$additionalAttributes[$attributeName],
$mapping,
$nextLevelClass
$nextLevelClass,
$options
);
if ($imageStorage) {
foreach ($attributeResult as &$attributeResultRow) {
@@ -167,7 +169,8 @@ class ApiUtility
[$methodResult],
$additionalAttributes[$attributeName],
$mapping,
$nextLevelClass
$nextLevelClass,
$options
)[0];
$rowResult[$attributeName . 'Uid']
= $rowResult[$attributeName]['uid'];
@@ -218,6 +221,10 @@ class ApiUtility
}
}
}
if (($options['clearIds'] ?? '' ) === true) {
unset($rowResult['uid']);
unset($rowResult['pid']);
}
$result[] = $rowResult;
}
return $result;

View File

@@ -37,4 +37,22 @@ class InterfaceUtility
}, ARRAY_FILTER_USE_KEY);
return array_values($constants);
}
/**
* Get all interface constants per prefix
*/
public static function parseInterfaceConstantsAssoc(
$interfaceClass, $prefix
) {
$constants = (new \ReflectionClass($interfaceClass))
->getConstants();
$constants = array_filter($constants, function($key) use ($prefix) {
if (substr($key, 0, strlen($prefix) + 1)
== strtoupper($prefix) . '_'
) {
return true;
}
}, ARRAY_FILTER_USE_KEY);
return $constants;
}
}

View File

@@ -21,7 +21,7 @@ use TYPO3\CMS\Fluid\View\StandaloneView;
use TYPO3\CMS\Fluid\View\TemplatePaths;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
use Symfony\Component\Mime\Address;
use TYPO3\CMS\Frontend\Page\PageRepository;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
/**
*
*/

View File

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

View File

@@ -65,12 +65,13 @@ class TranslationUtility
if (!$extensionKey) {
$extensionKey = 'site_templates';
}
return implode([
'LLL:EXT:',
$extensionKey,
'/Resources/Private/Language/locallang_db.xlf:',
$key
]);
$translation = LocalizationUtility::translate(
'LLL:EXT:'
. $extensionKey
. '/Resources/Private/Language/locallang_db.xlf:'
. $key
);
return $translation;
} else {
if ($extensionKey) {
$translation = LocalizationUtility::translate(

View File

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

View File

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