diff --git a/src/app/Backends/LDAP.php b/src/app/Backends/LDAP.php --- a/src/app/Backends/LDAP.php +++ b/src/app/Backends/LDAP.php @@ -713,6 +713,13 @@ $domainBaseDN = "ou={$domain->namespace},{$hostedRootDN}"; foreach ($group->members as $member) { + $member = strtolower($member); + + // filter out duplicate members + if (in_array($member, $validMembers)) { + continue; + } + list($local, $domainName) = explode('@', $member); $memberDN = "uid={$member},ou=People,{$domainBaseDN}"; @@ -747,7 +754,10 @@ // Update members in sql (some might have been removed), // skip model events to not invoke another update job + sort($validMembers); + $group->members = $validMembers; + Group::withoutEvents(function () use ($group) { $group->save(); }); diff --git a/src/app/Group.php b/src/app/Group.php --- a/src/app/Group.php +++ b/src/app/Group.php @@ -197,7 +197,10 @@ */ public function setMembersAttribute(array $members): void { - $members = array_filter(array_map('strtolower', $members)); + $members = array_unique(array_filter(array_map('strtolower', $members))); + + sort($members); + $this->attributes['members'] = implode(',', $members); }