Code

Correcting some locale errors
[gosa.git] / setup / class_setupStep_Migrate.inc
index 8354a765e2b494b031d67d096f5d1794c39a85ae..2ec63d3bc6335fda18a2ea4c250ed5f862cd75a7 100644 (file)
@@ -67,7 +67,6 @@ class Step_Migrate extends setup_step
 
   /* Create Acl attributes */
   var $acl_create_dialog  = FALSE;
-  var $acl_create_type    = "group";
   var $acl_create_selected= ""; // Currently selected element, that should receive admin rights 
   var $acl_create_changes = ""; // Contains ldif information about changes 
   var $acl_create_confirmed= FALSE;
@@ -342,6 +341,21 @@ class Step_Migrate extends setup_step
 
     $group_ou = $cv['groupou'];
     $ldap->cd($cv['base']);
+
+    /***********
+     * Get all gosaDepartments to be able to 
+     *  validate correct ldap tree position of every single user
+     ***********/
+    $valid_deps = array();
+    $valid_deps['/'] = $cv['base'];
+    $ldap->search("(&(objectClass=gosaDepartment)(ou=*))",array("dn","ou"));
+    while($attrs = $ldap->fetch()){
+      $valid_deps[$attrs['ou'][0]] = $attrs['dn'];
+    }
+  
+    /***********
+     * Get all groups 
+     ***********/
     $res = $ldap->search("(objectClass=posixGroup)",array("dn"));
     if(!$res){
       $this->checks['outside_groups']['STATUS']    = FALSE;
@@ -350,13 +364,18 @@ class Step_Migrate extends setup_step
       return(false);
     }
 
-
-    $this->outside_groups = array();
     while($attrs = $ldap->fetch()){
-      if((!preg_match("/^[^,]+,".normalizePreg($group_ou)."/",$attrs['dn'])) && !preg_match("/,dc=addressbook,/",$attrs['dn'])){
+      $group_db_base = preg_replace("/^[^,]+,".normalizePreg($group_ou)."/","",$attrs['dn']);
+
+      /* Check if entry is not an addressbook only user
+       *  and verify that he is in a valid department
+       */
+      if( !preg_match("/".normalizePreg("dc=addressbook,")."/",$group_db_base) &&
+          !in_array($group_db_base,$valid_deps)
+         ){
         $attrs['selected'] = FALSE;
         $attrs['ldif']     = "";
-        $this->outside_groups[base64_encode($attrs['dn'])] = $attrs;
+        $this->outside_users[base64_encode($attrs['dn'])] = $attrs;
       }
     }
 
@@ -386,8 +405,24 @@ class Step_Migrate extends setup_step
         $cv['connection'],
         FALSE,
         $cv['tls']);
-    $people_ou = $cv['peopleou'];
+
     $ldap->cd($cv['base']);
+
+  
+    /***********
+     * Get all gosaDepartments to be able to 
+     *  validate correct ldap tree position of every single user
+     ***********/
+    $valid_deps = array();
+    $valid_deps['/'] = $cv['base'];
+    $ldap->search("(&(objectClass=gosaDepartment)(ou=*))",array("dn","ou"));
+    while($attrs = $ldap->fetch()){
+      $valid_deps[$attrs['ou'][0]] = $attrs['dn'];
+    }
+  
+    /***********
+     * Search for all users 
+     ***********/
     $res = $ldap->search("(&(objectClass=gosaAccount)(!(uid=*$)))",array("dn"));
     if(!$res){
       $this->checks['outside_users']['STATUS']    = FALSE;
@@ -396,10 +431,24 @@ class Step_Migrate extends setup_step
       return(false);
     }
 
-
+    /***********
+     * Check if returned users are within a valid GOsa deparmtment. (peopleou,gosaDepartment,base)
+     ***********/
     $this->outside_users = array();
