X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fclass_ldap.inc;h=e5809d72099e075eb69c1fdbd23d80e1c098f6b7;hb=0adbff1190cf5933e2f48f5c9022496de7bade2e;hp=a1f960aa3bc730f67939ee52a170f3530ec83e84;hpb=89c3bffbdaadc28ed709f34a92bd6386bce05966;p=gosa.git diff --git a/include/class_ldap.inc b/include/class_ldap.inc index a1f960aa3..e5809d720 100644 --- a/include/class_ldap.inc +++ b/include/class_ldap.inc @@ -1,7 +1,7 @@ + Copyright (C) 2003 Alejandro Escanero Blanco Copyright (C) 2004-2006 Cajus Pollmeier Based in code of ldap.inc of @@ -65,9 +65,10 @@ class LDAP{ function convert($dn) { if (SPECIALS_OVERRIDE == TRUE){ - return (preg_replace(array("/\\\\,/", "/\\\\2C/", "/\(/", "/\)/", "/\//"), + $tmp= preg_replace(array("/\\\\,/", "/\\\\2C/", "/\(/", "/\)/", "/\//"), array("\001CO", "\001CO", "\001OB", "\001CB", "\001SL"), - $dn)); + $dn); + return (preg_replace('/,\s+/', ',', $tmp)); } else { return ($dn); } @@ -196,6 +197,7 @@ class LDAP{ } } + $this->log("LDAP operation: time=".get_MicroTimeDiff($start,microtime())." operation=search('".$this->fix($this->basedn)."', '$filter')"); return($this->sr); }else{ $this->error = "Could not connect to LDAP server"; @@ -228,6 +230,8 @@ class LDAP{ } } + $this->log("LDAP operation: time=".get_MicroTimeDiff($start,microtime())." operation=ls('".$this->fix($basedn)."', '$filter')"); + return($this->sr); }else{ $this->error = "Could not connect to LDAP server"; @@ -280,7 +284,7 @@ class LDAP{ if ($this->re) { $att= @ldap_get_attributes($this->cid, $this->re); - $att['dn']= $this->convert(@ldap_get_dn($this->cid, $this->re)); + $att['dn']= trim($this->convert(@ldap_get_dn($this->cid, $this->re))); } $this->error = @ldap_error($this->cid); if (!isset($att)){ @@ -324,7 +328,7 @@ class LDAP{ $rv = @ldap_get_dn($this->cid, $this->re); $this->error = @ldap_error($this->cid); - return($this->convert($rv)); + return(trim($this->convert($rv))); } }else{ $this->error = "Perform a Fetch with no Search"; @@ -439,21 +443,21 @@ class LDAP{ /* Copy given attributes and sub-dns with attributes to destination dn */ - function copy_FAI_resource_recursive($sourcedn,$destinationdn,$type="branch",$is_first = true,$depth=0) + function copy_FAI_resource_recursive($sourcedn,$destinationdn,$destinationName,$type="branch",$is_first = true,$depth=0) { error_reporting(E_ALL); if($is_first){ - echo "

".sprintf(_("Creating copy of %s"),"".$sourcedn."")."

"; + echo "

".sprintf(_("Creating copy of %s"),"".@LDAP::fix($sourcedn)."")."

"; }else{ if(preg_match("/^ou=/",$sourcedn)){ - echo "

"._("Processing")." $destinationdn

"; + echo "

"._("Processing")." ".@LDAP::fix($destinationdn)."

"; }else{ $tmp = split(",",$sourcedn); echo " "._("Object").": "; - $deststr = $destinationdn; + $deststr = @LDAP::fix($destinationdn); if(strlen($deststr) > 96){ $deststr = substr($deststr,0,96)."..."; } @@ -526,7 +530,7 @@ class LDAP{ /* If this is no department */ foreach($attr as $key => $value){ - if(in_array($key ,array("FAItemplateFile","FAIscript", "gotoLogonScript", "gosaApplicationIcon"))){ + if(in_array($key ,array("FAItemplateFile","FAIscript", "gotoLogonScript", "gosaApplicationIcon","gotoMimeIcon"))){ $sr= ldap_read($this->cid, $this->fix($sourcedn), "$key=*", array($key)); $ei= ldap_first_entry($this->cid, $sr); if ($tmp= @ldap_get_values_len($this->cid, $ei,$key)){ @@ -544,7 +548,7 @@ class LDAP{ unset($attr['count']); unset($attr['dn']); - if(!in_array("gosaApplication" , $attr['objectClass'])){ + if((!in_array("gosaApplication" , $attr['objectClass'])) && (!in_array("gotoMimeType", $attr['objectClass']))){ if($type=="branch"){ $attr['FAIstate'] ="branch"; }elseif($type=="freeze"){ @@ -554,6 +558,11 @@ class LDAP{ } } + /* Replace FAIdebianRelease with new release name */ + if(in_array("FAIpackageList" , $attr['objectClass'])){ + $attr['FAIdebianRelease'] = $destinationName; + } + /* Add entry */ $this->cd($destinationdn); $this->cat($destinationdn); @@ -588,7 +597,7 @@ class LDAP{ $this->cd($basedn); $item = $this->fetch($this->cat($dn)); if(!in_array("FAIbranch",$item['objectClass'])){ - $this->copy_FAI_resource_recursive($dn,str_replace($sourcedn,$destinationdn,$dn),$type,false,$depth); + $this->copy_FAI_resource_recursive($dn,str_replace($sourcedn,$destinationdn,$dn),$destinationName,$type,false,$depth); } } } @@ -636,7 +645,7 @@ class LDAP{ } $real_path= substr($target, 0, strlen($target) - strlen($this->basedn) -1 ); - $l= array_reverse(ldap_explode_dn($real_path,0)); + $l= array_reverse(gosa_ldap_explode_dn($real_path)); unset($l['count']); $cdn= $this->basedn; $tag= ""; @@ -762,7 +771,7 @@ class LDAP{ } else { $adderror= $this->get_additional_error(); if ($adderror != ""){ - $error= $this->error." (".$this->get_additional_error().", ".sprintf(_("while operating on '%s' using LDAP server '%s'"), $this->base, $this->hostname).")"; + $error= $this->error." (".$this->get_additional_error().", ".sprintf(_("while operating on '%s' using LDAP server '%s'"), $this->basedn, $this->hostname).")"; } else { $error= $this->error." (".sprintf(_("while operating on LDAP server %s"), $this->hostname).")"; } @@ -797,19 +806,25 @@ class LDAP{ if ($recursive){ $this->cd($dn); - $this->search("$filter", array('dn')); + $this->ls($filter,$dn, array('dn','objectClass')); + $deps = array(); + + $display .= $this->gen_one_entry($dn)."\n"; + while ($attrs= $this->fetch()){ - $display.= $this->gen_one_entry($attrs['dn'], $filter, $attributes); - $display.= "\n"; + $deps[] = $attrs['dn']; + } + foreach($deps as $dn){ + $display .= $this->gen_ldif($dn, $filter,$attributes,$recursive); } } else { $display.= $this->gen_one_entry($dn); } - return ($display); } -function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $recursive= TRUE,$r_array=0) + + function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $recursive= TRUE,$r_array=0) { $display= ""; @@ -890,7 +905,14 @@ function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $rec - function import_complete_ldif($str_attr,&$error,$overwrite,$cleanup) + /* This funktion imports ldifs + + If DeleteOldEntries is true, the destination entry will be deleted first. + If JustModify is true the destination entry will only be touched by the attributes specified in the ldif. + if JustMofify id false the destination dn will be overwritten by the new ldif. + */ + + function import_complete_ldif($str_attr,&$error,$JustModify,$DeleteOldEntries) { if($this->reconnect) $this->connect(); @@ -902,8 +924,21 @@ function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $rec $cnt = 0; $current_line = 0; + /* FIX ldif */ + $last = ""; + $tmp = ""; + $i = 0; + foreach($entries as $entry){ + if(preg_match("/^ /",$entry)){ + $tmp[$i] .= trim($entry); + }else{ + $i ++; + $tmp[$i] = trim($entry); + } + } + /* Every single line ... */ - foreach($entries as $entry) { + foreach($tmp as $entry) { $current_line ++; /* Removing Spaces to .. @@ -927,15 +962,15 @@ function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $rec if(ereg("::",$tmp2)) { $encoded = split("::",$entry); - $attr = $encoded[0]; - $value = base64_decode($encoded[1]); + $attr = trim($encoded[0]); + $value = base64_decode(trim($encoded[1])); /* Add linenumber */ - $data .= $current_line."#".$attr.":".$value."\n"; + $data .= $current_line."#".base64_encode($attr.":".$value)."\n"; } else { /* Add Linenumber */ - $data .= $current_line."#".$entry."\n"; + $data .= $current_line."#".base64_encode($entry)."\n"; } } } @@ -951,7 +986,7 @@ function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $rec foreach ( $all as $single) { $lineone = split("\n",$single); $ndn = split("#", $lineone[0]); - $line = $ndn[1]; + $line = base64_decode($ndn[1]); $dnn = split (":",$line); $current_line = $ndn[0]; @@ -970,18 +1005,18 @@ function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $rec /* Delete before insert */ $usermdir= false; - /* The dn address already exists! */ - if (($this->dn_exists($value))&&((!$overwrite)&&(!$cleanup))) { + /* The dn address already exists, Don't delete destination entry, overwrite it */ + if (($this->dn_exists($value))&&((!$JustModify)&&(!$DeleteOldEntries))) { - $error= sprintf(_("The dn: '%s' (from line %s) already exists in the LDAP database."), $line, $current_line); - return ALREADY_EXISTING_ENTRY; + $usermdir = $usemodify = false; - } elseif(($this->dn_exists($value))&&($cleanup)){ + /* Delete old entry first, then add new */ + } elseif(($this->dn_exists($value))&&($DeleteOldEntries)){ /* Delete first, then add */ $usermdir = true; - } elseif(($this->dn_exists($value))&&($overwrite)) { + } elseif(($this->dn_exists($value))&&($JustModify)) { /* Modify instead of Add */ $usemodify = true; @@ -998,7 +1033,11 @@ function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $rec } - /* Imports a single entry */ + /* Imports a single entry + If $delete is true; The old entry will be deleted if it exists. + if $modify is true; All variables that are not touched by the new ldif will be kept. + if $modify is false; The new ldif overwrites the old entry, and all untouched attributes get lost. + */ function import_single_entry($str_attr,$modify,$delete) { if($this->reconnect) $this->connect(); @@ -1012,19 +1051,27 @@ function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $rec /* Check if we use Linenumbers (when import_complete_ldif is called we use Linenumbers) Linenumbers are use like this 123#attribute : value */ if(!empty($row)) { - if((strpos($row,"#")!=FALSE)&&(strpos($row,"#")cd($data['dn']); /* Delete existing entry */ if($delete){ - $this->rmdir($data['dn']); + $this->rmdir_recursive($data['dn']); } - + /* Create missing trees */ + $this->cd ($this->basedn); $this->create_missing_trees($data['dn']); + $this->cd($data['dn']); + + $dn = $data['dn']; unset($data['dn']); - /* If entry exists use modify */ if(!$modify){ - $ret = $this->add($data); + + $this->cat($dn); + if($this->count()){ + + /* The destination entry exists, overwrite it with the new entry */ + $attrs = $this->fetch(); + foreach($attrs as $name => $value ){ + if(!is_numeric($name)){ + if(in_array($name,array("dn","count"))) continue; + if(!isset($data[$name])){ + $data[$name] = array(); + } + } + } + $ret = $this->modify($data); + + }else{ + + /* The destination entry doesn't exists, create it */ + $ret = $this->add($data); + } + } else { + + /* Keep all vars that aren't touched by this ldif */ $ret = $this->modify($data); } } - + show_ldap_error($this->get_error(), sprintf(_("Ldap import with dn '%s' failed."),$dn)); return($ret); } @@ -1124,6 +1208,15 @@ function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $rec return $objectclasses; } + function log($string) + { + if (isset($_SESSION['config'])){ + $cfg= $_SESSION['config']; + if (isset($cfg->current['LDAPSTATS']) && preg_match('/true/i', $cfg->current['LDAPSTATS'])){ + syslog (LOG_INFO, $string); + } + } + } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: