diff --git a/Domain/Entry.php b/Domain/Entry.php index 55c4b37..9d12fac 100644 --- a/Domain/Entry.php +++ b/Domain/Entry.php @@ -178,31 +178,49 @@ public function setStrategy($strategy) */ public function serialize() { - return serialize(array( + return serialize($this->getSerializeData()); + } + + /** + * Implementation of \Serializable. + * + * @param string $serialized + */ + public function unserialize($serialized) + { + $this->setSerializeData(unserialize($serialized)); + } + + /** + * Get data for serialize + * @return array + */ + protected function getSerializeData() + { + return array( $this->mask, $this->id, $this->securityIdentity, $this->strategy, $this->auditFailure, $this->auditSuccess, - $this->granting, - )); + $this->granting + ); } /** - * Implementation of \Serializable. - * - * @param string $serialized + * Set unserialized data + * @param array $array Array of serialized data */ - public function unserialize($serialized) + protected function setSerializeData(array $array) { list($this->mask, - $this->id, - $this->securityIdentity, - $this->strategy, - $this->auditFailure, - $this->auditSuccess, - $this->granting - ) = unserialize($serialized); + $this->id, + $this->securityIdentity, + $this->strategy, + $this->auditFailure, + $this->auditSuccess, + $this->granting + ) = $array; } } diff --git a/Domain/FieldEntry.php b/Domain/FieldEntry.php index 86b1e5b..ca9e73d 100644 --- a/Domain/FieldEntry.php +++ b/Domain/FieldEntry.php @@ -27,15 +27,15 @@ class FieldEntry extends Entry implements FieldEntryInterface /** * Constructor. * - * @param int $id - * @param AclInterface $acl - * @param string $field + * @param int $id + * @param AclInterface $acl + * @param string $field * @param SecurityIdentityInterface $sid - * @param string $strategy - * @param int $mask - * @param bool $granting - * @param bool $auditFailure - * @param bool $auditSuccess + * @param string $strategy + * @param int $mask + * @param bool $granting + * @param bool $auditFailure + * @param bool $auditSuccess */ public function __construct($id, AclInterface $acl, $field, SecurityIdentityInterface $sid, $strategy, $mask, $granting, $auditFailure, $auditSuccess) { @@ -55,20 +55,33 @@ public function getField() /** * {@inheritdoc} */ - public function serialize() + public function unserialize($serialized) { - return serialize(array( - $this->field, - parent::serialize(), - )); + # Legacy support + $unserialized = unserialize($serialized); + + if (is_string($unserialized[1])) { + $unserialized[1] = unserialize($unserialized[1]); + $this->setSerializeData($unserialized); + } + + $this->setSerializeData($unserialized); } /** * {@inheritdoc} */ - public function unserialize($serialized) + protected function getSerializeData() + { + return array($this->field, parent::getSerializeData()); + } + + /** + * {@inheritdoc} + */ + protected function setSerializeData(array $array) { - list($this->field, $parentStr) = unserialize($serialized); - parent::unserialize($parentStr); + $this->field = $array[0]; + parent::setSerializeData($array[1]); } } diff --git a/Tests/Domain/FieldEntryTest.php b/Tests/Domain/FieldEntryTest.php index 735e2e8..b3e4053 100644 --- a/Tests/Domain/FieldEntryTest.php +++ b/Tests/Domain/FieldEntryTest.php @@ -22,6 +22,30 @@ public function testConstructor() $this->assertEquals('foo', $ace->getField()); } + public function testSerializeUnserializeSameSecurityIdentity() + { + $sid = $this->getSid(); + + $aceFirst = $this->getAce(null, $sid); + $aceSecond = $this->getAce(null, $sid); + + /** @var FieldEntry $uAceFirst */ + /** @var FieldEntry $uAceSecond */ + list($uAceFirst, $uAceSecond) = unserialize(serialize(array($aceFirst, $aceSecond))); + + $this->assertInstanceOf('Symfony\Component\Security\Acl\Model\SecurityIdentityInterface', $uAceFirst->getSecurityIdentity()); + $this->assertSame($uAceFirst->getSecurityIdentity(), $uAceSecond->getSecurityIdentity()); + } + + public function testUnserializeLegacy() + { + $serialized = 'C:48:"Symfony\Component\Security\Acl\Domain\FieldEntry":300:{a:2:{i:0;s:5:"field";i:1;s:265:"a:7:{i:0;s:4:"mask";i:1;i:1;i:2;O:20:"SecurityEdentityMock":2:{s:48:" SecurityEdentityMock __phpunit_invocationMocker";N;s:46:" SecurityEdentityMock __phpunit_originalObject";N;}i:3;s:8:"strategy";i:4;s:12:"auditFailure";i:5;s:12:"auditSuccess";i:6;s:8:"granting";}";}}'; + $ace = unserialize($serialized); + $this->assertNull($ace->getAcl()); + $this->assertEquals(1, $ace->getId()); + $this->assertEquals('field', $ace->getField()); + } + public function testSerializeUnserialize() { $ace = $this->getAce();