From 496b5c60ab18bd5e60d7b238938eaff091418f15 Mon Sep 17 00:00:00 2001
From: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
Date: Mon, 14 Aug 2023 07:38:03 +0200
Subject: [PATCH 8/9] Revert "fix multiple_edit and add custom Constraint to
 filters"

This reverts a variant of commit 7f6cdfae3b1468e2db77c555cc41800bbae4a409.

Signed-off-by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
---
 include/class_filter.inc                      |   2 +-
 plugins/admin/groups/class_group.inc          | 247 +++++++++---------
 .../groups/userSelect/class_userSelect.inc    |  13 +-
 3 files changed, 121 insertions(+), 141 deletions(-)

--- a/include/class_filter.inc
+++ b/include/class_filter.inc
@@ -3,7 +3,7 @@
  * This code is part of GOsa (http://www.gosa-project.org)
  * Copyright (C) 2003-2008 GONICUS GmbH
  *
- * ID: $$Id: class_filter.inc 19251 2010-07-29 13:21:27Z hickert $$
+ * ID: $$Id$$
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
--- a/plugins/admin/groups/class_group.inc
+++ b/plugins/admin/groups/class_group.inc
@@ -26,7 +26,7 @@
     /* Group attributes */
     var $cn= "";
     var $gidNumber= "";
-    var $members_used_by_some= array();
+    var $memberUid_used_by_some= array();
 
     /* Helpers */
     var $base= "";
@@ -55,7 +55,6 @@
     var $view_logged = FALSE;
     var $allowGroupsWithSameNameInOtherSubtrees = true;
     var $baseSelector;
-    var $dns= array();
 
     /* attribute list for save action */
     var $attributes= array("cn", "description", "gidNumber","sambaGroupType","sambaSID","member");
@@ -107,6 +106,9 @@
             ksort ($this->members);
         }
 
