Code

Updated ACL handling for users.
[gosa.git] / gosa-core / setup / class_setupStep_Migrate.inc
index 20d563b5f9a1b90b81cc8f53df2a9058f8f9676d..e43d1a15c435a0fbd4f0580fa27f3dc0880f0f04 100644 (file)
@@ -94,6 +94,7 @@ class Step_Migrate extends setup_step
   var $check_gidNumbers        = array();
   var $check_gidNumbers_dialog = FALSE;
 
+  var $group_list              = array();
 
   function Step_Migrate()
   {
@@ -126,7 +127,6 @@ class Step_Migrate extends setup_step
     $this->checks['deps_visible']['STATUS']    = FALSE;
     $this->checks['deps_visible']['STATUS_MSG']= "";
     $this->checks['deps_visible']['ERROR_MSG'] = "";
-    $this->check_organizationalUnits();
 
     $this->checks['users_visible']['TITLE']     = _("Checking for invisible users");
     $this->checks['users_visible']['STATUS']    = FALSE;
@@ -151,6 +151,7 @@ class Step_Migrate extends setup_step
     $this->checks['outside_groups']['STATUS_MSG']= "";
     $this->checks['outside_groups']['ERROR_MSG'] = "";
     $this->search_outside_groups();
+    $this->check_organizationalUnits();
 
     $this->checks['outside_winstations']['TITLE']     = _("Checking for windows workstations outside the winstation tree");
     $this->checks['outside_winstations']['STATUS']    = FALSE;
@@ -158,13 +159,13 @@ class Step_Migrate extends setup_step
     $this->checks['outside_winstations']['ERROR_MSG'] = "";
     $this->search_outside_winstations();
 
-    $this->checks['uidNumber_usage']['TITLE']     = _("Checking for duplicate uid numbers");
+    $this->checks['uidNumber_usage']['TITLE']     = _("Checking for duplicated UID numbers");
     $this->checks['uidNumber_usage']['STATUS']    = FALSE;
     $this->checks['uidNumber_usage']['STATUS_MSG']= "";
     $this->checks['uidNumber_usage']['ERROR_MSG'] = "";
     $this->check_uidNumber();
     
-    $this->checks['gidNumber_usage']['TITLE']     = _("Checking for duplicate gid numbers");
+    $this->checks['gidNumber_usage']['TITLE']     = _("Checking for duplicate GID numbers");
     $this->checks['gidNumber_usage']['STATUS']    = FALSE;
     $this->checks['gidNumber_usage']['STATUS_MSG']= "";
     $this->checks['gidNumber_usage']['ERROR_MSG'] = "";
@@ -176,15 +177,18 @@ class Step_Migrate extends setup_step
    */
   function check_uidNumber()
   {
+    /* Establish ldap connection */
     $cv = $this->parent->captured_values;
-    $ldap = new LDAP($cv['admin'],
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     $ldap->cd($cv['base']);
-    $res = $ldap->search("uidNumber=*",array("dn","uidNumber"));
+    $res = $ldap->search("(&(objectClass=posixAccount)(uidNumber=*))",array("dn","uidNumber"));
     if(!$res){
       $this->checks['uidNumber_usage']['STATUS']    = FALSE;
       $this->checks['uidNumber_usage']['STATUS_MSG']= _("LDAP query failed");
@@ -225,13 +229,16 @@ class Step_Migrate extends setup_step
    */
   function check_gidNumber()
   {
+    /* Establish ldap connection */
     $cv = $this->parent->captured_values;
-    $ldap = new LDAP($cv['admin'],
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     $ldap->cd($cv['base']);
     $res = $ldap->search("(&(objectClass=posixGroup)(gidNumber=*))",array("dn","gidNumber"));
     if(!$res){
@@ -274,13 +281,16 @@ class Step_Migrate extends setup_step
    */
   function search_outside_winstations()
   {
+    /* Establish ldap connection */
     $cv = $this->parent->captured_values;
-    $ldap = new LDAP($cv['admin'],
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     /* Get winstation ou */
     if($cv['generic_settings']['wws_ou_active']) {
       $winstation_ou = $cv['generic_settings']['ws_ou'];
@@ -332,13 +342,16 @@ class Step_Migrate extends setup_step
    */
   function search_outside_groups()
   {
+    /* Establish ldap connection */
     $cv = $this->parent->captured_values;
-    $ldap = new LDAP($cv['admin'],
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     $group_ou = $cv['groupou'];
     $ldap->cd($cv['base']);
 
@@ -365,6 +378,7 @@ class Step_Migrate extends setup_step
     }
 
     $this->outside_groups = array();
+    $this->groups_list = array();;
     while($attrs = $ldap->fetch()){
       $group_db_base = preg_replace("/^[^,]+,".normalizePreg($group_ou)."+,/i","",$attrs['dn']);
 
@@ -378,6 +392,7 @@ class Step_Migrate extends setup_step
         $attrs['ldif']     = "";
         $this->outside_groups[base64_encode($attrs['dn'])] = $attrs;
       }
+      $this->group_list[] = $attrs['dn'];
     }
 
     if(count($this->outside_groups)){
@@ -399,13 +414,15 @@ class Step_Migrate extends setup_step
    */
   function search_outside_users()
   {
+    /* Establish ldap connection */
     $cv = $this->parent->captured_values;
-    $ldap = new LDAP($cv['admin'],
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
     $ldap->cd($cv['base']);
 
 
@@ -477,13 +494,16 @@ class Step_Migrate extends setup_step
    */
   function check_ldap_permissions()
   {
+    /* Establish ldap connection */
     $cv = $this->parent->captured_values;
-    $ldap = new LDAP($cv['admin'],
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     /* Create dummy entry 
      */
     $name     = "GOsa_setup_text_entry_".session_id().rand(0,999999);
@@ -554,16 +574,16 @@ class Step_Migrate extends setup_step
     $old    = $this->users_to_migrate;
     $this->users_to_migrate = array();
 
-    /* Get collected configuration settings */
-    $cv = $this->parent->captured_values;
-
     /* Establish ldap connection */
-    $ldap = new LDAP($cv['admin'],
+    $cv = $this->parent->captured_values;
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     /* Get all invisible users 
      */
     $ldap->cd($cv['base']); 
@@ -607,16 +627,16 @@ class Step_Migrate extends setup_step
   {
     $this->show_details= $only_ldif;
 
-    /* Get collected configuration settings */
-    $cv = $this->parent->captured_values;
-
     /* Establish ldap connection */
-    $ldap = new LDAP($cv['admin'],
+    $cv = $this->parent->captured_values;
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     /* Add gosaAccount objectClass to the selected users  
      */
     foreach($this->users_to_migrate as $key => $dep){
@@ -662,18 +682,18 @@ class Step_Migrate extends setup_step
     $old = $this->deps_to_migrate;
     $this->deps_to_migrate = array();
 
-    /* Get collected configuration settings */
-    $cv = $this->parent->captured_values;
-
     /* Establish ldap connection */
-    $ldap = new LDAP($cv['admin'],
+    $cv = $this->parent->captured_values;
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     /* Skip GOsa internal departments */
-    $skip_dns = array("/".$cv['peopleou']."/","/".$cv['groupou']."/","/^ou=people,/","/^ou=groups,/",
+    $skip_dns = array("/".$cv['peopleou']."/","/".$cv['groupou']."/","/^ou=people,/","/^ou=groups,/","/^ou=sudoers,/",
         "/(,|)ou=configs,/","/(,|)ou=systems,/",
         "/(,|)ou=apps,/","/(,|)ou=mime,/","/(,|)ou=devices/","/^ou=aclroles,/","/^ou=incoming,/",
         "/ou=snapshots,/","/(,|)dc=addressbook,/","/^(,|)ou=machineaccounts,/",
@@ -700,6 +720,17 @@ class Step_Migrate extends setup_step
     foreach($this->deps_to_migrate as $key => $attrs){
       $dn = $attrs['dn'];
       $skip = false;;
+
+      /* Check if this object is an application release object
+          e.g. groups-> application menus.
+       */
+      if(preg_match("/^.*,[ ]*cn=/",$dn)){
+        $cn_dn = preg_replace("/^.*,[ ]*cn=/","cn=",$dn);
+        if(in_array($cn_dn,$this->group_list)){
+          $skip = true;
+        }
+      }
+    
       foreach($skip_dns as $skip_dn){
         if(preg_match($skip_dn,$dn)){
           $skip = true;
@@ -736,16 +767,16 @@ class Step_Migrate extends setup_step
   {
     $this->show_details= $only_ldif;
 
-    /* Get collected configuration settings */
-    $cv = $this->parent->captured_values;
-
     /* Establish ldap connection */
-    $ldap = new LDAP($cv['admin'],
+    $cv = $this->parent->captured_values;
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     /* Add gosaDepartment objectClass to each selected entry 
      */
     foreach($this->deps_to_migrate as $key => $dep){
@@ -792,13 +823,13 @@ class Step_Migrate extends setup_step
   {
     /* Establish ldap connection */
     $cv = $this->parent->captured_values;
-    $ldap = new LDAP($cv['admin'],
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
-    /* Search for gosaAcls */ 
+    $ldap = new ldapMultiplexer($ldap_l);
     $ldap->cd($cv['base']);
     $res = $ldap->cat($cv['base']);
     
@@ -899,19 +930,22 @@ class Step_Migrate extends setup_step
     /* Get collected configuration settings */
     $cv = $this->parent->captured_values;
 
-    /* Establish ldap connection */
-    $ldap = new LDAP($cv['admin'],
+    /* On first call check for rid/sid base */
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     /* 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 = array();
     $attrs_new['objectClass'] = array("gosaACL");
 
     for($i = 0; $i < $attrs['objectClass']['count']; $i ++){
@@ -976,15 +1010,16 @@ class Step_Migrate extends setup_step
       return false;
     }
     
-
-    /* Establish ldap connection */
+    /* On first call check for rid/sid base */
     $cv = $this->parent->captured_values;
-    $ldap = new LDAP($cv['admin'],
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     /* Get current base attributes */
     $ldap->cd($cv['base']);
   
@@ -994,21 +1029,18 @@ class Step_Migrate extends setup_step
     }
 
     if($cv['peopledn'] == "cn"){
-      $dn = "cn=System Administrator,".$people_ou.$cv['base'];
+      $dn = "cn=System Administrator-".$uid.",".$people_ou.$cv['base'];
     }else{
       $dn = "uid=".$uid.",".$people_ou.$cv['base'];
     }
 
-    $methods = @passwordMethod::get_available_methods();
-    $p_m = $methods[$cv['encryption']];
-    $p_c = new $p_m(array());
-    $hash = $p_c->generate_hash($pw2);
+    $hash = passwordMethod::make_hash($pw2, $cv['encryption']);
 
     $new_user=array();
     $new_user['objectClass']= array("top","person","gosaAccount","organizationalPerson","inetOrgPerson");
     $new_user['givenName']  = "System";
     $new_user['sn']  = "Administrator";
-    $new_user['cn']  = "System Administrator";
+    $new_user['cn']  = "System Administrator-".$uid;
     $new_user['uid'] = $uid;
     $new_user['userPassword'] = $hash;
    
@@ -1041,12 +1073,14 @@ class Step_Migrate extends setup_step
   {
     /* Establish ldap connection */
     $cv = $this->parent->captured_values;
-    $ldap = new LDAP($cv['admin'],
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     $ldap->cd($cv['base']);
 
     /* Check if there was a destination department posted */
@@ -1089,12 +1123,13 @@ class Step_Migrate extends setup_step
   {
     /* Establish ldap connection */
     $cv = $this->parent->captured_values;
-    $ldap = new LDAP($cv['admin'],
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
     $ldap->cd($cv['base']);
 
     /* Check if there was a destination department posted */
@@ -1137,12 +1172,13 @@ class Step_Migrate extends setup_step
   {
     /* Establish ldap connection */
     $cv = $this->parent->captured_values;
-    $ldap = new LDAP($cv['admin'],
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
     $ldap->cd($cv['base']);
 
     /* Check if there was a destination department posted */
@@ -1586,19 +1622,21 @@ class Step_Migrate extends setup_step
    */
   function checkBase($just_check = TRUE)
   {
-    /* Get collected setup informations */
-    $cv = $this->parent->captured_values;
-
     /* Establish ldap connection */
-    $ldap = new LDAP($cv['admin'],
+    $cv = $this->parent->captured_values;
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     /* Check if root object exists */
     $ldap->cd($cv['base']);
+    $ldap->set_size_limit(1);
     $res = $ldap->search("(objectClass=*)");
+    $ldap->set_size_limit(0);
     $err = ldap_errno($ldap->cid); 
 
     if( !$res || 
@@ -1663,16 +1701,15 @@ class Step_Migrate extends setup_step
 
   function get_user_list()
   {
-    /* Get collected configuration settings */
-    $cv = $this->parent->captured_values;
-
     /* Establish ldap connection */
-    $ldap = new LDAP($cv['admin'],
+    $cv = $this->parent->captured_values;
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
-    
+
+    $ldap = new ldapMultiplexer($ldap_l);
     $ldap->cd($cv['base']);
     $ldap->search("(objectClass=gosaAccount)",array("dn"));
   
@@ -1691,12 +1728,14 @@ class Step_Migrate extends setup_step
     $people_ou = trim($cv['peopleou']);
 
     /* Establish ldap connection */
-    $ldap = new LDAP($cv['admin'],
+    $cv = $this->parent->captured_values;
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
 
     /*****************
      * If people ou is NOT empty
@@ -1747,16 +1786,16 @@ class Step_Migrate extends setup_step
 
   function get_all_winstation_ous()
   {
-    /* Get collected configuration settings */
-    $cv = $this->parent->captured_values;
-
     /* Establish ldap connection */
-    $ldap = new LDAP($cv['admin'],
+    $cv = $this->parent->captured_values;
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     /* Get winstation ou */
     if($cv['generic_settings']['wws_ou_active']) {
       $winstation_ou = $cv['generic_settings']['ws_ou'];
@@ -1794,16 +1833,16 @@ class Step_Migrate extends setup_step
 
  function get_all_group_ous()
   {
-    /* Get collected configuration settings */
-    $cv = $this->parent->captured_values;
-
     /* Establish ldap connection */
-    $ldap = new LDAP($cv['admin'],
+    $cv = $this->parent->captured_values;
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
     $group_ou = trim($cv['groupou']);
     if(!empty($group_ou)){
       $group_ou = trim($group_ou);
@@ -1855,15 +1894,15 @@ class Step_Migrate extends setup_step
 
   function get_group_list()
   {
-    /* Get collected configuration settings */
-    $cv = $this->parent->captured_values;
-
     /* Establish ldap connection */
-    $ldap = new LDAP($cv['admin'],
+    $cv = $this->parent->captured_values;
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
+
+    $ldap = new ldapMultiplexer($ldap_l);
     
     $ldap->cd($cv['base']);
     $ldap->search("(objectClass=posixGroup)",array("dn"));
@@ -1878,16 +1917,16 @@ class Step_Migrate extends setup_step
 
   function move($source,$destination)
   {
-    /* Get collected configuration settings */
-    $cv = $this->parent->captured_values;
-
     /* Establish ldap connection */
-    $ldap = new LDAP($cv['admin'],
+    $cv = $this->parent->captured_values;
+    $ldap_l = new LDAP($cv['admin'],
         $cv['password'],
         $cv['connection'],
         FALSE,
         $cv['tls']);
 
+    $ldap = new ldapMultiplexer($ldap_l);
+
      /* Update object references in gosaGroupOfNames */
     $ogs_to_fix = array();
     $ldap->cd($cv['base']);
@@ -1916,7 +1955,9 @@ class Step_Migrate extends setup_step
       msg_dialog::display(_("LDAP error"), sprintf(_("Copy '%s' to '%s' failed:")."<br><br><i>%s</i>", LDAP::fix($source), LDAP::fix($destination), $ldap->get_error()), ERROR_DIALOG);
     }else{
       $res = $ldap->rmDir($source);
-      show_ldap_error($ldap->get_error(),_("Problem copying DNs"));
+      if (!$ldap->success()){
+        msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $source, LDAP_DEL, get_class()));
+      }
 
       /* Object is copied, so update its references */
       foreach($ogs_to_fix as $dn => $data){