Code

Fixed groupmail acl stuff
[gosa.git] / plugins / admin / groups / class_groupManagement.inc
index db439b5702aba1f490849bc13f5e2f5690fbc58f..6bf78f1545b001fa94d68605f8923a3467ff036a 100644 (file)
@@ -56,6 +56,11 @@ class groupManagement extends plugin
 
   function execute()
   {
+       /* Call parent execute */
+       plugin::execute();
+
+    $_SESSION['LOCK_VARS_TO_USE'] = array("/^act$/","/^id$/","/^group_edit_/","/^group_del_/");
+
     /* Save data */
     $groupfilter= get_global("groupfilter");
     $s_action   = "";
@@ -93,27 +98,32 @@ class groupManagement extends plugin
     /* Test Posts */
     foreach($_POST as $key => $val){
       // Post for delete
-      if(preg_match("/group_del.*/",$key)){
+      if(preg_match("/^group_del.*/",$key)){
         $s_action = "del";
         $s_entry  = preg_replace("/group_".$s_action."_/i","",$key);
         // Post for edit
-      }elseif(preg_match("/group_edit_.*/",$key)){
+      }elseif(preg_match("/^group_edit_.*/",$key)){
         $s_action="edit";
         $s_entry  = preg_replace("/group_".$s_action."_/i","",$key);
         // Post for new
-      }elseif(preg_match("/dep_back.*/i",$key)){
+      }elseif(preg_match("/^dep_back.*/i",$key)){
         $s_action="back";
-      }elseif(preg_match("/group_new.*/",$key)){
+      }elseif(preg_match("/^group_new.*/",$key)){
         $s_action="new";
-      }elseif(preg_match("/dep_home.*/i",$key)){
+      }elseif(preg_match("/^dep_home.*/i",$key)){
         $s_action="home";
-      }elseif(preg_match("/group_tplnew.*/i",$key)){
+      }elseif(preg_match("/^group_tplnew.*/i",$key)){
         $s_action="new_tpl";
-      }elseif(preg_match("/group_chgpw.*/i",$key)){
+      }elseif(preg_match("/^group_chgpw.*/i",$key)){
         $s_action="change_pw";
         $s_entry  = preg_replace("/group_chgpw_/i","",$key);
-      }elseif(preg_match("/dep_root.*/i",$key)){
+      }elseif(preg_match("/^dep_root.*/i",$key)){
         $s_action="root";
+      }elseif(preg_match("/_group_edit_/",$key)){
+        $type = preg_replace("/_group_edit_.*$/","",$key);
+        $s_action="edit";
+        $s_entry  = preg_replace("/".$type."_group_edit_/i","",$key); 
+        $_POST['arg'] = $type;
       }
     }
     $s_entry  = preg_replace("/_.$/","",$s_entry); 
@@ -123,7 +133,6 @@ class groupManagement extends plugin
       $s_action="open";
       $s_entry = base64_decode($_GET['dep_id']);
       $groupfilter['depselect']= "".$this->config->departments[trim($s_entry)];
-      $this->reload();
     }
 
     // Edit if
@@ -135,19 +144,16 @@ class groupManagement extends plugin
     /* Department changed? */
     if(isset($_POST['depselect']) && $_POST['depselect']){
       $groupfilter['depselect']= $_POST['depselect'];
-      $this->reload();
     }
 
     /* Homebutton is posted */
     if($s_action=="home"){
       $groupfilter['depselect']= (preg_replace("/^[^,]+,/","",$this->ui->dn));
       $groupfilter['depselect']= (preg_replace("/^[^,]+,/","",$groupfilter['depselect']));
-      $this->reload();
     }
 
     if($s_action=="root"){
       $groupfilter['depselect']=($this->config->current['BASE']);
-      $this->reload();
     }
 
     /* If Backbutton is Posted */
@@ -160,19 +166,13 @@ class groupManagement extends plugin
       }else{
         $groupfilter['depselect']= $this->config->departments["/"];
       }
-      $this->reload();
     }
     register_global("groupfilter", $groupfilter);
 
     $smarty= get_smarty();
 
     /* Prepare formular */