+    $people_ou = trim($cv['peopleou']);
+    if(!empty($people_ou)){
+      $people_ou = $people_ou.",";
+    } 
+
     while($attrs = $ldap->fetch()){
-      if((!preg_match("/^[^,]+,".normalizePreg($people_ou)."/",$attrs['dn'])  && !preg_match("/,dc=addressbook,/",$attrs['dn']))){
+      $people_db_base = preg_replace("/^[^,]+,".normalizePreg($people_ou)."/","",$attrs['dn']);
+      /* Check if entry is not an addressbook only user 
+       *  and verify that he is in a valid department
+       */
+      if( !preg_match("/".normalizePreg("dc=addressbook,")."/",$people_db_base) &&
+          !in_array($people_db_base,$valid_deps)
+         ){
         $attrs['selected'] = FALSE;
         $attrs['ldif']     = "";
         $this->outside_users[base64_encode($attrs['dn'])] = $attrs;
@@ -623,12 +672,12 @@ class Step_Migrate extends setup_step
         $cv['tls']);
 
     /* Skip GOsa internal departments */
-    $skip_dns = array("/^ou=people,/","/^ou=groups,/","/(,|)ou=configs,/","/(,|)ou=systems,/",
+    $skip_dns = array("/".$cv['peopleou']."/","/".$cv['groupou']."/","/^ou=people,/",
+        "/^ou=groups,/","/(,|)ou=configs,/","/(,|)ou=systems,/",
         "/^ou=apps,/","/^ou=mime,/","/^ou=aclroles,/","/^ou=incoming,/",
         "/ou=snapshots,/","/(,|)dc=addressbook,/","/^(,|)ou=machineaccounts,/",
         "/(,|)ou=winstations,/");
 
-
     /* Get all invisible departments */
     $ldap->cd($cv['base']); 
     $res = $ldap->search("(&(objectClass=organizationalUnit)(!(objectClass=gosaDepartment)))",array("ou","description","dn"));
@@ -748,83 +797,60 @@ class Step_Migrate extends setup_step
         FALSE,
         $cv['tls']);
 
-    /* Search for gosaAcls */ 
+    /* Search for groups that have complete permissions */ 
     $ldap->cd($cv['base']);
-    $res = $ldap->cat($cv['base']);
-    
+    $res = $ldap->search("(&(objectClass=posixGroup)(gosaSubtreeACL=:all)(memberUid=*))",array("memberUid","cn"));
+   
+    /* If ldap search failed, set error message */ 
     if(!$res){
       $this->checks['acls']['STATUS']    = FALSE;
       $this->checks['acls']['STATUS_MSG']= _("LDAP query failed");
       $this->checks['acls']['ERROR_MSG'] = _("Possibly the 'root object' is missing.");
     }else{
-      $found = false;
-      $username = "";
-      $attrs = $ldap->fetch();
-      if(isset($attrs['gosaAclEntry'])){
-        $acls = $attrs['gosaAclEntry'];
-        for($i = 0 ; $i < $acls['count'] ; $i++){
-          $acl = $acls[$i];
-          $tmp = split(":",$acl);
-          if($tmp[1] == "psub"){
-            $members = split(",",$tmp[2]);
-            foreach($members as $member){
-              $member = base64_decode($member);
-
-              /* Check if acl owner is a valid GOsa user account */
-              $ldap->cat($member,array("objectClass","uid","cn"));
-              $ret = $ldap->fetch();
-
-              if(isset($ret['objectClass']) && in_array("posixGroup",$ret['objectClass'])){
-                $found = TRUE;
-                $username .= "ACL-Group:&nbsp;".$ret['cn'][0]."<br>";
-              }elseif(isset($ret['objectClass']) && in_array("gosaAccount",$ret['objectClass']) &&
-                  in_array("organizationalPerson",$ret['objectClass']) &&
-                  in_array("inetOrgPerson",$ret['objectClass'])){
-                $found = TRUE;
-                $username .= "ACL:&nbsp;".$ret['uid'][0]."<br>";
-              }
-            }
-          }elseif($tmp[1] == "role"){
-
-            /* Check if acl owner is a valid GOsa user account */
-            $ldap->cat(base64_decode($tmp[2]),array("gosaAclTemplate"));
-            $ret = $ldap->fetch();
-
-            if(isset($ret['gosaAclTemplate'])){
-              $cnt = $ret['gosaAclTemplate']['count'];
-              for($e = 0 ; $e < $cnt ; $e++){
-
-                $a_str = $ret['gosaAclTemplate'][$e];
-                if(preg_match("/^[0-9]*:psub:/",$a_str) && preg_match("/:all;cmdrw$/",$a_str)){
-
-                  $members = split(",",$tmp[3]);
-                  foreach($members as $member){
-                    $member = base64_decode($member);
-
-                    /* Check if acl owner is a valid GOsa user account */
-                    $ldap->cat($member,array("objectClass","uid"));
-                    $ret = $ldap->fetch();
-  
-                    if(isset($ret['objectClass']) && in_array("gosaAccount",$ret['objectClass']) &&
-                        in_array("organizationalPerson",$ret['objectClass']) &&
-                        in_array("inetOrgPerson",$ret['objectClass'])){
-                      $found = TRUE;
-                      $username .= "ACL Role:&nbsp;".$ret['uid'][0]."<br>";
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
+
+      /* */
+      $found = FALSE;
+      $debug = "";
+      $admin_groups = array();
+
+      /* Get all returned groups */
+      while($attrs  = $ldap->fetch()){
+        $admin_groups[]= $attrs;
       }
 
+      /* Walk through groups and check if memberUid exists in ldap database */
+      foreach($admin_groups as $group){
+
+        $debug .= "<b>".$group['cn'][0].":</b><br>";
+
+        $count_member = $group['memberUid']['count'];
+
+        /* Check every single group member */
+        for($i = 0 ; $i < $count_member ; $i++){
+          $debug .= $group['memberUid'][$i];
+
+          /* Check if user exists */
+          $ldap->search("(&(objectClass=gosaAccount)(uid=".$group['memberUid'][$i]."))",array("dn"));
+          $cnt= $ldap->count(); 
+           
+          /* Update found-status if there is a member available */ 
+          if($cnt == 1){
+            $debug .= " <i>->Found</i><br>";
+            $found = TRUE;
+          }elseif($cnt == 0 ){
+            $debug .= " <font color='red'>-> NOT Found</font><br>";
+          }else{
+            $debug .= " <font color='red'>-> Found more than once -.- </font><br>";
+          }
+        } 
+      
+      }
       # For debugging
-      #echo $username;
+      # echo $debug."<br>----------------<br>"; 
 
       if($found){
         $this->checks['acls']['STATUS']    = TRUE;
-        $this->checks['acls']['STATUS_MSG']= _("Ok")."&nbsp;";
+        $this->checks['acls']['STATUS_MSG']= _("Ok");
         $this->checks['acls']['ERROR_MSG'] = "";
       }else{
         $this->checks['acls']['STATUS']    = FALSE;
@@ -855,56 +881,99 @@ class Step_Migrate extends setup_step
         $cv['connection'],
         FALSE,
         $cv['tls']);
-
-    /* Get current base attributes */
+    
     $ldap->cd($cv['base']);
-    $ldap->cat($cv['base'],array("dn","objectClass","gosaAclEntry"));
-    $attrs = $ldap->fetch();
-
-    /* Add acls for the selcted user to the base */
-    $attrs_new['objectClass'] = array("gosaACL");
+    $ldap->cat($dn,array("objectClass","cn","uid"));
+    $object_attrs = $ldap->fetch();
+    $type = "none";
+  
+    /* Check object that should receive admin acls */
+    if(in_array("gosaAccount",$object_attrs['objectClass'])){
+      $type = "user";
+    }elseif(in_array("posixGroup",$object_attrs['objectClass'])){
+      $type = "group";
+    } 
+
+    /* If a user should get administrative acls, we  
+     *  should check if there is an administrational group 
+     *  and just assign the user to it.
+     * If there is no such group, we must create one.
+     */
+    if($type == "user"){
 
-    for($i = 0; $i < $attrs['objectClass']['count']; $i ++){
-      if(!in_array_ics($attrs['objectClass'][$i],$attrs_new['objectClass'])){
-        $attrs_new['objectClass'][] = $attrs['objectClass'][$i];
-      }
-    }
+      $ldap->search("(&(objectClass=posixGroup)(gosaSubtreeACL=:all)(memberUid=*))",array("memberUid"));
+      if($ldap->count()){
+        $fetched_attrs          = $ldap->fetch();
+        $attrs_admin_group      = $this->cleanup_array($fetched_attrs);
+        $attrs_admin_group_new  = $attrs_admin_group;
 
-    $acl = "0:psub:".base64_encode($dn).":all;cmdrw";    
-    $attrs_new['gosaAclEntry'][] = $acl;
-    if(isset($attrs['gosaAclEntry'])){
-      for($i = 0 ; $i < $attrs['gosaAclEntry']['count']; $i ++){
-          
-        $prio = preg_replace("/[:].*$/","",$attrs['gosaAclEntry'][$i]);
-        $rest = preg_replace("/^[^:]/","",$attrs['gosaAclEntry'][$i]);
-        $data = ($prio+1).$rest;
-        $attrs_new['gosaAclEntry'][] = $data;
-      }
-    }
+        if(!isset($attrs_admin_group_new['memberUid'])){
+          $attrs_admin_group_new['memberUid'] = array();
+        }
+        if(!in_array($object_attrs['uid'][0],$attrs_admin_group_new['memberUid'])){
+          $attrs_admin_group_new['memberUid'][] = $object_attrs['uid'][0];
+        }
 
-    if($only_ldif){
-      $this->acl_create_changes ="\n".$cv['base']."\n";
-      $this->acl_create_changes.=$this->array_to_ldif($attrs)."\n";
-      $this->acl_create_changes.="\n".$cv['base']."\n";
-      $this->acl_create_changes.=$this->array_to_ldif($attrs_new);
-    }else{
-   
-      $ldap->cd($cv['base']);
-      if(!$ldap->modify($attrs_new)){
-        print_red(sprintf(_("Adding acls for user '%s' failed, ldap says '%s'."),$dn,$ldap->get_error()));
-        return(FALSE);
+        if($only_ldif){
+          $this->acl_create_changes = _("Appending user to group administrational group: \n");
+          $this->acl_create_changes.= "\n"._("Before").":\n";
+          $this->acl_create_changes.= $fetched_attrs['dn']."\n";
+          $this->acl_create_changes.= $this->array_to_ldif($attrs_admin_group)."\n";
+          $this->acl_create_changes.= "\n"._("After").":\n";
+          $this->acl_create_changes.= $fetched_attrs['dn']."\n";
+          $this->acl_create_changes.= $this->array_to_ldif($attrs_admin_group_new)."\n";
+        }else{ 
+          $ldap->cd($fetched_attrs['dn']);
+          $ldap->modify($attrs_admin_group_new);
+          if(!preg_match("/success/i",$ldap->get_error())){
+            print_red(sprintf(_("Adding acls for user '%s' failed, ldap says '%s'."),$dn,$ldap->get_error()));
+            return(FALSE);
+          }
+        }
+        
       }else{
-        return(TRUE);
+
+        $group_ou = trim($cv['groupou']);
+        if(!empty($group_ou)){
+          $group_ou = trim($group_ou).",";
+        }
+
+        $new_group_dn = "cn=GOsa Administrators,".$group_ou.$cv['base'];
+        $new_group_attrs['objectClass'] = array("gosaObject","posixGroup");
+        $new_group_attrs['cn'] = "GOsa Administrators";
+        $new_group_attrs['gosaSubtreeACL'] = ":all";
+        $new_group_attrs['gidNumber'] = "999";
+        $new_group_attrs['memberUid'] = array($object_attrs['uid'][0]);
+
+        if($only_ldif){
+          $this->acl_create_changes = _("Creating new administrational group: \n\n");
+          $this->acl_create_changes.= $new_group_dn."\n";
+          $this->acl_create_changes.= $this->array_to_ldif($new_group_attrs);
+        }else{ 
+          $ldap->cd($cv['base']);
+          $ldap->create_missing_trees($group_ou.$cv['base']);
+          $ldap->cd($new_group_dn);
+          $res = $ldap->add($new_group_attrs);
+          if(!$res){
+            print_red(sprintf(_("Adding acls for user '%s' failed, ldap says '%s'."),$dn,$ldap->get_error()));
+            return(FALSE);
+          }
+        }
       }
     }
+    return(TRUE);
   }
  
   
   function create_admin_user()
   {
     $pw1 = $pw2 = "";
+    $uid = "";
 
+    if(isset($_POST['new_user_uid'])){
+      $uid = $_POST['new_user_uid'];
+    }
+  
     if(isset($_POST['new_user_password'])){
       $pw1 = $_POST['new_user_password'];
     }
@@ -916,7 +985,12 @@ class Step_Migrate extends setup_step
       print_red(_("Specified passwords are empty or not equal."));
       return false;
     }
+
+    if(!is_uid($uid) || empty($uid)){
+      print_red(_("Please specify a valid uid."));
+      return false;
+    }
+
     /* Establish ldap connection */
     $cv = $this->parent->captured_values;
     $ldap = new LDAP($cv['admin'],
@@ -927,11 +1001,16 @@ class Step_Migrate extends setup_step
 
     /* Get current base attributes */
     $ldap->cd($cv['base']);
-  
+
+    $people_ou = trim($cv['peopleou']);
+    if(!empty($people_ou)){
+      $people_ou = trim($people_ou).",";
+    }
+
     if($cv['peopledn'] == "cn"){
-      $dn = "cn=System Administrator,".$cv['peopleou'].",".$cv['base'];
+      $dn = "cn=System Administrator,".$people_ou.$cv['base'];
     }else{
-      $dn = "uid=admin,".$cv['peopleou'].",".$cv['base'];
+      $dn = "uid=".$uid.",".$people_ou.$cv['base'];
     }
 
     $methods = @passwordMethod::get_available_methods_if_not_loaded();
@@ -944,10 +1023,17 @@ class Step_Migrate extends setup_step
     $new_user['givenName']  = "System";
     $new_user['sn']  = "Administrator";
     $new_user['cn']  = "System Administrator";
-    $new_user['uid'] = "admin";
+    $new_user['uid'] = $uid;
     $new_user['userPassword'] = $hash;
     
     $ldap->cd($cv['base']);
+    $ldap->cat($dn,array("dn"));
+    if($ldap->count()){
+      print_red(sprintf(_("Could not add administrative user, there is already an object with the same dn '%s' in your ldap database."),
+            $dn));
+      return(FALSE);
+    }
+
     $ldap->create_missing_trees(preg_replace("/^[^,]+,/","",$dn));
     $ldap->cd($dn);  
     $res = $ldap->add($new_user);
@@ -1080,7 +1166,7 @@ class Step_Migrate extends setup_step
       print_red(_("Couldn't move users to specified department."));
       return(false);
     }
+      
     foreach($this->outside_users as $b_dn => $data){
       $this->outside_users[$b_dn]['ldif'] ="";
       if($data['selected']){
@@ -1264,14 +1350,14 @@ class Step_Migrate extends setup_step
       $this->show_details = FALSE;
     }
 
-    if(isset($_POST['create_acls_create_confirmed'])){
-      if($this->create_admin()){
-        $this->acl_create_dialog = FALSE;
-        $this->dialog = FALSE;
-      $this->show_details = FALSE;
-        $this->initialize_checks();
-      }
-    }
+#    if(isset($_POST['create_acls_create_confirmed'])){
+#      if($this->create_admin()){
+#        $this->acl_create_dialog = FALSE;
+#        $this->dialog = FALSE;
+#      $this->show_details = FALSE;
+#        $this->initialize_checks();
+#      }
+#    }
 
     if(isset($_POST['create_acls_create'])){
       $this->create_admin(TRUE);
@@ -1286,13 +1372,15 @@ class Step_Migrate extends setup_step
 
     if($this->acl_create_dialog){
       $smarty = get_smarty();
+
+      $uid = "admin";
+      if(isset($_POST['new_user_uid'])){
+        $uid = $_POST['new_user_uid'];
+      }
+
+      $smarty->assign("new_user_uid",$uid);
       $smarty->assign("new_user_password",@$_POST['new_user_password']);
       $smarty->assign("new_user_password2",@$_POST['new_user_password2']);
-      $smarty->assign("users" ,$this->get_user_list());
-      $smarty->assign("users_cnt" ,count($this->get_user_list()));
-      $smarty->assign("groups",$this->get_group_list());
-      $smarty->assign("groups_cnt",count($this->get_group_list()));
-      $smarty->assign("type"  ,$this->acl_create_type);
       $smarty->assign("method","create_acls");
       $smarty->assign("acl_create_selected",$this->acl_create_selected);
       $smarty->assign("what_will_be_done_now",$this->acl_create_changes);
@@ -1440,21 +1528,10 @@ class Step_Migrate extends setup_step
 
     /* Get "create acl" dialog posts */
     if($this->acl_create_dialog){
-      if(isset($_POST['create_acls_create'])){
-        if(isset($_POST['create_acls_selected'])){
-          $this->acl_create_selected = base64_decode($_POST['create_acls_selected']);
-        }else{
-          $this->acl_create_selected = ""; 
-        }
-      }
 
       if(isset($_POST['create_acls_create_abort'])){
         $this->acl_create_selected = "";
       }
-
-      if(isset($_POST['acl_create_type'])){
-        $this->acl_create_type = $_POST['acl_create_type'];
-      }
     }
 
     /* Get selected departments */
@@ -1590,6 +1667,7 @@ class Step_Migrate extends setup_step
   {
     /* Get collected configuration settings */
     $cv = $this->parent->captured_values;
+    $people_ou = trim($cv['peopleou']);
 
     /* Establish ldap connection */
     $ldap = new LDAP($cv['admin'],
@@ -1598,33 +1676,54 @@ class Step_Migrate extends setup_step
         FALSE,
         $cv['tls']);
 
-    $ldap->cd($cv['base']);
-    $ldap->search("(".$cv['peopleou'].")",array("dn"));
-  
-    if($ldap->count() == 0 ){
-      $add_dn = $cv['peopleou'].",".$cv['base'];
-      $naming_attr = preg_replace("/=.*$/","",$add_dn);
-      $naming_value = preg_replace("/^[^=]*+=([^,]*).*$/","\\1",$add_dn);
-      $add = array();
-      $add['objectClass'] = array("organizationalUnit");
-      $add[$naming_attr] = $naming_value;
+    
+    /*****************
+     * If people ou is NOT empty 
+     * search for for all objects matching the given container
+     *****************/
+    if(!empty($people_ou)){
+      $ldap->search("(".$people_ou.")",array("dn"));
+
+      /* Create people ou if there is currently none */
+      if($ldap->count() == 0 ){
+        $add_dn = $cv['peopleou'].",".$cv['base'];
+        $naming_attr = preg_replace("/=.*$/","",$add_dn);
+        $naming_value = preg_replace("/^[^=]*+=([^,]*).*$/","\\1",$add_dn);
+        $add = array();
+        $add['objectClass'] = array("organizationalUnit");
+        $add[$naming_attr] = $naming_value;
+        $ldap->cd($cv['base']);
+        $ldap->create_missing_trees(preg_replace("/^[^,]+,/","",$add_dn));
+        $ldap->cd($add_dn);
+        $ldap->add($add);
+      }
 
-      $ldap->cd($cv['base']);
-      $ldap->create_missing_trees(preg_replace("/^[^,]+,/","",$add_dn));
-      $ldap->cd($add_dn);
-      $ldap->add($add);
-    }
+      /* Create result */
+      $ldap->search("(".$cv['peopleou'].")",array("dn"));
+      $tmp = array();
+      while($attrs= $ldap->fetch()){
+        if(!preg_match("/ou=snapshots,/",$attrs['dn'])){
+          $tmp[base64_encode($attrs['dn'])] = $ldap->fix($attrs['dn']);
+        }
+      }
+    } else{
 
-    $ldap->search("(".$cv['peopleou'].")",array("dn"));
-    $tmp = array();
-    while($attrs= $ldap->fetch()){
-      if(!preg_match("/ou=snapshots,/",$attrs['dn'])){
-        $tmp[base64_encode($attrs['dn'])] = $ldap->fix($attrs['dn']);
+      /************
+       * If people ou is empty 
+       * Get all valid gosaDepartments
+       ************/
+      $ldap->cd($cv['base']);
+      $tmp = array();
+      $ldap->search("(&(objectClass=gosaDepartment)(ou=*))",array("dn"));
+      $tmp[base64_encode($cv['base'])] = $ldap->fix($cv['base']);
+      while($attrs = $ldap->fetch()){
+        $tmp[base64_encode($attrs['dn'])] = $ldap->fix($attrs['dn']);;
       }
     }
     return($tmp); 
   }
 
+
   function get_all_winstation_ous()
   {
     /* Get collected configuration settings */
@@ -1683,29 +1782,50 @@ class Step_Migrate extends setup_step
         $cv['connection'],
         FALSE,
         $cv['tls']);
+    
+    $group_ou = trim($cv['groupou']);
+    if(!empty($group_ou)){
+      $group_ou = trim($group_ou);
+    }
 
+    /************
+     * If group ou is NOT empty
+     * Get all valid group ous, create one if necessary
+     ************/
     $ldap->cd($cv['base']);
-    $ldap->search("(".$cv['groupou'].")",array("dn"));
-  
-    if($ldap->count() == 0 ){
-      $add_dn = $cv['groupou'].",".$cv['base'];
-      $naming_attr = preg_replace("/=.*$/","",$add_dn);
-      $naming_value = preg_replace("/^[^=]*+=([^,]*).*$/","\\1",$add_dn);
-      $add = array();
-      $add['objectClass'] = array("organizationalUnit");
-      $add[$naming_attr] = $naming_value;
+    if(!empty($group_ou)){
+      $ldap->search("(".$group_ou.")",array("dn"));
+      if($ldap->count() == 0 ){
+        $add_dn = $group_ou.$cv['base'];
+        $naming_attr = preg_replace("/=.*$/","",$add_dn);
+        $naming_value = preg_replace("/^[^=]*+=([^,]*).*$/","\\1",$add_dn);
+        $add = array();
+        $add['objectClass'] = array("organizationalUnit");
+        $add[$naming_attr] = $naming_value;
 
+        $ldap->cd($cv['base']);
+        $ldap->create_missing_trees(preg_replace("/^[^,]+,/","",$add_dn));
+        $ldap->cd($add_dn);
+        $ldap->add($add);
+      }
+      $ldap->search("(".$group_ou.")",array("dn"));
+      $tmp = array();
+      while($attrs= $ldap->fetch()){
+        if(!preg_match("/ou=snapshots,/",$attrs['dn'])){
+          $tmp[base64_encode($attrs['dn'])] = $ldap->fix($attrs['dn']);
+        }
+      }
+    }else{
+      /************
+       * If group ou is empty
+       * Get all valid gosaDepartments
+       ************/
       $ldap->cd($cv['base']);
-      $ldap->create_missing_trees(preg_replace("/^[^,]+,/","",$add_dn));
-      $ldap->cd($add_dn);
-      $ldap->add($add);
-    }
-
-    $ldap->search("(".$cv['groupou'].")",array("dn"));
-    $tmp = array();
-    while($attrs= $ldap->fetch()){
-      if(!preg_match("/ou=snapshots,/",$attrs['dn'])){
-        $tmp[base64_encode($attrs['dn'])] = $ldap->fix($attrs['dn']);
+      $tmp = array();
+      $ldap->search("(&(objectClass=gosaDepartment)(ou=*))",array("dn"));
+      $tmp[base64_encode($cv['base'])] = $ldap->fix($cv['base']);
+      while($attrs = $ldap->fetch()){
+        $tmp[base64_encode($attrs['dn'])] = $ldap->fix($attrs['dn']);;
       }
     }
     return($tmp);