From ae154a7424bd46c82ca2756591c146c1a7f05db5 Mon Sep 17 00:00:00 2001
From: Roland Gruber
Date: Sat, 26 May 2007 18:42:08 +0000
Subject: [PATCH] allow to show primary group members (patch 1722460) thanks to
Ludek Finstrle
---
lam/lib/types/group.inc | 164 ++++++++++++++++++++++++++++++++++++++--
1 file changed, 157 insertions(+), 7 deletions(-)
diff --git a/lam/lib/types/group.inc b/lam/lib/types/group.inc
index be6fbafd..245df6d3 100644
--- a/lam/lib/types/group.inc
+++ b/lam/lib/types/group.inc
@@ -26,6 +26,7 @@ $Id$
*
* @package types
* @author Roland Gruber
+* @author Ludek Finstrle
*/
/**
@@ -98,6 +99,16 @@ class group extends baseType {
*/
class lamGroupList extends lamList {
+ /** Controls if include primary group members into group memebers */
+ var $include_primary = "";
+ /** Primary group members hash */
+ var $primary_hash = array();
+ /** Controls if primary group members needs refresh */
+ var $refresh_primary = false;
+ /** Controls if primary group members are using */
+ // This is here for future use with primary group members listing
+ var $use_primary = false;
+
/**
* Constructor
*
@@ -115,6 +126,49 @@ class lamGroupList extends lamList {
'createPDFAll' => _("Create PDF for all groups"));
}
+ /**
+ * Manages all POST actions (e.g. button pressed) for the account lists.
+ */
+ function listDoPost() {
+ parent::listDoPost();
+ // check if list primary group members
+ if (isset($_POST['apply_group_addopts'])) {
+ $use_primary = $this->use_primary;
+ $this->include_primary = $_POST['addopts_include_primary'];
+ $this->groupSetUsePrimary();
+ if (!$use_primary && $this->use_primary)
+ $this->refresh_primary = true;
+ }
+ }
+
+ /**
+ * Sets some internal parameters.
+ */
+ function listGetParams() {
+ parent::listGetParams();
+ // generate list primary group memebers
+ // after parent::listGetParams is $this->refresh set to correct value
+ if ($this->use_primary && !$this->refresh && ($this->refresh_primary || (sizeof($this->primary_hash) == 0)))
+ $this->groupRefreshPrimary();
+ }
+
+ /**
+ * Prints additional option field for primary member display.
+ */
+ function listPrintAdditionalOptions() {
+ parent::listPrintAdditionalOptions();
+ // show primary group members option
+ if (in_array("memberuid", $this->attrArray)) {
+ echo "" . _("Show primary group members as normal group members") . ": ";
+ echo "type . "\" type=\"checkbox\" name=\"addopts_include_primary\"";
+ if ($this->include_primary == "on")
+ echo " checked";
+ echo ">";
+ echo (" type . "\" type=\"submit\" name=\"apply_group_addopts\" value=\"" . _("Apply") . "\">");
+ echo "
\n";
+ }
+ }
+
/**
* Prints the content of a cell in the account list for a given LDAP entry and attribute.
*
@@ -123,15 +177,59 @@ class lamGroupList extends lamList {
*/
function listPrintTableCellContent(&$entry, &$attribute) {
if ($attribute == "memberuid") {
- if (!is_array($entry[$attribute]) || (sizeof($entry[$attribute]) < 1)) return;
- if (isset($entry[$attribute]['count'])) unset($entry[$attribute]['count']);
- // sort array
- sort($entry[$attribute]);
+ // $gid is used for linking primary group memebers
+ $gid = -1;
+ $use_primary = false;
+ if ($this->include_primary == "on") {
+ // Get the gid number
+ if (isset($entry['gidnumber']) && is_array($entry['gidnumber'])) {
+ $gid = $entry['gidnumber'][0];
+ }
+ $use_primary = (($gid >= 0) && (sizeof($this->primary_hash) > 0) &&
+ isset($this->primary_hash[$gid]) && is_array($this->primary_hash[$gid]) &&
+ (sizeof($this->primary_hash[$gid]) > 0));
+ }
+ if ($use_primary) {
+ if (isset($entry[$attribute]) && isset($entry[$attribute]['count'])) unset($entry[$attribute]['count']);
+ } else {
+ if (!isset($entry[$attribute]) || !is_array($entry[$attribute]) || (sizeof($entry[$attribute]) < 1)) return;
+ if (isset($entry[$attribute]['count'])) unset($entry[$attribute]['count']);
+ // sort array
+ sort($entry[$attribute]);
+ }
// make a link for each member of the group
$linklist = array();
- for ($d = 0; $d < sizeof($entry[$attribute]); $d++) {
- $user = $entry[$attribute][$d]; // user name
- $linklist[$d] = "" . $user . "";
+ if ($use_primary) {
+ $primary_hash = $this->primary_hash[$gid];
+ // merge primary members into secondary ones
+ $primaryvals = array_flip(array_values($primary_hash));
+ // test if group has some secondary members
+ if (isset($entry[$attribute])) {
+ $attr = array_merge($primary_hash,$entry[$attribute]);
+ }
+ else {
+ $attr = $primary_hash;
+ }
+ // sort array
+ sort($attr);
+
+ // make a link for each member of the group
+ for ($d = 0; $d < sizeof($attr); $d++) {
+ $user = $attr[$d]; // user name
+ if (isset($primaryvals[$user])) {
+ $linklist[$d] = "" . $user . "";
+ }
+ else {
+ $linklist[$d] = "" . $user . "";
+ }
+ }
+ }
+ else {
+ // make a link for each member of the group
+ for ($d = 0; $d < sizeof($entry[$attribute]); $d++) {
+ $user = $entry[$attribute][$d]; // user name
+ $linklist[$d] = "" . $user . "";
+ }
}
echo implode("; ", $linklist);
}
@@ -141,6 +239,58 @@ class lamGroupList extends lamList {
}
}
+ /**
+ * Rereads the entries from LDAP.
+ */
+ function listRefreshData() {
+ parent::listRefreshData();
+ if ($this->use_primary) {
+ $this->groupRefreshPrimary();
+ }
+ }
+
+ /**
+ * Refreshes the primary group members list.
+ */
+ function groupRefreshPrimary() {
+ $this->refresh_primary = false;
+ // return unless some entries
+ if (sizeof($this->entries) <= 0) return;
+
+ $scope = "user";
+ // get search suffix
+ $module_suffix = $_SESSION["config"]->get_Suffix($scope);
+ // configure search filter
+ $module_filter = get_ldap_filter($scope); // basic filter is provided by modules
+ $attrs = array( "uid" );
+ for ($i = 0; $i < sizeof($this->entries); $i++) {
+ $this->primary_hash[$i]['memberuid_primary'] = array();
+ $gid = $this->entries[$i]['gidnumber'][0];
+ $filter = "(&(&" . $module_filter . ")(gidNumber=" . $gid . "))";
+ $sr = @ldap_search($_SESSION["ldap"]->server(), $module_suffix, $filter, $attrs);
+ if (ldap_errno($_SESSION["ldap"]->server()) == 4) {
+ StatusMessage("WARN", _("LDAP sizelimit exceeded, not all entries are shown."), _("See README.openldap.txt to solve this problem."));
+ $this->refresh_primary = true;
+ }
+ if ($sr) {
+ $members = ldap_get_entries($_SESSION["ldap"]->server, $sr);
+ ldap_free_result($sr);
+ // delete first array entry which is "count"
+ unset($members['count']);
+ for ($j = 0; $j < sizeof($members); $j++) {
+ $this->primary_hash[$gid][$j] = $members[$j]['uid'][0];
+ }
+ }
+ }
+ }
+
+ /**
+ * Checks if primary group members should be included.
+ */
+ function groupSetUsePrimary() {
+ $this->use_primary = ($this->include_primary == "on");
+ }
+
}