update_strings(); $this->initialize_checks(); } function update_strings() { $this->s_title = _("LDAP inspection"); $this->s_title_long = _("LDAP inspection"); $this->s_info = _("Analyze your current LDAP for GOsa compatibility"); } function initialize_checks() { $this->checks = array(); $this->checks['permissions']['TITLE'] = _("Checking permissions on ldap database"); $this->checks['permissions']['STATUS'] = FALSE; $this->checks['permissions']['STATUS_MSG']= ""; $this->checks['permissions']['ERROR_MSG'] = ""; $this->check_ldap_permissions(); $this->checks['deps_visible']['TITLE'] = _("Checking for invisible deparmtments"); $this->checks['deps_visible']['STATUS'] = FALSE; $this->checks['deps_visible']['STATUS_MSG']= ""; $this->checks['deps_visible']['ERROR_MSG'] = ""; $this->check_visible_organizationalUnits(); $this->checks['users_visible']['TITLE'] = _("Checking for invisible user"); $this->checks['users_visible']['STATUS'] = FALSE; $this->checks['users_visible']['STATUS_MSG']= ""; $this->checks['users_visible']['ERROR_MSG'] = ""; $this->check_visible_gosaAccounts(); } /* Check ldap accessibility * Create and remove a dummy object, * to ensure that we have the necessary permissions */ function check_ldap_permissions() { $cv = $this->parent->captured_values; $ldap = new LDAP($cv['admin'], $cv['password'], $cv['connection'], FALSE, $cv['tls']); $name = "GOsa_setup_text_entry_".session_id().rand(0,999999); $dn = "ou=".$name.",".$cv['base']; $testEntry= array(); $testEntry['objectClass'][]= "top"; $testEntry['objectClass'][]= "organizationalUnit"; $testEntry['objectClass'][]= "gosaDepartment"; $testEntry['description']= "Created by GOsa setup, this object can be removed."; $testEntry['ou'] = $name; $ldap->cd ($dn); $res = $ldap->add($testEntry); if(!$res){ $this->checks['permissions']['STATUS'] = FALSE; $this->checks['permissions']['STATUS_MSG']= _("Failed"); $this->checks['permissions']['ERROR_MSG'] = sprintf(_("The specified user '%s' does not have full access to your ldap database."),$cv['admin']); $this->checks['permissions']['ERROR_MSG'].= ""; return(false); } $res = $ldap->rmDir($dn); if(!$res){ $this->checks['permissions']['STATUS'] = FALSE; $this->checks['permissions']['STATUS_MSG']= _("Failed"); $this->checks['permissions']['ERROR_MSG'] = sprintf(_("The specified user '%s' does not have full access to your ldap database."),$cv['admin']); $this->checks['permissions']['ERROR_MSG'].= ""; return(false); } $this->checks['permissions']['STATUS'] = TRUE; $this->checks['permissions']['STATUS_MSG']= _("Ok"); $this->checks['permissions']['ERROR_MSG'] = ""; return(true); } function check_visible_gosaAccounts() { $old = $this->users_to_migrate; $this->users_to_migrate = array(); $cnt_ok = 0; /* Get collected configuration settings */ $cv = $this->parent->captured_values; /* Establish ldap connection */ $ldap = new LDAP($cv['admin'], $cv['password'], $cv['connection'], FALSE, $cv['tls']); /* Get all invisible departments */ $ldap->cd($cv['base']); $ldap->search("(&(|(objectClass=posixAccount)(objectClass=inetOrgPerson)(objectClass=organizationalPerson))(!(objectClass=gosaAccount)))",array("sn","givenName","cn","uid")); while($attrs = $ldap->fetch()){ if(!preg_match("/,dc=addressbook,/",$attrs['dn'])){ $attrs['checked'] = FALSE; $attrs['before'] = ""; $attrs['after'] = ""; /* Set objects to selected, that were selected before reload */ if(isset($old[base64_encode($attrs['dn'])])){ $attrs['checked'] = $old[base64_encode($attrs['dn'])]['checked']; } $this->users_to_migrate[base64_encode($attrs['dn'])] = $attrs; } } /* No invisible */ if(count($this->users_to_migrate) == 0){ $this->checks['users_visible']['STATUS'] = TRUE; $this->checks['users_visible']['STATUS_MSG']= _("Ok"); $this->checks['users_visible']['ERROR_MSG'] = ""; $this->checks['users_visible']['ERROR_MSG'] .= ""; }else{ $this->checks['users_visible']['STATUS'] = FALSE; $this->checks['users_visible']['STATUS_MSG']= ""; $this->checks['users_visible']['ERROR_MSG'] = sprintf(_("Found %s users that will not be visible in GOsa."), count($this->users_to_migrate)); $this->checks['users_visible']['ERROR_MSG'] .= ""; $this->checks['users_visible']['ERROR_MSG'] .= ""; } } /* Start deparmtment migration */ function migrate_gosaAccounts($only_ldif = FALSE) { /* Get collected configuration settings */ $cv = $this->parent->captured_values; /* Establish ldap connection */ $ldap = new LDAP($cv['admin'], $cv['password'], $cv['connection'], FALSE, $cv['tls']); foreach($this->users_to_migrate as $key => $dep){ if($dep['checked']){ $ldap->cat($dep['dn'],array("objectClass")); $attrs = $ldap->fetch(); $new_attrs = array(); for($i = 0 ; $i < $attrs['objectClass']['count']; $i ++ ){ $new_attrs['objectClass'][] = $attrs['objectClass'][$i]; } $new_attrs['objectClass'][] = "gosaAccount"; if($only_ldif){ $this->users_to_migrate[$key]['before'] = $this->array_to_ldif($attrs); $this->users_to_migrate[$key]['after'] = $this->array_to_ldif($new_attrs); }else{ $ldap->cd($attrs['dn']); if(!$ldap->modify($new_attrs)){ print_red(sprintf(_("Failed to migrate the department '%s' into GOsa, error message is as follows '%s'."),$attrs['dn'],$ldap->get_error())); return(false); } } } } return(TRUE); } function check_visible_organizationalUnits() { $old = $this->deps_to_migrate; $this->deps_to_migrate = array(); $cnt_ok = 0; /* Get collected configuration settings */ $cv = $this->parent->captured_values; /* Establish ldap connection */ $ldap = new LDAP($cv['admin'], $cv['password'], $cv['connection'], FALSE, $cv['tls']); /* Skip GOsa internal departments */ $skip_dns = array("/^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']); $ldap->search("(&(objectClass=organizationalUnit)(!(objectClass=gosaDepartment)))",array("ou","description","dn")); while($attrs = $ldap->fetch()){ $attrs['checked'] = FALSE; $attrs['before'] = ""; $attrs['after'] = ""; /* Set objects to selected, that were selected before reload */ if(isset($old[base64_encode($attrs['dn'])])){ $attrs['checked'] = $old[base64_encode($attrs['dn'])]['checked']; } $this->deps_to_migrate[base64_encode($attrs['dn'])] = $attrs; } /* Filter returned list of departments */ foreach($this->deps_to_migrate as $key => $attrs){ $dn = $attrs['dn']; $skip = false; foreach($skip_dns as $skip_dn){ if(preg_match($skip_dn,$dn)){ $skip = true; } } if($skip){ unset($this->deps_to_migrate[$key]); } } /* No invisible */ if(count($this->deps_to_migrate) == 0){ $this->checks['deps_visible']['STATUS'] = TRUE; $this->checks['deps_visible']['STATUS_MSG']= _("Ok"); $this->checks['deps_visible']['ERROR_MSG'] = ""; $this->checks['deps_visible']['ERROR_MSG'] .= ""; }else{ $this->checks['deps_visible']['STATUS'] = FALSE; $this->checks['deps_visible']['STATUS_MSG']= "";//sprintf(_("%s entries found"),count($this->deps_to_migrate)); $this->checks['deps_visible']['ERROR_MSG'] = sprintf(_("Found %s departments that will not be visible in GOsa."),count($this->deps_to_migrate)); $this->checks['deps_visible']['ERROR_MSG'] .= ""; $this->checks['deps_visible']['ERROR_MSG'] .= ""; } } /* Start deparmtment migration */ function migrate_organizationalUnits($only_ldif = FALSE) { /* Get collected configuration settings */ $cv = $this->parent->captured_values; /* Establish ldap connection */ $ldap = new LDAP($cv['admin'], $cv['password'], $cv['connection'], FALSE, $cv['tls']); foreach($this->deps_to_migrate as $key => $dep){ if($dep['checked']){ $ldap->cat($dep['dn'],array("objectClass","description")); $attrs = $ldap->fetch(); $new_attrs = array(); for($i = 0 ; $i < $attrs['objectClass']['count']; $i ++ ){ $new_attrs['objectClass'][] = $attrs['objectClass'][$i]; } $new_attrs['objectClass'][] = "gosaDepartment"; if(!isset($attrs['description'])){ $new_attrs['description'][] = "GOsa department"; } if($only_ldif){ $this->deps_to_migrate[$key]['before'] = $this->array_to_ldif($attrs); $this->deps_to_migrate[$key]['after'] = $this->array_to_ldif($new_attrs); }else{ $ldap->cd($attrs['dn']); if(!$ldap->modify($new_attrs)){ print_red(sprintf(_("Failed to migrate the department '%s' into GOsa, error message is as follows '%s'."),$attrs['dn'],$ldap->get_error())); return(false); } } } } return(TRUE); } function execute() { /* Permission check */ $this->check_ldap_permissions(); /* User Migration */ /* Refresh list of deparments */ if(isset($_POST['users_visible_migrate_refresh'])){ $this->check_visible_gosaAccounts(); } /* Open migration dialog */ if(isset($_POST['users_visible_migrate'])){ $this->users_migration_dialog = TRUE; $this->dialog =TRUE; } /* Close migration dialog */ if(isset($_POST['users_visible_migrate_close'])){ $this->users_migration_dialog = FALSE; $this->dialog =FALSE; } /* Start migration */ if(isset($_POST['users_visible_migrate_migrate'])){ if($this->migrate_gosaAccounts()){ $this->check_visible_gosaAccounts(); } } /* Start migration */ if(isset($_POST['users_visible_migrate_whatsdone'])){ $this->migrate_gosaAccounts(TRUE); } /* Display migration dialog */ if($this->users_migration_dialog){ $smarty = get_smarty(); $smarty->assign("users_to_migrate",$this->users_to_migrate); $smarty->assign("method","migrate_users"); return($smarty->fetch(get_template_path("setup_migrate.tpl",TRUE,dirname(__FILE__)))); } /* Department migration options */ /* Refresh list of deparments */ if(isset($_POST['deps_visible_migrate_refresh'])){ $this->check_visible_organizationalUnits(); } /* Open migration dialog */ if(isset($_POST['deps_visible_migrate'])){ $this->dep_migration_dialog = TRUE; $this->dialog =TRUE; } /* Close migration dialog */ if(isset($_POST['deps_visible_migrate_close'])){ $this->dep_migration_dialog = FALSE; $this->dialog =FALSE; } /* Start migration */ if(isset($_POST['deps_visible_migrate_migrate'])){ if($this->migrate_organizationalUnits()){ $this->check_visible_organizationalUnits(); } } /* Start migration */ if(isset($_POST['deps_visible_migrate_whatsdone'])){ $this->migrate_organizationalUnits(TRUE); } /* Display migration dialog */ if($this->dep_migration_dialog){ $smarty = get_smarty(); $smarty->assign("deps_to_migrate",$this->deps_to_migrate); $smarty->assign("method","migrate_deps"); return($smarty->fetch(get_template_path("setup_migrate.tpl",TRUE,dirname(__FILE__)))); } $smarty = get_smarty(); $smarty->assign("checks",$this->checks); $smarty->assign("method","default"); return($smarty->fetch(get_template_path("setup_migrate.tpl",TRUE,dirname(__FILE__)))); } function save_object() { if($this->dep_migration_dialog){ foreach($this->deps_to_migrate as $id => $data){ if(isset($_POST['migrate_'.$id])){ $this->deps_to_migrate[$id]['checked'] = TRUE; }else{ $this->deps_to_migrate[$id]['checked'] = FALSE; } } } if($this->users_migration_dialog){ foreach($this->users_to_migrate as $id => $data){ if(isset($_POST['migrate_'.$id])){ $this->users_to_migrate[$id]['checked'] = TRUE; }else{ $this->users_to_migrate[$id]['checked'] = FALSE; } } } } function array_to_ldif($atts) { $ret = ""; unset($atts['count']); unset($atts['dn']); foreach($atts as $name => $value){ if(is_numeric($name)) { continue; } if(is_array($value)){ unset($value['count']); foreach($value as $a_val){ if(!preg_match('/^[a-z0-9+@#.=, \/ -]+$/i', $a_val)){ $ret .= $name.":: ". base64_encode($a_val)."\n"; }else{ $ret .= $name.": ". $a_val."\n"; } } }else{ if(!preg_match('/^[a-z0-9+@#.=, \/ -]+$/i', $value)){ $ret .= $name.": ". base64_encode($value)."\n"; }else{ $ret .= $name.": ". $value."\n"; } } } return(preg_replace("/\n$/","",$ret)); } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>