395 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			395 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
// @codingStandardsIgnoreStart
 | 
						|
namespace {
 | 
						|
    $mockPHPFunctions = false;
 | 
						|
}
 | 
						|
 | 
						|
namespace Magento\Framework\Session {
 | 
						|
 | 
						|
    use Magento\Framework\App\Filesystem\DirectoryList;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Mock ini_get global function
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    function ini_get($varName)
 | 
						|
    {
 | 
						|
        global $mockPHPFunctions;
 | 
						|
        if ($mockPHPFunctions == 1) {
 | 
						|
            switch ($varName) {
 | 
						|
                case 'session.save_path':
 | 
						|
                    return 'preset_save_path';
 | 
						|
                case 'session.save_handler':
 | 
						|
                    return 'php';
 | 
						|
                default:
 | 
						|
                    return '';
 | 
						|
            }
 | 
						|
        } elseif ($mockPHPFunctions == 2) {
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
        //phpcs:ignore PHPCompatibility
 | 
						|
        return call_user_func_array('\ini_get', func_get_args());
 | 
						|
    }
 | 
						|
 | 
						|
    // @codingStandardsIgnoreEnd
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     */
 | 
						|
    class ConfigTest extends \PHPUnit\Framework\TestCase
 | 
						|
    {
 | 
						|
        /** @var string */
 | 
						|
        private $_cacheLimiter = 'private_no_expire';
 | 
						|
 | 
						|
        /** @var \Magento\TestFramework\ObjectManager */
 | 
						|
        private $_objectManager;
 | 
						|
 | 
						|
        /** @var string Default value for session.save_path setting */
 | 
						|
        private $defaultSavePath;
 | 
						|
 | 
						|
        /** @var \Magento\Framework\App\DeploymentConfig | \PHPUnit\Framework\MockObject\MockObject */
 | 
						|
        private $deploymentConfigMock;
 | 
						|
 | 
						|
        protected function setUp(): void
 | 
						|
        {
 | 
						|
            $this->_objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
 | 
						|
 | 
						|
            $this->deploymentConfigMock = $this->createMock(\Magento\Framework\App\DeploymentConfig::class);
 | 
						|
            $this->deploymentConfigMock
 | 
						|
                ->method('get')
 | 
						|
                ->willReturnCallback(function ($configPath) {
 | 
						|
                    switch ($configPath) {
 | 
						|
                        case Config::PARAM_SESSION_SAVE_METHOD:
 | 
						|
                            return 'files';
 | 
						|
                        case Config::PARAM_SESSION_CACHE_LIMITER:
 | 
						|
                            return $this->_cacheLimiter;
 | 
						|
                        default:
 | 
						|
                            return null;
 | 
						|
                    }
 | 
						|
                });
 | 
						|
 | 
						|
            $this->defaultSavePath = $this->_objectManager
 | 
						|
                ->get(\Magento\Framework\Filesystem\DirectoryList::class)
 | 
						|
                ->getPath(DirectoryList::SESSION);
 | 
						|
        }
 | 
						|
 | 
						|
        /**
 | 
						|
         * @magentoAppIsolation enabled
 | 
						|
         */
 | 
						|
        public function testDefaultConfiguration()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            /** @var \Magento\Framework\Filesystem $filesystem */
 | 
						|
            $filesystem = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
 | 
						|
                \Magento\Framework\Filesystem::class
 | 
						|
            );
 | 
						|
            $path = ini_get('session.save_path') ?:
 | 
						|
                $filesystem->getDirectoryRead(DirectoryList::SESSION)->getAbsolutePath();
 | 
						|
 | 
						|
            $this->assertEquals(
 | 
						|
                $path,
 | 
						|
                $model->getSavePath()
 | 
						|
            );
 | 
						|
            $this->assertEquals(
 | 
						|
                \Magento\Framework\Session\Config::COOKIE_LIFETIME_DEFAULT,
 | 
						|
                $model->getCookieLifetime()
 | 
						|
            );
 | 
						|
            $this->assertEquals($this->_cacheLimiter, $model->getCacheLimiter());
 | 
						|
            $this->assertEquals('/', $model->getCookiePath());
 | 
						|
            $this->assertEquals('localhost', $model->getCookieDomain());
 | 
						|
            $this->assertFalse($model->getCookieSecure());
 | 
						|
            $this->assertTrue($model->getCookieHttpOnly());
 | 
						|
            $this->assertEquals($model->getSavePath(), $model->getOption('save_path'));
 | 
						|
        }
 | 
						|
 | 
						|
        public function testSetOptionsInvalidValue()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $preValue = $model->getOptions();
 | 
						|
            $model->setOptions('');
 | 
						|
            $this->assertEquals($preValue, $model->getOptions());
 | 
						|
        }
 | 
						|
 | 
						|
        /**
 | 
						|
         * @dataProvider optionsProvider
 | 
						|
         */
 | 
						|
        public function testSetOptions($option, $getter, $value)
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $options = [$option => $value];
 | 
						|
            $model->setOptions($options);
 | 
						|
            $this->assertSame($value, $model->{$getter}());
 | 
						|
        }
 | 
						|
 | 
						|
        public function optionsProvider()
 | 
						|
        {
 | 
						|
            return [
 | 
						|
                ['save_path', 'getSavePath', __DIR__],
 | 
						|
                ['name', 'getName', 'FOOBAR'],
 | 
						|
                ['gc_probability', 'getGcProbability', 42],
 | 
						|
                ['gc_divisor', 'getGcDivisor', 3],
 | 
						|
                ['gc_maxlifetime', 'getGcMaxlifetime', 180],
 | 
						|
                ['serialize_handler', 'getSerializeHandler', 'php_binary'],
 | 
						|
                ['cookie_lifetime', 'getCookieLifetime', 180],
 | 
						|
                ['cookie_path', 'getCookiePath', '/foo/bar'],
 | 
						|
                ['cookie_domain', 'getCookieDomain', 'framework.zend.com'],
 | 
						|
                ['cookie_secure', 'getCookieSecure', true],
 | 
						|
                ['cookie_httponly', 'getCookieHttpOnly', true],
 | 
						|
                ['use_cookies', 'getUseCookies', false],
 | 
						|
                ['use_only_cookies', 'getUseOnlyCookies', true],
 | 
						|
                ['referer_check', 'getRefererCheck', 'foobar'],
 | 
						|
                ['entropy_file', 'getEntropyFile', __FILE__],
 | 
						|
                ['entropy_length', 'getEntropyLength', 42],
 | 
						|
                ['cache_limiter', 'getCacheLimiter', 'private'],
 | 
						|
                ['cache_expire', 'getCacheExpire', 42],
 | 
						|
                ['use_trans_sid', 'getUseTransSid', true],
 | 
						|
                ['hash_function', 'getHashFunction', 'md5'],
 | 
						|
                ['hash_bits_per_character', 'getHashBitsPerCharacter', 5],
 | 
						|
                ['url_rewriter_tags', 'getUrlRewriterTags', 'a=href']
 | 
						|
            ];
 | 
						|
        }
 | 
						|
 | 
						|
        public function testNameIsMutable()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $model->setName('FOOBAR');
 | 
						|
            $this->assertEquals('FOOBAR', $model->getName());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testCookieLifetimeIsMutable()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $model->setCookieLifetime(20);
 | 
						|
            $this->assertEquals(20, $model->getCookieLifetime());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testCookieLifetimeCanBeZero()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $model->setCookieLifetime(0);
 | 
						|
            $this->assertEquals(0, $model->getCookieLifetime());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testSettingInvalidCookieLifetime()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $preVal = $model->getCookieLifetime();
 | 
						|
            $model->setCookieLifetime('foobar_bogus');
 | 
						|
            $this->assertEquals($preVal, $model->getCookieLifetime());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testSettingInvalidCookieLifetime2()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $preVal = $model->getCookieLifetime();
 | 
						|
            $model->setCookieLifetime(-1);
 | 
						|
            $this->assertEquals($preVal, $model->getCookieLifetime());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testWrongMethodCall()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $this->expectException(\BadMethodCallException::class);
 | 
						|
            $this->expectExceptionMessage(
 | 
						|
                'Method "methodThatNotExist" does not exist in Magento\Framework\Session\Config'
 | 
						|
            );
 | 
						|
            $model->methodThatNotExist();
 | 
						|
        }
 | 
						|
 | 
						|
        public function testCookieSecureDefaultsToIniSettings()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $this->assertSame((bool)ini_get('session.cookie_secure'), $model->getCookieSecure());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testSetCookieSecureInOptions()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $model->setCookieSecure(true);
 | 
						|
            $this->assertTrue($model->getCookieSecure());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testCookieDomainIsMutable()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $model->setCookieDomain('example.com');
 | 
						|
            $this->assertEquals('example.com', $model->getCookieDomain());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testCookieDomainCanBeEmpty()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $model->setCookieDomain('');
 | 
						|
            $this->assertEquals('', $model->getCookieDomain());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testSettingInvalidCookieDomain()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $preVal = $model->getCookieDomain();
 | 
						|
            $model->setCookieDomain(24);
 | 
						|
            $this->assertEquals($preVal, $model->getCookieDomain());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testSettingInvalidCookieDomain2()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $preVal = $model->getCookieDomain();
 | 
						|
            $model->setCookieDomain('D:\\WINDOWS\\System32\\drivers\\etc\\hosts');
 | 
						|
            $this->assertEquals($preVal, $model->getCookieDomain());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testSetCookieHttpOnlyInOptions()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $model->setCookieHttpOnly(true);
 | 
						|
            $this->assertTrue($model->getCookieHttpOnly());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testUseCookiesDefaultsToIniSettings()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $this->assertSame((bool)ini_get('session.use_cookies'), $model->getUseCookies());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testSetUseCookiesInOptions()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $model->setUseCookies(true);
 | 
						|
            $this->assertTrue($model->getUseCookies());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testUseOnlyCookiesDefaultsToIniSettings()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $this->assertSame((bool)ini_get('session.use_only_cookies'), $model->getUseOnlyCookies());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testSetUseOnlyCookiesInOptions()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $model->setOption('use_only_cookies', true);
 | 
						|
            $this->assertTrue((bool)$model->getOption('use_only_cookies'));
 | 
						|
        }
 | 
						|
 | 
						|
        public function testRefererCheckDefaultsToIniSettings()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $this->assertSame(ini_get('session.referer_check'), $model->getRefererCheck());
 | 
						|
        }
 | 
						|
 | 
						|
        public function testRefererCheckIsMutable()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $model->setOption('referer_check', 'FOOBAR');
 | 
						|
            $this->assertEquals('FOOBAR', $model->getOption('referer_check'));
 | 
						|
        }
 | 
						|
 | 
						|
        public function testRefererCheckMayBeEmpty()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $model->setOption('referer_check', '');
 | 
						|
            $this->assertEquals('', $model->getOption('referer_check'));
 | 
						|
        }
 | 
						|
 | 
						|
        public function testSetSavePath()
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $model->setSavePath('some_save_path');
 | 
						|
            $this->assertEquals($model->getOption('save_path'), 'some_save_path');
 | 
						|
        }
 | 
						|
 | 
						|
        /**
 | 
						|
         * @param $mockPHPFunctionNum
 | 
						|
         * @param $givenSavePath
 | 
						|
         * @param $expectedSavePath
 | 
						|
         * @param $givenSaveHandler
 | 
						|
         * @param $expectedSaveHandler
 | 
						|
         * @dataProvider constructorDataProvider
 | 
						|
         */
 | 
						|
        public function testConstructor(
 | 
						|
            $mockPHPFunctionNum,
 | 
						|
            $givenSavePath,
 | 
						|
            $expectedSavePath,
 | 
						|
            $givenSaveHandler,
 | 
						|
            $expectedSaveHandler
 | 
						|
        ) {
 | 
						|
            global $mockPHPFunctions;
 | 
						|
            $mockPHPFunctions = $mockPHPFunctionNum;
 | 
						|
 | 
						|
            $sessionSaveHandler = ini_get('session.save_handler');
 | 
						|
            if ($expectedSavePath === 'default') {
 | 
						|
                $expectedSavePath = $this->defaultSavePath . '/';
 | 
						|
            }
 | 
						|
            if ($expectedSaveHandler === 'php') {
 | 
						|
                $expectedSaveHandler = $sessionSaveHandler;
 | 
						|
            }
 | 
						|
 | 
						|
            $deploymentConfigMock = $this->createMock(\Magento\Framework\App\DeploymentConfig::class);
 | 
						|
            $deploymentConfigMock
 | 
						|
                ->method('get')
 | 
						|
                ->willReturnCallback(function ($configPath) use ($givenSavePath, $givenSaveHandler) {
 | 
						|
                    switch ($configPath) {
 | 
						|
                        case Config::PARAM_SESSION_SAVE_METHOD:
 | 
						|
                            return $givenSaveHandler;
 | 
						|
                        case Config::PARAM_SESSION_CACHE_LIMITER:
 | 
						|
                            return $this->_cacheLimiter;
 | 
						|
                        case Config::PARAM_SESSION_SAVE_PATH:
 | 
						|
                            return $givenSavePath;
 | 
						|
                        default:
 | 
						|
                            return null;
 | 
						|
                    }
 | 
						|
                });
 | 
						|
 | 
						|
            $model = $this->_objectManager->create(
 | 
						|
                \Magento\Framework\Session\Config::class,
 | 
						|
                ['deploymentConfig' => $deploymentConfigMock]
 | 
						|
            );
 | 
						|
            $this->assertEquals($expectedSavePath, $model->getOption('save_path'));
 | 
						|
            $this->assertEquals($expectedSaveHandler, $model->getOption('session.save_handler'));
 | 
						|
            global $mockPHPFunctions;
 | 
						|
            $mockPHPFunctions = false;
 | 
						|
        }
 | 
						|
 | 
						|
        public function constructorDataProvider()
 | 
						|
        {
 | 
						|
            // preset value (null = not set), input value (null = not set), expected value
 | 
						|
            $savePathGiven = 'explicit_save_path';
 | 
						|
            $presetPath = 'preset_save_path';
 | 
						|
            return [
 | 
						|
                [2, $savePathGiven, $savePathGiven, 'db', 'db'],
 | 
						|
                [2, null, 'default', 'redis', 'redis'],
 | 
						|
                [1, $savePathGiven, $savePathGiven, null, 'php'],
 | 
						|
                [1, null, $presetPath, 'files', 'files'],
 | 
						|
            ];
 | 
						|
        }
 | 
						|
 | 
						|
        private function getModel(): \Magento\Framework\Session\Config
 | 
						|
        {
 | 
						|
            return $this->_objectManager->create(
 | 
						|
                \Magento\Framework\Session\Config::class,
 | 
						|
                ['deploymentConfig' => $this->deploymentConfigMock]
 | 
						|
            );
 | 
						|
        }
 | 
						|
 | 
						|
        /**
 | 
						|
         * Test Set SameSite Attribute
 | 
						|
         *
 | 
						|
         * @return void
 | 
						|
         */
 | 
						|
        public function testSetCookieInvalidSameSite(): void
 | 
						|
        {
 | 
						|
            $model = $this->getModel();
 | 
						|
            $this->expectException('InvalidArgumentException');
 | 
						|
            $this->expectExceptionMessage('Invalid Samesite attribute.');
 | 
						|
            $model->setCookieSameSite('foobar');
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |