Skip to content

Commit

Permalink
[Security][Acl] Fix symfony#5787 : Add MutableAclProvider::updateUser…
Browse files Browse the repository at this point in the history
…SecurityIdentity
  • Loading branch information
lemoinem committed Dec 23, 2013
1 parent c0e4c4a commit 69c9d8c
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 0 deletions.
36 changes: 36 additions & 0 deletions src/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php
Expand Up @@ -351,6 +351,17 @@ public function updateAcl(MutableAclInterface $acl)
}
}

/**
* Updates a user security identity when the user's username changes
*
* @param UserSecurityIdentity $usid
* @param string $oldUsername
*/
public function updateUserSecurityIdentity(UserSecurityIdentity $usid, $oldUsername)
{
$this->connection->executeQuery($this->getUpdateUserSecurityIdentitySql($usid, $oldUsername));
}

/**
* Constructs the SQL for deleting access control entries.
*
Expand Down Expand Up @@ -633,6 +644,31 @@ protected function getUpdateObjectIdentitySql($pk, array $changes)
);
}

/**
* Constructs the SQL for updating a user security identity.
*
* @param UserSecurityIdentity $usid
* @param string $oldUsername
* @return string
*/
protected function getUpdateUserSecurityIdentitySql(UserSecurityIdentity $usid, $oldUsername)
{
if ($usid->getUsername() == $oldUsername) {
throw new \InvalidArgumentException('There are no changes.');
}

$oldIdentifier = $usid->getClass().'-'.$oldUsername;
$newIdentifier = $usid->getClass().'-'.$usid->getUsername();

return sprintf(
'UPDATE %s SET identifier = %s WHERE identifier = %s AND username = %s',
$this->options['sid_table_name'],
$this->connection->quote($newIdentifier),
$this->connection->quote($oldIdentifier),
$this->connection->getDatabasePlatform()->convertBooleans(true)
);
}

/**
* Constructs the SQL for updating an ACE.
*
Expand Down
Expand Up @@ -405,6 +405,35 @@ public function testUpdateAclDeletingObjectFieldAcesThrowsDBConstraintViolations
$acl = $provider->findAcl($oid);
$acl->insertObjectFieldAce($fieldName, $sid3, 4);
$provider->updateAcl($acl);

public function testUpdateUserSecurityIdentity()
{
$provider = $this->getProvider();
$acl = $provider->createAcl(new ObjectIdentity(1, 'Foo'));
$sid = new UserSecurityIdentity('johannes', 'FooClass');
$acl->setEntriesInheriting(!$acl->isEntriesInheriting());

$acl->insertObjectAce($sid, 1);
$acl->insertClassAce($sid, 5, 0, false);
$acl->insertObjectAce($sid, 2, 1, true);
$acl->insertClassFieldAce('field', $sid, 2, 0, true);
$provider->updateAcl($acl);

$newSid = new UserSecurityIdentity('mathieu', 'FooClass');
$provider->updateUserSecurityIdentity($newSid, 'johannes');

$reloadProvider = $this->getProvider();
$reloadedAcl = $reloadProvider->findAcl(new ObjectIdentity(1, 'Foo'));

$this->assertNotSame($acl, $reloadedAcl);
$this->assertSame($acl->isEntriesInheriting(), $reloadedAcl->isEntriesInheriting());

$aces = $acl->getObjectAces();
$reloadedAces = $reloadedAcl->getObjectAces();
$this->assertEquals(count($aces), count($reloadedAces));
foreach ($reloadedAces as $ace) {
$this->assertTrue($ace->getSecurityIdentity()->equals($newSid));
}
}

/**
Expand Down

0 comments on commit 69c9d8c

Please sign in to comment.