!C99Shell v. 1.0 pre-release build #13!

Software: Apache. PHP/5.5.15 

uname -a: Windows NT SVR-DMZ 6.1 build 7600 (Windows Server 2008 R2 Enterprise Edition) i586 

SYSTEM 

Safe-mode: OFF (not secure)

C:\dmz\php\pear\DB\   drwxrwxrwx
Free 4.11 GB of 39.52 GB (10.39%)
Detected drives: [ a ] [ c ] [ d ] [ e ] [ f ]
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     ldap.php (34.37 KB)      -rw-rw-rw-
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
//
// Pear DB LDAP - Database independent query interface definition
// for PHP's LDAP extension.
//
// Copyright (c) 2002-2003 Ludovico Magnocavallo <ludo@sumatrasolutions.com>
//
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License, or (at your option) any later version.
//
//  This library 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
//  Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public
//  License along with this library; if not, write to the Free Software
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
//
// Contributors
// - Piotr Roszatycki <dexter@debian.org>
//   DB_ldap::base() method, support for LDAP sequences, various fixes
// - Aaron Spencer Hawley <aaron dot hawley at uvm dot edu>
//   fix to use port number if present in DB_ldap->connect()
//
// $Id$
//

require_once 'DB.php';
require_once 
'DB/common.php';

define("DB_ERROR_BIND_FAILED",     -26);
define("DB_ERROR_UNKNOWN_LDAP_ACTION",     -27);

/**
 * LDAP result class
 *
 * LDAP_result extends DB_result to provide specific LDAP
 * result methods.
 *
 * @version 1.0
 * @author Ludovico Magnocavallo <ludo@sumatrasolutions.com>
 * @package DB
 */

class LDAP_result extends DB_result
{

    
// {{{ properties

    /**
     * data returned from ldap_entries()
     * @access private
     */
    
var $_entries   null;
    
/**
     * result rows as hash of records
     * @access private
     */
    
var $_recordset null;
    
/**
     * current record as hash
     * @access private
     */
    
var $_record    null;

    
// }}}
    // {{{ constructor

