index 642908017b553e236a8ca00710cc2dc60961ec5f..6af377218add9ef4562a5ccf76858426a92b4d81 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 = "";
}
}
+ 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.
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
+ } else {
$basedn = LDAP::convert($this->basedn);
$basedn = LDAP::convert($this->basedn);
+ }
return(ereg_replace("[^,]*[,]*[ ]*(.*)", "\\1", $basedn));
}
return(ereg_replace("[^,]*[,]*[ ]*(.*)", "\\1", $basedn));
}
- function search($filter, $attrs= array())
+
+ function search($srp, $filter, $attrs= array())
{
if($this->hascon){
if ($this->reconnect) $this->connect();
$start = microtime();
{
if($this->hascon){
if ($this->reconnect) $this->connect();
$start = microtime();
-
- $this->clearResult();
- $this->sr = @ldap_search($this->cid, LDAP::fix($this->basedn), $filter, $attrs);
+ $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){
}
$this->log("LDAP operation: time=".get_MicroTimeDiff($start,microtime())." operation=search('".LDAP::fix($this->basedn)."', '$filter')");
}
$this->log("LDAP operation: time=".get_MicroTimeDiff($start,microtime())." operation=search('".LDAP::fix($this->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 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);
$start = microtime();
if ($basedn == "")
$basedn = $this->basedn;
else
$basedn= LDAP::convert($basedn);
$start = microtime();
- $this->sr = @ldap_list($this->cid, LDAP::fix($basedn), $filter,$attrs);
+ $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){
$this->log("LDAP operation: time=".get_MicroTimeDiff($start,microtime())." operation=ls('".LDAP::fix($basedn)."', '$filter')");
$this->log("LDAP operation: time=".get_MicroTimeDiff($start,microtime())." 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("*"))
{
if($this->hascon){
if ($this->reconnect) $this->connect();
{
if($this->hascon){
if ($this->reconnect) $this->connect();
- $this->clearResult();
+
+ $this->clearResult($srp);
$filter = "(objectclass=*)";
$filter = "(objectclass=*)";
- $this->sr = @ldap_read($this->cid, LDAP::fix($dn), $filter,$attrs);
+ $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 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{
}
}
}
}
+
+ /*! \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)
+ {
+ $source = LDAP::fix($source);
+ $dest = LDAP::fix($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,$source,$dest_rdn,$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 */
}
}
}
}
- function create_missing_trees($target)
+ function create_missing_trees($srp, $target)
{
global $config;
{
global $config;
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)){
/* Bail out, if we've nothing to do... */
if ($ocname == ""){
/* 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!"),$type), FATAL_ERROR_DIALOG);
exit();
}
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()){
+ 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);
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'){
}
}
- function gen_ldif ($dn, $filter= "(objectClass=*)", $attributes= array('*'), $recursive= TRUE)
+ function gen_ldif ($srp, $dn, $filter= "(objectClass=*)", $attributes= array('*'), $recursive= TRUE)
{
$display= "";
if ($recursive){
$this->cd($dn);
{
$display= "";
if ($recursive){
$this->cd($dn);
- $this->ls($filter,$dn, array('dn','objectClass'));
+ $this->ls($srp, $filter,$dn, array('dn','objectClass'));
$deps = array();
$display .= $this->gen_one_entry($dn)."\n";
$deps = array();
$display .= $this->gen_one_entry($dn)."\n";
- while ($attrs= $this->fetch()){
+ while ($attrs= $this->fetch($srp)){
$deps[] = $attrs['dn'];
}
foreach($deps as $dn){
$deps[] = $attrs['dn'];
}
foreach($deps as $dn){
- $display .= $this->gen_ldif($dn, $filter,$attributes,$recursive);
+ $display .= $this->gen_ldif($srp, $dn, $filter,$attributes,$recursive);
}
} else {
$display.= $this->gen_one_entry($dn);
}
} else {
$display.= $this->gen_one_entry($dn);
}
}
- 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){
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();
}
/* 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) ) {
+ 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,
$current_line);
return UNKNOWN_TOKEN_IN_LDIF_FILE; }
$error= sprintf(_("Error while importing dn: '%s', please check your LDIF from line %s on!"), $line,
$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;
/* 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);
}
return($ret);
}
}
# 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();
if(class_available("session")){
session::set("LDAP_CACHE::get_objectclasses",$objectclasses);
}
if(class_available("session")){
session::set("LDAP_CACHE::get_objectclasses",$objectclasses);
}
+
return $objectclasses;
}
return $objectclasses;
}
return ($result);
}
return ($result);
}
+
}
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>
}
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>