[BUGFIX] Unknown exception thrown with validator in backend context 72/55172/2
authorStanislas Rolland <typo3@sjbr.ca>
Wed, 20 Dec 2017 02:10:52 +0000 (21:10 -0500)
committerStanislas Rolland <typo3@sjbr.ca>
Wed, 20 Dec 2017 02:12:26 +0000 (03:12 +0100)
Unknown exception is thrown when domain model with validator is used
in backend context.

Solution: Fix the exception class. Avoid loading fe_user data when not
available.

Resolves: #80906
Change-Id: Ic1f53cdb50c4dd8eb8c7ebb6a7f0012f7b707161
Reviewed-on: https://review.typo3.org/55172
Reviewed-by: Stanislas Rolland <typo3@sjbr.ca>
Tested-by: Stanislas Rolland <typo3@sjbr.ca>
ChangeLog
Classes/Domain/Session/SessionStorage.php
Classes/Validation/Validator/CaptchaValidator.php
Classes/ViewHelpers/AudioViewHelper.php
Classes/ViewHelpers/ImageViewHelper.php

index c2b2158..da98e6f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2017-12-19  Stanislas Rolland  <typo(arobas)sjbr.ca>
+       * Resolves #80906: Unknown Exception thrown when domain model with validator is used in backend context
+
 2017-10-16  Stanislas Rolland  <typo(arobas)sjbr.ca>
        * Resolves #82716: Migrate from mcrypt to openssl
        * Resolves #81736: Add P3P header for IE 11 of Windows 7 when page opens in popup
index f2c7afe..e898499 100644 (file)
@@ -4,7 +4,7 @@ namespace SJBR\SrFreecap\Domain\Session;
 /*
  *  Copyright notice
  *
- *  (c) 2012-2015 Stanislas Rolland <typo3@sjbr.ca>
+ *  (c) 2012-2017 Stanislas Rolland <typo3@sjbr.ca>
  *  All rights reserved
  *
  *  This script is part of the TYPO3 project. The TYPO3 project is
@@ -26,6 +26,9 @@ namespace SJBR\SrFreecap\Domain\Session;
  *
  *  This copyright notice MUST APPEAR in all copies of the script!
  */
+
+use TYPO3\CMS\Core\Session\Backend\Exception\SessionNotFoundException;
+
 /**
  * Session storage
  *
@@ -75,13 +78,13 @@ class SessionStorage implements \TYPO3\CMS\Core\SingletonInterface
         * Gets a frontend user from TSFE->fe_user
         *
         * @return      \TYPO3\CMS\Frontend\Authentication\FrontendUserAuthtenication   The current frontend user object
-        * @throws      LogicException
+        * @throws      SessionNotFoundException
         */
        protected function getFrontendUser()
        {
                if ($GLOBALS ['TSFE']->fe_user) {
                        return $GLOBALS ['TSFE']->fe_user;
                }
-               throw new LogicException ('No Frontentuser found in session!');
+               throw new SessionNotFoundException('No frontend user found in session!');
        }
 }
\ No newline at end of file
index 21d220d..2d46fee 100644 (file)
@@ -1,35 +1,41 @@
 <?php
 namespace SJBR\SrFreecap\Validation\Validator;
+
 /***************************************************************
-*  Copyright notice
-*
-*  (c) 2012-2015 Stanislas Rolland <typo3@sjbr.ca>
-*  All rights reserved
-*
-*  This class is a backport of the corresponding class of FLOW3. 
-*  All credits go to the v5 team.
-*
-*  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 2 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!
-***************************************************************/
+ *  Copyright notice
+ *
+ *  (c) 2012-2017 Stanislas Rolland <typo3@sjbr.ca>
+ *  All rights reserved
+ *
+ *  All credits go to the v5 team.
+ *
+ *  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 2 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 SJBR\SrFreecap\Domain\Repository\WordRepository;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Extbase\Object\ObjectManager;
+use TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator;
+
 /**
  * Captcha validator
  */