    /**
     * class constructor, calls DB_result constructor
     * @param ref $dbh reference to the db instance
     * @param resource $result ldap command result
     */
    
function LDAP_result(&$dbh$result)
    {
        
$this->DB_result($dbh$result);
    }

    
/**
     * fetch rows of data into $this->_recordset
     *
     * called once as soon as something needs to be returned
     * @access private
     * @param resource $result ldap command result
     * @return boolean true
     */
    
function getRows() {
        if (
$this->_recordset === null) {
            
// begin processing result into recordset
            
$this->_entries ldap_get_entries($this->dbh->connection$this->result);
            
$this->row_counter $this->_entries['count'];
            
$i 1;
            
$rs_template = array();
            if (
count($this->dbh->attributes) > 0) {
                
reset($this->dbh->attributes);
                while (list(
$a_index$a_name) = each($this->dbh->attributes)) $rs_template[$a_name] = '';
            }
            while (list(
$entry_idx$entry) = each($this->_entries)) {
                
// begin first loop, iterate through entries
                
if (!empty($this->dbh->limit_from) && ($i $this->dbh->limit_from)) continue;
                if (!empty(
$this->dbh->limit_count) && ($i $this->dbh->limit_count)) break;
                
$rs $rs_template;
                if (!
is_array($entry)) continue;
                while (list(
$attr$attr_values) = each($entry)) {
                    
// begin second loop, iterate through attributes
                    
if (is_int($attr) || $attr == 'count') continue;
                    if (
is_string($attr_values)) $rs[$attr] = $attr_values;
                    else {
                        
$value '';
                        while (list(
$value_idx$attr_value) = each($attr_values)) {
                            
// begin third loop, iterate through attribute values
                            
if (!is_int($value_idx)) continue;
                            if (empty(
$value)) $value $attr_value;
                            else {
                                if (
is_array($value)) $value[] = $attr_value;
                                else 
$value = array($value$attr_value);
                            }
//                          else $value .= "\n$attr_value";
                            // end third loop
                        
}
                        
$rs[$attr] = $value;
                    }
                    
// end second loop
                
}
                
reset($rs);
                
$this->_recordset[$entry_idx] = $rs;
                
$i++;
                
// end first loop
            
}
            
$this->_entries null;
            if (!
is_array($this->_recordset))
                
$this->_recordset = array();
            if (!empty(
$this->dbh->sorting)) {
                
$sorting_method = (!empty($this->dbh->sorting_method) ? $this->dbh->sorting_method 'cmp');
                
uksort($this->_recordset, array(&$this$sorting_method));
            }
            
reset($this->_recordset);
            
// end processing result into recordset
        
}
        return 
DB_OK;
    }


    
/**
     * Fetch and return a row of data (it uses driver->fetchInto for that)
     * @param int $fetchmode  format of fetched row
     * @param int $rownum     the row number to fetch
     *
     * @return  array a row of data, NULL on no more rows or PEAR_Error on error
     *
     * @access public
     */
    
function &fetchRow($fetchmode DB_FETCHMODE_DEFAULT$rownum null)
    {
        
$this->getRows();
        if (
count($this->_recordset) === ) {
            return 
null;
        }

        if (
$this->_record !== null) {
            
$this->_record next($this->_recordset);
        } else {
            
$this->_record current($this->_recordset);
        }
        
$row $this->_record;
        if (
$row === false) {
            return 
null;
        }

        return 
$row;
    }


    
/**
     * Fetch a row of data into an existing variable.
     *
     * @param  mixed     $arr        reference to data containing the row
     * @param  integer   $fetchmode  format of fetched row
     * @param  integer   $rownum     the row number to fetch
     *
     * @return  mixed  DB_OK on success, NULL on no more rows or
     *                 a DB_Error object on error
     *
     * @access public
     */

    
function fetchInto(&$ar$fetchmode DB_FETCHMODE_DEFAULT$rownum null)
    {
        
$this->getRows();
        if (
$this->_record !== null$this->_record next($this->_recordset);
        else 
$this->_record current($this->_recordset);
        
$ar $this->_record;
        if (!
$ar) {
            return 
null;
        }
        return 
DB_OK;
    }

    
/**
     * return all records
     *
     * returns a hash of all records, basically returning
     * a copy of $this->_recordset
     * @param  integer   $fetchmode  format of fetched row
     * @param  integer   $rownum     the row number to fetch (not used, here for interface compatibility)
     *
     * @return  mixed  DB_OK on success, NULL on no more rows or
     *                 a DB_Error object on error
     *
     * @access public
     */
    
function fetchAll($fetchmode DB_FETCHMODE_DEFAULT$rownum null)
    {
        
$this->getRows();
        return(
$this->_recordset);
    }

    
/**
     * Get the the number of columns in a result set.
     *
     * @return int the number of columns, or a DB error
     *
     * @access public
     */
    
function numCols($result)
    {
        
$this->getRows();
        return(
count(array_keys($this->_record)));
    }

    function 
cmp($a$b)
    {
        return(
strcmp(strtolower($this->_recordset[$a][$this->dbh->sorting]), strtolower($this->_recordset[$b][$this->dbh->sorting])));
    }

    
/**
     * Get the number of rows in a result set.
     *
     * @return int the number of rows, or a DB error
     *
     * @access public
     */
    
function numRows()
    {
        
$this->getRows();
        return 
$this->row_counter;
    }

    
/**
     * Get the next result if a batch of queries was executed.
     *
     * @return bool true if a new result is available or false if not.
     *
     * @access public
     */
    
function nextResult()
    {
        return 
$this->dbh->nextResult($this->result);
    }

    
/**
     * Frees the resources allocated for this result set.
     * @return  int     error code
     *
     * @access public
     */
    
function free()
    {
        
$this->_recordset null;
        
$this->_record null;
        
ldap_free_result($this->result);
        
$this->result null;
        return 
true;
    }

    
/**
    * @deprecated
    */
    
function tableInfo($mode null)
    {
        return 
$this->dbh->tableInfo($this->result$mode);
    }

    
/**
    * returns the actual rows number
    * @return integer
    */
    
function getRowCounter()
    {
        
$this->getRows();
        return 
$this->row_counter;
    }
}

/**
 * LDAP DB interface class
 *
 * LDAP extends DB_common to provide DB compliant
 * access to LDAP servers
 *
 * @version 1.0
 * @author Ludovico Magnocavallo <ludo@sumatrasolutions.com>
 * @package DB
 */

class DB_ldap extends DB_common
{
    
// {{{ properties

