index 1b39d79252f99116e2e8d907c9faabd1efaae0b1..1a991f1b6e122ba7466593abe2bd1ec1336cda9a 100644 (file)
<?php
<?php
-/*****************************************************************************
- newldap.inc - version 1.0
- Copyright (C) 2003 Alejandro Escanero Blanco <aescanero@chaosdimension.org>
- Copyright (C) 2004-2006 Cajus Pollmeier <pollmeier@gonicus.de>
-
- Based in code of ldap.inc of
- Copyright (C) 1998 Eric Kilfoil <eric@ipass.net>
- *****************************************************************************/
+/*
+ * This code is part of GOsa (http://www.gosa-project.org)
+ * Copyright (C) 2003-2008 GONICUS GmbH
+ * Copyright (C) 2003 Alejandro Escanero Blanco <aescanero@chaosdimension.org>
+ * Copyright (C) 1998 Eric Kilfoil <eric@ipass.net>
+ *
+ * ID: $$Id$$
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
define("ALREADY_EXISTING_ENTRY",-10001);
define("UNKNOWN_TOKEN_IN_LDIF_FILE",-10002);
define("ALREADY_EXISTING_ENTRY",-10001);
define("UNKNOWN_TOKEN_IN_LDIF_FILE",-10002);
class LDAP{
var $hascon =false;
class LDAP{
var $hascon =false;
- var $hasres =false;
var $reconnect=false;
var $tls = false;
var $reconnect=false;
var $tls = false;
- var $basedn ="";
var $cid;
var $cid;
+ var $hasres = array();
+ var $sr = array();
+ var $re = array();
+ var $basedn ="";
+ var $start = array(); // 0 if we are fetching the first entry, otherwise 1
var $error = ""; // Any error messages to be returned can be put here
var $error = ""; // Any error messages to be returned can be put here
- var $start = 0; // 0 if we are fetching the first entry, otherwise 1
+ var $srp = 0;
var $objectClasses = array(); // Information read from slapd.oc.conf
var $binddn = "";
var $bindpw = "";
var $objectClasses = array(); // Information read from slapd.oc.conf
var $binddn = "";
var $bindpw = "";
$this->hostname=$hostname;
/* Check if MAX_LDAP_QUERY_TIME is defined */
$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("ldapMaxQueryTime") != ""){
+ $str = $config->get_cfg_value("ldapMaxQueryTime");
$this->max_ldap_query_time = (float)($str);
}
$this->max_ldap_query_time = (float)($str);
}
}
}
+ function getSearchResource()
+ {
+ $this->sr[$this->srp]= NULL;
+ $this->start[$this->srp]= 0;
+ $this->hasres[$this->srp]= false;
+ return $this->srp++;
+ }
+
+
/* 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.
/* 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:
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){
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);
return (preg_replace('/,\s+/', ',', $tmp));
} else {
return ($dn);
static function fix($dn)
{
if (SPECIALS_OVERRIDE == TRUE){
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);
}
}
} else {
return ($dn);
}
}
+ /* Function to fix problematic characters in DN's that are used for search
+ requests. I.e. member=.... */
+ static function prepare4filter($dn)
+ {
+ $fixed= normalizeLdap(str_replace('\\\\', '\\\\\\', LDAP::fix($dn)));
+ return str_replace('\\,', '\\\\,', $fixed);
+ }
+
function connect()
{
function connect()
{
function rebind($ldap, $referral)
{
$credentials= $this->get_credentials($referral);
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 = "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;
}
}
return NULL;
}
}
function cd($dir)
{
function cd($dir)
{
- if ($dir == "..")
+ if ($dir == ".."){
$this->basedn = $this->getParentDir();
$this->basedn = $this->getParentDir();
- else
+ } else {
$this->basedn = LDAP::convert($dir);
$this->basedn = LDAP::convert($dir);
+ }
}
function getParentDir($basedn = "")
{
}
function getParentDir($basedn = "")
{
- if ($basedn=="")
+ if ($basedn==""){
$basedn = $this->basedn;
$basedn = $this->basedn;
- else
- $basedn = LDAP::convert($this->basedn);
- return(ereg_replace("[^,]*[,]*[ ]*(.*)", "\\1", $basedn));
+ } else {
+ $basedn = LDAP::convert($basedn);
+ }
+ return(preg_replace("/[^,]*[,]*[ ]*(.*)/", "$1", $basedn));
}
}
- function search($filter, $attrs= array())
+
+ function search($srp, $filter, $attrs= array())
{
if($this->hascon){
if ($this->reconnect) $this->connect();
{
if($this->hascon){
if ($this->reconnect) $this->connect();
- $start = microtime();
-
- $this->clearResult();
- $this->sr = @ldap_search($this->cid, LDAP::fix($this->basedn), $filter, $attrs);
+ $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);
$this->error = @ldap_error($this->cid);
- $this->resetResult();
- $this->hasres=true;
+ $this->resetResult($srp);
+ $this->hasres[$srp]=true;
/* Check if query took longer as specified in max_ldap_query_time */
if($this->max_ldap_query_time){
/* 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){
if($diff > $this->max_ldap_query_time){
- print_red(sprintf(_("The LDAP server is slow (%.2fs for the last query). This may be responsible for performance breakdowns."),$diff)) ;
+ 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')");
- return($this->sr);
+ $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";
return("");
}
}
}else{
$this->error = "Could not connect to LDAP server";
return("");
}
}
- function ls($filter = "(objectclass=*)", $basedn = "",$attrs = array("*"))
+ function ls($srp, $filter = "(objectclass=*)", $basedn = "",$attrs = array("*"))
{
if($this->hascon){
if ($this->reconnect) $this->connect();
{
if($this->hascon){
if ($this->reconnect) $this->connect();
- $this->clearResult();
+
+ $this->clearResult($srp);
if ($basedn == "")
$basedn = $this->basedn;
else
$basedn= LDAP::convert($basedn);
if ($basedn == "")
$basedn = $this->basedn;
else
$basedn= LDAP::convert($basedn);
- $start = microtime();
- $this->sr = @ldap_list($this->cid, LDAP::fix($basedn), $filter,$attrs);
+ $start = microtime(true);
+ $this->sr[$srp] = @ldap_list($this->cid, LDAP::fix($basedn), $filter,$attrs);
$this->error = @ldap_error($this->cid);
$this->error = @ldap_error($this->cid);
- $this->resetResult();
- $this->hasres=true;
+ $this->resetResult($srp);
+ $this->hasres[$srp]=true;
/* Check if query took longer as specified in max_ldap_query_time */
if($this->max_ldap_query_time){
/* 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){
if($diff > $this->max_ldap_query_time){
- print_red(sprintf(_("The ldapserver is answering very slow (%.2f), this may be responsible for performance breakdowns."),$diff)) ;
+ 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);
+ return($this->sr[$srp]);
}else{
$this->error = "Could not connect to LDAP server";
return("");
}
}
}else{
$this->error = "Could not connect to LDAP server";
return("");
}
}
- function cat($dn,$attrs= array("*"))
+ function cat($srp, $dn,$attrs= array("*"), $filter = "(objectclass=*)")
{
if($this->hascon){
if ($this->reconnect) $this->connect();
{
if($this->hascon){
if ($this->reconnect) $this->connect();
- $this->clearResult();
- $filter = "(objectclass=*)";
- $this->sr = @ldap_read($this->cid, LDAP::fix($dn), $filter,$attrs);
+
+ $this->clearResult($srp);
+ $this->sr[$srp] = @ldap_read($this->cid, LDAP::fix($dn), $filter,$attrs);
$this->error = @ldap_error($this->cid);
$this->error = @ldap_error($this->cid);
- $this->resetResult();
- $this->hasres=true;
- return($this->sr);
+ $this->resetResult($srp);
+ $this->hasres[$srp]=true;
+ return($this->sr[$srp]);
}else{
$this->error = "Could not connect to LDAP server";
return("");
}
}
}else{
$this->error = "Could not connect to LDAP server";
return("");
}
}
+ 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 */
function set_size_limit($size)
{
/* Ignore zero settings */
}
}
}
}
- function fetch()
+ function fetch($srp)
{
$att= array();
if($this->hascon){
{
$att= array();
if($this->hascon){
- if($this->hasres){
- if ($this->start == 0)
+ if($this->hasres[$srp]){
+ if ($this->start[$srp] == 0)
{
{
- if ($this->sr){
- $this->start = 1;
- $this->re= @ldap_first_entry($this->cid, $this->sr);
+ if ($this->sr[$srp]){
+ $this->start[$srp] = 1;
+ $this->re[$srp]= @ldap_first_entry($this->cid, $this->sr[$srp]);
} else {
return array();
}
} else {
} else {
return array();
}
} else {
- $this->re= @ldap_next_entry($this->cid, $this->re);
+ $this->re[$srp]= @ldap_next_entry($this->cid, $this->re[$srp]);
}
}
- if ($this->re)
+ if ($this->re[$srp])
{
{
- $att= @ldap_get_attributes($this->cid, $this->re);
- $att['dn']= trim(LDAP::convert(@ldap_get_dn($this->cid, $this->re)));
+ $att= @ldap_get_attributes($this->cid, $this->re[$srp]);
+ $att['dn']= trim(LDAP::convert(@ldap_get_dn($this->cid, $this->re[$srp])));
}
$this->error = @ldap_error($this->cid);
if (!isset($att)){
}
$this->error = @ldap_error($this->cid);
if (!isset($att)){
}
return($att);
}else{
}
return($att);
}else{
- $this->error = "Perform a Fetch with no Search";
+ $this->error = "Perform a fetch with no search";
return("");
}
}else{
return("");
}
}else{
}
}
}
}
- function resetResult()
+ function resetResult($srp)
{
{
- $this->start = 0;
+ $this->start[$srp] = 0;
}
}
- function clearResult()
+ function clearResult($srp)
{
{
- if($this->hasres){
- $this->hasres = false;
- @ldap_free_result($this->sr);
+ if($this->hasres[$srp]){
+ $this->hasres[$srp] = false;
+ @ldap_free_result($this->sr[$srp]);
}
}
}
}
- function getDN()
+ function getDN($srp)
{
if($this->hascon){
{
if($this->hascon){
- if($this->hasres){
+ if($this->hasres[$srp]){
- if(!$this->re)
+ if(!$this->re[$srp])
{
$this->error = "Perform a Fetch with no valid Result";
}
else
{
{
$this->error = "Perform a Fetch with no valid Result";
}
else
{
- $rv = @ldap_get_dn($this->cid, $this->re);
+ $rv = @ldap_get_dn($this->cid, $this->re[$srp]);
$this->error = @ldap_error($this->cid);
return(trim(LDAP::convert($rv)));
$this->error = @ldap_error($this->cid);
return(trim(LDAP::convert($rv)));
}
}
}
}
- function count()
+ function count($srp)
{
if($this->hascon){
{
if($this->hascon){
- if($this->hasres){
- $rv = @ldap_count_entries($this->cid, $this->sr);
+ if($this->hasres[$srp]){
+ $rv = @ldap_count_entries($this->cid, $this->sr[$srp]);
$this->error = @ldap_error($this->cid);
return($rv);
}else{
$this->error = @ldap_error($this->cid);
return($rv);
}else{
if ($dn == "")
$dn = $this->basedn;
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{
$this->error = @ldap_error($this->cid);
return($r);
}else{
}
}
}
}
+
+ /*! \brief Move the given Ldap entry from $source to $dest
+ @param String $source The source dn.
+ @param String $dest The destination dn.
+ @return Boolean TRUE on success else FALSE.
+ */
+ function rename_dn($source,$dest)
+ {
+ /* Check if source and destination are the same entry */
+ if(strtolower($source) == strtolower($dest)){
+ trigger_error("Source and destination can't be the same entry.");
+ $this->error = "Source and destination can't be the same entry.";
+ return(FALSE);
+ }
+
+ /* Check if destination entry exists */
+ if($this->dn_exists($dest)){
+ trigger_error("Destination '$dest' already exists.");
+ $this->error = "Destination '$dest' already exists.";
+ return(FALSE);
+ }
+
+ /* Extract the name and the parent part out ouf source dn.
+ e.g. cn=herbert,ou=department,dc=...
+ parent => ou=department,dc=...
+ dest_rdn => cn=herbert
+ */
+ $parent = preg_replace("/^[^,]+,/","", $dest);
+ $dest_rdn = preg_replace("/,.*$/","",$dest);
+
+ if($this->hascon){
+ if ($this->reconnect) $this->connect();
+ $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
+ server may not support this operation */
+ $r &= is_resource($this->dn_exists($dest));
+ return($r);
+ }else{
+ $this->error = "Could not connect to LDAP server";
+ return(FALSE);
+ }
+ }
+
+
/**
* Function rmdir_recursive
*
/**
* Function rmdir_recursive
*
* GiveBack: True on sucessfull , 0 in error, and "" when we don't get a ldap conection
*
*/
* GiveBack: True on sucessfull , 0 in error, and "" when we don't get a ldap conection
*
*/
-
- function rmdir_recursive($deletedn)
+ function rmdir_recursive($srp, $deletedn)
{
if($this->hascon){
if ($this->reconnect) $this->connect();
$delarray= array();
/* Get sorted list of dn's to delete */
{
if($this->hascon){
if ($this->reconnect) $this->connect();
$delarray= array();
/* Get sorted list of dn's to delete */
- $this->ls ("(objectClass=*)",$deletedn);
- while ($this->fetch()){
- $deldn= $this->getDN();
+ $this->ls ($srp, "(objectClass=*)",$deletedn);
+ while ($this->fetch($srp)){
+ $deldn= $this->getDN($srp);
$delarray[$deldn]= strlen($deldn);
}
arsort ($delarray);
$delarray[$deldn]= strlen($deldn);
}
arsort ($delarray);
/* Really Delete ALL dn's in subtree */
foreach ($delarray as $key => $value){
/* Really Delete ALL dn's in subtree */
foreach ($delarray as $key => $value){
- $this->rmdir_recursive($key);
+ $this->rmdir_recursive($srp, $key);
}
/* Finally Delete own Node */
}
/* Finally Delete own Node */
}
}
}
}
- /* Copy given attributes and sub-dns with attributes to destination dn
- */
- function copy_FAI_resource_recursive($sourcedn,$destinationdn,$destinationName,$type="branch",$is_first = true,$depth=0)
- {
- error_reporting(E_ALL | E_STRICT);
-
- if($is_first){
- echo "<h2>".sprintf(_("Creating copy of %s"),"<i>".LDAP::fix($sourcedn)."</i>")."</h2>";
- }else{
- if(preg_match("/^ou=/",$sourcedn)){
- echo "<h3>"._("Processing")." <i>".LDAP::fix($destinationdn)."</i></h3>";
- }else{
- $tmp = split(",",$sourcedn);
-
- echo " <b>"._("Object").":</b> ";
+ function makeReadableErrors($error,$attrs)
+ {
+ global $config;
- $deststr = LDAP::fix($destinationdn);
- if(strlen($deststr) > 96){
- $deststr = substr($deststr,0,96)."...";
- }
+ if($this->success()) return("");
- echo $deststr."<br>";
+ $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.= " - <b>objectClass: ".$attrs['objectClass'][$oc]."</b>";
}
}
}
}
+ if($error == "Undefined attribute type"){
+ $str = " - <b>attribute: ".preg_replace("/:.*$/","",$this->get_additional_error())."</b>";
+ }
- flush();
-
- if($this->hascon){
- if ($this->reconnect) $this->connect();
-
- /* Save base dn */
- $basedn= $this->basedn;
- $delarray= array();
-
- /* Check if destination entry already exists */
- $this->cat($destinationdn);
-
- if($this->count()){
- return;
- }else{
-
- $this->clearResult();
-
- /* Get source entry */
- $this->cd($basedn);
- $this->cat($sourcedn);
- $attr = $this->fetch();
-
- /* Error while fetching object / attribute abort*/
- if((!$attr) || (count($attr)) ==0) {
- echo _("Error while fetching source dn - aborted!");
- return;
- }
-
- /* check if this is a department */
- if(in_array("organizationalUnit",$attr['objectClass'])){
- $attr['dn'] = LDAP::convert($destinationdn);
- $this->cd($basedn);
- $this->create_missing_trees($destinationdn);
- $this->cd($destinationdn);
-
- /* If is first entry, append FAIbranch to department entry */
- if($is_first){
- $this->cat($destinationdn);
- $attr= $this->fetch();
-
- /* Filter unneeded informations */
- foreach($attr as $key => $value){
- if(is_numeric($key)) unset($attr[$key]);
- if(isset($attr[$key]['count'])){
- if(is_array($attr[$key])){
- unset($attr[$key]['count']);
- }
- }
- }
-
- unset($attr['count']);
- unset($attr['dn']);
-
- /* Add marking attribute */
- $attr['objectClass'][] = "FAIbranch";
-
- /* Add this entry */
- $this->modify($attr);
- }
- }else{
-
- /* If this is no department */
- foreach($attr as $key => $value){
- if(in_array($key ,array("FAItemplateFile","FAIscript", "gotoLogonScript", "gosaApplicationIcon","gotoMimeIcon"))){
- $sr= ldap_read($this->cid, LDAP::fix($sourcedn), "$key=*", array($key));
- $ei= ldap_first_entry($this->cid, $sr);
- if ($tmp= @ldap_get_values_len($this->cid, $ei,$key)){
- $attr[$key] = $tmp;
- }
- }
-
- if(is_numeric($key)) unset($attr[$key]);
- if(isset($attr[$key]['count'])){
- if(is_array($attr[$key])){
- unset($attr[$key]['count']);
- }
- }
- }
- unset($attr['count']);
- unset($attr['dn']);
-
- if((!in_array("gosaApplication" , $attr['objectClass'])) && (!in_array("gotoMimeType", $attr['objectClass']))){
- $attr['FAIdebianRelease'] = $destinationName;
- if($type=="branch"){
- $attr['FAIstate'] ="branch";
- }elseif($type=="freeze"){
- $attr['FAIstate'] ="freeze";
- }else{
- print_red(_("Unknown FAIstate %s"),$type);
- }
- }
-
- /* Replace FAIdebianRelease with new release name */
- if(in_array("FAIpackageList" , $attr['objectClass'])){
- $attr['FAIdebianRelease'] = $destinationName;
- }
-
- /* Add entry */
- $this->cd($destinationdn);
- $this->cat($destinationdn);
- $a = $this->fetch();
- if(!count($a)){
- $this->add($attr);
- }
-
- if($this->error != "Success"){
- /* Some error occurred */
- print "---------------------------------------------";
- print $this->get_error()."<br>";
- print $sourcedn."<br>";
- print $destinationdn."<br>";
- print_a( $attr);
- exit();
- }
- }
- }
-
- echo "<script language=\"javascript\" type=\"text/javascript\">scrollDown2();</script>" ;
-
- $this->ls ("(objectClass=*)",$sourcedn);
- while ($this->fetch()){
- $deldn= $this->getDN();
- $delarray[$deldn]= strlen($deldn);
- }
- asort ($delarray);
- reset ($delarray);
-
- $depth ++;
- foreach($delarray as $dn => $bla){
- if($dn != $destinationdn){
- $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),$destinationName,$type,false,$depth);
- }
- }
- }
- }
- if($is_first){
- echo "<p class='seperator'> </p>";
- }
+ @DEBUG(DEBUG_LDAP,__LINE__,__FUNCTION__,__FILE__,$attrs,"Erroneous data");
+ return($str);
}
function modify($attrs)
}
function modify($attrs)
if ($this->reconnect) $this->connect();
$r = @ldap_modify($this->cid, LDAP::fix($this->basedn), $attrs);
$this->error = @ldap_error($this->cid);
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";
return($r ? $r : 0);
}else{
$this->error = "Could not connect to LDAP server";
if ($this->reconnect) $this->connect();
$r = @ldap_add($this->cid, LDAP::fix($this->basedn), $attrs);
$this->error = @ldap_error($this->cid);
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";
return($r ? $r : 0);
}else{
$this->error = "Could not connect to LDAP server";
}
}
}
}
- function create_missing_trees($target)
+ function create_missing_trees($srp, $target)
{
global $config;
{
global $config;
/* Ignore referrals */
$found= false;
foreach($this->referrals as $ref){
/* 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;
if ($base == $cdn){
$found= true;
break;
continue;
}
continue;
}
- $this->cat ($cdn);
- $attrs= $this->fetch();
+ $this->cat ($srp, $cdn);
+ $attrs= $this->fetch($srp);
/* Create missing entry? */
if (count ($attrs)){
/* Create missing entry? */
if (count ($attrs)){
} else {
$type= preg_replace('/^([^=]+)=.*$/', '\\1', $cdn);
} 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();
$na= array();
/* Get name of first matching objectClass */
$ocname= "";
foreach($classes as $class){
/* 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'])){
/* Look for first classes that is structural... */
if (isset($class['STRUCTURAL'])){
/* Bail out, if we've nothing to do... */
if ($ocname == ""){
/* Bail out, if we've nothing to do... */
if ($ocname == ""){
- print_red(sprintf(_("Autocreation of subtree failed. No objectClass found for attribute '%s'."), $type));
- display_error_page();
+ msg_dialog::display(_("Internal error"), sprintf(_("Cannot automatically create subtrees with RDN %s: no object class found"), bold($type)), FATAL_ERROR_DIALOG);
+ exit();
}
/* Assemble_entry */
}
/* Assemble_entry */
$na['objectClass'][]= 'locality';
}
$na[$type]= $param;
$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 (is_array($classes[$ocname]['MUST'])){
foreach($classes[$ocname]['MUST'] as $attr){
+ if(isset($na[$attr]) && !empty($na[$attr])) continue;
$na[$attr]= "filled";
}
}
$na[$attr]= "filled";
}
}
$na["dc"]= $param;
break;
default:
$na["dc"]= $param;
break;
default:
- print_red(sprintf(_("Autocreation of type '%s' is currently not supported. Please report to the GOsa team."), $type));
- display_error_page();
+ msg_dialog::display(_("Internal error"), sprintf(_("Cannot automatically create subtrees with RDN %s: not supported"), bold($type)), FATAL_ERROR_DIALOG);
+ exit();
}
}
$this->cd($cdn);
$this->add($na);
}
}
$this->cd($cdn);
$this->add($na);
- show_ldap_error($this->get_error(), sprintf(_("Creating subtree '%s' failed."),$cdn));
- if (!preg_match('/success/i', $this->error)){
+ 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;
}
}
return FALSE;
}
}
}
}
- function recursive_remove()
+ function recursive_remove($srp)
{
$delarray= array();
/* Get sorted list of dn's to delete */
{
$delarray= array();
/* Get sorted list of dn's to delete */
- $this->search ("(objectClass=*)");
- while ($this->fetch()){
- $deldn= $this->getDN();
+ $this->search ($srp, "(objectClass=*)");
+ while ($this->fetch($srp)){
+ $deldn= $this->getDN($srp);
$delarray[$deldn]= strlen($deldn);
}
arsort ($delarray);
$delarray[$deldn]= strlen($deldn);
}
arsort ($delarray);
}
}
}
}
+
function get_attribute($dn, $name,$r_array=0)
{
$data= "";
function get_attribute($dn, $name,$r_array=0)
{
$data= "";
}
}
}
}
}
}
- if($r_array==0)
- return ($data);
- else
- return ($info);
-
-
+ if($r_array==0) {
+ return ($data);
+ } else {
+ return ($info);
+ }
}
}
return ($error);
}
return ($error);
}
+
+ function success()
+ {
+ return (preg_match('/Success/i', $this->error));
+ }
+
+
function get_error()
{
if ($this->error == 'Success'){
function get_error()
{
if ($this->error == 'Success'){
} else {
$adderror= $this->get_additional_error();
if ($adderror != ""){
} 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 {
} 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;
}
}
return $error;
}
if (isset($referrals[$server])){
return ($referrals[$server]);
} else {
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);
}
}
return ($ret);
}
- function gen_ldif ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $recursive= TRUE)
+ function generateLdif ($dn, $filter= "(objectClass=*)", $attributes= array(), $scope = 'sub', $limit=0)
{
{
- $display= "";
-
- if ($recursive){
- $this->cd($dn);
- $this->ls($filter,$dn, array('dn','objectClass'));
- $deps = array();
-
- $display .= $this->gen_one_entry($dn)."\n";
-
- while ($attrs= $this->fetch()){
- $deps[] = $attrs['dn'];
- }
- foreach($deps as $dn){
- $display .= $this->gen_ldif($dn, $filter,$attributes,$recursive);
- }
- } else {
- $display.= $this->gen_one_entry($dn);
- }
- return ($display);
+ $host = $this->hostname;
+ $attrs = (count($attributes))?implode($attributes,' '):'';
+ $scope = (!empty($scope))?' -s '.$scope: '';
+ $limit = (!$limit)?'':' -z '.$limit;
+ $cmd = "ldapsearch -x -LLLL '{$filter}' {$limit} {$scope} -H '{$host}' -b '{$dn}' $attrs";
+ exec($cmd, $ret,$code);
+ $res = implode($ret,"\n");
+ return($res);
}
}
- function gen_xls ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $recursive= TRUE,$r_array=0)
+ function gen_xls ($srp, $dn, $filter= "(objectClass=*)", $attributes= array('*'), $recursive= TRUE,$r_array=0)
{
$display= array();
$this->cd($dn);
{
$display= array();
$this->cd($dn);
- $this->search("$filter");
+ $this->search($srp, "$filter");
$i=0;
$i=0;
- while ($attrs= $this->fetch()){
+ while ($attrs= $this->fetch($srp)){
$j=0;
foreach ($attributes as $at){
$j=0;
foreach ($attributes as $at){
}
}
- 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"));
function dn_exists($dn)
{
return @ldap_list($this->cid, LDAP::fix($dn), "(objectClass=*)", array("objectClass"));
if JustMofify id false the destination dn will be overwritten by the new ldif.
*/
if JustMofify id false the destination dn will be overwritten by the new ldif.
*/
- function import_complete_ldif($str_attr,&$error,$JustModify,$DeleteOldEntries)
+ function import_complete_ldif($srp, $str_attr,$error,$JustModify,$DeleteOldEntries)
{
if($this->reconnect) $this->connect();
{
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 */
An empty line indicates an new Entry */
- $entries = split("\n",$str_attr);
+ $entries = preg_split("/\n/",$str_attr);
$data = "";
$cnt = 0;
$data = "";
$cnt = 0;
/* Append lines ... */
if(!empty($tmp2)) {
/* check if we need base64_decode for this line */
/* 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 */
$attr = trim($encoded[0]);
$value = base64_decode(trim($encoded[1]));
/* Add linenumber */
Now we check every insertblock and try to insert */
foreach ( $all as $single) {
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]);
$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") {
$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;
}
return -2;
}
}
/* If we can't Import, return with a file error */
}
/* If we can't Import, return with a file error */
- if(!$this->import_single_entry($single,$usemodify,$usermdir) ) {
- $error= sprintf(_("Error while importing dn: '%s', please check your LDIF from line %s on!"), $line,
+ if(!$this->import_single_entry($srp, $single,$usemodify,$usermdir) ) {
+ $error= sprintf(_("Error while importing DN %s: please check LDIF from line %s on!"), bold($line),
$current_line);
return UNKNOWN_TOKEN_IN_LDIF_FILE; }
}
$current_line);
return UNKNOWN_TOKEN_IN_LDIF_FILE; }
}
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.
*/
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)
+ function import_single_entry($srp, $str_attr,$modify,$delete)
{
global $config;
{
global $config;
if($this->reconnect) $this->connect();
$ret = false;
if($this->reconnect) $this->connect();
$ret = false;
- $rows= split("\n",$str_attr);
+ $rows= preg_split("/\n/",$str_attr);
$data= false;
foreach($rows as $row) {
$data= false;
foreach($rows as $row) {
/* We are using line numbers
Because there is a # before a : */
/* 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 */
$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 */
$attr[0]= trim($attr[0]); /* attribute */
$attr[1]= $attr[1]; /* value */
/* Delete existing entry */
if($delete){
/* Delete existing entry */
if($delete){
- $this->rmdir_recursive($data['dn']);
+ $this->rmdir_recursive($srp, $data['dn']);
}
/* Create missing trees */
$this->cd ($this->basedn);
$this->cd($config->current['BASE']);
}
/* Create missing trees */
$this->cd ($this->basedn);
$this->cd($config->current['BASE']);
- $this->create_missing_trees(preg_replace("/^[^,]+,/","",$data['dn']));
+ $this->create_missing_trees($srp, preg_replace("/^[^,]+,/","",$data['dn']));
$this->cd($data['dn']);
$dn = $data['dn'];
$this->cd($data['dn']);
$dn = $data['dn'];
if(!$modify){
if(!$modify){
- $this->cat($dn);
- if($this->count()){
+ $this->cat($srp, $dn);
+ if($this->count($srp)){
/* The destination entry exists, overwrite it with the new entry */
/* The destination entry exists, overwrite it with the new entry */
- $attrs = $this->fetch();
+ $attrs = $this->fetch($srp);
foreach($attrs as $name => $value ){
if(!is_numeric($name)){
if(in_array($name,array("dn","count"))) continue;
foreach($attrs as $name => $value ){
if(!is_numeric($name)){
if(in_array($name,array("dn","count"))) continue;
$ret = $this->modify($data);
}
}
$ret = $this->modify($data);
}
}
- show_ldap_error($this->get_error(), sprintf(_("Ldap import with dn '%s' failed."),$dn));
+
+ if (!$this->success()){
+ msg_dialog::display(_("LDAP error"), msgPool::ldaperror($this->get_error(), $dn, "", get_class()));
+ }
+
return($ret);
}
function importcsv($str)
{
return($ret);
}
function importcsv($str)
{
- $lines = split("\n",$str);
+ $lines = preg_split("/\n/",$str);
foreach($lines as $line)
{
/* continue if theres a comment */
foreach($lines as $line)
{
/* continue if theres a comment */
$line= str_replace ("\t" ,"," ,$line);
echo $line;
$line= str_replace ("\t" ,"," ,$line);
echo $line;
- $cells = split(",",$line ) ;
+ $cells = explode(",",$line ) ;
$linet= str_replace ("\t\t",",",$line);
$linet= str_replace ("\t\t",",",$line);
- $cells = split("\t",$line);
+ $cells = preg_split("/\t/",$line);
$count = count($cells);
}
}
$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))){
{
$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("schemaCheck") != "true"){
return($objectclasses);
}
}
return($objectclasses);
}
}
+
+ /* Return the cached results. */
+ 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
# 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();
$attr = @ldap_get_entries($this->cid,$sr);
if (!isset($attr[0]['subschemasubentry'][0])){
return array();
continue;
}
$name= "OID";
continue;
}
$name= "OID";
- $pattern= split(' ', $val);
+ $pattern= explode(' ', $val);
$ocname= preg_replace("/^.* NAME\s+\(*\s*'([^']+)'\s*\)*.*$/", '\\1', $val);
$objectclasses[$ocname]= array();
$ocname= preg_replace("/^.* NAME\s+\(*\s*'([^']+)'\s*\)*.*$/", '\\1', $val);
$objectclasses[$ocname]= array();
break;
case ')': if ($name != ""){
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= "";
}
$name= "";
$value= "";
case 'MUST':
case 'MAY':
if ($name != ""){
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= "";
}
$name= $chunk;
$value= "";
}
}
}
}
+ if(class_available("session")){
+ session::global_set("LDAP_CACHE::get_objectclasses",$objectclasses);
+ }
+
return $objectclasses;
}
return $objectclasses;
}
function log($string)
{
function log($string)
{
- if (isset($_SESSION['config'])){
- $cfg= $_SESSION['config'];
- if (1 || isset($cfg->current['LDAPSTATS']) && preg_match('/true/i', $cfg->current['LDAPSTATS'])){
+ 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);
}
}
syslog (LOG_INFO, $string);
}
}
/* added by Guido Serra aka Zeph <zeph@purotesto.it> */
function getCn($dn){
/* added by Guido Serra aka Zeph <zeph@purotesto.it> */
function getCn($dn){
- $simple= split(",", $dn);
+ $simple= explode(",", $dn);
foreach($simple as $piece) {
foreach($simple as $piece) {
- $partial= split("=", $piece);
+ $partial= explode("=", $piece);
if($partial[0] == "cn"){
return $partial[1];
if($partial[0] == "cn"){
return $partial[1];
return ($result);
}
return ($result);
}
-
}
}
-
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>