X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=include%2Fclass_ldap.inc;h=5649ea53268167949b310fc3f22dcf76a74bda23;hb=4a8f604592cf9e6bdf3aa8a1dd09b77da58f034a;hp=94ae4c9244c550832c26e33ae3a45fb2dd118cd5;hpb=9661305ec872b58877cee3ac6b772134dcf7282c;p=gosa.git
diff --git a/include/class_ldap.inc b/include/class_ldap.inc
index 94ae4c924..5649ea532 100644
--- a/include/class_ldap.inc
+++ b/include/class_ldap.inc
@@ -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);
}
@@ -280,7 +281,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 +325,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 +440,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 +527,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 +545,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 +555,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 +594,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);
}
}
}
@@ -760,7 +766,12 @@ class LDAP{
if ($this->error == 'Success'){
return $this->error;
} else {
- $error= $this->error." (".$this->get_additional_error().")";
+ $adderror= $this->get_additional_error();
+ if ($adderror != ""){
+ $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).")";
+ }
return $error;
}
}
@@ -792,19 +803,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= "";
@@ -885,7 +902,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();
@@ -897,8 +921,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 ..
@@ -922,15 +959,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";
}
}
}
@@ -946,7 +983,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];
@@ -965,18 +1002,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;
@@ -993,7 +1030,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();
@@ -1007,19 +1048,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);
}