    /**
     * LDAP connection
     * @access private
     */
    
var $connection;
    
/**
     * base dn
     * @access private
     */
    
var $base           '';
    
/**
     * default base dn
     * @access private
     */
    
var $d_base           '';
    
/**
     * query base dn
     * @access private
     */
    
var $q_base           '';
    
/**
     * array of LDAP actions that only manipulate data
     * returning a true/false value
     * @access private
     */
    
var $manip          = array('add''compare''delete''modify''mod_add''mod_del''mod_replace''rename');
    
/**
     * store the default real LDAP action to perform
     * @access private
     */
    
var $action         'search';
    
/**
     * store the real LDAP action to perform
     * (ie PHP ldap function to call) for a query
     * @access private
     */
    
var $q_action       '';
    
/**
     * store optional parameters passed
     *  to the real LDAP action
     * @access private
     */
    
var $q_params       = array();

    
// }}}

    /**
     * Constructor, calls DB_common constructor
     *
     * @see DB_common::DB_common()
     */
    
function DB_ldap()
    {
        
$this->DB_common();
        
$this->phptype 'ldap';
        
$this->dbsyntax 'ldap';
        
$this->features = array(
            
'prepare'       => false,
            
'pconnect'      => false,
            
'transactions'  => false,
            
'limit'         => false
        
);
        
$this->errorcode_map = array(
            
0x10 => DB_ERROR_NOSUCHFIELD,               // LDAP_NO_SUCH_ATTRIBUTE
            
0x11 => DB_ERROR_INVALID,                   // LDAP_UNDEFINED_TYPE
            
0x12 => DB_ERROR_INVALID,                   // LDAP_INAPPROPRIATE_MATCHING
            
0x13 => DB_ERROR_INVALID,                   // LDAP_CONSTRAINT_VIOLATION
            
0x14 => DB_ERROR_ALREADY_EXISTS,            // LDAP_TYPE_OR_VALUE_EXISTS
            
0x15 => DB_ERROR_INVALID,                   // LDAP_INVALID_SYNTAX
            
0x20 => DB_ERROR_NOT_FOUND,                 // LDAP_NO_SUCH_OBJECT
            
0x21 => DB_ERROR_NOT_FOUND,                 // LDAP_ALIAS_PROBLEM
            
0x22 => DB_ERROR_INVALID,                   // LDAP_INVALID_DN_SYNTAX
            
0x23 => DB_ERROR_INVALID,                   // LDAP_IS_LEAF
            
0x24 => DB_ERROR_INVALID,                   // LDAP_ALIAS_DEREF_PROBLEM
            
0x30 => DB_ERROR_ACCESS_VIOLATION,          // LDAP_INAPPROPRIATE_AUTH
            
0x31 => DB_ERROR_ACCESS_VIOLATION,          // LDAP_INVALID_CREDENTIALS
            
0x32 => DB_ERROR_ACCESS_VIOLATION,          // LDAP_INSUFFICIENT_ACCESS
            
0x40 => DB_ERROR_MISMATCH,                  // LDAP_NAMING_VIOLATION
            
0x41 => DB_ERROR_MISMATCH,                  // LDAP_OBJECT_CLASS_VIOLATION
            
0x44 => DB_ERROR_ALREADY_EXISTS,            // LDAP_ALREADY_EXISTS
            
0x51 => DB_ERROR_CONNECT_FAILED,            // LDAP_SERVER_DOWN
            
0x57 => DB_ERROR_SYNTAX                     // LDAP_FILTER_ERROR
        
);
    }

    
/**
     * Connect and bind to LDAP server with either anonymous or authenticated bind depending on dsn info
     *
     * @param array $dsninfo dsn info as passed by DB::connect()
     * @param boolean $persistent kept for interface compatibility
     * @return DB_OK if successfully connected. A DB error code is returned on failure.
     */
    
function connect($dsninfo$persistent false)
    {
        if (!
PEAR::loadExtension('ldap'))
            return 
$this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);

        
$this->dsn    $dsninfo;
        
$user         $dsninfo['username'];
        
$pw           $dsninfo['password'];
        
$host         $dsninfo['hostspec'];
        
$port         $dsninfo['port'];
        
$this->base   $dsninfo['database'];
        
$this->d_base $this->base;
        
$version      $dsninfo['protocol'];

