X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_ldap.inc;h=21fc089307554f4e25d9449088097a3e13ed8ec9;hb=c9bd6c4d92532063a9dd8df3cfd20740d43e5841;hp=3c52101f9d979f59f81d45b4684b51e7e75baedd;hpb=84758025b5db95d96c44d1cccf2f917d09be03b7;p=gosa.git diff --git a/gosa-core/include/class_ldap.inc b/gosa-core/include/class_ldap.inc index 3c52101f9..21fc08930 100644 --- a/gosa-core/include/class_ldap.inc +++ b/gosa-core/include/class_ldap.inc @@ -60,8 +60,8 @@ class LDAP{ $this->hostname=$hostname; /* Check if MAX_LDAP_QUERY_TIME is defined */ - if(isset($config->data['MAIN']['MAX_LDAP_QUERY_TIME'])){ - $str = $config->data['MAIN']['MAX_LDAP_QUERY_TIME']; + if(is_object($config) && $config->get_cfg_value("core","ldapMaxQueryTime") != ""){ + $str = $config->get_cfg_value("core","ldapMaxQueryTime"); $this->max_ldap_query_time = (float)($str); } @@ -81,19 +81,20 @@ class LDAP{ /* Function to replace all problematic characters inside a DN by \001XX, where \001 is decoded to chr(1) [ctrl+a]. It is not impossible, but very unlikely that this character is inside a DN. - + Currently used codes: - , => CO - \2C => CO - ( => OB - ) => CB - / => SL */ + , => CO + \2C => CO + ( => OB + ) => CB + / => SL + \22 => DQ */ static function convert($dn) { if (SPECIALS_OVERRIDE == TRUE){ - $tmp= preg_replace(array("/\\\\,/", "/\\\\2C/", "/\(/", "/\)/", "/\//"), - array("\001CO", "\001CO", "\001OB", "\001CB", "\001SL"), - $dn); + $tmp= preg_replace(array("/\\\\,/", "/\\\\2C/", "/\(/", "/\)/", "/\//", "/\\\\22/", '/\\\\"/'), + array("\001CO", "\001CO", "\001OB", "\001CB", "\001SL", "\001DQ", "\001DQ"), + $dn); return (preg_replace('/,\s+/', ',', $tmp)); } else { return ($dn); @@ -108,20 +109,20 @@ class LDAP{ static function fix($dn) { if (SPECIALS_OVERRIDE == TRUE){ - return (preg_replace(array("/\001CO/", "/\001OB/", "/\001CB/", "/\001SL/"), - array("\,", "(", ")", "/"), - $dn)); + return (preg_replace(array("/\001CO/", "/\001OB/", "/\001CB/", "/\001SL/", "/\001DQ/"), + array("\,", "(", ")", "/", '\"'), + $dn)); } else { return ($dn); } } - /* Function to fix problematic characters in DN's that are used for search requests. I.e. member=.... */ static function prepare4filter($dn) { - return normalizeLdap(preg_replace('/\\\\/', '\\\\\\', LDAP::fix($dn))); + $fixed= normalizeLdap(str_replace('\\\\', '\\\\\\', LDAP::fix($dn))); + return str_replace('\\,', '\\\\,', $fixed); } @@ -160,13 +161,13 @@ class LDAP{ function rebind($ldap, $referral) { $credentials= $this->get_credentials($referral); - if (@ldap_bind($ldap, LDAP::fix($credentials['ADMIN']), $credentials['PASSWORD'])) { + if (@ldap_bind($ldap, LDAP::fix($credentials['ADMINDN']), $credentials['ADMINPASSWORD'])) { $this->error = "Success"; $this->hascon=true; $this->reconnect= true; return (0); } else { - $this->error = "Could not bind to " . $credentials['ADMIN']; + $this->error = "Could not bind to " . $credentials['ADMINDN']; return NULL; } } @@ -207,9 +208,9 @@ class LDAP{ if ($basedn==""){ $basedn = $this->basedn; } else { - $basedn = LDAP::convert($this->basedn); + $basedn = LDAP::convert($basedn); } - return(ereg_replace("[^,]*[,]*[ ]*(.*)", "\\1", $basedn)); + return(preg_replace("/[^,]*[,]*[ ]*(.*)/", "$1", $basedn)); } @@ -218,7 +219,7 @@ class LDAP{ if($this->hascon){ if ($this->reconnect) $this->connect(); - $start = microtime(); + $start = microtime(true); $this->clearResult($srp); $this->sr[$srp] = @ldap_search($this->cid, LDAP::fix($this->basedn), $filter, $attrs); $this->error = @ldap_error($this->cid); @@ -227,13 +228,13 @@ class LDAP{ /* Check if query took longer as specified in max_ldap_query_time */ if($this->max_ldap_query_time){ - $diff = get_MicroTimeDiff($start,microtime()); + $diff = microtime(true) - $start; if($diff > $this->max_ldap_query_time){ - msg_dialog::display(_("Performance warning"), sprintf(_("LDAP performance is poor: last query took about %.2fs!"), $diff), WARNING_DIALOG); + msg_dialog::display(_("Performance warning"), sprintf(_("LDAP performance is poor: last query took %.2fs!"), $diff), WARNING_DIALOG); } } - $this->log("LDAP operation: time=".get_MicroTimeDiff($start,microtime())." operation=search('".LDAP::fix($this->basedn)."', '$filter')"); + $this->log("LDAP operation: time=".(microtime(true)-$start)." operation=search('".LDAP::fix($this->basedn)."', '$filter')"); return($this->sr[$srp]); }else{ $this->error = "Could not connect to LDAP server"; @@ -252,7 +253,7 @@ class LDAP{ else $basedn= LDAP::convert($basedn); - $start = microtime(); + $start = microtime(true); $this->sr[$srp] = @ldap_list($this->cid, LDAP::fix($basedn), $filter,$attrs); $this->error = @ldap_error($this->cid); $this->resetResult($srp); @@ -260,13 +261,13 @@ class LDAP{ /* Check if query took longer as specified in max_ldap_query_time */ if($this->max_ldap_query_time){ - $diff = get_MicroTimeDiff($start,microtime()); + $diff = microtime(true) - $start; if($diff > $this->max_ldap_query_time){ - msg_dialog::display(_("Performance warning"), sprintf(_("LDAP performance is poor: last query took about %.2fs!"), $diff), WARNING_DIALOG); + msg_dialog::display(_("Performance warning"), sprintf(_("LDAP performance is poor: last query took %.2fs!"), $diff), WARNING_DIALOG); } } - $this->log("LDAP operation: time=".get_MicroTimeDiff($start,microtime())." operation=ls('".LDAP::fix($basedn)."', '$filter')"); + $this->log("LDAP operation: time=".(microtime(true) - $start)." operation=ls('".LDAP::fix($basedn)."', '$filter')"); return($this->sr[$srp]); }else{ @@ -275,13 +276,12 @@ class LDAP{ } } - function cat($srp, $dn,$attrs= array("*")) + function cat($srp, $dn,$attrs= array("*"), $filter = "(objectclass=*)") { if($this->hascon){ if ($this->reconnect) $this->connect(); $this->clearResult($srp); - $filter = "(objectclass=*)"; $this->sr[$srp] = @ldap_read($this->cid, LDAP::fix($dn), $filter,$attrs); $this->error = @ldap_error($this->cid); $this->resetResult($srp); @@ -293,6 +293,19 @@ class LDAP{ } } + function object_match_filter($dn,$filter) + { + if($this->hascon){ + if ($this->reconnect) $this->connect(); + $res = @ldap_read($this->cid, LDAP::fix($dn), $filter, array("objectClass")); + $rv = @ldap_count_entries($this->cid, $res); + return($rv); + }else{ + $this->error = "Could not connect to LDAP server"; + return(FALSE); + } + } + function set_size_limit($size) { /* Ignore zero settings */ @@ -405,7 +418,23 @@ class LDAP{ if ($dn == "") $dn = $this->basedn; - $r = @ldap_mod_del($this->cid, LDAP::fix($dn), $attrs); + $r = ldap_mod_del($this->cid, LDAP::fix($dn), $attrs); + $this->error = @ldap_error($this->cid); + return($r); + }else{ + $this->error = "Could not connect to LDAP server"; + return(""); + } + } + + function mod_add($attrs = "", $dn = "") + { + if($this->hascon){ + if ($this->reconnect) $this->connect(); + if ($dn == "") + $dn = $this->basedn; + + $r = @ldap_mod_add($this->cid, LDAP::fix($dn), $attrs); $this->error = @ldap_error($this->cid); return($r); }else{ @@ -470,12 +499,12 @@ class LDAP{ parent => ou=department,dc=... dest_rdn => cn=herbert */ - $parent = preg_replace("/^[^,]+,/","",$dest); + $parent = preg_replace("/^[^,]+,/","", $dest); $dest_rdn = preg_replace("/,.*$/","",$dest); - + if($this->hascon){ if ($this->reconnect) $this->connect(); - $r= ldap_rename($this->cid,$source,$dest_rdn,$parent,TRUE); + $r= ldap_rename($this->cid,@LDAP::fix($source), @LDAP::fix($dest_rdn),@LDAP::fix($parent),TRUE); $this->error = ldap_error($this->cid); /* Check if destination dn exists, if not the @@ -527,6 +556,27 @@ class LDAP{ } } + function makeReadableErrors($error,$attrs) + { + global $config; + + if($this->success()) return(""); + + $str = ""; + if(preg_match("/^objectClass: value #([0-9]*) invalid per syntax$/", $this->get_additional_error())){ + $oc = preg_replace("/^objectClass: value #([0-9]*) invalid per syntax$/","\\1", $this->get_additional_error()); + if(isset($attrs['objectClass'][$oc])){ + $str.= " - objectClass: ".$attrs['objectClass'][$oc].""; + } + } + if($error == "Undefined attribute type"){ + $str = " - attribute: ".preg_replace("/:.*$/","",$this->get_additional_error()).""; + } + + @DEBUG(DEBUG_LDAP,__LINE__,__FUNCTION__,__FILE__,$attrs,"Erroneous data"); + + return($str); + } function modify($attrs) { @@ -537,6 +587,9 @@ class LDAP{ if ($this->reconnect) $this->connect(); $r = @ldap_modify($this->cid, LDAP::fix($this->basedn), $attrs); $this->error = @ldap_error($this->cid); + if(!$this->success()){ + $this->error.= $this->makeReadableErrors($this->error,$attrs); + } return($r ? $r : 0); }else{ $this->error = "Could not connect to LDAP server"; @@ -550,6 +603,9 @@ class LDAP{ if ($this->reconnect) $this->connect(); $r = @ldap_add($this->cid, LDAP::fix($this->basedn), $attrs); $this->error = @ldap_error($this->cid); + if(!$this->success()){ + $this->error.= $this->makeReadableErrors($this->error,$attrs); + } return($r ? $r : 0); }else{ $this->error = "Could not connect to LDAP server"; @@ -583,7 +639,7 @@ class LDAP{ /* Ignore referrals */ $found= false; foreach($this->referrals as $ref){ - $base= preg_replace('!^[^:]+://[^/]+/([^?]+).*$!', '\\1', $ref['URL']); + $base= preg_replace('!^[^:]+://[^/]+/([^?]+).*$!', '\\1', $ref['URI']); if ($base == $cdn){ $found= true; break; @@ -606,7 +662,8 @@ class LDAP{ } else { $type= preg_replace('/^([^=]+)=.*$/', '\\1', $cdn); - $param= preg_replace('/^[^=]+=([^,]+),.*$/', '\\1', $cdn); + $param= LDAP::fix(preg_replace('/^[^=]+=([^,]+).*$/', '\\1', $cdn)); + $param=preg_replace(array('/\\\\,/','/\\\\"/'),array(',','"'),$param); $na= array(); @@ -616,7 +673,7 @@ class LDAP{ /* Get name of first matching objectClass */ $ocname= ""; foreach($classes as $class){ - if (isset($class['MUST']) && $class['MUST'] == "$type"){ + if (isset($class['MUST']) && in_array($type, $class['MUST'])){ /* Look for first classes that is structural... */ if (isset($class['STRUCTURAL'])){ @@ -633,7 +690,7 @@ class LDAP{ /* Bail out, if we've nothing to do... */ if ($ocname == ""){ - msg_dialog::display(_("Internal error"), sprintf(_("Cannot automatically create subtrees with RDN '%s': no object class found!"),$type), FATAL_ERROR_DIALOG); + msg_dialog::display(_("Internal error"), sprintf(_("Cannot automatically create subtrees with RDN %s: no object class found"), bold($type)), FATAL_ERROR_DIALOG); exit(); } @@ -652,8 +709,11 @@ class LDAP{ $na['objectClass'][]= 'locality'; } $na[$type]= $param; + + // Fill in MUST values - but do not overwrite existing ones. if (is_array($classes[$ocname]['MUST'])){ foreach($classes[$ocname]['MUST'] as $attr){ + if(isset($na[$attr]) && !empty($na[$attr])) continue; $na[$attr]= "filled"; } } @@ -681,7 +741,7 @@ class LDAP{ $na["dc"]= $param; break; default: - msg_dialog::display(_("Internal error"), sprintf(_("Cannot automatically create subtrees with RDN '%s': not supported"),$type), FATAL_ERROR_DIALOG); + msg_dialog::display(_("Internal error"), sprintf(_("Cannot automatically create subtrees with RDN %s: not supported"), bold($type)), FATAL_ERROR_DIALOG); exit(); } @@ -690,6 +750,9 @@ class LDAP{ $this->add($na); if (!$this->success()){ + + print_a(array($cdn,$na)); + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($this->get_error(), $cdn, LDAP_ADD, get_class())); return FALSE; } @@ -719,6 +782,7 @@ class LDAP{ } } + function get_attribute($dn, $name,$r_array=0) { $data= ""; @@ -734,12 +798,11 @@ class LDAP{ } } } - if($r_array==0) - return ($data); - else - return ($info); - - + if($r_array==0) { + return ($data); + } else { + return ($info); + } } @@ -765,9 +828,9 @@ 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->basedn, $this->hostname).")"; + $error= $this->error." (".$this->get_additional_error().", ".sprintf(_("while operating on %s using LDAP server %s"), bold($this->basedn), bold($this->hostname)).")"; } else { - $error= $this->error." (".sprintf(_("while operating on LDAP server %s"), $this->hostname).")"; + $error= $this->error." (".sprintf(_("while operating on LDAP server %s"), bold($this->hostname)).")"; } return $error; } @@ -786,35 +849,37 @@ class LDAP{ if (isset($referrals[$server])){ return ($referrals[$server]); } else { - $ret['ADMIN']= LDAP::fix($this->binddn); - $ret['PASSWORD']= $this->bindpw; + $ret['ADMINDN']= LDAP::fix($this->binddn); + $ret['ADMINPASSWORD']= $this->bindpw; } return ($ret); } - function gen_ldif ($srp, $dn, $filter= "(objectClass=*)", $attributes= array('*'), $recursive= TRUE) + /*! \brief Generates an ldif for all entries matching the filter settings, scope and limit. + * @param $dn The entry to export. + * @param $filter Limit the exported object to those maching this filter. + * @param $attributes Specify the attributes to export here, empty means all. + * @param $scope 'base', 'sub' .. see manpage for 'ldapmodify' for details. + * @param $limit Limits the result. + */ + function generateLdif ($dn, $filter= "(objectClass=*)", $attributes= array(), $scope = 'sub', $limit=0) { - $display= ""; - - if ($recursive){ - $this->cd($dn); - $this->ls($srp, $filter,$dn, array('dn','objectClass')); - $deps = array(); - - $display .= $this->gen_one_entry($dn)."\n"; - - while ($attrs= $this->fetch($srp)){ - $deps[] = $attrs['dn']; - } - foreach($deps as $dn){ - $display .= $this->gen_ldif($srp, $dn, $filter,$attributes,$recursive); - } - } else { - $display.= $this->gen_one_entry($dn); - } - return ($display); + $attrs = (count($attributes))?implode($attributes,' '):''; + $scope = (!empty($scope))?' -s '.$scope: ''; + $limit = (!$limit)?'':' -z '.$limit; + $dn = escapeshellarg($dn); + $admin = escapeshellarg($this->binddn); + $pwd = escapeshellarg($this->bindpw); + $filter = escapeshellarg($filter); + $host = escapeshellarg($this->hostname); + $cmd = "ldapsearch -x -LLLL -D {$admin} -w {$pwd} {$filter} {$limit} {$scope} -H {$host} -b {$dn} $attrs "; + ob_start(); + passthru($cmd); + $res=ob_get_contents(); + ob_end_clean(); + return($res); } @@ -841,57 +906,6 @@ class LDAP{ } - function gen_one_entry($dn, $filter= "(objectClass=*)" , $name= array("*")) - { - $ret = ""; - $data = ""; - if($this->reconnect){ - $this->connect(); - } - - /* Searching Ldap Tree */ - $sr= @ldap_read($this->cid, LDAP::fix($dn), $filter, $name); - - /* Get the first entry */ - $entry= @ldap_first_entry($this->cid, $sr); - - /* Get all attributes related to that Objekt */ - $atts = array(); - - /* Assemble dn */ - $atts[0]['name'] = "dn"; - $atts[0]['value'] = array('count' => 1, 0 => $dn); - - /* Reset index */ - $i = 1 ; - $identifier = array(); - $attribute= @ldap_first_attribute($this->cid,$entry,$identifier); - while ($attribute) { - $i++; - $atts[$i]['name'] = $attribute; - $atts[$i]['value'] = @ldap_get_values_len($this->cid, $entry, "$attribute"); - - /* Next one */ - $attribute= @ldap_next_attribute($this->cid,$entry,$identifier); - } - - foreach($atts as $at) - { - for ($i= 0; $i<$at['value']['count']; $i++){ - - /* Check if we must encode the data */ - if(!preg_match('/^[a-z0-9+@#.=, \/ -]+$/i', $at['value'][$i])) { - $ret .= $at['name'].":: ".base64_encode($at['value'][$i])."\n"; - } else { - $ret .= $at['name'].": ".$at['value'][$i]."\n"; - } - } - } - - return($ret); - } - - function dn_exists($dn) { return @ldap_list($this->cid, LDAP::fix($dn), "(objectClass=*)", array("objectClass")); @@ -910,9 +924,9 @@ class LDAP{ { if($this->reconnect) $this->connect(); - /* First we have to splitt the string ito detect empty lines + /* First we have to split the string into empty lines. An empty line indicates an new Entry */ - $entries = split("\n",$str_attr); + $entries = preg_split("/\n/",$str_attr); $data = ""; $cnt = 0; @@ -953,9 +967,9 @@ class LDAP{ /* Append lines ... */ if(!empty($tmp2)) { /* check if we need base64_decode for this line */ - if(ereg("::",$tmp2)) + if(strstr($tmp2, "::") !== false) { - $encoded = split("::",$entry); + $encoded = explode("::",$entry); $attr = trim($encoded[0]); $value = base64_decode(trim($encoded[1])); /* Add linenumber */ @@ -978,18 +992,18 @@ class LDAP{ Now we check every insertblock and try to insert */ foreach ( $all as $single) { - $lineone = split("\n",$single); - $ndn = split("#", $lineone[0]); + $lineone = preg_split("/\n/",$single); + $ndn = explode("#", $lineone[0]); $line = base64_decode($ndn[1]); - $dnn = split (":",$line,2); + $dnn = explode (":",$line,2); $current_line = $ndn[0]; $dn = $dnn[0]; $value = $dnn[1]; /* Every block must begin with a dn */ if($dn != "dn") { - $error= sprintf(_("This is not a valid DN: '%s'. A block for import should begin with 'dn: ...' in line %s"), $line, $current_line); + $error= sprintf(_("Invalid DN %s: block to be imported should start with 'dn: ...' in line %s"), bold($line), bold($current_line)); return -2; } @@ -1018,7 +1032,7 @@ class LDAP{ /* If we can't Import, return with a file error */ if(!$this->import_single_entry($srp, $single,$usemodify,$usermdir) ) { - $error= sprintf(_("Error while importing dn: '%s', please check your LDIF from line %s on!"), $line, + $error= sprintf(_("Error while importing DN %s: please check LDIF from line %s on!"), bold($line), $current_line); return UNKNOWN_TOKEN_IN_LDIF_FILE; } } @@ -1044,7 +1058,7 @@ class LDAP{ if($this->reconnect) $this->connect(); $ret = false; - $rows= split("\n",$str_attr); + $rows= preg_split("/\n/",$str_attr); $data= false; foreach($rows as $row) { @@ -1056,13 +1070,13 @@ class LDAP{ /* We are using line numbers Because there is a # before a : */ - $tmp1= split("#",$row); + $tmp1= explode("#",$row); $current_line= $tmp1[0]; $row= base64_decode($tmp1[1]); } /* Split the line into attribute and value */ - $attr = split(":", $row,2); + $attr = explode(":", $row,2); $attr[0]= trim($attr[0]); /* attribute */ $attr[1]= $attr[1]; /* value */ @@ -1165,7 +1179,7 @@ class LDAP{ function importcsv($str) { - $lines = split("\n",$str); + $lines = preg_split("/\n/",$str); foreach($lines as $line) { /* continue if theres a comment */ @@ -1177,38 +1191,34 @@ class LDAP{ $line= str_replace ("\t" ,"," ,$line); echo $line; - $cells = split(",",$line ) ; + $cells = explode(",",$line ) ; $linet= str_replace ("\t\t",",",$line); - $cells = split("\t",$line); + $cells = preg_split("/\t/",$line); $count = count($cells); } } - function get_objectclasses() + function get_objectclasses( $force_reload = FALSE) { $objectclasses = array(); global $config; /* Only read schema if it is allowed */ if(isset($config) && preg_match("/config/i",get_class($config))){ - if(!isset($config->data['MAIN']['SCHEMA_CHECK']) || !preg_match("/true/i",$config->data['MAIN']['SCHEMA_CHECK'])){ + if ($config->get_cfg_value("core","schemaCheck") != "true"){ return($objectclasses); } } /* Return the cached results. */ - if(class_available('session') && session::is_set("LDAP_CACHE::get_objectclasses")){ - $objectclasses = session::get("LDAP_CACHE::get_objectclasses"); + if(class_available('session') && session::global_is_set("LDAP_CACHE::get_objectclasses") && !$force_reload){ + $objectclasses = session::global_get("LDAP_CACHE::get_objectclasses"); return($objectclasses); } # Get base to look for schema - $sr = @ldap_read ($this->cid, NULL, "objectClass=*", array("subschemaSubentry")); - if(!$sr){ - $sr = @ldap_read ($this->cid, "", "objectClass=*", array("subschemaSubentry")); - } - + $sr = @ldap_read ($this->cid, "", "objectClass=*", array("subschemaSubentry")); $attr = @ldap_get_entries($this->cid,$sr); if (!isset($attr[0]['subschemasubentry'][0])){ return array(); @@ -1227,7 +1237,7 @@ class LDAP{ continue; } $name= "OID"; - $pattern= split(' ', $val); + $pattern= explode(' ', $val); $ocname= preg_replace("/^.* NAME\s+\(*\s*'([^']+)'\s*\)*.*$/", '\\1', $val); $objectclasses[$ocname]= array(); @@ -1239,7 +1249,11 @@ class LDAP{ break; case ')': if ($name != ""){ - $objectclasses[$ocname][$name]= $this->value2container($value); + $v = $this->value2container($value); + if(in_array($name, array('MUST', 'MAY')) && !is_array($v)){ + $v = array($v); + } + $objectclasses[$ocname][$name]= $v; } $name= ""; $value= ""; @@ -1254,7 +1268,11 @@ class LDAP{ case 'MUST': case 'MAY': if ($name != ""){ - $objectclasses[$ocname][$name]= $this->value2container($value); + $v = $this->value2container($value); + if(in_array($name, array('MUST', 'MAY')) && !is_array($v)){ + $v = array($v); + } + $objectclasses[$ocname][$name]= $v; } $name= $chunk; $value= ""; @@ -1266,8 +1284,9 @@ class LDAP{ } if(class_available("session")){ - session::set("LDAP_CACHE::get_objectclasses",$objectclasses); + session::global_set("LDAP_CACHE::get_objectclasses",$objectclasses); } + return $objectclasses; } @@ -1296,8 +1315,8 @@ class LDAP{ function log($string) { - if (session::is_set('config')){ - $cfg = session::get('config'); + if (session::global_is_set('config')){ + $cfg = session::global_get('config'); if (isset($cfg->current['LDAPSTATS']) && preg_match('/true/i', $cfg->current['LDAPSTATS'])){ syslog (LOG_INFO, $string); } @@ -1306,10 +1325,10 @@ class LDAP{ /* added by Guido Serra aka Zeph */ function getCn($dn){ - $simple= split(",", $dn); + $simple= explode(",", $dn); foreach($simple as $piece) { - $partial= split("=", $piece); + $partial= explode("=", $piece); if($partial[0] == "cn"){ return $partial[1];