diff --git a/resources/lib/UnityGroup.php b/resources/lib/UnityGroup.php index 3517a022..e2084906 100644 --- a/resources/lib/UnityGroup.php +++ b/resources/lib/UnityGroup.php @@ -470,4 +470,13 @@ public static function ownerMail2GID(string $email): string $ownerUid = $entry->getAttribute("cn")[0]; return self::PI_PREFIX . $ownerUid; } + + public function getGroupMembersAttributes(array $attributes, array $default_values = []): array + { + return $this->LDAP->getUsersAttributes( + $this->getGroupMemberUIDs(), + $attributes, + $default_values, + ); + } } diff --git a/resources/lib/UnityLDAP.php b/resources/lib/UnityLDAP.php index fe630b52..0b7ede67 100644 --- a/resources/lib/UnityLDAP.php +++ b/resources/lib/UnityLDAP.php @@ -2,6 +2,7 @@ namespace UnityWebPortal\lib; +use UnityWebPortal\lib\exceptions\EntryNotFoundException; use PHPOpenLDAPer\LDAPConn; use PHPOpenLDAPer\LDAPEntry; @@ -487,4 +488,50 @@ public function getSortedGroupsForRedis(): array sort($groups); return $groups; } + + /** + * returns an array with each UID as an array key + * @throws \UnityWebPortal\lib\exceptions\EntryNotFoundException + */ + public function getUsersAttributes( + array $uids, + array $attributes, + array $default_values = [], + ): array { + if (count($uids) === 0) { + return []; + } + $attributes = array_map("strtolower", $attributes); + if (in_array("uid", $attributes)) { + $asked_for_uid_attribute = true; + } else { + $asked_for_uid_attribute = false; + array_push($attributes, "uid"); + } + $uids_escaped = array_map(fn($x) => ldap_escape($x, "", LDAP_ESCAPE_FILTER), $uids); + $filter = + "(&(objectClass=posixAccount)(|" . + implode("", array_map(fn($x) => "(uid=$x)", $uids_escaped)) . + "))"; + $entries = $this->baseOU->getChildrenArrayStrict( + $attributes, + true, + $filter, + $default_values, + ); + $output = []; + foreach ($entries as $entry) { + $uid = $entry["uid"][0]; + if (!$asked_for_uid_attribute) { + unset($entry["uid"]); + } + $output[$uid] = $entry; + } + $uids_not_found = array_diff($uids, array_keys($output)); + if (count($uids_not_found) > 0) { + throw new EntryNotFoundException(jsonEncode($uids_not_found)); + } + ksort($output); + return $output; + } } diff --git a/webroot/admin/ajax/get_group_members.php b/webroot/admin/ajax/get_group_members.php index 9d98e44e..d2434e55 100644 --- a/webroot/admin/ajax/get_group_members.php +++ b/webroot/admin/ajax/get_group_members.php @@ -14,43 +14,42 @@ } $group = new UnityGroup($_GET["gid"], $LDAP, $SQL, $MAILER, $REDIS, $WEBHOOK); -$members = $group->getGroupMembers(); +$members = $group->getGroupMembersAttributes(["gecos", "mail"]); $requests = $group->getRequests(); $i = 0; $count = count($members) + count($requests); -foreach ($members as $member) { - if ($member->uid == $group->getOwner()->uid) { +foreach ($members as $uid => $attributes) { + if ($uid == $group->getOwner()->uid) { continue; } - if ($i >= $count - 1) { echo "