diff --git a/.travis.yml b/.travis.yml index dfadab7..1a05b1a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,12 +9,12 @@ env: matrix: fast_finish: true include: - - php: 5.6 - env: DB=MYSQL PHPUNIT_TEST=1 PHPCS_TEST=1 - - php: 7.0 - env: DB=MYSQL PHPUNIT_TEST=1 - php: 7.1 env: DB=MYSQL PHPUNIT_TEST=1 + - php: 7.2 + env: DB=MYSQL PHPUNIT_TEST=1 PHPCS_TEST=1 + - php: 7.3 + env: DB=MYSQL PHPUNIT_TEST=1 before_script: - composer self-update || true diff --git a/code/DynamoDbClient.php b/code/DynamoDbClient.php new file mode 100644 index 0000000..de4a84a --- /dev/null +++ b/code/DynamoDbClient.php @@ -0,0 +1,82 @@ +sessionTable = $sessionTable; + parent::__construct(...$args); + } + + /** + * Initialize the client with the session data attribute (within the session table) + * This method must be used to finish the client initialization, otherwise session updates will not be + * intercepted and amended + * + * @param string $dataAttribute attribute of the session table where session data is persisted + */ + public function setSessionTableDataAttribute($dataAttribute) + { + $this->dataAttribute = $dataAttribute; + } + + public function updateItem($attributes, ...$extra) + { + $this->patchSessionUpdate($attributes); + return parent::updateItem($attributes, ...$extra); + } + + /** + * Update the session data type from 'S' to 'B' (from string to binary) + * + * @param mixed &$data Data to be updated in-place + */ + private function patchSessionUpdate(&$data) + { + if (!isset($data['TableName']) || $data['TableName'] !== $this->sessionTable) { + return; + } + + if (!isset($data['AttributeUpdates'][$this->dataAttribute]['Value']['S'])) { + return; + } + + $data['AttributeUpdates'][$this->dataAttribute]['Value']['B'] = $data['AttributeUpdates'][$this->dataAttribute]['Value']['S']; + unset($data['AttributeUpdates'][$this->dataAttribute]['Value']['S']); + } +} diff --git a/code/Model/DynamoDbSession.php b/code/Model/DynamoDbSession.php index fde4273..fd7e9d1 100644 --- a/code/Model/DynamoDbSession.php +++ b/code/Model/DynamoDbSession.php @@ -2,8 +2,8 @@ namespace SilverStripe\DynamoDb\Model; -use Aws\DynamoDb\DynamoDbClient; -use Aws\DynamoDb\SessionHandler; +use SilverStripe\DynamoDb\DynamoDbClient; +use SilverStripe\DynamoDb\SessionHandler; use Aws\DoctrineCacheAdapter; use Doctrine\Common\Cache\ApcuCache; use SilverStripe\Core\Config\Config; @@ -78,7 +78,8 @@ public static function get() public function __construct($options, $table) { - $this->client = new DynamoDbClient(array_merge(['version' => '2012-08-10'], $options)); + $this->client = new DynamoDbClient($table, array_merge(['version' => '2012-08-10'], $options)); + $this->table = $table; $this->handler = SessionHandler::fromClient( $this->client, diff --git a/code/SessionHandler.php b/code/SessionHandler.php new file mode 100644 index 0000000..a40b5ba --- /dev/null +++ b/code/SessionHandler.php @@ -0,0 +1,36 @@ +setSessionTableDataAttribute($handler->connection->getDataAttribute()); + + return $handler; + } + + public function __construct(SessionConnectionInterface $connection) + { + $this->connection = $connection; + parent::__construct($connection); + } +} diff --git a/composer.json b/composer.json index 1f2702a..fd7721e 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,8 @@ "silverstripe/framework": "^4@dev" }, "require-dev": { - "phpunit/PHPUnit": "^5.7" + "phpunit/PHPUnit": "^5.7", + "squizlabs/php_codesniffer": "^3.0" }, "autoload": { "psr-4": {