-    if (!isset($this->grouptab) &&
-        !isset($_POST['new_group']) &&
-        !isset($_POST['delete_group']) &&
-        !isset($_POST['select_group'])){
-      $this->reload();
-    }
+    $this->reload();
 
     /* Check for exeeded sizelimit */
     if (($message= check_sizelimit()) != ""){
@@ -189,7 +189,9 @@ class groupManagement extends plugin
       /* Create new usertab object */
       $this->grouptab= new grouptabs($this->config,
           $this->config->data['TABS']['GROUPTABS'], $this->dn);
-      $this->grouptab->set_acl(array(':all'));
+      /* Set up the users ACL's for this 'dn' */
+      $acl= get_permissions ($groupfilter['depselect'], $this->ui->subtreeACL);
+      $this->grouptab->set_acl($acl);
     }
 
     /* Cancel dialogs */
@@ -203,7 +205,7 @@ class groupManagement extends plugin
     /* Finish group edit is triggered by the tabulator dialog, so
        the user wants to save edited data. Check and save at this
        point. */
-    if (isset($_POST['edit_finish'])){
+    if ((isset($_POST['edit_finish'])) && (isset($this->grouptab->config)) ){
 
       /* Check tabs, will feed message array */
       $message= $this->grouptab->check();
@@ -236,14 +238,17 @@ class groupManagement extends plugin
     }
 
     /* User wants to edit data? */
-    if ($s_action=="edit"){
+    if (($s_action=="edit") && (!isset($this->grouptab-> config))){
 
       /* Get 'dn' from posted 'uid', must be unique */
       $this->dn= $this->grouplist[trim($s_entry)]['dn'];
 
       /* Check locking, save current plugin in 'back_plugin', so
          the dialog knows where to return. */
-      if (($user= get_lock($this->dn)) != ""){
+
+      $user = get_lock($this->dn);
+
+      if ($user != ""){
         return(gen_locked_message ($user, $this->dn));
       }
 
@@ -280,7 +285,7 @@ class groupManagement extends plugin
 
         /* Lock the current entry, so nobody will edit it during deletion */
         add_lock ($this->dn, $this->ui->dn);
-        $smarty->assign("info", sprintf(_("You're about to delete the group '%s'."), $this->dn));
+        $smarty->assign("info", sprintf(_("You're about to delete the group '%s'."), LDAP::fix($this->dn)));
         return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
       } else {
 
@@ -329,7 +334,7 @@ class groupManagement extends plugin
     }
 
     /* Show tab dialog if object is present */
-    if ($this->grouptab){
+    if (isset($this->grouptab->config)){
       $display= $this->grouptab->execute();
 
       /* Don't show buttons if tab dialog requests this */
@@ -355,57 +360,90 @@ class groupManagement extends plugin
 
     // Managment
     $listhead = "<div style='background:#F0F0F9;padding:5px;'>".
-      " <input type='image' align='middle' src='images/list_back.png' title='"._("Go up one department")."' alt='"._("Up")."' name='dep_back'>&nbsp;".
-      " <input type='image' src='images/list_root.png' align='middle' title='"._("Go to root department")."' name='dep_root' alt='"._("Root")."'>&nbsp;".
-      " <input type='image' align='middle' src='images/list_home.png' title='"._("Go to users department")."'
- alt='"._("Home")."' name='dep_home'>&nbsp;".
-      " <img src='images/list_seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;".
-      " <input type='image' align='middle' src='images/list_new_group.png' title='"._("Create new group")."'
- alt='"._("New")."' name='group_new'>&nbsp;".
-      " <img src='images/list_seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;".
-      _("Current base")."&nbsp;<select name='depselect' onChange='mainform.submit()'>$options</select>".
-       " <input type='image' src='images/list_submit.png' align='middle' title='"._("Submit department")."'   name='submit_department' alt='"._("Submit")."'>&nbsp;".
+      " <input type='image' class='center' src='images/list_back.png' title='"._("Go up one department")."' alt='"._("Up")."' name='dep_back'>&nbsp;".
+      " <input type='image' class='center' src='images/list_root.png' title='"._("Go to root department")."' name='dep_root' alt='"._("Root")."'>&nbsp;".
+      " <input type='image' class='center' src='images/list_home.png' title='"._("Go to users department")."' alt='"._("Home")."' name='dep_home'>&nbsp;".
+      " <img class='center' src='images/list_seperator.png' alt='' height='16' width='1'>&nbsp;".
+      " <input type='image' class='center' src='images/list_new_group.png' title='"._("Create new group")."' alt='"._("New")."' name='group_new'>&nbsp;".
+      " <img class='center' src='images/list_seperator.png' alt='' height='16' width='1'>&nbsp;".
+      _("Base")."&nbsp;<select name='depselect' onChange='mainform.submit()' class='center'>$options</select>".
+       " <input type='image' class='center' src='images/list_submit.png' title='"._("Submit department")."' name='submit_department' alt='"._("Submit")."'>&nbsp;".
       "</div>";
 
     
-    $actions = "<input type='image' src='images/edit.png' alt='"._("edit")."' name='group_edit_%KEY%' title='"._("Edit this entry")."'>";
-    $actions.= "<input type='image' src='images/edittrash.png' alt='"._("delete")."' name='group_del_%KEY%' title='"._("Delete this entry")."'>";
+    $actions = "<input class='center' type='image' src='images/edit.png' alt='"._("edit")."' name='group_edit_%KEY%' title='"._("Edit this entry")."'>";
+    $actions.= "<input class='center' type='image' src='images/edittrash.png' alt='"._("delete")."' name='group_del_%KEY%' title='"._("Delete this entry")."'>";
 
     // Defining Links
     $linkopen = "<a href='?plug=".$_GET['plug']."&amp;act=dep_open&amp;dep_id=%s'>%s</a>";
 
     // image Buttons 
     $editlink = "<a href='?plug=".$_GET['plug']."&amp;id=%s&amp;act=edit_entry'>%s</a>";
-    $userimg  = "<img src='images/select_groups.png' alt='User'    title='%s'>";
-
-    // Extension images 
-    $posiximg = "<img src='images/select_groups.png'        alt='P'  title='"._("Posix")  ."'>";
-    $mailimg  = "<img src='images/mailto.png'             alt='M'  title='"._("Mail")   ."'>";
-    $sambaimg = "<img src='images/select_winstation.png'  alt='S'  title='"._("Samba")  ."'>";
-    $applimg  = "<img src='images/select_application.png' alt='A'  title='"._("Application")."'>"; 
-    $phoneimg  = "<img src='images/select_phone.png'      alt='Ph' title='"._("Phone")  ."'>"; 
+    $userimg  = "<img class='center' src='images/select_groups.png' alt='User'    title='%s'>";
+
+
+    /* Extension images 
+        group
+        environment
+        appgroup
+        mailgroup
+        acl
+        reference
+
+     */
+    $posiximg = "<input type='image' class='center' src='images/select_groups.png' 
+                 name='group_group_edit_%KEY%' 
+                 alt='P'  title='"._("Posix")  ."'>";
+    $mailimg  = "<input type='image' class='center' src='images/mailto.png'            
+                 name='mailgroup_group_edit_%KEY%' 
+                  alt='M'  title='"._("Mail")   ."'>";
+    $sambaimg = "<input type='image'  class='center' src='images/select_winstation.png'  
+                 name='group_group_edit_%KEY%' 
+                  alt='S'  title='"._("Samba")  ."'>";
+    $applimg  = "<input type='image'  class='center' src='images/select_application.png' 
+                 name='appgroup_group_edit_%KEY%' 
+                  alt='A'  title='"._("Application")."'>"; 
+    $phoneimg = "<input type='image'  class='center' src='images/select_phone.png'      
+                 name='group_group_edit_%KEY%' 
+                  alt='Ph' title='"._("Phone")  ."'>"; 
+    $envimg   = "<input type='image'  class='center' src='images/smallenv.png'      
+                 name='environment_group_edit_%KEY%' 
+                  alt='E' title='"._("Environment")  ."'>"; 
+
     // Space
-    $empty    = "<img src='images/empty.png' style='width:16px;height:16px;' alt=''>";
+    $empty    = "<img class='center' src='images/empty.png' style='width:16px;height:16px;' alt=''>";
 
 
-    $divlist = new divlist();
+    $divlist = new divlist("groupstab");
     $divlist->SetHeader(array(
-          array("string" => "&nbsp;"),
-          array("string" => _("Groupname")." / "._("Department")),
-          array("string" => _("Properties"), "attach" => "style='width:100px;'"),
-          array("string" => _("Actions")    ,"attach" => "style='border:none'")
+          array("string" => "&nbsp;", "attach" => "style='text-align:center;width:20px;'"),
+          array("string" => _("Groupname")." / "._("Department"), "attach" => "style=''"),
+          array("string" => _("Properties"), "attach" => "style='width:136px;'"),
+          array("string" => _("Actions"), "attach" => "style='width:60px;border-right:0px;text-align:right;'")
           ));
 
-
     $divlist->SetSummary(_("This table displays all groups, in the selected tree."));
-    $divlist->SetEntriesPerPage(20);
+    $divlist->SetEntriesPerPage(0);
 
     foreach($this->departments as $key=> $val){
 
-      $field1 = array("string" => "<img src='images/folder.png' alt='department'>");
-      $field2 = array("string" => sprintf($linkopen,base64_encode($key),$val));
-      $field3 = array("string" => "&nbsp;");
-      $field4 = array("string" => "&nbsp;","attach"=>"style='text-align:right;border:none'");
+      if(!isset($this->config->departments[trim($key)])){
+        $this->config->departments[trim($key)]="";
+      }
+
+      $non_empty="";
+      $keys= str_replace("/","\/",$key);
+      foreach($this->config->departments as $keyd=>$vald ){
+        if(preg_match("/".$keys."\/.*/",$keyd)){
+          $non_empty="full";
+        }
+      }
+
+
+      $field1 = array("string" => "<img src='images/".$non_empty."folder.png' alt='department'>", "attach" => "style='text-align:center;width:20px;'");
+      $field2 = array("string" => sprintf($linkopen,base64_encode($key),$val), "attach" => "style=''");
+      $field3 = array("string" => "&nbsp;", "attach" => "style='width:136px;'");
+      $field4 = array("string" => "&nbsp;", "attach" => "style='width:60px;border-right:0px;text-align:right;'");
 
       $divlist->AddEntry(array($field1,$field2,$field3,$field4));
     }
@@ -418,6 +456,7 @@ class groupManagement extends plugin
         if(in_array("sambaGroupMapping",    $val['objectClass']))   $samba = $sambaimg;   else $samba   = $empty;
         if(in_array("gosaApplicationGroup", $val['objectClass']))   $appl  = $applimg;    else $appl    = $empty;
         if(in_array("goFonPickupGroup",     $val['objectClass']))   $phone = $phoneimg;   else $phone   = $empty;
+        if(in_array("gotoEnvironment",      $val['objectClass']))   $enviro= $envimg;     else $enviro  = $empty;
       }else{
         $posix=$mail=$samba=$appl=$phone=$empty;
       }
@@ -429,10 +468,10 @@ class groupManagement extends plugin
       }else{
         $desc = " - [ ".$val['description'][0]." ]";
       }      
-      $field1 = array("string" => sprintf($userimg,$val['dn']),"attach"=>"style='width:20px;align:middle;'");
-      $field2 = array("string" => sprintf($editlink,$key,($val['cn']['0'].$desc)),"attach"=>$title);
-      $field3 = array("string" => $posix."&nbsp;".$mail."&nbsp;".$samba."&nbsp;".$appl."&nbsp;".$phone);  
-      $field4 = array("string" => preg_replace("/%KEY%/", $key, $actions),"attach"=>"style='text-align:right;border:none;width:32px;'");
+      $field1 = array("string" => sprintf($userimg,$val['dn']), "attach" => "style='text-align:center;width:20px;'");
+      $field2 = array("string" => sprintf($editlink,$key,($val['cn']['0'].$desc)), "attach" => "style='' ".$title);
+      $field3 = array("string" => preg_replace("/%KEY%/", $key, $posix."&nbsp;".$enviro."&nbsp;".$mail."&nbsp;".$samba."&nbsp;".$appl."&nbsp;".$phone), "attach" => "style='width:136px;'");  
+      $field4 = array("string" => preg_replace("/%KEY%/", $key, $actions), "attach" => "style='width:60px;border-right:0px;text-align:right;'");
       
       $divlist->AddEntry(array($field1,$field2,$field3,$field4));    
     }
@@ -441,6 +480,7 @@ class groupManagement extends plugin
     $smarty->assign("grouplisthead", $listhead);
     $smarty->assign("grouplist", $divlist->DrawList());
     $smarty->assign("search_image", get_template_path('images/search.png'));
+    $smarty->assign("searchu_image", get_template_path('images/search_user.png'));
     $smarty->assign("tree_image", get_template_path('images/tree.png'));
     $smarty->assign("infoimage", get_template_path('images/info.png'));
     $smarty->assign("launchimage", get_template_path('images/launch.png'));
@@ -453,12 +493,16 @@ class groupManagement extends plugin
     $smarty->assign("apply", apply_filter());
     $smarty->assign("alphabet", generate_alphabet());
     $smarty->assign("hint", print_sizelimit_warning());
+    if (isset($this->config->data['MAIN']['NOPRIMARYGROUP'])){
+      $smarty->assign("showprimary", "");
+    } else {
+      $smarty->assign("showprimary", "true");
+    }
 
     return($smarty->fetch(get_template_path('headpage.tpl', TRUE)));
   }
 
-
-  function reload()
+  function reload($CreatePosixsList=false)
   {
     /* Get config */
     $groupfilter= get_global('groupfilter');
@@ -474,36 +518,23 @@ class groupManagement extends plugin
     }
 
     /* User filter? */
-    $filter= "";
+    $filter= "(objectclass=posixGroup)";
     $error= "";
     $error2= "";
     $this->grouplist= array();
 
     /* What are primary groups? */
     $primaries= array();
-    $ldap= $this->config->get_ldap_link(TRUE);
-    $ldap->cd($base);
-    $ldap->search("(&(uid=$regex)(!(uid=*$))(objectClass=posixAccount)(gidNumber=*))", array("gidNumber", "cn"));
-    $error= $ldap->error;
-    while ($attrs= $ldap->fetch()){
-      $primaries[$attrs['gidNumber'][0]]= $attrs['cn'][0];
-    }
-
-    if ($groupfilter['primarygroups'] == "checked"){
-      $filter.= "(&(objectClass=posixGroup)(|";
-      foreach ($primaries as $gidNumber => $cn){
-        $filter.= "(gidNumber=$gidNumber)";
-      }
-      $filter.= "))";
-    } else {
-      $filter.= "(&(objectClass=posixGroup)(!(|";
-      foreach ($primaries as $gidNumber => $cn){
-        $filter.= "(gidNumber=$gidNumber)";
+    $ldap= $this->config->get_ldap_link();
+    if (!isset($this->config->data['MAIN']['NOPRIMARYGROUP'])){
+      $ldap->cd($base);
+      $ldap->search("(&(uid=$regex)(!(uid=*$))(objectClass=posixAccount)(gidNumber=*))", array("gidNumber", "cn"));
+      show_ldap_error($ldap->get_error());
+      while ($attrs= $ldap->fetch()){
+        $primaries[$attrs['gidNumber'][0]]= $attrs['cn'][0];
       }
-      $filter.= ")))";
     }
 
-  
     /* Set filter depending on selection */
     $sfilter= "";
     if ($groupfilter['appgroups'] == "checked"){
@@ -520,43 +551,40 @@ class groupManagement extends plugin
     if ($groupfilter['mailgroups'] == "checked"){
       $filter.= "(objectClass=gosaMailAccount)";
     }
-    if ($groupfilter['functionalgroups'] == "checked"){
-      $ldap->cd($base);
-      $ldap->set_size_limit($_SESSION['size_limit']);
-      $ldap->search("(&(cn=$regex)(objectClass=posixGroup)(!(|(objectClass=gosaMailAccount)(objectClass=gosaApplicationGroup)$sfilter)))", array("cn", "gidNumber", "description"));
-      $error2= $ldap->error;
-      while ($attrs= $ldap->fetch()){
-        if (!isset($primaries[$attrs['gidNumber'][0]])){
-          $this->grouplist[$attrs['gidNumber'][0]]= $attrs;
-        }
+    $functional= array();
+    $ldap->cd(get_groups_ou().$base);
+    $ldap->set_size_limit($_SESSION['size_limit']);
+    $ldap->search("(&(cn=$regex)(objectClass=posixGroup)(!(|(objectClass=gosaMailAccount)(objectClass=gosaApplicationGroup)$sfilter)))", array("cn", "gidNumber", "description"));
+    $error2= $ldap->error;
+    while ($attrs= $ldap->fetch()){
+      if (!isset($primaries[$attrs['gidNumber'][0]])){
+        $functional[$attrs['gidNumber'][0]]= $attrs['gidNumber'][0];
       }
     }
 
-    /* NEW LIST MANAGMENT
+    /*
      * We also need to search for the departments
      * So we are able to navigate like in konquerer
      */
-    $base2 = preg_replace("/ou=people,/i","",$base);
 
-    $res3 =  get_list2($this->ui->subtreeACL, "(&(|(ou=$regex)(description=$regex))(objectClass=gosaDepartment))",
-                              TRUE, $base2, array("ou", "description"), TRUE);
-
-    $this->departments= array();
-    foreach ($res3 as $value){
-      if($value["description"][0]!=".."){
-        $this->departments[$value['dn']]= convert_department_dn2($value['dn'])." - [".$value["description"][0]."]";
-      }else{
-        $this->departments[$value['dn']]=$value["description"][0];
+      $res3 =  get_list2($this->ui->subtreeACL, "(&(|(ou=$regex)(description=$regex))(objectClass=gosaDepartment))",
+          FALSE, $base, array("ou", "description"), TRUE);
+      $this->departments= array();
+      $tmp = array();
+      foreach ($res3 as $value){
+        $tmp[strtolower($value['dn']).$value['dn']]=$value;
       }
-    }
-
-    /* END NEW LIST MANAGMENT
+      ksort($tmp);
+      foreach($tmp as $value){
+        if(isset($value["description"][0])){
+          $this->departments[$value['dn']]=convert_department_dn2($value['dn'])." - [".$value["description"][0]."]";
+        }else{
+          $this->departments[$value['dn']]= convert_department_dn2($value['dn']);//$value["description"][0];
+        }
+      }
+    /*  Ende department generation
      */
 
-
-
-
-
     /* Generate grouplist */
     if ($filter != ""){
       $filter= "(&(cn=$regex)(objectClass=posixGroup)(|$filter))";
@@ -564,8 +592,11 @@ class groupManagement extends plugin
         $filter= "(&(|(memberUID=" . $groupfilter['guser'] . ")(cn=" . $groupfilter['guser'] . "))$filter)";
       }
     }
+
+    /* Depending on $CreatePosixsList we have to create different lists */
+
     if ($groupfilter['subsearch'] == "checked"){
-      $res= get_list($this->ui->subtreeACL, "$filter", TRUE, $base, array("cn", "description", "gidNumber"), TRUE);
+      $res= get_list($this->ui->subtreeACL, "$filter", FALSE, $base, array("cn", "description", "gidNumber"), TRUE);
     } else {
       $base= get_groups_ou().$base;
       $res= get_list($this->ui->subtreeACL, "$filter", FALSE, $base, array("cn", "description", "gidNumber"), TRUE);
@@ -575,9 +606,29 @@ class groupManagement extends plugin
     }
 
     foreach ($res as $value){
-      $this->grouplist[$value['gidNumber'][0]]= $value;
+      if ($groupfilter['functionalgroups'] != "checked" && isset($functional[$value['gidNumber'][0]])){
+        continue;
+      }
+      if ($groupfilter['primarygroups'] == "checked"){
+        $this->grouplist[$value['gidNumber'][0]]= $value;
+      } else {
+        if (!isset($primaries[$value['gidNumber'][0]])){
+          $this->grouplist[$value['gidNumber'][0]]= $value;
+        }
+      }
     }
 
+    $tmp=array();
+
+    /* Create result for group management listbox*/
+    foreach($this->grouplist as $tkey => $val ){
+      $tmp[strtolower($val['cn'][0]).$val['cn'][0]]=$val;
+    }
+    ksort($tmp);
+    $this->grouplist=array();
+    foreach($tmp as $val){
+      $this->grouplist[]=$val;
+    }
     reset ($this->grouplist);
   }