        if (empty(
$host)) {
            return 
$this->raiseError("no host specified $host");
        } 
// else ...

        
if (isset($port)) {
            
$conn ldap_connect($host$port);
        } else {
            
$conn ldap_connect($host);
        }
        if (!
$conn) {
            return 
$this->raiseError(DB_ERROR_CONNECT_FAILED);
        }

        if (isset(
$version)) {
            
ldap_set_option($connLDAP_OPT_PROTOCOL_VERSION$version);
        } else {
            
// Use 3 by default
            
$res ldap_set_option($connLDAP_OPT_PROTOCOL_VERSION3);
            
// If 3 fails then we can try 2
            
if (!$res) {
                
ldap_set_option($connLDAP_OPT_PROTOCOL_VERSION2);
            }
        }

        if (
$user && $pw) {
            
$bind = @ldap_bind($conn$user$pw);
        } else {
            
$bind = @ldap_bind($conn);
        }
        if (!
$bind) {
            return 
$this->raiseError(DB_ERROR_BIND_FAILED);
        }
        
$this->connection $conn;
        return 
DB_OK;
    }

    
/**
     * Unbinds from LDAP server
     *
     * @return int ldap_unbind() return value
     */
    
function disconnect()
    {
        
$ret = @ldap_unbind($this->connection);
        
$this->connection null;
        return 
$ret;
    }


    
/**
     * Performs a request against the LDAP server
     *
     * The type of request (and the corresponding PHP ldap function called)
     * depend on two additional parameters, added in respect to the
     * DB_common interface.
     *
     * @param string $filter text of the request to send to the LDAP server
     * @param string $action type of request to perform, defaults to search (ldap_search())
     * @param array $params array of additional parameters to pass to the PHP ldap function requested
     * @return result from ldap function or DB Error object if no result
     */
    
function simpleQuery($filter$action null$params null)
    {
        if (
$action === null) {
            
$action = (!empty($this->q_action) ? $this->q_action $this->action);
        }
        if (
$params === null) {
            
$params = (count($this->q_params) > $this->q_params : array());
        }
        if (!
$this->isManip($action)) {
            
$base $this->q_base $this->q_base $this->base;
            
$attributes = array();
            
$attrsonly 0;
            
$sizelimit 0;
            
$timelimit 0;
            
$deref LDAP_DEREF_NEVER;
            
$sorting '';
            
$sorting_method '';
            
reset($params);
            while (list(
$k$v) = each($params)) {
                if (isset(${
$k})) ${$k} = $v;
            }
            
$this->sorting $sorting;
            
$this->sorting_method $sorting_method;
            
$this->attributes $attributes;
            
# double escape char for filter: '(o=Przedsi\C4\99biorstwo)' => '(o=Przedsi\\C4\\99biorstwo)'
            
$filter str_replace('\\''\\\\'$filter);
            
$this->last_query $filter;
            if (
$action == 'search')
                
$result = @ldap_search($this->connection$base$filter$attributes$attrsonly$sizelimit$timelimit$deref);
            else if (
$action == 'list')
                
$result = @ldap_list($this->connection$base$filter$attributes$attrsonly$sizelimit$timelimit$deref);
            else if (
$action == 'read')
                
$result = @ldap_read($this->connection$base$filter$attributes$attrsonly$sizelimit$timelimit$deref);
            else
                return 
$this->ldapRaiseError(DB_ERROR_UNKNOWN_LDAP_ACTION);
            if (!
$result) {
                return 
$this->ldapRaiseError();
            }
        } else {
            
# If first argument is an array, it contains the entry with DN.
            
if (is_array($filter)) {
                
$entry $filter;
                
$filter $entry["dn"];
            } else {
                
$entry = array();
            }
            unset(
$entry["dn"]);
            
$attribute      '';
            
$value          '';
            
$newrdn         '';
            
$newparent      '';
            
$deleteoldrdn   false;
            
reset($params);
            while (list(
$k$v) = each($params)) {
                if (isset(${
$k})) ${$k} = $v;
            }
            
$this->last_query $filter;
            if (
$action == 'add')
                
$result = @ldap_add($this->connection$filter$entry);
            else if (
$action == 'compare')
                
$result = @ldap_add($this->connection$filter$attribute$value);
            else if (
$action == 'delete')
                
$result = @ldap_delete($this->connection$filter);
            else if (
$action == 'modify')
                
$result = @ldap_modify($this->connection$filter$entry);
            else if (
$action == 'mod_add')
                
$result = @ldap_mod_add($this->connection$filter$entry);
            else if (
$action == 'mod_del')
                
$result = @ldap_mod_del($this->connection$filter$entry);
            else if (
$action == 'mod_replace')
                
$result = @ldap_mod_replace($this->connection$filter$entry);
            else if (
$action == 'rename')
                
$result = @ldap_rename($this->connection$filter$newrdn$newparent$deleteoldrdn);
            else
                return 
$this->ldapRaiseError(DB_ERROR_UNKNOWN_LDAP_ACTION);
            if (!
$result) {
                return 
$this->ldapRaiseError();
            }
        }
        
$this->freeQuery();
        return 
$result;
    }

    
/**
     * Executes a query performing variables substitution in the query text
     *
     * @param string $stmt text of the request to send to the LDAP server
     * @param array $data query variables values to substitute
     * @param string $action type of request to perform, defaults to search (ldap_search())
     * @param array $params array of additional parameters to pass to the PHP ldap function requested
     * @return LDAP_result object or DB Error object if no result
     * @see DB_common::executeEmulateQuery $this->simpleQuery()
     */
    
function execute($stmt$data false$action null$params = array())
    {
        
$this->q_params $params;
        
$realquery $this->executeEmulateQuery($stmt$data);
        if (
DB::isError($realquery)) {
            return 
$realquery;
        }
        
$result $this->simpleQuery($realquery$action$params);
        if (
DB::isError($result) || $result === DB_OK) {
            return 
$result;
        }

        
$obj = new LDAP_result($this$result);
        return 
$obj;
    }

    
/**
     * Executes multiple queries performing variables substitution for each query
     *
     * @param string $stmt text of the request to send to the LDAP server
     * @param array $data query variables values to substitute
     * @param string $action type of request to perform, defaults to search (ldap_search())
     * @param array $params array of additional parameters to pass to the PHP ldap function requested
     * @return LDAP_result object or DB Error object if no result
     * @see DB_common::executeMultiple
     */
    
function executeMultiple($stmt, &$data$action null$params = array())
    {
        
$this->q_action $action $action $this->action;
        
$this->q_params $params;
        return(
parent::executeMultiple($stmt$data));
    }

    
/**
     * Executes a query substituting variables if any are present
     *
     * @param string $query text of the request to send to the LDAP server
     * @param array $data query variables values to substitute
     * @param string $action type of request to perform, defaults to search (ldap_search())
     * @param array $params array of additional parameters to pass to the PHP ldap function requested
     * @return LDAP_result object or DB Error object if no result
     * @see DB_common::prepare() $this->execute()$this->simpleQuery()
     */
    
function &query($query$data = array(), $action null$params = array())
    {
        
// $this->q_action = $action ? $action : $this->action;
        // $this->q_params = $params;
        
if (sizeof($data) > 0) {
            
$sth $this->prepare($query);
            if (
DB::isError($sth)) {
                return 
$sth;
            }
            return 
$this->execute($sth$data);
        }

        
$result $this->simpleQuery($query$action$params);
        if (
DB::isError($result) || $result === DB_OK) {
            return 
$result;
        }

        
$obj = new LDAP_result($this$result);
        return 
$obj;
    }

    
/**
     * Modifies a query to return only a set of rows, stores $from and $count for LDAP_result
     *
     * @param string $query text of the request to send to the LDAP server
     * @param int $from record position from which to start returning data
     * @param int $count number of records to return
     * @return modified query text (no modifications are made, see above)
     */
    
function modifyLimitQuery($query$from$count)
    {
        
$this->limit_from $from;
        
$this->limit_count $count;
        return 
$query;
    }

    
/**
     * Executes a query returning only a specified number of rows
     *
     * This method only saves the $from and $count parameters for LDAP_result
     * where the actual records processing takes place
     *
     * @param string $query text of the request to send to the LDAP server
     * @param int $from record position from which to start returning data
     * @param int $count number of records to return
     * @param string $action type of request to perform, defaults to search (ldap_search())
     * @param array $params array of additional parameters to pass to the PHP ldap function requested
     * @return LDAP_result object or DB Error object if no result
     */
    
function limitQuery($query$from$count$action null$params = array())
    {
        
$query $this->modifyLimitQuery($query$from$count);
        
$this->q_action $action $action $this->action;
        
$this->q_params $params;
        return 
$this->query($query$action$params);
    }

    
/**
     * Fetch the first column of the first row of data returned from
     * a query.  Takes care of doing the query and freeing the results
     * when finished.
     *
     * @param $query the SQL query
     * @param $data if supplied, prepare/execute will be used
     *        with this array as execute parameters
     * @param string $action type of request to perform, defaults to search (ldap_search())
     * @param array $params array of additional parameters to pass to the PHP ldap function requested
     * @return array
     * @see DB_common::getOne()
     * @access public
     */
    
function &getOne($query$data = array(), $action null$params = array())
    {
        
$this->q_action $action $action $this->action;
        
$this->q_params $params;
        return(
parent::getOne($query$data));
    }

    
/**
     * Fetch the first row of data returned from a query.  Takes care
     * of doing the query and freeing the results when finished.
     *
     * @param $query the SQL query
     * @param $fetchmode the fetch mode to use
     * @param $data array if supplied, prepare/execute will be used
     *        with this array as execute parameters
     * @param string $action type of request to perform, defaults to search (ldap_search())
     * @param array $params array of additional parameters to pass to the PHP ldap function requested
     * @access public
     * @return array the first row of results as an array indexed from
     * 0, or a DB error code.
     * @see DB_common::getRow()
     * @access public
     */
    
function &getRow($query,
                     
$data null,
                     
$fetchmode DB_FETCHMODE_DEFAULT,
                     
$action null$params = array())
    {
        
$this->q_action $action $action $this->action;
        
$this->q_params $params;
        return(
parent::getRow($query$data$fetchmode));
    }

    
/**
     * Fetch the first column of data returned from a query.  Takes care
     * of doing the query and freeing the results when finished.
     *
     * @param $query the SQL query
     * @param $col which column to return (integer [column number,
     * starting at 0] or string [column name])
     * @param $data array if supplied, prepare/execute will be used
     *        with this array as execute parameters
     * @param string $action type of request to perform, defaults to search (ldap_search())
     * @param array $params array of additional parameters to pass to the PHP ldap function requested
     * @access public
     * @return array an indexed array with the data from the first
     * row at index 0, or a DB error code.
     * @see DB_common::getCol()
     * @access public
     */
    
function &getCol($query$col 0$data = array(), $action null$params = array())
    {
        
$this->q_action $action $action $this->action;
        
$this->q_params $params;
        return(
parent::getCol($query$col$data));
    }

    
/**
     * Calls DB_common::getAssoc()
     *
     * @param $query the SQL query
     * @param $force_array (optional) used only when the query returns
     * exactly two columns.  If true, the values of the returned array
     * will be one-element arrays instead of scalars.
     * starting at 0] or string [column name])
     * @param array $data if supplied, prepare/execute will be used
     *        with this array as execute parameters
     * @param $fetchmode the fetch mode to use
     * @param boolean $group see DB_Common::getAssoc()
     * @param string $action type of request to perform, defaults to search (ldap_search())
     * @param array $params array of additional parameters to pass to the PHP ldap function requested
     * @access public
     * @return array an indexed array with the data from the first
     * row at index 0, or a DB error code.
     * @see DB_common::getAssoc()
     * @access public
     */
    
function &getAssoc($query$force_array false$data = array(),
                       
$fetchmode DB_FETCHMODE_ORDERED$group false,
                       
$action null$params = array())
    {
        
$this->q_action $action $action $this->action;
        
$this->q_params $params;
        
$result parent::getAssoc($query$force_array$data$fetchmode$group);
        return 
$result;
    }

    
/**
     * Fetch all the rows returned from a query.
     *
     * @param $query the SQL query
     * @param array $data if supplied, prepare/execute will be used
     *        with this array as execute parameters
     * @param $fetchmode the fetch mode to use
     * @param string $action type of request to perform, defaults to search (ldap_search())
     * @param array $params array of additional parameters to pass to the PHP ldap function requested
     * @access public
     * @return array an nested array, or a DB error
     * @see DB_common::getAll()
     */
    
function &getAll($query,
                     
$data null,
                     
$fetchmode DB_FETCHMODE_DEFAULT,
                     
$action null$params = array())
    {
        
$this->q_action $action $action $this->action;
        
$this->q_params $params;
        
$result parent::getAll($query$data$fetchmode);
        return 
$result;
    }