+        /* Get group list */
+
+
         /* Save gidNumber for later use */
         if (isset($this->attrs['gidNumber'])){
             $this->saved_gidNumber= $this->attrs['gidNumber'][0];
@@ -252,7 +254,7 @@
             // Check if list is available, depends on multi- or sinlge- group editing. 
             if($this->$list){
                 // ensure we can delete group members if we have
-                // write permission to the member attribute
+                // write permission to the memberUid attribute
                 $mu_acl = $this->getacl("member");
                 if (preg_match("/w/",$mu_acl) && !preg_match("/d/",$mu_acl)) {
                     $this->$list->setAcl($mu_acl.'d');
@@ -270,11 +272,8 @@
         }
 
         /* Add objects? */
-        if (!$this->dns[0]) {
-            $this->dns[] = $this->dn;
-        }
         if (isset($_POST["edit_membership"]) && preg_match("/w/",$this->getacl("member"))){
-            $this->userSelect= new userSelect($this->config, get_userinfo(), $this->dns);
+            $this->userSelect= new userSelect($this->config, get_userinfo());
         }
 
         /* Add objects finished? */
@@ -343,9 +342,9 @@
         if(!$this->multiple_support_active){
             $this->memberList->setAcl($this->getacl("member"));
             $data = $lData = array();
-            foreach($this->members as $cn => $member){
-                if ($cn !== $this->cn) {                
-                    $data[$cn] = $member;
+            foreach($this->members as $uid => $member){
+                if ($uid !== $this->cn) {                
+                    $data[$uid] = $member;
                     $givenName = $sn = $cn = _("Unknown");
                     // if(isset($member['sn']) && isset($member['sn'][0])) $sn = $member['sn'][0];
                     if (isset($member['cn']) && isset($member['cn'][0])) $cn = $member['cn'][0];
@@ -372,7 +371,7 @@
                                 break;
                         }
                     }
-                    $lData[$cn] = array('data' => array($image,$cn/*,$sn,$givenName*/, $data[$cn]['uid'][0] ?? ""));
+                    $lData[$uid] = array('data' => array($image,$cn/*,$sn,$givenName*/, $data[$uid]['uid'][0] ?? ""));
                 }
             }
             $this->memberList->setListData($data,$lData);
@@ -386,37 +385,36 @@
             $this->partialList->setAcl($this->getacl("member"));
 
             $data = $lData = array();
-            foreach($this->members as $cn => $member){
-                if (!in_array($member['dn'], $this->dns)) {
-                    $data[$cn] = $member;
-                    $givenName = $sn = $cn = _("Unknown");
-                    //if(isset($member['sn'][0])) $sn = $member['sn'][0];
-                    if(isset($member['cn'][0])) $cn = $member['cn'][0];
-                    //if(isset($member['givenName'][0])) $givenName = $member['givenName'][0];
-                    $image = image('images/false.png');
-                    if(isset($member['sn'])){
-                        switch ($theme) {
-                            case 'classic':
-                                $image = image("plugins/users/images/select_user.png");
-                                break;
-                            
-                            default:
-                                $image = image("<i class='material-icons'>person</i>");
-                                break;
-                        }
-                    }elseif(isset($member['gidNumber'])){
-                        switch ($theme) {
-                            case 'classic':
-                                $image = image("plugins/groups/images/select_group.png");
-                                break;
-                            
-                            default:
-                                $image = image("<i class='material-icons'>groups</i>");
-                                break;
-                        }
+            foreach($this->members as $uid => $member){
+                $member = $this->members[$member];
+                $data[$uid] = $member;
+                $givenName = $sn = $cn = _("Unknown");
+                //if(isset($member['sn'][0])) $sn = $member['sn'][0];
+                if(isset($member['cn'][0])) $cn = $member['cn'][0];
+                //if(isset($member['givenName'][0])) $givenName = $member['givenName'][0];
+                $image = image('images/false.png');
+                if(isset($member['sn'])){
+                    switch ($theme) {
+                        case 'classic':
+                            $image = image("plugins/users/images/select_user.png");
+                            break;
+                        
+                        default:
+                            $image = image("<i class='material-icons'>person</i>");
+                            break;
+                    }
+                }elseif(isset($member['gidNumber'])){
+                    switch ($theme) {
+                        case 'classic':
+                            $image = image("plugins/groups/images/select_group.png");
+                            break;
+                        
+                        default:
+                            $image = image("<i class='material-icons'>groups</i>");
+                            break;
                     }
-                    $lData[$cn] = array('data' => array($image,$cn/*,$sn,$givenName,*/,$data[$cn]['uid'][0] ?? ""));
                 }
+                $lData[$uid] = array('data' => array($image,$cn/*,$sn,$givenName,*/,$uid));
             }
             $this->commonList->setListData($data,$lData);
             $this->commonList->update();
@@ -424,38 +422,37 @@
 
             $data = $lData = array();
 
-            foreach($this->members_used_by_some as $cn => $member){
-                if (!in_array($member['dn'], $this->dns)) {
-                    $data[$cn] = $member;
-                    $givenName = $sn = $cn = _("Unknown");
-                    //if(isset($member['sn']) && isset($member['sn'][0])) $sn = $member['sn'][0];
-                    if(isset($member['cn']) && isset($member['cn'][0])) $cn = $member['cn'][0];
-                    //if(isset($member['givenName'][0]) && isset($member['givenName'][0])) $givenName = $member['givenName'][0];
-                    $image = image('images/false.png');
-                    if(isset($member['sn'])){
-                        switch ($theme) {
-                            case 'classic':
-                                $image = image("plugins/users/images/select_user.png");
-                                break;
-                            
-                            default:
-                                $image = image("<i class='material-icons'>person</i>");
-                                break;
-                        }
+            foreach($this->members_used_by_some as $uid => $member){
+                $member = (isset($this->members[$member])) ?? NULL;
+                $data[$uid] = $member;
+                $givenName = $sn = $cn = _("Unknown");
+                //if(isset($member['sn']) && isset($member['sn'][0])) $sn = $member['sn'][0];
+                if(isset($member['cn']) && isset($member['cn'][0])) $cn = $member['cn'][0];
+                //if(isset($member['givenName'][0]) && isset($member['givenName'][0])) $givenName = $member['givenName'][0];
+                $image = image('images/false.png');
+                if(isset($member['sn'])){
+                    switch ($theme) {
+                        case 'classic':
+                            $image = image("plugins/users/images/select_user.png");
+                            break;
                         
-                    }elseif(isset($member['gidNumber'])){
-                        switch ($theme) {
-                            case 'classic':
-                                $image = image("plugins/groups/images/select_group.png");
-                                break;
-                            
-                            default:
-                                $image = image("<i class='material-icons'>groups</i>");
-                                break;
-                        }
+                        default:
+                            $image = image("<i class='material-icons'>person</i>");
+                            break;
+                    }
+                    
+                }elseif(isset($member['gidNumber'])){
+                    switch ($theme) {
+                        case 'classic':
+                            $image = image("plugins/groups/images/select_group.png");
+                            break;
+                        
+                        default:
+                            $image = image("<i class='material-icons'>groups</i>");
+                            break;
                     }
-                    $lData[$cn] = array('data' => array($image,$cn/*,$sn, $givenName*/, $data[$cn]['uid'][0] ?? ""));
                 }
+                $lData[$uid] = array('data' => array($image,$cn/*,$sn, $givenName*/, $uid));
             }
             $this->partialList->setListData($data,$lData);
             $this->partialList->update();
@@ -524,7 +521,7 @@
         $bool = $this->isRestrictedByDynGroup();
         $smarty->assign("restrictedByDynGroup", $bool);
         if($bool){
-            $smarty->assign("memberACL", preg_replace("/[^r]/","",$this->getacl('member')));
+            $smarty->assign("memberUidACL", preg_replace("/[^r]/","",$this->getacl('member')));
              
         }
         return($smarty->fetch (get_template_path('generic.tpl', TRUE)));
@@ -544,17 +541,18 @@
     function addUser($dn)
     {
         /* In mutliple edit we have to handle two arrays.
-         *  members               : Containing users used in all groups
-         *  members_used_by_some  : Those which are not used in all groups
+         *  memberUid               : Containing users used in all groups
+         *  memberUid_used_by_some  : Those which are not used in all groups
          * So we have to remove the given $uid from the ..used_by_some array first.
          */
         if($this->multiple_support_active){
-            if(isset($this->members_used_by_some[$dn])){
-                unset($this->members_used_by_some[$dn]);
+            if(isset($this->memberUid_used_by_some[$dn])){
+                unset($this->memberUid_used_by_some[$dn]);
             }
         }  
 
-        /* Ensure that the requested object is known to the group class */
+        /* Ensure that the requested object is known to the group class 
+         */
         $ldap = $this->config->get_ldap_link();
         $ldap->cd($this->config->current['BASE']);
         $ldap->cat($dn,array("dn","cn","uid","sn","givenName","gidNumber"));
@@ -575,6 +573,7 @@
                 $this->members[$attrs['cn'][0]] = $attrs;
             }
         }
+        
     }
 
 
@@ -585,13 +584,13 @@
         }
 
         /* We have two array contianing group members in multiple edit.
-         *  this->members             : Groups used by all currently edited groups 
-         *  this->members_used_by_some: Used by some 
+         *  this->memberUid             : Groups used by all currently edited groups 
+         *  this->memberUid_used_by_some: Used by some 
          * So we have to remove the specified uid from both arrays.
          */
         if($this->multiple_support_active){
-            if(isset($this->members_used_by_some[$id])){
-                unset($this->members_used_by_some[$id]);
+            if(isset($this->memberUid_used_by_some[$id])){
+                unset($this->memberUid_used_by_some[$id]);
             }
         }
     }
@@ -604,7 +603,7 @@
         $ldap->cd($this->config->current['BASE']);
 
 
-        /* Resolve still unresolved members to fill the list with sn/giveName attributes 
+        /* Resolve still unresolved memberuids to fill the list with sn/giveName attributes 
            (Store gathered sn/givenName informations in $this->allusers too, 
            to be prepared when adding/deleting users)
          */    
@@ -613,11 +612,11 @@
     
 
         // Merge in partial uids in multiple edit
-        $allMember = array_keys($this->members);
+        $allUids = array_keys($this->members);
         if($this->multiple_support_active) {
-            $allMember = array_merge($allMember,  array_keys($this->members_used_by_some));
+            $allUids = array_merge($allUids,  array_keys($this->memberUid_used_by_some));
         }
-        $allMember = array_values($allMember);
+        $allUids = array_values($allUids);
 
         // To resolve the usernames out of the 'uid' we've to perform ldap queries. 
         // To keep the amount of queries as short as possible, we combine the query 
@@ -634,15 +633,15 @@
             $maxPerRound = count($allUids);
         }
 
-        for ( $added = 0; $added < count($allMember); $added += $maxPerRound ) {
+        for ( $added = 0; $added < count($allUids); $added += $maxPerRound ) {
 
             // First build the query....
             $start = $added;
             $end = $added + $maxPerRound;
             $filter = "";
             for ( $done = $start; $done < $end; $done++ ) {
-                if(!isset($allMember[$done])) break;
-                $value = $allMember[$done];
+                if(!isset($allUids[$done])) break;
+                $value = $allUids[$done];
                 $filter .= "(cn=".normalizeLdap($value).")";
             }
 
@@ -659,7 +658,7 @@
             if(!isset($this->members[$value])){
                 $this->members[$value] = "";
             }
-        }
+        }  
     }
 
 
@@ -890,16 +889,18 @@
         }
 
         /* Add member dn's for RFC2307bis Support */
-        $temp = array();
-        if (count($this->members)) {
-            foreach($this->members as $member) {
-                if ($member['dn'] !== $this->dn) {
-                    $temp[] = $member['dn'];
-                }   
-            }
-            $this->attrs['member']= $temp;
-        }else {
-            $this->attrs['member']= $this->dn;
+        if ($this->rfc2307bis){
+            $temp = array();
+            if (count($this->members)){
+                foreach($this->members as $member) {
+                    if ($member['dn'] !== $this->dn) {
+                        $temp[] = $member['dn'];
+                    }   
+                }
+                $this->attrs['member']= $temp;
+            }else {
+                $this->attrs['member']= $this->dn;
+            }
         }
 
         /* Save data. Using 'modify' implies that the entry is already present, use 'add' for
@@ -1146,10 +1147,11 @@
 
                     "sambaGroupType"    => _("Samba group type"),
                     "sambaDomainName"   => _("Samba domain name"),
-                    "accessTo"          => _("System trust"),
+                    "accessTo"        => _("System trust"),
                     "fonGroup"          => _("Phone pickup group"),
                     "nagiosGroup"       => _("Nagios group"),
 
+                    "memberUid"         => _("Group member"),
                     "member"            => _("Group member"))
                 ));
     }
@@ -1225,7 +1227,7 @@
         }
 
         $ret['member'] = $this->members;
-        $ret['members_used_by_some'] = $this->members_used_by_some;
+        $ret['memberUid_used_by_some'] = $this->memberUid_used_by_some;
         return($ret);
     }
 
@@ -1242,35 +1244,22 @@
         plugin::init_multiple_support($attrs,$all);
         $this->trustModeDialog->init_multiple_support($attrs,$all);
 
-        // sort out members_used_by_some in $diff array
-        $diff= array_diff($all['member'],$attrs['member'] ?? [""]);
-
-        $this->dns = $all['dn'];
         $this->members = array();
         $this->members_used_by_some = array();
-
-        // fetch Members in all Groups to $members for multiple edit
-        $ldap = $this->config->get_ldap_link();
-        $ldap->cd($this->config->current['BASE']);
         if (isset($attrs['member'])){
-            foreach ($attrs['member'] as $member => $dn) {
-                $ldap->cat($dn,array("dn","cn","uid","sn","givenName","gidNumber"));
-                while ($attr = $ldap->fetch()) {
-                    $this->members[$attr['cn'][0]]= $attr;
-                }
+            for ($i= 0; $i<$attrs['member']['count']; $i++){
+                $this->members[$attrs['member'][$i]]= $attrs['member'][$i];
             }
             ksort($this->members);
         }
 
-        // fetch all Member in $diff to $members_used_by_some for multiple edit
-        if (isset($diff)){
-            foreach ($diff as $member => $dn) {
-                $ldap->cat($dn,array("dn","cn","uid","sn","givenName","gidNumber"));
-                while ($allAttr = $ldap->fetch()) {
-                    $this->members_used_by_some[$allAttr['cn'][0]]= $allAttr;
+        if (isset($all['member'])){
+            for ($i= 0; $i<$all['member']['count']; $i++){
+                if(!in_array_strict($all['member'][$i],$this->members)){
+                    $this->memberUid_used_by_some[$all['member'][$i]]= $all['member'][$i];
                 }
             }
-            ksort($this->members_used_by_some);
+            ksort($this->memberUid_used_by_some);
         }
 
         $this->reload(TRUE);
@@ -1284,8 +1273,8 @@
         $this->commonList->setEditable(false);
         $this->commonList->setWidth("100%");
         $this->commonList->setHeight("120px");
-        $this->commonList->setHeader(array('~',_("Common Name"),_("UID")));
-        $this->commonList->setColspecs(array('20px','*','*','20px'));
+        $this->commonList->setHeader(array('~',_("Given name"),_("Surname"),_("UID")));
+        $this->commonList->setColspecs(array('20px','*','*','*','20px'));
         $this->commonList->setDefaultSortColumn(1);
 
         $this->partialList = new sortableListing();
@@ -1294,8 +1283,8 @@
         $this->partialList->setEditable(false);
         $this->partialList->setWidth("100%");
         $this->partialList->setHeight("120px");
-        $this->partialList->setHeader(array('~',_("Common Name"),_("UID")));
-        $this->partialList->setColspecs(array('20px','*','*','20px'));
+        $this->partialList->setHeader(array('~',_("Given name"),_("Surname"),_("UID")));
+        $this->partialList->setColspecs(array('20px','*','*','*','20px'));
         $this->partialList->setDefaultSortColumn(1);
     }
 
@@ -1376,24 +1365,22 @@
         $this->trustModeDialog->enable_multiple_support();
     }
 
-    /* Set all members of edited groups in $members */
+
     function set_multi_edit_values($attrs)
     {
         $users = array();
 
         /* Update groupMembership, keep optinal group */
-        foreach($attrs['members_used_by_some'] as $member){
-            if(in_array_strict($member,$this->members)){
-                $users[] = $member;
+        foreach($attrs['memberUid_used_by_some'] as $uid){
+            if(in_array_strict($uid,$this->members)){
+                $users[$uid] = $uid;
             }
         }
 
         /* Update groupMembership, add forced groups */
-        foreach($attrs['member'] as $member){
-
-            $users[] = $member;
+        foreach($attrs['member'] as $uid){
+            $users[$uid] = $uid;
         }
-        
         plugin::set_multi_edit_values($attrs);
         $this->trustModeDialog->set_multi_edit_values($attrs);
         $this->members = $users;
--- a/plugins/admin/groups/userSelect/class_userSelect.inc
+++ b/plugins/admin/groups/userSelect/class_userSelect.inc
@@ -23,33 +23,26 @@
 #[\AllowDynamicProperties]
 class userSelect extends management
 {
-    
     public $plHeadline = "User selection";
     protected $skipFooter = TRUE;
     protected $skipHeader = TRUE;
 
-    function __construct($config, $ui, array $dns = null)
+    function __construct($config, $ui)
     {
         $this->config = $config;
         $this->ui = $ui;
 
-        $this->storagePoints = array(get_ou("core", "userRDN"),get_ou("core", "groupRDN"));
-        # $this->storagePoints = array( get_ou("core", "groupRDN"));
+        $this->storagePoints = array(get_ou("core", "userRDN"));
+
         // Build filter
         if (session::global_is_set(get_class($this)."_filter")){
             $filter= session::global_get(get_class($this)."_filter");
-            $filter->customConstraints['dn'] = $dns;
         } else {
             $filter = new filter(get_template_path("user-filter.xml", true, dirname(__FILE__)));
             $filter->setObjectStorage($this->storagePoints);
-            $filter->addConstraint(['dn' => $dns]);
         }
-        
-
         $this->setFilter($filter);
 
-        
-
         // Build headpage
         $headpage = new listing(get_template_path("user-list.xml", true, dirname(__FILE__)));
         $headpage->setFilter($filter);
