From 6c9511d3d565648459c322bb34f9f1a2b4f8a6f7 Mon Sep 17 00:00:00 2001 From: Alex Kellner Date: Fri, 10 Jun 2016 15:44:06 +0200 Subject: [PATCH] [TASK] Create extension in2frontendauthentication Finishing extension --- .../Domain/Repository/FeGroupsRepository.php | 101 ++++++++++++++++++ .../Domain/Service/AuthenticationService.php | 35 +++--- Configuration/TCA/Overrides/fe_groups.php | 27 +++++ .../Private/Language/de.locallang_db.xlf | 12 +++ Resources/Private/Language/locallang_db.xlf | 11 ++ ext_tables.sql | 6 ++ 6 files changed, 176 insertions(+), 16 deletions(-) create mode 100644 Classes/Domain/Repository/FeGroupsRepository.php create mode 100644 Configuration/TCA/Overrides/fe_groups.php create mode 100644 Resources/Private/Language/de.locallang_db.xlf create mode 100644 Resources/Private/Language/locallang_db.xlf create mode 100644 ext_tables.sql diff --git a/Classes/Domain/Repository/FeGroupsRepository.php b/Classes/Domain/Repository/FeGroupsRepository.php new file mode 100644 index 0000000..46944b2 --- /dev/null +++ b/Classes/Domain/Repository/FeGroupsRepository.php @@ -0,0 +1,101 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +use TYPO3\CMS\Core\Database\DatabaseConnection; +use TYPO3\CMS\Core\Utility\GeneralUtility; + +/** + * Class Contact + */ +class FeGroupsRepository +{ + const TABLE_NAME = 'fe_groups'; + + /** + * Find groups with current IP address + * + * @return array + */ + public function findByCurrentIpAddress() + { + $row = $this->getDatabaseConnection()->exec_SELECTgetSingleRow( + '*', + self::TABLE_NAME, + 'deleted = 0 and hidden = 0' . $this->getIpQueryString() + ); + if ($row !== false) { + return $row; + } + return []; + } + + /** + * Build string like + * ip_mask like "%1.1.1.1%" and ip_mask like "%2.2.2.2%" + * + * @return string + */ + protected function getIpQueryString() + { + $queryString = ' and ('; + foreach ($this->getCurrentIpAddresses() as $ipAddress) { + $databaseConnection = $this->getDatabaseConnection(); + $ipAddress = $databaseConnection->quoteStr($ipAddress, self::TABLE_NAME); + $queryString .= 'ip_mask like "%' . $ipAddress . '%" or '; + } + $queryString = rtrim($queryString, ' or '); + $queryString .= ')'; + return $queryString; + } + + /** + * Get current IP address and all variants with wildcards + * + * @return array + */ + protected function getCurrentIpAddresses() + { + $ips = [ + GeneralUtility::getIndpEnv('REMOTE_ADDR') + ]; + $parts = GeneralUtility::trimExplode('.', $ips[0], true); + $ips[] = '*.*.*.*'; + $ips[] = $parts[0] . '.*.*.*'; + $ips[] = $parts[0] . '.' . $parts[1] . '.*.*'; + $ips[] = $parts[0] . '.' . $parts[1] . '.' . $parts[2] . '.*'; + return $ips; + } + + /** + * @return DatabaseConnection + * @SuppressWarnings(PHPMD.Superglobals) + */ + protected function getDatabaseConnection() + { + return $GLOBALS['TYPO3_DB']; + } +} diff --git a/Classes/Domain/Service/AuthenticationService.php b/Classes/Domain/Service/AuthenticationService.php index b05a308..1530eca 100644 --- a/Classes/Domain/Service/AuthenticationService.php +++ b/Classes/Domain/Service/AuthenticationService.php @@ -25,29 +25,32 @@ namespace In2code\In2frontendauthentication\Domain\Service; * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/ +use In2code\In2frontendauthentication\Domain\Repository\FeGroupsRepository; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Extbase\Object\ObjectManager; use TYPO3\CMS\Sv\AuthenticationService as AuthenticationServiceCore; /** - * Class Contact + * Class AuthenticationService + * @package In2code\In2frontendauthentication\Domain\Service */ class AuthenticationService extends AuthenticationServiceCore { - public function getUser() - { - return parent::getUser(); - } - - public function authUser(array $user) - { - return parent::authUser($user); - } - + /** + * This method is called in fronted and should bypass the authentication for content elements and pages + * + * @param array $user + * @param array $knownGroups + * @return array + */ public function getGroups($user, $knownGroups) { -// return parent::getGroups($user, $knownGroups); - $row = (array)$this->getDatabaseConnection()->exec_SELECTgetSingleRow('*', 'fe_groups', 'uid=1'); -// \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($row, 'in2code: ' . __CLASS__ . ':' . __LINE__); - return $row; + $feGroupsRepository = GeneralUtility::makeInstance(ObjectManager::class) + ->get(FeGroupsRepository::class); + $feGroup = $feGroupsRepository->findByCurrentIpAddress(); + if (!empty($feGroup)) { + return $feGroup; + } + return parent::getGroups($user, $knownGroups); } - } diff --git a/Configuration/TCA/Overrides/fe_groups.php b/Configuration/TCA/Overrides/fe_groups.php new file mode 100644 index 0000000..4ba28d3 --- /dev/null +++ b/Configuration/TCA/Overrides/fe_groups.php @@ -0,0 +1,27 @@ + [ + 'exclude' => 0, + 'label' => 'LLL:EXT:in2frontendauthentication/Resources/Private/Language/locallang_db.xlf:' . + FeGroupsRepository::TABLE_NAME . '.ip_mask', + 'config' => [ + 'type' => 'text', + 'cols' => '40', + 'rows' => '2' + ] + ], +]; + +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns(FeGroupsRepository::TABLE_NAME, $columns); +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes( + FeGroupsRepository::TABLE_NAME, + 'ip_mask', + '', + '' +); diff --git a/Resources/Private/Language/de.locallang_db.xlf b/Resources/Private/Language/de.locallang_db.xlf new file mode 100644 index 0000000..5cf7eeb --- /dev/null +++ b/Resources/Private/Language/de.locallang_db.xlf @@ -0,0 +1,12 @@ + + + +
+ + + Autologin with IP address (e.g. "192.168.*.*, 133.145.219.8") + Autologin über IP-Adresse (z.B. ) + + + + diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf new file mode 100644 index 0000000..92323dd --- /dev/null +++ b/Resources/Private/Language/locallang_db.xlf @@ -0,0 +1,11 @@ + + + +
+ + + IP access (e.g. "192.168.*.*, 133.145.219.8") + + + + diff --git a/ext_tables.sql b/ext_tables.sql new file mode 100644 index 0000000..0b4641e --- /dev/null +++ b/ext_tables.sql @@ -0,0 +1,6 @@ +# +# Table structure for table 'fe_groups' +# +CREATE TABLE fe_groups ( + ip_mask text +);