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:
?>