Skip to content

Commit 3c7ab37

Browse files
committed
Allow adding and removing values to/from multi-valued attributes
1 parent ee51f74 commit 3c7ab37

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

src/Symfony/Component/Ldap/Adapter/ExtLdap/EntryManager.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,47 @@ public function remove(Entry $entry)
6767
}
6868
}
6969

70+
/**
71+
* Adds values to an entry's multi-valued attribute from the Ldap server.
72+
*
73+
* @param Entry $entry
74+
* @param string $attribute
75+
* @param array $values
76+
*
77+
* @throws NotBoundException
78+
* @throws LdapException
79+
*/
80+
public function addAttributeValues(Entry $entry, string $attribute, array $values)
81+
{
82+
$con = $this->getConnectionResource();
83+
84+
if (!@ldap_mod_add($con, $entry->getDn(), array($attribute => $values))) {
85+
throw new LdapException(sprintf('Could not add values to entry "%s", attribute %s: %s', $entry->getDn(),
86+
$attribute, ldap_error($con)));
87+
}
88+
}
89+
90+
/**
91+
* Removes values from an entry's multi-valued attribute from the Ldap server.
92+
*
93+
* @param Entry $entry
94+
* @param string $attribute
95+
* @param array $values
96+
*
97+
* @throws NotBoundException
98+
* @throws LdapException
99+
*/
100+
public function removeAttributeValues(Entry $entry, string $attribute, array $values)
101+
{
102+
$con = $this->getConnectionResource();
103+
104+
if (!@ldap_mod_del($con, $entry->getDn(), array($attribute => $values))) {
105+
throw new LdapException(sprintf('Could not remove values from entry "%s", attribute %s: %s',
106+
$entry->getDn(),
107+
$attribute, ldap_error($con)));
108+
}
109+
}
110+
70111
/**
71112
* {@inheritdoc}
72113
*/

src/Symfony/Component/Ldap/Tests/Adapter/ExtLdap/LdapManagerTest.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,4 +192,50 @@ public function testLdapRenameWithoutRemovingOldRdn()
192192

193193
$this->executeSearchQuery(1);
194194
}
195+
196+
public function testLdapAddRemoveAttributeValues()
197+
{
198+
$entryManager = $this->adapter->getEntryManager();
199+
200+
$result = $this->executeSearchQuery(1);
201+
$entry = $result[0];
202+
203+
$entryManager->addAttributeValues($entry, 'mail', array('fabpot@example.org', 'fabpot2@example.org'));
204+
205+
$result = $this->executeSearchQuery(1);
206+
$newEntry = $result[0];
207+
208+
$this->assertCount(4, $newEntry->getAttribute('mail'));
209+
210+
$entryManager->removeAttributeValues($newEntry, 'mail', array('fabpot@example.org', 'fabpot2@example.org'));
211+
212+
$result = $this->executeSearchQuery(1);
213+
$newNewEntry = $result[0];
214+
215+
$this->assertCount(2, $newNewEntry->getAttribute('mail'));
216+
}
217+
218+
public function testLdapRemoveAttributeValuesError()
219+
{
220+
$entryManager = $this->adapter->getEntryManager();
221+
222+
$result = $this->executeSearchQuery(1);
223+
$entry = $result[0];
224+
225+
$this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}(LdapException::class);
226+
227+
$entryManager->removeAttributeValues($entry, 'mail', array('fabpot@example.org'));
228+
}
229+
230+
public function testLdapAddAttributeValuesError()
231+
{
232+
$entryManager = $this->adapter->getEntryManager();
233+
234+
$result = $this->executeSearchQuery(1);
235+
$entry = $result[0];
236+
237+
$this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}(LdapException::class);
238+
239+
$entryManager->addAttributeValues($entry, 'mail', $entry->getAttribute('mail'));
240+
}
195241
}

0 commit comments

Comments
 (0)