Code

Do not remove classes/plugin from session if a lock was removed
[gosa.git] / gosa-core / plugins / admin / ogroups / class_ogroup.inc
index 029feeb1730ec1fae99dcd70ba463fce68d27fe0..b038bf6611c88396200e9dfa5ca750a9aeddb115 100644 (file)
@@ -59,6 +59,10 @@ class ogroup extends plugin
 
   var $was_trust_account= FALSE;
 
+  /* Already assigned Workstations. Will be hidden in selection. 
+   */
+  var $used_workstations = array();
+
   /* attribute list for save action */
   var $attributes= array("cn", "description", "gosaGroupObjects","member","accessTo","trustModel");
   var $objectclasses= array("top", "gosaGroupOfNames");
@@ -82,14 +86,14 @@ class ogroup extends plugin
     $this->is_account= TRUE;
 
     /* Get global filter config */
-    if (!session::is_set("ogfilter")){
+    if (!session::global_is_set("ogfilter")){
       $ui= get_userinfo();
       $base= get_base_from_people($ui->dn);
       $ogfilter= array( "dselect"       => $base,
           "regex"           => "*");
-      session::set("ogfilter", $ogfilter);
+      session::global_set("ogfilter", $ogfilter);
     }
-    $ogfilter= session::get('ogfilter');
+    $ogfilter= session::global_get('ogfilter');
 
     /* Adjust flags */
     foreach( array(   "U" => "accounts",
@@ -110,17 +114,17 @@ class ogroup extends plugin
         $ogfilter[$val]= "";
       }
     }
-    session::set("ogfilter", $ogfilter);
+    session::global_set("ogfilter", $ogfilter);
   
-    if(session::is_set('CurrentMainBase')){
-     $this->base  = session::get('CurrentMainBase');
+    if(session::global_is_set('CurrentMainBase')){
+     $this->base  = global_session::get('CurrentMainBase');
     }
 
     /* Set base */
     if ($this->dn == "new"){
-      $this->base = session::get('CurrentMainBase');
+      $this->base = session::global_get('CurrentMainBase');
     } else {
-      $this->base= preg_replace("/^[^,]+,".normalizePreg(get_ou("ogroupou"))."/","",$this->dn);
+      $this->base= preg_replace("/^[^,]+,".preg_quote(get_ou("ogroupRDN"), '/')."/","",$this->dn);
 
       /* Is this account a trustAccount? */
       if ($this->is_account && isset($this->attrs['trustModel'])){
@@ -140,16 +144,38 @@ class ogroup extends plugin
       }
     }
 
+    /* Detect all workstations, which are already assigned to an object group  
+        - Those objects will be hidden in the add object dialog.
+        - Check() will complain if such a system is assigned to this object group.
+     */ 
+    $base = $this->config->current['BASE'];
+    $res    = get_list("(|(objectClass=gotoWorkstation)(objectClass=gotoTerminal))","none" , 
+        $base, array("dn"),GL_NO_ACL_CHECK|GL_SUBSEARCH);
+    $ws_dns = array();
+    foreach($res as $data){
+      $ws_dns[] = $data['dn'];
+    }
+    $res=get_list("(&(member=*)(objectClass=gosaGroupOfNames))","none",
+        $base, array("dn","member", "gosaGroupObjects"),GL_NO_ACL_CHECK|GL_SUBSEARCH);
+    $this->used_workstations = array();
+    foreach($res as $og){
+      if($og['dn'] == $this->dn) continue;
+      $test = array_intersect($ws_dns,$og['member']);
+      if(($og['gosaGroupObjects'] == "[W]" || $og['gosaGroupObjects'] == "[T]") && count($test)){
+        $this->used_workstations = array_merge($this->used_workstations,$test);
+      }
+    }
+
     $this->orig_cn = $this->cn;
     $this->orig_base = $this->base;
 
     /* Get global filter config */
-    if (!session::is_set("sysfilter")){
+    if (!session::global_is_set("sysfilter")){
       $ui= get_userinfo();
       $base= get_base_from_people($ui->dn);
       $sysfilter= array( "depselect"       => $base,
           "regex"           => "*");
-      session::set("sysfilter", $sysfilter);
+      session::global_set("sysfilter", $sysfilter);
     }
 
     /* Load member data */
@@ -283,7 +309,7 @@ class ogroup extends plugin
     /* Show ws dialog */
     if ($this->show_ws_dialog){
       /* Save data */
-      $sysfilter= session::get("sysfilter");
+      $sysfilter= session::global_get("sysfilter");
       foreach( array("depselect", "regex") as $type){
         if (isset($_POST[$type])){
           $sysfilter[$type]= $_POST[$type];
@@ -296,7 +322,7 @@ class ogroup extends plugin
         }
         $sysfilter['regex']= $s;
       }
-      session::set("sysfilter", $sysfilter);
+      session::global_set("sysfilter", $sysfilter);
 
       /* Get workstation list */
       $exclude= "";
@@ -309,10 +335,10 @@ class ogroup extends plugin
       $regex= $sysfilter['regex'];
       $filter= "(&(|(objectClass=goServer)(objectClass=gotoWorkstation)(objectClass=gotoTerminal))$exclude(cn=*)(cn=$regex))";
 
-      $deps_a = array(get_ou("serverou"),
-          get_ou("terminalou"),
-          get_ou("workstationou"));
-      $res= get_sub_list($filter, array("terminal","server","workstation"), $deps_a, get_ou("systemsou").$sysfilter['depselect'],
+      $deps_a = array(get_ou("serverRDN"),
+          get_ou("terminalRDN"),
+          get_ou("workstationRDN"));
+      $res= get_sub_list($filter, array("terminal","server","workstation"), $deps_a, get_ou("systemRDN").$sysfilter['depselect'],
           array("cn"), GL_SUBSEARCH | GL_SIZELIMIT);
       $wslist= array();
       foreach ($res as $attrs){
@@ -375,7 +401,7 @@ class ogroup extends plugin
     if ($this->group_dialog){
 
       /* Save data */
-      $ogfilter= session::get("ogfilter");
+      $ogfilter= session::global_get("ogfilter");
       foreach( array("dselect", "regex") as $type){
         if (isset($_POST[$type])){
           $ogfilter[$type]= $_POST[$type];
@@ -400,11 +426,17 @@ class ogroup extends plugin
         }
         $ogfilter['regex']= $s;
       }
-      session::set("ogfilter", $ogfilter);
+      session::global_set("ogfilter", $ogfilter);
       $this->reload();
 
-      /* Calculate actual groups */
-      $smarty->assign("objects", $this->convert_list($this->objects));
+      /* Calculate actual groups / remove entries that are already inside... */
+      $strippedObjects= array();
+      foreach ($this->objects as $key => $value){
+        if (!isset($this->member[$key])){
+          $strippedObjects[$key]= $value;
+        }
+      }
+      $smarty->assign("objects", $this->convert_list($strippedObjects));
 
       /* Show dialog */
       $smarty->assign("search_image", get_template_path('images/lists/search.png'));
@@ -612,7 +644,7 @@ class ogroup extends plugin
     $filter                       = "";
     $objectClasses                = array();
     
-    $ogfilter               = session::get("ogfilter");
+    $ogfilter               = session::global_get("ogfilter");
     $regex                  = $ogfilter['regex'];
 
     $ldap= $this->config->get_ldap_link();
@@ -626,28 +658,28 @@ class ogroup extends plugin
     $p_f= array("accounts"=> array("OBJ"=>"user", "CLASS"=>"gosaAccount"    ,
           "DN"=> get_people_ou()           ,"ACL" => "users"), 
         "groups"          => array("OBJ"=>"group", "CLASS"=>"posixGroup"     ,
-          "DN"=> get_groups_ou('ogroupou') ,"ACL" => "groups"), 
+          "DN"=> get_groups_ou('ogroupRDN') ,"ACL" => "groups"), 
         "departments"     => array("OBJ"=>"department", "CLASS"=>"gosaDepartment" ,
           "DN"=> ""                        ,"ACL" => "department"), 
         "servers"         => array("OBJ"=>"servgeneric", "CLASS"=>"goServer"       ,
-          "DN"=> get_ou('serverou')        ,"ACL" => "server"),
+          "DN"=> get_ou('serverRDN')        ,"ACL" => "server"),
         "workstations"    => array("OBJ"=>"workgeneric", "CLASS"=>"gotoWorkstation",
-          "DN"=> get_ou('workstationou')   ,"ACL" => "workstation"),
+          "DN"=> get_ou('workstationRDN')   ,"ACL" => "workstation"),
         "winstations"     => array("OBJ"=>"wingeneric", "CLASS"=>"opsiClient",        
-          "DN"=> get_ou('WINSTATIONS')     ,"ACL" => "winstation"),
+          "DN"=> get_ou('SAMBAMACHINEACCOUNTRDN')     ,"ACL" => "winstation"),
         "terminals"       => array("OBJ"=>"termgeneric", "CLASS"=>"gotoTerminal"   ,
-          "DN"=> get_ou('terminalou')      ,"ACL" => "terminal"),
+          "DN"=> get_ou('terminalRDN')      ,"ACL" => "terminal"),
         "printers"        => array("OBJ"=>"printgeneric", "CLASS"=>"gotoPrinter"    ,
-          "DN"=> get_ou('printerou')       ,"ACL" => "printer"),
+          "DN"=> get_ou('printerRDN')       ,"ACL" => "printer"),
         "phones"          => array("OBJ"=>"phoneGeneric", "CLASS"=>"goFonHardware"  ,
-          "DN"=> get_ou('phoneou')         ,"ACL" => "phone"));
+          "DN"=> get_ou('phoneRDN')         ,"ACL" => "phone"));
 
 
     /* Allow searching for applications, if we are not using release managed applications 
       */
     if(!$this->IsReleaseManagementActivated()){
       $p_f[      "applications"]    = array("OBJ"=>"application", "CLASS"=>"gosaApplication",
-          "DN"=> get_ou('applicationou')   ,"ACL" => "application"); 
+          "DN"=> get_ou('applicationRDN')   ,"ACL" => "application"); 
     }
            
     /*###########
@@ -677,6 +709,14 @@ class ogroup extends plugin
         /* fetch results and append them to the list */
         foreach($res as $attrs){
 
+          /* Skip workstations which are already assigned to an object group.
+           */
+          if ($this->gosaGroupObjects == "[W]" || $this->gosaGroupObjects == "[T]"){
+            if(in_array($attrs['dn'],$this->used_workstations)){
+              continue;
+            }
+          }
+
           $type= $this->getObjectType($attrs);
           $name= $this->getObjectName($attrs);
 
@@ -712,7 +752,7 @@ class ogroup extends plugin
 
       /* It has failed, add entry with type flag I (Invalid)*/
       if (!$ldap->success()){
-        $this->memberList[$dn]= array('text' => _("Non existing dn:")." ".@LDAP::fix($dn),"type" => "I");
+        $this->memberList[$dn]= array('text' => _("Non existing dn:")." ".LDAP::fix($dn),"type" => "I");
 
       } else {
 
@@ -787,8 +827,8 @@ class ogroup extends plugin
         "O" => "plugins/ogroups/images/winstation.png",
         "T" => "plugins/ogroups/images/terminal.png",
         "F" => "plugins/ogroups/images/phone.png",
-        "I" => "images/lists/flag.png",
-        "P" => "plugins/ogroups/images/printer.png");
+        "P" => "plugins/ogroups/images/printer.png",
+        "I" => "images/false.png");
 
     foreach ($input as $key => $value){
       /* Generate output */
@@ -852,11 +892,23 @@ class ogroup extends plugin
 
     /* Permissions for that base? */
     if ($this->base != ""){
-      $new_dn= 'cn='.$this->cn.','.get_ou('ogroupou').$this->base;
+      $new_dn= 'cn='.$this->cn.','.get_ou('ogroupRDN').$this->base;
     } else {
       $new_dn= $this->dn;
     }
 
+    /* Check if we have workstations assigned, that are already assigned to
+        another object group.  */
+    if ($this->gosaGroupObjects == "[W]" || $this->gosaGroupObjects == "[T]" ) {
+      $test =array_intersect($this->used_workstations,$this->member); 
+      if(count($test)){
+        $str = "";
+        foreach($test as $dn){
+          $str .= "<li>".$dn."</li>";
+        }
+        $message[] = sprintf(_("These systems are already configured by other object groups and cannot be added:")."<br><ul>%s</ul>",$str);
+      }
+    }
 
     $ldap = $this->config->get_ldap_link();
     if($this->dn != $new_dn){
@@ -902,14 +954,14 @@ class ogroup extends plugin
     /* Move members to target array */
     $this->attrs['member'] =array();
     foreach ($this->member as $key => $desc){
-      $this->attrs['member'][]= @LDAP::fix($key);
+      $this->attrs['member'][]= LDAP::fix($key);
     }
 
     $ldap= $this->config->get_ldap_link();
 
     /* New accounts need proper 'dn', propagate it to remaining objects */
     if ($this->dn == 'new'){
-      $this->dn= 'cn='.$this->cn.','.get_ou('ogroupou').$this->base;
+      $this->dn= 'cn='.$this->cn.','.get_ou('ogroupRDN').$this->base;
     }
 
     /* Save data. Using 'modify' implies that the entry is already present, use 'add' for