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 ""; } else { echo ""; } - - echo "" . $member->getFullname() . ""; - echo "" . $member->uid . ""; - echo "" . $member->getMail() . ""; + $fullname = $attributes["gecos"][0]; + $mail = $attributes["mail"][0]; + echo "$fullname"; + echo "$uid"; + echo "$mail"; echo ""; echo "
- - + +
"; echo ""; echo ""; - $i++; } @@ -76,6 +75,5 @@ "; echo ""; echo ""; - $i++; } diff --git a/webroot/panel/ajax/get_group_members.php b/webroot/panel/ajax/get_group_members.php index 878f703a..920b0ab2 100644 --- a/webroot/panel/ajax/get_group_members.php +++ b/webroot/panel/ajax/get_group_members.php @@ -13,22 +13,24 @@ if (!$group->memberExists($USER)) { UnityHTTPD::forbidden("not a group member"); } -$members = $group->getGroupMembers(); +$members = $group->getGroupMembersAttributes(["gecos", "mail"]); $count = count($members); -foreach ($members as $key => $member) { - if ($member->uid == $group->getOwner()->uid) { +$i = 0; +foreach ($members as $uid => $attributes) { + if ($uid == $group->getOwner()->uid) { continue; } - - if ($key >= $count - 1) { - echo ""; + if ($i >= $count - 1) { + echo ""; } else { - echo ""; + echo ""; } - - echo "" . $member->getFullname() . ""; - echo "" . $member->uid . ""; - echo "" . $member->getMail() . ""; - echo ""; + $fullname = $attributes["gecos"][0]; + $mail = $attributes["mail"][0]; + echo "$fullname"; + echo "$uid"; + echo "$mail"; + echo ""; echo ""; + $i++; }