From 4ef9e9f78adc7004f4f279fd5b38ae09534174ce Mon Sep 17 00:00:00 2001 From: Andrzej Lipka Date: Fri, 5 Dec 2014 21:42:45 +0100 Subject: [PATCH 1/3] Test show FieldEntry serialization Bug --- Tests/Domain/FieldEntryTest.php | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Tests/Domain/FieldEntryTest.php b/Tests/Domain/FieldEntryTest.php index 735e2e8..5f4301c 100644 --- a/Tests/Domain/FieldEntryTest.php +++ b/Tests/Domain/FieldEntryTest.php @@ -40,6 +40,37 @@ public function testSerializeUnserialize() $this->assertEquals($ace->isAuditFailure(), $uAce->isAuditFailure()); } + public function testSerializeUnserializeMoreAceWithSameSecurityIdentity() + { + $sid = $this->getSid(); + + $aceFirst = $this->getAce(null, $sid); + $aceSecond = $this->getAce(null, $sid); + + $serializedFirst = serialize(array($aceFirst, $aceSecond)); + list($uAceFirst, $uAceSecond) = unserialize($serializedFirst); + + $this->assertNull($uAceFirst->getAcl()); + $this->assertInstanceOf('Symfony\Component\Security\Acl\Model\SecurityIdentityInterface', $uAceFirst->getSecurityIdentity()); + $this->assertEquals($aceFirst->getId(), $uAceFirst->getId()); + $this->assertEquals($aceFirst->getField(), $uAceFirst->getField()); + $this->assertEquals($aceFirst->getMask(), $uAceFirst->getMask()); + $this->assertEquals($aceFirst->getStrategy(), $uAceFirst->getStrategy()); + $this->assertEquals($aceFirst->isGranting(), $uAceFirst->isGranting()); + $this->assertEquals($aceFirst->isAuditSuccess(), $uAceFirst->isAuditSuccess()); + $this->assertEquals($aceFirst->isAuditFailure(), $uAceFirst->isAuditFailure()); + + $this->assertNull($uAceSecond->getAcl()); + $this->assertInstanceOf('Symfony\Component\Security\Acl\Model\SecurityIdentityInterface', $uAceSecond->getSecurityIdentity()); + $this->assertEquals($aceSecond->getId(), $uAceSecond->getId()); + $this->assertEquals($aceSecond->getField(), $uAceSecond->getField()); + $this->assertEquals($aceSecond->getMask(), $uAceSecond->getMask()); + $this->assertEquals($aceSecond->getStrategy(), $uAceSecond->getStrategy()); + $this->assertEquals($aceSecond->isGranting(), $uAceSecond->isGranting()); + $this->assertEquals($aceSecond->isAuditSuccess(), $uAceSecond->isAuditSuccess()); + $this->assertEquals($aceSecond->isAuditFailure(), $uAceSecond->isAuditFailure()); + } + protected function getAce($acl = null, $sid = null) { if (null === $acl) { From 3369f761b032e0ddaa55035e4d2cc6dee3e0ef08 Mon Sep 17 00:00:00 2001 From: Ivan Shakuta Date: Thu, 15 Oct 2015 23:34:19 +0300 Subject: [PATCH 2/3] Test to show FieldEntry serialization Bug - change serialize input format - to avoid segmentation fault on php 5.5.26 os x - to make it exactly the same format as used internally by Acl::serialize --- Tests/Domain/FieldEntryTest.php | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Tests/Domain/FieldEntryTest.php b/Tests/Domain/FieldEntryTest.php index 5f4301c..7c0e723 100644 --- a/Tests/Domain/FieldEntryTest.php +++ b/Tests/Domain/FieldEntryTest.php @@ -47,8 +47,20 @@ public function testSerializeUnserializeMoreAceWithSameSecurityIdentity() $aceFirst = $this->getAce(null, $sid); $aceSecond = $this->getAce(null, $sid); - $serializedFirst = serialize(array($aceFirst, $aceSecond)); - list($uAceFirst, $uAceSecond) = unserialize($serializedFirst); + // as used in DoctrineAclCache::putInCache (line 142) + $serialized = serialize( + array( // Acl:serialize (line 260) + [ // classFieldAces + 'fieldOne' => [$aceFirst], + 'fieldTwo' => [$aceSecond], + ] + ) + ); + + $unserialized = unserialize($serialized); + $uAceFirst = $unserialized[0]['fieldOne'][0]; + $uAceSecond = $unserialized[0]['fieldTwo'][0]; + $this->assertNull($uAceFirst->getAcl()); $this->assertInstanceOf('Symfony\Component\Security\Acl\Model\SecurityIdentityInterface', $uAceFirst->getSecurityIdentity()); @@ -61,7 +73,10 @@ public function testSerializeUnserializeMoreAceWithSameSecurityIdentity() $this->assertEquals($aceFirst->isAuditFailure(), $uAceFirst->isAuditFailure()); $this->assertNull($uAceSecond->getAcl()); + + // Bug: this will fail, securityIdentity is FieldEntry $this->assertInstanceOf('Symfony\Component\Security\Acl\Model\SecurityIdentityInterface', $uAceSecond->getSecurityIdentity()); + $this->assertEquals($aceSecond->getId(), $uAceSecond->getId()); $this->assertEquals($aceSecond->getField(), $uAceSecond->getField()); $this->assertEquals($aceSecond->getMask(), $uAceSecond->getMask()); From 896b53d5357c99cc1a9563241c926d983ff24555 Mon Sep 17 00:00:00 2001 From: Ivan Shakuta Date: Fri, 16 Oct 2015 16:25:39 +0300 Subject: [PATCH 3/3] FieldEntry serialize/unserialize - fix field entry unserialize in case when few FieldEntry instances has save SecurityIdentityInterface instance --- Domain/Entry.php | 4 +++- Tests/Domain/FieldEntryTest.php | 34 +++++++++++---------------------- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/Domain/Entry.php b/Domain/Entry.php index 55c4b37..7797cf1 100644 --- a/Domain/Entry.php +++ b/Domain/Entry.php @@ -181,7 +181,9 @@ public function serialize() return serialize(array( $this->mask, $this->id, - $this->securityIdentity, + // clone due to the unserialize issue in php 5.4-5.6 + // when Acl has few FieldEntry objects with the same SecurityIdentityInterface instance + clone $this->securityIdentity, $this->strategy, $this->auditFailure, $this->auditSuccess, diff --git a/Tests/Domain/FieldEntryTest.php b/Tests/Domain/FieldEntryTest.php index 7c0e723..e189931 100644 --- a/Tests/Domain/FieldEntryTest.php +++ b/Tests/Domain/FieldEntryTest.php @@ -40,6 +40,9 @@ public function testSerializeUnserialize() $this->assertEquals($ace->isAuditFailure(), $uAce->isAuditFailure()); } + /** + * Test that two FieldEntry objects correctly serialized and unserialized + */ public function testSerializeUnserializeMoreAceWithSameSecurityIdentity() { $sid = $this->getSid(); @@ -61,29 +64,14 @@ public function testSerializeUnserializeMoreAceWithSameSecurityIdentity() $uAceFirst = $unserialized[0]['fieldOne'][0]; $uAceSecond = $unserialized[0]['fieldTwo'][0]; - - $this->assertNull($uAceFirst->getAcl()); - $this->assertInstanceOf('Symfony\Component\Security\Acl\Model\SecurityIdentityInterface', $uAceFirst->getSecurityIdentity()); - $this->assertEquals($aceFirst->getId(), $uAceFirst->getId()); - $this->assertEquals($aceFirst->getField(), $uAceFirst->getField()); - $this->assertEquals($aceFirst->getMask(), $uAceFirst->getMask()); - $this->assertEquals($aceFirst->getStrategy(), $uAceFirst->getStrategy()); - $this->assertEquals($aceFirst->isGranting(), $uAceFirst->isGranting()); - $this->assertEquals($aceFirst->isAuditSuccess(), $uAceFirst->isAuditSuccess()); - $this->assertEquals($aceFirst->isAuditFailure(), $uAceFirst->isAuditFailure()); - - $this->assertNull($uAceSecond->getAcl()); - - // Bug: this will fail, securityIdentity is FieldEntry - $this->assertInstanceOf('Symfony\Component\Security\Acl\Model\SecurityIdentityInterface', $uAceSecond->getSecurityIdentity()); - - $this->assertEquals($aceSecond->getId(), $uAceSecond->getId()); - $this->assertEquals($aceSecond->getField(), $uAceSecond->getField()); - $this->assertEquals($aceSecond->getMask(), $uAceSecond->getMask()); - $this->assertEquals($aceSecond->getStrategy(), $uAceSecond->getStrategy()); - $this->assertEquals($aceSecond->isGranting(), $uAceSecond->isGranting()); - $this->assertEquals($aceSecond->isAuditSuccess(), $uAceSecond->isAuditSuccess()); - $this->assertEquals($aceSecond->isAuditFailure(), $uAceSecond->isAuditFailure()); + $this->assertInstanceOf( + 'Symfony\Component\Security\Acl\Model\SecurityIdentityInterface', + $uAceFirst->getSecurityIdentity() + ); + $this->assertInstanceOf( + 'Symfony\Component\Security\Acl\Model\SecurityIdentityInterface', + $uAceSecond->getSecurityIdentity() + ); } protected function getAce($acl = null, $sid = null)