-class CaptchaValidator extends \TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator {
-
+class CaptchaValidator extends AbstractValidator
+{
        /**
         * Specifies whether this validator accepts empty values.
         *
@@ -39,7 +45,7 @@ class CaptchaValidator extends \TYPO3\CMS\Extbase\Validation\Validator\AbstractV
         *
         * @var bool
         */
-       protected $acceptsEmptyValues = FALSE;
+       protected $acceptsEmptyValues = false;
 
        /**
         * @var string Name of the extension this controller belongs to
@@ -53,26 +59,32 @@ class CaptchaValidator extends \TYPO3\CMS\Extbase\Validation\Validator\AbstractV
         * @param string $word: the word that was entered and should be validated
         * @return boolean TRUE, if the word entered matches the hash value, FALSE if an error occured
         */
-       public function isValid ($word) {
-               $isValid = FALSE;
-               // Get session data
-               $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager');
-               $wordRepository = $objectManager->get('SJBR\\SrFreecap\\Domain\\Repository\\WordRepository');
-               $wordObject = $wordRepository->getWord();
-               $wordHash = $wordObject->getWordHash();
-               // Check the word hash against the stored hash value
-               if (!empty($wordHash) && !empty($word)) {
-                       if ($wordObject->getHashFunction() == 'md5') {
-                               // All freeCap words are lowercase.
-                               // font #4 looks uppercase, but trust me, it's not...
-                               if (md5(strtolower(utf8_decode($word))) == $wordHash) {
-                                       // Reset freeCap session vars
-                                       // Cannot stress enough how important it is to do this
-                                       // Defeats re-use of known image with spoofed session id
-                                       $wordRepository->cleanUpWord();
-                                       $isValid = TRUE;
+       public function isValid($word)
+       {
+               $isValid = false;
+               // This validator needs a frontend user session
+               if (is_object($GLOBALS ['TSFE']) && isset($GLOBALS ['TSFE']->fe_user)) {
+                       // Get session data
+                       $objectManager = GeneralUtility::makeInstance(ObjectManager::class);
+                       $wordRepository = $objectManager->get(WordRepository::class);
+                       $wordObject = $wordRepository->getWord();
+                       $wordHash = $wordObject->getWordHash();
+                       // Check the word hash against the stored hash value
+                       if (!empty($wordHash) && !empty($word)) {
+                               if ($wordObject->getHashFunction() == 'md5') {
+                                       // All freeCap words are lowercase.
+                                       // font #4 looks uppercase, but trust me, it's not...
+                                       if (md5(strtolower(utf8_decode($word))) == $wordHash) {
+                                               // Reset freeCap session vars
+                                               // Cannot stress enough how important it is to do this
+                                               // Defeats re-use of known image with spoofed session id
+                                               $wordRepository->cleanUpWord();
+                                               $isValid = true;
+                                       }
                                }
                        }
+               } else {
+                       $isValid = empty($word);
                }
                if (!$isValid) {
                        $this->addError('Entered word does not match the image', 9221561048);
index 781bbc7..00775c4 100644 (file)
@@ -27,6 +27,7 @@ namespace SJBR\SrFreecap\ViewHelpers;
  ***************************************************************/
 
 use SJBR\SrFreecap\ViewHelpers\TranslateViewHelper;
+use TYPO3\CMS\Core\Session\Backend\Exception\SessionNotFoundException;
 use TYPO3\CMS\Core\Utility\ClientUtility;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
@@ -53,7 +54,8 @@ class AudioViewHelper extends AbstractTagBasedViewHelper
         * @param ConfigurationManagerInterface $configurationManager
         * @return void
         */
-       public function injectConfigurationManager(ConfigurationManagerInterface $configurationManager) {
+       public function injectConfigurationManager(ConfigurationManagerInterface $configurationManager)
+       {
                $this->configurationManager = $configurationManager;
        }
 
@@ -63,7 +65,13 @@ class AudioViewHelper extends AbstractTagBasedViewHelper
         * @param string suffix to be appended to the extenstion key when forming css class names
         * @return string The html used to render the captcha audio rendering request icon
         */
-       public function render ($suffix = '') {
+       public function render($suffix = '')
+       {
+               // This viewhelper needs a frontend user session
+               if (!is_object($GLOBALS ['TSFE']) || !isset($GLOBALS ['TSFE']->fe_user)) {
+                       throw new SessionNotFoundException('No frontend user found in session!');
+               }
+
                $value = '';
                // Get the plugin configuration
                $settings = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS, $this->extensionName, $this->pluginName);
@@ -140,7 +148,8 @@ class AudioViewHelper extends AbstractTagBasedViewHelper
         * @param string suffix to be appended to the extenstion key when forming css class names
         * @return string the class attribute with the combined class name (with the correct prefix)
         */
-       protected function getClassAttribute ($class, $suffix = '') {
+       protected function getClassAttribute ($class, $suffix = '')
+       {
                return ' class="' . trim(str_replace('_', '-', $this->pluginName) . ($suffix ? '-' . $suffix . '-' : '-') . $class) . '"';
        }
 }
\ No newline at end of file
index dc50a6a..e6be819 100644 (file)
@@ -28,6 +28,7 @@ namespace SJBR\SrFreecap\ViewHelpers;
 
 use SJBR\SrFreecap\ViewHelpers\TranslateViewHelper;
 use TYPO3\CMS\Core\Page\PageRenderer;
+use TYPO3\CMS\Core\Session\Backend\Exception\SessionNotFoundException;
 use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
@@ -72,6 +73,11 @@ class ImageViewHelper extends AbstractTagBasedViewHelper
         */
        public function render($suffix = '')
        {
+               // This viewhelper needs a frontend user session
+               if (!is_object($GLOBALS ['TSFE']) || !isset($GLOBALS ['TSFE']->fe_user)) {
+                       throw new SessionNotFoundException('No frontend user found in session!');
+               }
+
                $value = '';
 
                // Include the required JavaScript