_("Group name"), "gidnumber" => _("GID number"), "memberuid" => _("Group members"), "member" => _("Group member DNs"), "description" => _("Group description") ); } } /** * Generates the list view. * * @package lists * @author Roland Gruber * */ class lamGroupList extends lamList { /** Controls if include primary group members into group memebers */ private $use_primary = false; /** Primary group members hash */ private $primary_hash = array(); /** Controls if primary group members needs refresh */ private $refresh_primary = false; /** ID for config option */ const TRANS_PRIMARY_OPTION_NAME = "LG_TP"; /** * Constructor * * @param string $type account type * @return lamList list object */ function lamGroupList($type) { parent::lamList($type); $this->labels = array( 'nav' => _("%s group(s) found"), 'error_noneFound' => _("No groups found!"), 'newEntry' => _("New group"), 'deleteEntry' => _("Delete group(s)"), 'createPDF' => _("Create PDF for selected group(s)"), 'createPDFAll' => _("Create PDF for all groups")); } /** * 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->include_primary && !$this->refresh && ($this->refresh_primary || (sizeof($this->primary_hash) == 0))) $this->groupRefreshPrimary(); } /** * Prints the content of a cell in the account list for a given LDAP entry and attribute. * * @param array $entry LDAP attributes * @param string $attribute attribute name */ function listPrintTableCellContent(&$entry, &$attribute) { if ($attribute == "memberuid") { // $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(); 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); } // print all other attributes else { parent::listPrintTableCellContent($entry, $attribute); } } /** * Rereads the entries from LDAP. */ function listRefreshData() { parent::listRefreshData(); if ($this->include_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]; } } } } /** * Returns a list of possible configuration options. * * @return array list of lamListOption objects */ protected function listGetAllConfigOptions() { return array(new lamBooleanListOption(_('Show primary group members as normal group members'), self::TRANS_PRIMARY_OPTION_NAME)); } /** * Called when the configuration options changed. */ protected function listConfigurationChanged() { $tpOption = $this->listGetConfigOptionByID(self::TRANS_PRIMARY_OPTION_NAME); $use_primary = $this->include_primary; $this->include_primary = $tpOption->isSelected(); if (!$use_primary && $this->include_primary) { $this->refresh_primary = true; } } } ?>