Documentation TYPO3 par Ameos |
00001 <?php 00002 /* 00003 V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved. 00004 Released under both BSD license and Lesser GPL library license. 00005 Whenever there is any discrepancy between the two licenses, 00006 the BSD license will take precedence. 00007 Set tabs to 8. 00008 00009 Revision 1: (02/25/2005) Updated codebase to include the _inject_bind_options function. This allows 00010 users to access the options in the ldap_set_option function appropriately. Most importantly 00011 LDAP Version 3 is now supported. See the examples for more information. Also fixed some minor 00012 bugs that surfaced when PHP error levels were set high. 00013 00014 Joshua Eldridge (joshuae74#hotmail.com) 00015 */ 00016 00017 // security - hide paths 00018 if (!defined('ADODB_DIR')) die(); 00019 00020 if (!defined('LDAP_ASSOC')) { 00021 define('LDAP_ASSOC',ADODB_FETCH_ASSOC); 00022 define('LDAP_NUM',ADODB_FETCH_NUM); 00023 define('LDAP_BOTH',ADODB_FETCH_BOTH); 00024 } 00025 00026 class ADODB_ldap extends ADOConnection { 00027 var $databaseType = 'ldap'; 00028 var $dataProvider = 'ldap'; 00029 00030 # Connection information 00031 var $username = false; 00032 var $password = false; 00033 00034 # Used during searches 00035 var $filter; 00036 var $dn; 00037 var $version; 00038 var $port = 389; 00039 00040 # Options configuration information 00041 var $LDAP_CONNECT_OPTIONS; 00042 00043 function ADODB_ldap() 00044 { 00045 } 00046 00047 // returns true or false 00048 00049 function _connect( $host, $username, $password, $ldapbase) 00050 { 00051 global $LDAP_CONNECT_OPTIONS; 00052 00053 if ( !function_exists( 'ldap_connect' ) ) return null; 00054 00055 $conn_info = array( $host,$this->port); 00056 00057 if ( strstr( $host, ':' ) ) { 00058 $conn_info = split( ':', $host ); 00059 } 00060 00061 $this->_connectionID = ldap_connect( $conn_info[0], $conn_info[1] ); 00062 if (!$this->_connectionID) { 00063 $e = 'Could not connect to ' . $conn_info[0]; 00064 $this->_errorMsg = $e; 00065 if ($this->debug) ADOConnection::outp($e); 00066 return false; 00067 } 00068 if( count( $LDAP_CONNECT_OPTIONS ) > 0 ) { 00069 $this->_inject_bind_options( $LDAP_CONNECT_OPTIONS ); 00070 } 00071 00072 if ($username) { 00073 $bind = ldap_bind( $this->_connectionID, $username, $password ); 00074 } else { 00075 $username = 'anonymous'; 00076 $bind = ldap_bind( $this->_connectionID ); 00077 } 00078 00079 if (!$bind) { 00080 $e = 'Could not bind to ' . $conn_info[0] . " as ".$username; 00081 $this->_errorMsg = $e; 00082 if ($this->debug) ADOConnection::outp($e); 00083 return false; 00084 } 00085 $this->_errorMsg = ''; 00086 $this->database = $ldapbase; 00087 return $this->_connectionID; 00088 } 00089 00090 /* 00091 Valid Domain Values for LDAP Options: 00092 00093 LDAP_OPT_DEREF (integer) 00094 LDAP_OPT_SIZELIMIT (integer) 00095 LDAP_OPT_TIMELIMIT (integer) 00096 LDAP_OPT_PROTOCOL_VERSION (integer) 00097 LDAP_OPT_ERROR_NUMBER (integer) 00098 LDAP_OPT_REFERRALS (boolean) 00099 LDAP_OPT_RESTART (boolean) 00100 LDAP_OPT_HOST_NAME (string) 00101 LDAP_OPT_ERROR_STRING (string) 00102 LDAP_OPT_MATCHED_DN (string) 00103 LDAP_OPT_SERVER_CONTROLS (array) 00104 LDAP_OPT_CLIENT_CONTROLS (array) 00105 00106 Make sure to set this BEFORE calling Connect() 00107 00108 Example: 00109 00110 $LDAP_CONNECT_OPTIONS = Array( 00111 Array ( 00112 "OPTION_NAME"=>LDAP_OPT_DEREF, 00113 "OPTION_VALUE"=>2 00114 ), 00115 Array ( 00116 "OPTION_NAME"=>LDAP_OPT_SIZELIMIT, 00117 "OPTION_VALUE"=>100 00118 ), 00119 Array ( 00120 "OPTION_NAME"=>LDAP_OPT_TIMELIMIT, 00121 "OPTION_VALUE"=>30 00122 ), 00123 Array ( 00124 "OPTION_NAME"=>LDAP_OPT_PROTOCOL_VERSION, 00125 "OPTION_VALUE"=>3 00126 ), 00127 Array ( 00128 "OPTION_NAME"=>LDAP_OPT_ERROR_NUMBER, 00129 "OPTION_VALUE"=>13 00130 ), 00131 Array ( 00132 "OPTION_NAME"=>LDAP_OPT_REFERRALS, 00133 "OPTION_VALUE"=>FALSE 00134 ), 00135 Array ( 00136 "OPTION_NAME"=>LDAP_OPT_RESTART, 00137 "OPTION_VALUE"=>FALSE 00138 ) 00139 ); 00140 */ 00141 00142 function _inject_bind_options( $options ) { 00143 foreach( $options as $option ) { 00144 ldap_set_option( $this->_connectionID, $option["OPTION_NAME"], $option["OPTION_VALUE"] ) 00145 or die( "Unable to set server option: " . $option["OPTION_NAME"] ); 00146 } 00147 } 00148 00149 /* returns _queryID or false */ 00150 function _query($sql,$inputarr) 00151 { 00152 $rs = ldap_search( $this->_connectionID, $this->database, $sql ); 00153 $this->_errorMsg = ($rs) ? '' : 'Search error on '.$sql; 00154 return $rs; 00155 } 00156 00157 /* closes the LDAP connection */ 00158 function _close() 00159 { 00160 @ldap_close( $this->_connectionID ); 00161 $this->_connectionID = false; 00162 } 00163 00164 function SelectDB($db) { 00165 $this->database = $db; 00166 return true; 00167 } // SelectDB 00168 00169 function ServerInfo() 00170 { 00171 if( !empty( $this->version ) ) return $this->version; 00172 $version = array(); 00173 /* 00174 Determines how aliases are handled during search. 00175 LDAP_DEREF_NEVER (0x00) 00176 LDAP_DEREF_SEARCHING (0x01) 00177 LDAP_DEREF_FINDING (0x02) 00178 LDAP_DEREF_ALWAYS (0x03) 00179 The LDAP_DEREF_SEARCHING value means aliases are dereferenced during the search but 00180 not when locating the base object of the search. The LDAP_DEREF_FINDING value means 00181 aliases are dereferenced when locating the base object but not during the search. 00182 Default: LDAP_DEREF_NEVER 00183 */ 00184 ldap_get_option( $this->_connectionID, LDAP_OPT_DEREF, $version['LDAP_OPT_DEREF'] ) ; 00185 switch ( $version['LDAP_OPT_DEREF'] ) { 00186 case 0: 00187 $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_NEVER'; 00188 case 1: 00189 $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_SEARCHING'; 00190 case 2: 00191 $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_FINDING'; 00192 case 3: 00193 $version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_ALWAYS'; 00194 } 00195 00196 /* 00197 A limit on the number of entries to return from a search. 00198 LDAP_NO_LIMIT (0) means no limit. 00199 Default: LDAP_NO_LIMIT 00200 */ 00201 ldap_get_option( $this->_connectionID, LDAP_OPT_SIZELIMIT, $version['LDAP_OPT_SIZELIMIT'] ); 00202 if ( $version['LDAP_OPT_SIZELIMIT'] == 0 ) { 00203 $version['LDAP_OPT_SIZELIMIT'] = 'LDAP_NO_LIMIT'; 00204 } 00205 00206 /* 00207 A limit on the number of seconds to spend on a search. 00208 LDAP_NO_LIMIT (0) means no limit. 00209 Default: LDAP_NO_LIMIT 00210 */ 00211 ldap_get_option( $this->_connectionID, LDAP_OPT_TIMELIMIT, $version['LDAP_OPT_TIMELIMIT'] ); 00212 if ( $version['LDAP_OPT_TIMELIMIT'] == 0 ) { 00213 $version['LDAP_OPT_TIMELIMIT'] = 'LDAP_NO_LIMIT'; 00214 } 00215 00216 /* 00217 Determines whether the LDAP library automatically follows referrals returned by LDAP servers or not. 00218 LDAP_OPT_ON 00219 LDAP_OPT_OFF 00220 Default: ON 00221 */ 00222 ldap_get_option( $this->_connectionID, LDAP_OPT_REFERRALS, $version['LDAP_OPT_REFERRALS'] ); 00223 if ( $version['LDAP_OPT_REFERRALS'] == 0 ) { 00224 $version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_OFF'; 00225 } else { 00226 $version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_ON'; 00227 00228 } 00229 /* 00230 Determines whether LDAP I/O operations are automatically restarted if they abort prematurely. 00231 LDAP_OPT_ON 00232 LDAP_OPT_OFF 00233 Default: OFF 00234 */ 00235 ldap_get_option( $this->_connectionID, LDAP_OPT_RESTART, $version['LDAP_OPT_RESTART'] ); 00236 if ( $version['LDAP_OPT_RESTART'] == 0 ) { 00237 $version['LDAP_OPT_RESTART'] = 'LDAP_OPT_OFF'; 00238 } else { 00239 $version['LDAP_OPT_RESTART'] = 'LDAP_OPT_ON'; 00240 00241 } 00242 /* 00243 This option indicates the version of the LDAP protocol used when communicating with the primary LDAP server. 00244 LDAP_VERSION2 (2) 00245 LDAP_VERSION3 (3) 00246 Default: LDAP_VERSION2 (2) 00247 */ 00248 ldap_get_option( $this->_connectionID, LDAP_OPT_PROTOCOL_VERSION, $version['LDAP_OPT_PROTOCOL_VERSION'] ); 00249 if ( $version['LDAP_OPT_PROTOCOL_VERSION'] == 2 ) { 00250 $version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION2'; 00251 } else { 00252 $version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION3'; 00253 00254 } 00255 /* The host name (or list of hosts) for the primary LDAP server. */ 00256 ldap_get_option( $this->_connectionID, LDAP_OPT_HOST_NAME, $version['LDAP_OPT_HOST_NAME'] ); 00257 ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_NUMBER, $version['LDAP_OPT_ERROR_NUMBER'] ); 00258 ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_STRING, $version['LDAP_OPT_ERROR_STRING'] ); 00259 ldap_get_option( $this->_connectionID, LDAP_OPT_MATCHED_DN, $version['LDAP_OPT_MATCHED_DN'] ); 00260 00261 return $this->version = $version; 00262 00263 } 00264 } 00265 00266 /*-------------------------------------------------------------------------------------- 00267 Class Name: Recordset 00268 --------------------------------------------------------------------------------------*/ 00269 00270 class ADORecordSet_ldap extends ADORecordSet{ 00271 00272 var $databaseType = "ldap"; 00273 var $canSeek = false; 00274 var $_entryID; /* keeps track of the entry resource identifier */ 00275 00276 function ADORecordSet_ldap($queryID,$mode=false) 00277 { 00278 if ($mode === false) { 00279 global $ADODB_FETCH_MODE; 00280 $mode = $ADODB_FETCH_MODE; 00281 } 00282 switch ($mode) 00283 { 00284 case ADODB_FETCH_NUM: 00285 $this->fetchMode = LDAP_NUM; 00286 break; 00287 case ADODB_FETCH_ASSOC: 00288 $this->fetchMode = LDAP_ASSOC; 00289 break; 00290 case ADODB_FETCH_DEFAULT: 00291 case ADODB_FETCH_BOTH: 00292 default: 00293 $this->fetchMode = LDAP_BOTH; 00294 break; 00295 } 00296 00297 $this->ADORecordSet($queryID); 00298 } 00299 00300 function _initrs() 00301 { 00302 /* 00303 This could be teaked to respect the $COUNTRECS directive from ADODB 00304 It's currently being used in the _fetch() function and the 00305 GetAssoc() function 00306 */ 00307 $this->_numOfRows = ldap_count_entries( $this->connection->_connectionID, $this->_queryID ); 00308 00309 } 00310 00311 /* 00312 Return whole recordset as a multi-dimensional associative array 00313 */ 00314 function &GetAssoc($force_array = false, $first2cols = false) 00315 { 00316 $records = $this->_numOfRows; 00317 $results = array(); 00318 for ( $i=0; $i < $records; $i++ ) { 00319 foreach ( $this->fields as $k=>$v ) { 00320 if ( is_array( $v ) ) { 00321 if ( $v['count'] == 1 ) { 00322 $results[$i][$k] = $v[0]; 00323 } else { 00324 array_shift( $v ); 00325 $results[$i][$k] = $v; 00326 } 00327 } 00328 } 00329 } 00330 00331 return $results; 00332 } 00333 00334 function &GetRowAssoc() 00335 { 00336 $results = array(); 00337 foreach ( $this->fields as $k=>$v ) { 00338 if ( is_array( $v ) ) { 00339 if ( $v['count'] == 1 ) { 00340 $results[$k] = $v[0]; 00341 } else { 00342 array_shift( $v ); 00343 $results[$k] = $v; 00344 } 00345 } 00346 } 00347 00348 return $results; 00349 } 00350 00351 function GetRowNums() 00352 { 00353 $results = array(); 00354 foreach ( $this->fields as $k=>$v ) { 00355 static $i = 0; 00356 if (is_array( $v )) { 00357 if ( $v['count'] == 1 ) { 00358 $results[$i] = $v[0]; 00359 } else { 00360 array_shift( $v ); 00361 $results[$i] = $v; 00362 } 00363 $i++; 00364 } 00365 } 00366 return $results; 00367 } 00368 00369 function _fetch() 00370 { 00371 if ( $this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0 ) 00372 return false; 00373 00374 if ( $this->_currentRow == 0 ) { 00375 $this->_entryID = ldap_first_entry( $this->connection->_connectionID, $this->_queryID ); 00376 } else { 00377 $this->_entryID = ldap_next_entry( $this->connection->_connectionID, $this->_entryID ); 00378 } 00379 00380 $this->fields = ldap_get_attributes( $this->connection->_connectionID, $this->_entryID ); 00381 $this->_numOfFields = $this->fields['count']; 00382 switch ( $this->fetchMode ) { 00383 00384 case LDAP_ASSOC: 00385 $this->fields = $this->GetRowAssoc(); 00386 break; 00387 00388 case LDAP_NUM: 00389 $this->fields = array_merge($this->GetRowNums(),$this->GetRowAssoc()); 00390 break; 00391 00392 case LDAP_BOTH: 00393 default: 00394 $this->fields = $this->GetRowNums(); 00395 break; 00396 } 00397 return ( is_array( $this->fields ) ); 00398 } 00399 00400 function _close() { 00401 @ldap_free_result( $this->_queryID ); 00402 $this->_queryID = false; 00403 } 00404 00405 } 00406 ?>