Skip to content

Commit

Permalink
Add SameSiteCookieCapableInterface
Browse files Browse the repository at this point in the history
Signed-off-by: Josef Moravec <[email protected]>
  • Loading branch information
xmorave2 authored and weierophinney committed Jun 30, 2021
1 parent 1fd3631 commit fa47772
Show file tree
Hide file tree
Showing 6 changed files with 180 additions and 10 deletions.
9 changes: 0 additions & 9 deletions src/Config/ConfigInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,6 @@ public function setCookieDomain($cookieDomain);
/** @return string */
public function getCookieDomain();

/**
* @param bool $cookieSameSite
* @return void
*/
public function setCookieSameSite($cookieSameSite);

/** @return bool */
public function getCookieSameSite();

/**
* @param bool $cookieSecure
* @return void
Expand Down
15 changes: 15 additions & 0 deletions src/Config/SameSiteCookieCapableInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

/**
* @see https://github.com/laminas/laminas-session for the canonical source repository
* @copyright https://github.com/laminas/laminas-session/blob/master/COPYRIGHT.md
* @license https://github.com/laminas/laminas-session/blob/master/LICENSE.md New BSD License
*/

namespace Laminas\Session\Config;

interface SameSiteCookieCapableInterface extends ConfigInterface
{
public function setCookieSameSite($cookieSameSite);
public function getCookieSameSite();
}
2 changes: 1 addition & 1 deletion src/Config/StandardConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
/**
* Standard session configuration
*/
class StandardConfig implements ConfigInterface
class StandardConfig implements SameSiteCookieCapableInterface
{
/**
* session.name
Expand Down
12 changes: 12 additions & 0 deletions src/Service/SessionConfigFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Laminas\ServiceManager\FactoryInterface;
use Laminas\ServiceManager\ServiceLocatorInterface;
use Laminas\Session\Config\ConfigInterface;
use Laminas\Session\Config\SameSiteCookieCapableInterface;
use Laminas\Session\Config\SessionConfig;

use function class_exists;
Expand Down Expand Up @@ -60,6 +61,17 @@ public function __invoke(ContainerInterface $container, $requestedName, ?array $
ConfigInterface::class
));
}

if (
isset($config['cookie_samesite'])
&& ! $sessionConfig instanceof SameSiteCookieCapableInterface
) {
throw new ServiceNotCreatedException(sprintf(
'Invalid configuration class "%s". When configuration option "cookie_samesite" is used, the configuration class must implement %s',
$class,
SameSiteCookieCapableInterface::class
));
}
$sessionConfig->setOptions($config);

return $sessionConfig;
Expand Down
18 changes: 18 additions & 0 deletions test/Service/SessionConfigFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@

use Laminas\ServiceManager\Config;
use Laminas\ServiceManager\ServiceManager;
use Laminas\ServiceManager\Exception\ServiceNotCreatedException;
use Laminas\Session\Config\ConfigInterface;
use Laminas\Session\Config\SessionConfig;
use Laminas\Session\Config\StandardConfig;
use Laminas\Session\Service\SessionConfigFactory;
use LaminasTest\Session\TestAsset\TestConfig;
use PHPUnit\Framework\TestCase;

/**
Expand Down Expand Up @@ -73,4 +75,20 @@ public function testServiceReceivesConfiguration(): void
$config = $this->services->get(ConfigInterface::class);
self::assertEquals('laminas', $config->getName());
}

public function testServiceNotCreatedWhenInvalidSamesiteConfig()
{
$this->services->setService(
'config',
[
'session_config' => [
'config_class' => TestConfig::class,
'cookie_samesite' => 'Lax',
],
]
);
$this->expectException(ServiceNotCreatedException::class);
$this->expectExceptionMessage('Invalid configuration class "LaminasTest\Session\TestAsset\TestConfig". When configuration option "cookie_samesite" is used, the configuration class must implement Laminas\Session\Config\SameSiteCookieCapableInterface');
$this->services->get(ConfigInterface::class);
}
}
134 changes: 134 additions & 0 deletions test/TestAsset/TestConfig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
<?php

/**
* @see https://github.com/laminas/laminas-session for the canonical source repository
* @copyright https://github.com/laminas/laminas-session/blob/master/COPYRIGHT.md
* @license https://github.com/laminas/laminas-session/blob/master/LICENSE.md New BSD License
*/

namespace LaminasTest\Session\TestAsset;

use Laminas\Session\Config\ConfigInterface;

class TestConfig implements ConfigInterface
{
public function setOptions($options)
{
return;
}

public function getOptions()
{
return;
}

public function setOption($option, $value)
{
return;
}

public function getOption($option)
{
return;
}

public function hasOption($option)
{
return;
}

public function toArray()
{
return;
}

public function setName($name)
{
return;
}

public function getName()
{
return;
}

public function setSavePath($savePath)
{
return;
}

public function getSavePath()
{
return;
}

public function setCookieLifetime($cookieLifetime)
{
return;
}

public function getCookieLifetime()
{
return;
}

public function setCookiePath($cookiePath)
{
return;
}

public function getCookiePath()
{
return;
}

public function setCookieDomain($cookieDomain)
{
return;
}

public function getCookieDomain()
{
return;
}

public function setCookieSecure($cookieSecure)
{
return;
}

public function getCookieSecure()
{
return;
}

public function setCookieHttpOnly($cookieHttpOnly)
{
return;
}

public function getCookieHttpOnly()
{
return;
}

public function setUseCookies($useCookies)
{
return;
}

public function getUseCookies()
{
return;
}

public function setRememberMeSeconds($rememberMeSeconds)
{
return;
}

public function getRememberMeSeconds()
{
return;
}
}

0 comments on commit fa47772

Please sign in to comment.