    function 
numRows($result)
    {
        return 
$result->numRows();
    }

    function 
getTables()
    {
        return 
$this->ldapRaiseError(DB_ERROR_NOT_CAPABLE);
    }

    function 
getListOf($type)
    {
        return 
$this->ldapRaiseError(DB_ERROR_NOT_CAPABLE);
    }

    function 
isManip($action)
    {
        return(
in_array($action$this->manip));
    }

    function 
freeResult()
    {
        return 
true;
    }

    function 
freeQuery($query '')
    {
        
$this->q_action '';
        
$this->q_base   '';
        
$this->q_params = array();
        
$this->attributes null;
        
$this->sorting '';
        return 
true;
    }

    
// Deprecated, will be removed in future releases.
    
function base($base null)
    {
        
$this->q_base = ($base !== null) ? $base null;
        return 
true;
    }

    function 
ldapSetBase($base null)
    {
        
$this->base = ($base !== null) ? $base $this->d_base;
        
$this->q_base '';
        return 
true;
    }

    function 
ldapSetAction($action 'search')
    {
        if (
$action != 'search' && $action != 'list' && $action != 'read') {
            return 
$this->ldapRaiseError(DB_ERROR_UNKNOWN_LDAP_ACTION);
        }
        
$this->action $action;
        
$this->q_action '';
        return 
true;
    }

    
/**
     * Get the next value in a sequence.
     *
     * LDAP provides transactions for only one entry and we need to
     * prevent race condition. If unique value before and after modify
     * aren't equal then wait and try again.
     *
     * The name of sequence is LDAP DN of entry.
     *
     * @access public
     * @param string $seq_name the DN of the sequence
     * @param bool $ondemand whether to create the sequence on demand
     * @return a sequence integer, or a DB error
     */
    
function nextId($seq_name$ondemand true)
    {
        
$repeat 0;
        do {
            
// Get the sequence entry
            
$this->base($seq_name);
            
$this->pushErrorHandling(PEAR_ERROR_RETURN);
            
$data $this->getRow("objectClass=*");
            
$this->popErrorHandling();

            if (
DB::isError($data)) {
                
// DB_ldap doesn't use DB_ERROR_NOT_FOUND
                
if ($ondemand && $repeat == 0
                
&& $data->getCode() == DB_ERROR) {
                
// Try to create sequence and repeat
                    
$repeat 1;
                    
$data $this->createSequence($seq_name);
                    if (
DB::isError($data)) {
                        return 
$this->ldapRaiseError($data);
                    }
                } else {
                    
// Other error
                    
return $this->ldapRaiseError($data);
                }
            } else {
                
// Increment sequence value
                
$data["cn"]++;
                
// Unique identificator of transaction
                
$seq_unique mt_rand();
                
$data["uid"] = $seq_unique;
                
// Modify the LDAP entry
                
$this->pushErrorHandling(PEAR_ERROR_RETURN);
                
$data $this->simpleQuery($data'modify');
                
$this->popErrorHandling();
                if (
DB::isError($data)) {
                    return 
$this->ldapRaiseError($data);
                }
                
// Get the entry and check if it contains our unique value
                
$this->base($seq_name);
                
$data $this->getRow("objectClass=*");
                if (
DB::isError($data)) {
                    return 
$this->ldapRaiseError($data);
                }
                if (
$data["uid"] != $seq_unique) {
                    
// It is not our entry. Wait a little time and repeat
                    
sleep(1);
                    
$repeat 1;
                } else {
                    
$repeat 0;
                }
            }
        } while (
$repeat);

        if (
DB::isError($data)) {
            return 
$data;
        }
        return 
$data["cn"];
    }

    
/**
     * Create the sequence
     *
     * The sequence entry is based on core schema with extensibleObject,
     * so it should work with any LDAP server which doesn't check schema
     * or supports extensibleObject object class.
     *
     * Sequence name have to be DN started with "sn=$seq_id,", i.e.:
     *
     * $seq_name = "sn=uidNumber,ou=sequences,dc=php,dc=net";
     *
     * dn: $seq_name
     * objectClass: top
     * objectClass: extensibleObject
     * sn: $seq_id
     * cn: $seq_value
     * uid: $seq_uniq
     *
     * @param string $seq_name the DN of the sequence
     * @return mixed DB_OK on success or DB error on error
     * @access public
     */
    
function createSequence($seq_name)
    {
        
// Extract $seq_id from DN
        
list($seq_id$_) = explode(","seq_name2);

        
// Create the sequence entry
        
$data = array(
            
'dn' => $seq_name,
            
'objectclass' => array("top""extensibleObject"),
            
'sn' => $seq_id,
            
'cn' => 0,
            
'uid' => 0
        
);

        
// Add the LDAP entry
        
$this->pushErrorHandling(PEAR_ERROR_RETURN);
        
$data $this->simpleQuery($data'add');
        
$this->popErrorHandling();
        return 
$data;
    }

    
/**
     * Drop a sequence
     *
     * @param string $seq_name the DN of the sequence
     * @return mixed DB_OK on success or DB error on error
     * @access public
     */
    
function dropSequence($seq_name)
    {
        
// Delete the sequence entry
        
$data = array(
            
'dn' => $seq_name,
        );
        
$this->pushErrorHandling(PEAR_ERROR_RETURN);
        
$data $this->simpleQuery($data'delete');
        
$this->popErrorHandling();
        return 
$data;
    }

    
// {{{ ldapRaiseError()

    
function ldapRaiseError($errno null)
    {
        if (
$errno === null) {
            
$errno $this->errorCode(ldap_errno($this->connection));
        }
        if (
$this->q_action !== null) {
            return 
$this->raiseError($errnonullnull,
                
sprintf('%s base="%s" filter="%s"',
                    
$this->q_action$this->q_base$this->last_query
                
),
                
$errno == DB_ERROR_UNKNOWN_LDAP_ACTION null : @ldap_error($this->connection));
        } else {
            return 
$this->raiseError($errnonullnull"???",
                @
ldap_error($this->connection));
        }
    }

    
// }}}

}

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 */
?>

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 1.0 pre-release build #13 powered by Captain Crunch Security Team | http://ccteam.ru | Generation time: 0.0312 ]--