From 2d8eeb200faca3ca59d6cd09d768d5cfeef7df9c Mon Sep 17 00:00:00 2001 From: Kevin Date: Fri, 13 Jan 2017 10:07:29 +0100 Subject: [PATCH] [LDAP] implemented LDAP entry rename for ExtLdap adapter --- UPGRADE-4.0.md | 5 +++ .../Ldap/Adapter/ExtLdap/EntryManager.php | 15 ++++++- .../Ldap/Adapter/RenameEntryInterface.php | 22 +++++++++ .../Tests/Adapter/ExtLdap/LdapManagerTest.php | 45 +++++++++++++++++++ 4 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/Symfony/Component/Ldap/Adapter/RenameEntryInterface.php diff --git a/UPGRADE-4.0.md b/UPGRADE-4.0.md index 3b20430852..6eb01eb10c 100644 --- a/UPGRADE-4.0.md +++ b/UPGRADE-4.0.md @@ -390,3 +390,8 @@ Yaml the `!php/object` tag. * Duplicate mapping keys lead to a `ParseException`. + +Ldap +-------------- + + * The `RenameEntryInterface` has been deprecated, and merged with `EntryManagerInterface` diff --git a/src/Symfony/Component/Ldap/Adapter/ExtLdap/EntryManager.php b/src/Symfony/Component/Ldap/Adapter/ExtLdap/EntryManager.php index 455602c5af..225414884b 100644 --- a/src/Symfony/Component/Ldap/Adapter/ExtLdap/EntryManager.php +++ b/src/Symfony/Component/Ldap/Adapter/ExtLdap/EntryManager.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Ldap\Adapter\ExtLdap; use Symfony\Component\Ldap\Adapter\EntryManagerInterface; +use Symfony\Component\Ldap\Adapter\RenameEntryInterface; use Symfony\Component\Ldap\Entry; use Symfony\Component\Ldap\Exception\LdapException; use Symfony\Component\Ldap\Exception\NotBoundException; @@ -20,7 +21,7 @@ use Symfony\Component\Ldap\Exception\NotBoundException; * @author Charles Sarrazin * @author Bob van de Vijver */ -class EntryManager implements EntryManagerInterface +class EntryManager implements EntryManagerInterface, RenameEntryInterface { private $connection; @@ -67,6 +68,18 @@ class EntryManager implements EntryManagerInterface } } + /** + * {@inheritdoc} + */ + public function rename(Entry $entry, $newRdn, $removeOldRdn = true) + { + $con = $this->getConnectionResource(); + + if (!@ldap_rename($con, $entry->getDn(), $newRdn, null, $removeOldRdn)) { + throw new LdapException(sprintf('Could not rename entry "%s" to "%s": %s', $entry->getDn(), $newRdn, ldap_error($con))); + } + } + /** * Get the connection resource, but first check if the connection is bound. */ diff --git a/src/Symfony/Component/Ldap/Adapter/RenameEntryInterface.php b/src/Symfony/Component/Ldap/Adapter/RenameEntryInterface.php new file mode 100644 index 0000000000..8bc70bda96 --- /dev/null +++ b/src/Symfony/Component/Ldap/Adapter/RenameEntryInterface.php @@ -0,0 +1,22 @@ + + */ +interface RenameEntryInterface +{ + /** + * Renames an entry on the Ldap server. + * + * @param Entry $entry + * @param string $newRdn + * @param bool $removeOldRdn + */ + public function rename(Entry $entry, $newRdn, $removeOldRdn = true); +} diff --git a/src/Symfony/Component/Ldap/Tests/Adapter/ExtLdap/LdapManagerTest.php b/src/Symfony/Component/Ldap/Tests/Adapter/ExtLdap/LdapManagerTest.php index 846d6a313d..30e250ba89 100644 --- a/src/Symfony/Component/Ldap/Tests/Adapter/ExtLdap/LdapManagerTest.php +++ b/src/Symfony/Component/Ldap/Tests/Adapter/ExtLdap/LdapManagerTest.php @@ -147,4 +147,49 @@ class LdapManagerTest extends LdapTestCase return $results; } + + /** + * @group functional + */ + public function testLdapRename() + { + $result = $this->executeSearchQuery(1); + + $entry = $result[0]; + + $entryManager = $this->adapter->getEntryManager(); + $entryManager->rename($entry, 'cn=Kevin'); + + $result = $this->executeSearchQuery(1); + $renamedEntry = $result[0]; + $this->assertEquals($renamedEntry->getAttribute('cn')[0], 'Kevin'); + + $oldRdn = $entry->getAttribute('cn')[0]; + $entryManager->rename($renamedEntry, 'cn='.$oldRdn); + $this->executeSearchQuery(1); + } + + /** + * @group functional + */ + public function testLdapRenameWithoutRemovingOldRdn() + { + $result = $this->executeSearchQuery(1); + + $entry = $result[0]; + + $entryManager = $this->adapter->getEntryManager(); + $entryManager->rename($entry, 'cn=Kevin', false); + + $result = $this->executeSearchQuery(1); + + $newEntry = $result[0]; + $originalCN = $entry->getAttribute('cn')[0]; + + $this->assertContains($originalCN, $newEntry->getAttribute('cn')); + + $entryManager->rename($newEntry, 'cn='.$originalCN); + + $this->executeSearchQuery(1); + } }