1999-04-22 08:45:14 +08:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
1999-07-16 21:13:16 +08:00
| PHP version 4.0 |
1999-04-22 08:45:14 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2000-01-01 09:32:05 +08:00
| Copyright ( c ) 1997 , 1998 , 1999 , 2000 The PHP Group |
1999-04-22 08:45:14 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2000-05-18 23:34:45 +08:00
| This source file is subject to version 2.02 of the PHP license , |
1999-07-16 21:13:16 +08:00
| that is bundled with this package in the file LICENSE , and is |
| available at through the world - wide - web at |
2000-05-18 23:34:45 +08:00
| http : //www.php.net/license/2_02.txt. |
1999-07-16 21:13:16 +08:00
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world - wide - web , please send a note to |
| license @ php . net so we can mail you a copy immediately . |
1999-04-22 08:45:14 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Authors : Amitay Isaacs < amitay @ w - o - i . com > |
| Eric Warnke < ericw @ albany . edu > |
| Rasmus Lerdorf < rasmus @ lerdorf . on . ca > |
1999-05-21 18:06:25 +08:00
| Gerrit Thomson < 334647 @ swin . edu . au > |
2000-07-25 23:34:28 +08:00
| Jani Taskinen < sniper @ iki . fi > |
2000-04-02 00:23:39 +08:00
| PHP 4.0 updates : Zeev Suraski < zeev @ zend . com > |
1999-04-22 08:45:14 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
/* $Id$ */
# define IS_EXT_MODULE
# include "php.h"
2000-04-02 00:23:39 +08:00
# include "php_ini.h"
1999-04-22 08:45:14 +08:00
1999-04-23 11:28:47 +08:00
# include "ext/standard/dl.h"
1999-12-05 03:19:57 +08:00
# include "php_ldap.h"
1999-04-22 08:45:14 +08:00
2000-02-16 17:33:19 +08:00
# ifdef PHP_WIN32
1999-04-22 08:45:14 +08:00
# include <string.h>
# if HAVE_NSLDAP
# include <winsock.h>
# endif
# define strdup _strdup
# undef WINDOWS
# undef strcasecmp
# undef strncasecmp
# define WINSOCK 1
# define __STDC__ 1
# endif
1999-12-05 03:19:57 +08:00
# include "ext/standard/php_string.h"
2000-04-07 00:57:33 +08:00
# include "ext/standard/info.h"
1999-04-22 08:45:14 +08:00
2000-04-02 00:23:39 +08:00
ZEND_DECLARE_MODULE_GLOBALS ( ldap )
1999-04-22 08:45:14 +08:00
2000-08-05 01:18:54 +08:00
static unsigned char third_argument_force_ref [ ] = { 3 , BYREF_NONE , BYREF_NONE , BYREF_FORCE } ;
2000-04-02 00:23:39 +08:00
static int le_result , le_result_entry , le_ber_entry ;
static int le_link ;
1999-04-22 08:45:14 +08:00
/*
This is just a small subset of the functionality provided by the LDAP library . All the
operations are synchronous . Referrals are not handled automatically .
*/
function_entry ldap_functions [ ] = {
1999-08-02 23:02:52 +08:00
PHP_FE ( ldap_connect , NULL )
1999-08-20 21:03:22 +08:00
PHP_FALIAS ( ldap_close , ldap_unbind , NULL )
1999-08-02 23:02:52 +08:00
PHP_FE ( ldap_bind , NULL )
PHP_FE ( ldap_unbind , NULL )
PHP_FE ( ldap_read , NULL )
PHP_FE ( ldap_list , NULL )
PHP_FE ( ldap_search , NULL )
PHP_FE ( ldap_free_result , NULL )
PHP_FE ( ldap_count_entries , NULL )
PHP_FE ( ldap_first_entry , NULL )
PHP_FE ( ldap_next_entry , NULL )
PHP_FE ( ldap_get_entries , NULL )
2000-08-05 01:18:54 +08:00
PHP_FE ( ldap_first_attribute , third_argument_force_ref )
PHP_FE ( ldap_next_attribute , third_argument_force_ref )
1999-08-02 23:02:52 +08:00
PHP_FE ( ldap_get_attributes , NULL )
PHP_FE ( ldap_get_values , NULL )
2000-04-08 07:20:22 +08:00
PHP_FE ( ldap_get_values_len , NULL )
1999-08-02 23:02:52 +08:00
PHP_FE ( ldap_get_dn , NULL )
PHP_FE ( ldap_explode_dn , NULL )
PHP_FE ( ldap_dn2ufn , NULL )
PHP_FE ( ldap_add , NULL )
PHP_FE ( ldap_delete , NULL )
PHP_FE ( ldap_modify , NULL )
1999-05-21 18:06:25 +08:00
/* additional functions for attribute based modifications, Gerrit Thomson */
1999-08-02 23:02:52 +08:00
PHP_FE ( ldap_mod_add , NULL )
PHP_FE ( ldap_mod_replace , NULL )
PHP_FE ( ldap_mod_del , NULL )
1999-05-21 18:06:25 +08:00
/* end gjt mod */
2000-07-24 05:32:02 +08:00
PHP_FE ( ldap_errno , NULL )
2000-04-06 20:36:47 +08:00
PHP_FE ( ldap_err2str , NULL )
2000-07-24 05:32:02 +08:00
PHP_FE ( ldap_error , NULL )
2000-07-26 19:01:44 +08:00
PHP_FE ( ldap_compare , NULL )
2000-08-02 21:11:46 +08:00
# ifdef STR_TRANSLATION
PHP_FE ( ldap_t61_to_8859 , NULL )
PHP_FE ( ldap_8859_to_t61 , NULL )
# endif
1999-04-22 08:45:14 +08:00
{ NULL , NULL , NULL }
} ;
1999-12-18 04:55:31 +08:00
zend_module_entry ldap_module_entry = {
2000-03-07 02:44:01 +08:00
" ldap " , ldap_functions , PHP_MINIT ( ldap ) , PHP_MSHUTDOWN ( ldap ) , NULL , NULL ,
1999-08-02 23:02:52 +08:00
PHP_MINFO ( ldap ) , STANDARD_MODULE_PROPERTIES
1999-04-22 08:45:14 +08:00
} ;
2000-05-23 17:33:51 +08:00
# ifdef COMPILE_DL_LDAP
2000-05-02 08:30:36 +08:00
ZEND_GET_MODULE ( ldap )
1999-04-22 08:45:14 +08:00
# endif
2000-04-02 00:23:39 +08:00
static void _close_ldap_link ( LDAP * ld )
1999-04-22 08:45:14 +08:00
{
2000-04-02 00:23:39 +08:00
LDAPLS_FETCH ( ) ;
1999-04-22 08:45:14 +08:00
2000-04-02 00:23:39 +08:00
ldap_unbind_s ( ld ) ;
/* php_printf("Freeing ldap connection");*/
LDAPG ( num_links ) - - ;
1999-04-22 08:45:14 +08:00
}
2000-04-02 00:23:39 +08:00
static void _free_ldap_result ( LDAPMessage * result )
1999-04-22 08:45:14 +08:00
{
2000-04-02 00:23:39 +08:00
ldap_msgfree ( result ) ;
1999-04-22 08:45:14 +08:00
}
2000-04-02 00:23:39 +08:00
PHP_INI_BEGIN ( )
STD_PHP_INI_ENTRY_EX ( " ldap.max_links " , " -1 " , PHP_INI_SYSTEM , OnUpdateInt , max_links , zend_ldap_globals , ldap_globals , display_link_numbers )
2000-04-19 21:18:01 +08:00
STD_PHP_INI_ENTRY ( " ldap.base_dn " , NULL , PHP_INI_ALL , OnUpdateString , base_dn , zend_ldap_globals , ldap_globals )
2000-04-02 00:23:39 +08:00
PHP_INI_END ( )
1999-04-22 08:45:14 +08:00
2000-04-02 00:23:39 +08:00
static void php_ldap_init_globals ( zend_ldap_globals * ldap_globals )
1999-04-22 08:45:14 +08:00
{
2000-04-02 00:23:39 +08:00
ldap_globals - > num_links = 0 ;
1999-04-22 08:45:14 +08:00
}
2000-04-02 00:23:39 +08:00
1999-08-02 23:02:52 +08:00
PHP_MINIT_FUNCTION ( ldap )
1999-04-22 08:45:14 +08:00
{
2000-04-02 00:23:39 +08:00
ZEND_INIT_MODULE_GLOBALS ( ldap , php_ldap_init_globals , NULL ) ;
1999-04-22 08:45:14 +08:00
2000-04-02 00:23:39 +08:00
REGISTER_INI_ENTRIES ( ) ;
1999-04-22 08:45:14 +08:00
2000-07-24 05:32:02 +08:00
/* Constants to be used with deref-parameter in php_ldap_do_search() */
2000-07-22 08:34:22 +08:00
REGISTER_MAIN_LONG_CONSTANT ( " LDAP_DEREF_NEVER " , LDAP_DEREF_NEVER , CONST_PERSISTENT | CONST_CS ) ;
REGISTER_MAIN_LONG_CONSTANT ( " LDAP_DEREF_SEARCHING " , LDAP_DEREF_SEARCHING , CONST_PERSISTENT | CONST_CS ) ;
REGISTER_MAIN_LONG_CONSTANT ( " LDAP_DEREF_FINDING " , LDAP_DEREF_FINDING , CONST_PERSISTENT | CONST_CS ) ;
REGISTER_MAIN_LONG_CONSTANT ( " LDAP_DEREF_ALWAYS " , LDAP_DEREF_ALWAYS , CONST_PERSISTENT | CONST_CS ) ;
2000-08-21 02:47:14 +08:00
# ifdef ORALDAP
REGISTER_MAIN_LONG_CONSTANT ( " GSLC_SSL_NO_AUTH " , GSLC_SSL_NO_AUTH , CONST_PERSISTENT | CONST_CS ) ;
REGISTER_MAIN_LONG_CONSTANT ( " GSLC_SSL_ONEWAY_AUTH " , GSLC_SSL_ONEWAY_AUTH , CONST_PERSISTENT | CONST_CS ) ;
REGISTER_MAIN_LONG_CONSTANT ( " GSLC_SSL_TWOWAY_AUTH " , GSLC_SSL_TWOWAY_AUTH , CONST_PERSISTENT | CONST_CS ) ;
# endif
2000-07-22 08:34:22 +08:00
2000-04-02 00:23:39 +08:00
le_result = register_list_destructors ( _free_ldap_result , NULL ) ;
le_link = register_list_destructors ( _close_ldap_link , NULL ) ;
1999-04-22 08:45:14 +08:00
ldap_module_entry . type = type ;
return SUCCESS ;
}
2000-04-02 00:23:39 +08:00
1999-08-02 23:02:52 +08:00
PHP_MSHUTDOWN_FUNCTION ( ldap )
{
1999-04-22 08:45:14 +08:00
return SUCCESS ;
}
2000-04-02 00:23:39 +08:00
1999-08-02 23:02:52 +08:00
PHP_MINFO_FUNCTION ( ldap )
1999-04-22 08:45:14 +08:00
{
2000-04-19 21:18:01 +08:00
char maxl [ 32 ] ;
2000-08-07 11:18:00 +08:00
# ifdef LDAP_API_VERSION
char ldapapiversion [ 32 ] ;
# endif
1999-04-22 08:45:14 +08:00
# if HAVE_NSLDAP
2000-06-05 23:17:25 +08:00
char tmp [ 32 ] ;
1999-04-22 08:45:14 +08:00
LDAPVersion ver ;
double SDKVersion ;
# endif
2000-04-04 06:00:18 +08:00
2000-04-02 00:23:39 +08:00
LDAPLS_FETCH ( ) ;
1999-04-22 08:45:14 +08:00
2000-04-04 06:00:18 +08:00
# if HAVE_NSLDAP
/* Print version information */
SDKVersion = ldap_version ( & ver ) ;
# endif
2000-04-02 00:23:39 +08:00
if ( LDAPG ( max_links ) = = - 1 ) {
2000-05-24 16:58:40 +08:00
snprintf ( maxl , 31 , " %ld/unlimited " , LDAPG ( num_links ) ) ;
1999-04-22 08:45:14 +08:00
} else {
2000-05-24 16:58:40 +08:00
snprintf ( maxl , 31 , " %ld/%ld " , LDAPG ( num_links ) , LDAPG ( max_links ) ) ;
1999-04-22 08:45:14 +08:00
}
2000-04-07 05:17:50 +08:00
maxl [ 31 ] = 0 ;
php_info_print_table_start ( ) ;
php_info_print_table_row ( 2 , " LDAP Support " , " enabled " ) ;
php_info_print_table_row ( 2 , " RCS Version " , " $Id$ " ) ;
php_info_print_table_row ( 2 , " Total Links " , maxl ) ;
2000-08-07 11:18:00 +08:00
# ifdef LDAP_API_VERSION
snprintf ( ldapapiversion , 31 , " %ld " , LDAP_API_VERSION ) ;
php_info_print_table_row ( 2 , " API Version " , ldapapiversion ) ;
# endif
1999-04-22 08:45:14 +08:00
# if HAVE_NSLDAP
2000-04-07 05:17:50 +08:00
snprintf ( tmp , 31 , " %f " , SDKVersion / 100.0 ) ;
tmp [ 31 ] = 0 ;
php_info_print_table_row ( 2 , " SDK Version " , tmp ) ;
snprintf ( tmp , 31 , " %f " , ver . protocol_version / 100.0 ) ;
tmp [ 31 ] = 0 ;
php_info_print_table_row ( 2 , " Highest LDAP Protocol Supported " , tmp ) ;
snprintf ( tmp , 31 , " %f " , ver . SSL_version / 100.0 ) ;
tmp [ 31 ] = 0 ;
php_info_print_table_row ( 2 , " SSL Level Supported " , tmp ) ;
1999-04-22 08:45:14 +08:00
if ( ver . security_level ! = LDAP_SECURITY_NONE ) {
2000-04-07 05:17:50 +08:00
snprintf ( tmp , 31 , " %d " , ver . security_level ) ;
tmp [ 31 ] = 0 ;
1999-04-22 08:45:14 +08:00
} else {
2000-04-07 05:17:50 +08:00
strcpy ( tmp , " SSL not enabled " ) ;
1999-04-22 08:45:14 +08:00
}
2000-04-07 05:17:50 +08:00
php_info_print_table_row ( 2 , " Level of Encryption " , tmp ) ;
1999-04-22 08:45:14 +08:00
# endif
2000-04-07 05:17:50 +08:00
php_info_print_table_end ( ) ;
1999-04-22 08:45:14 +08:00
}
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto int ldap_connect([string host [, int port]])
Connect to an LDAP server */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_connect )
1999-04-22 08:45:14 +08:00
{
char * host ;
int port ;
2000-08-21 02:47:14 +08:00
# ifdef HAVE_ORALDAP
char * wallet , * walletpasswd ;
int authmode ;
int ssl = 0 ;
# endif
1999-04-22 08:45:14 +08:00
/* char *hashed_details;
int hashed_details_length ; */
LDAP * ldap ;
2000-04-02 00:23:39 +08:00
LDAPLS_FETCH ( ) ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
switch ( ZEND_NUM_ARGS ( ) ) {
1999-04-22 08:45:14 +08:00
case 0 :
host = NULL ;
port = 0 ;
/* hashed_details = estrndup("ldap_", 5);
hashed_details_length = 4 + 1 ; */
break ;
case 1 : {
1999-11-22 10:31:32 +08:00
pval * * yyhost ;
1999-04-22 08:45:14 +08:00
1999-12-19 06:40:35 +08:00
if ( zend_get_parameters_ex ( 1 , & yyhost ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
RETURN_FALSE ;
}
1999-11-22 10:31:32 +08:00
convert_to_string_ex ( yyhost ) ;
host = ( * yyhost ) - > value . str . val ;
1999-04-22 08:45:14 +08:00
port = 389 ; /* Default port */
/* hashed_details_length = yyhost->value.str.len+4+1;
hashed_details = emalloc ( hashed_details_length + 1 ) ;
sprintf ( hashed_details , " ldap_%s " , yyhost - > value . str . val ) ; */
}
break ;
case 2 : {
1999-11-22 10:31:32 +08:00
pval * * yyhost , * * yyport ;
1999-04-22 08:45:14 +08:00
1999-12-19 06:40:35 +08:00
if ( zend_get_parameters_ex ( 2 , & yyhost , & yyport ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
RETURN_FALSE ;
}
1999-11-22 10:31:32 +08:00
convert_to_string_ex ( yyhost ) ;
host = ( * yyhost ) - > value . str . val ;
convert_to_long_ex ( yyport ) ;
port = ( * yyport ) - > value . lval ;
1999-04-22 08:45:14 +08:00
/* Do we need to take care of hosts running multiple LDAP servers ? */
/* hashed_details_length = yyhost->value.str.len+4+1;
hashed_details = emalloc ( hashed_details_length + 1 ) ;
sprintf ( hashed_details , " ldap_%s " , yyhost - > value . str . val ) ; */
}
break ;
2000-08-21 02:47:14 +08:00
# ifdef HAVE_ORALDAP
case 5 : {
pval * * yyhost , * * yyport , * * yywallet ,
* * yywalletpasswd , * * yyauthmode ;
if ( zend_get_parameters_ex ( 5 , & yyhost , & yyport ,
& yywallet ,
& yywalletpasswd ,
& yyauthmode )
= = FAILURE ) {
RETURN_FALSE ;
}
convert_to_string_ex ( yyhost ) ;
host = ( * yyhost ) - > value . str . val ;
convert_to_long_ex ( yyport ) ;
port = ( * yyport ) - > value . lval ;
convert_to_string_ex ( yywallet ) ;
wallet = ( * yywallet ) - > value . str . val ;
convert_to_string_ex ( yywalletpasswd ) ;
walletpasswd = ( * yywalletpasswd ) - > value . str . val ;
convert_to_long_ex ( yyauthmode ) ;
authmode = ( * yyauthmode ) - > value . lval ;
ssl = 1 ;
}
break ;
# endif
1999-04-22 08:45:14 +08:00
default :
WRONG_PARAM_COUNT ;
break ;
}
2000-04-02 00:23:39 +08:00
if ( LDAPG ( max_links ) ! = - 1 & & LDAPG ( num_links ) > = LDAPG ( max_links ) ) {
php_error ( E_WARNING , " LDAP: Too many open links (%d) " , LDAPG ( num_links ) ) ;
RETURN_FALSE ;
1999-04-22 08:45:14 +08:00
}
ldap = ldap_open ( host , port ) ;
if ( ldap = = NULL ) {
2000-04-02 00:23:39 +08:00
RETURN_FALSE ;
1999-04-22 08:45:14 +08:00
} else {
2000-08-21 02:47:14 +08:00
# ifdef HAVE_ORALDAP
if ( ssl ) {
if ( ldap_init_SSL ( & ldap - > ld_sb , wallet , walletpasswd ,
authmode ) ) {
php_error ( E_WARNING , " LDAP: SSL init failed " ) ;
RETURN_FALSE ;
}
}
# endif
2000-04-02 00:23:39 +08:00
RETURN_LONG ( zend_list_insert ( ( void * ) ldap , le_link ) ) ;
1999-04-22 08:45:14 +08:00
}
}
/* }}} */
2000-02-05 23:16:12 +08:00
static LDAP * _get_ldap_link ( pval * * link )
1999-04-22 08:45:14 +08:00
{
LDAP * ldap ;
int type ;
2000-04-02 00:23:39 +08:00
LDAPLS_FETCH ( ) ;
1999-04-22 08:45:14 +08:00
1999-11-22 10:31:32 +08:00
convert_to_long_ex ( link ) ;
1999-12-18 03:51:39 +08:00
ldap = ( LDAP * ) zend_list_find ( ( * link ) - > value . lval , & type ) ;
1999-04-22 08:45:14 +08:00
2000-04-02 00:23:39 +08:00
if ( ! ldap | | ! ( type = = le_link ) ) {
1999-11-22 10:31:32 +08:00
php_error ( E_WARNING , " %d is not a LDAP link index " , ( * link ) - > value . lval ) ;
1999-04-22 08:45:14 +08:00
return NULL ;
}
return ldap ;
}
2000-02-05 23:16:12 +08:00
static LDAPMessage * _get_ldap_result ( pval * * result )
1999-04-22 08:45:14 +08:00
{
LDAPMessage * ldap_result ;
int type ;
2000-04-02 00:23:39 +08:00
LDAPLS_FETCH ( ) ;
1999-04-22 08:45:14 +08:00
1999-11-22 10:31:32 +08:00
convert_to_long_ex ( result ) ;
1999-12-18 03:51:39 +08:00
ldap_result = ( LDAPMessage * ) zend_list_find ( ( * result ) - > value . lval , & type ) ;
1999-04-22 08:45:14 +08:00
2000-04-02 00:23:39 +08:00
if ( ! ldap_result | | type ! = le_result ) {
1999-11-22 10:31:32 +08:00
php_error ( E_WARNING , " %d is not a LDAP result index " , ( * result ) - > value . lval ) ;
1999-04-22 08:45:14 +08:00
return NULL ;
}
return ldap_result ;
}
2000-02-05 23:16:12 +08:00
static LDAPMessage * _get_ldap_result_entry ( pval * * result )
1999-04-22 08:45:14 +08:00
{
LDAPMessage * ldap_result_entry ;
int type ;
2000-04-02 00:23:39 +08:00
LDAPLS_FETCH ( ) ;
1999-04-22 08:45:14 +08:00
1999-11-22 10:31:32 +08:00
convert_to_long_ex ( result ) ;
1999-12-18 03:51:39 +08:00
ldap_result_entry = ( LDAPMessage * ) zend_list_find ( ( * result ) - > value . lval , & type ) ;
1999-04-22 08:45:14 +08:00
2000-04-02 00:23:39 +08:00
if ( ! ldap_result_entry | | type ! = le_result_entry ) {
1999-11-22 10:31:32 +08:00
php_error ( E_WARNING , " %d is not a LDAP result entry index " , ( * result ) - > value . lval ) ;
1999-04-22 08:45:14 +08:00
return NULL ;
}
return ldap_result_entry ;
}
2000-02-05 23:16:12 +08:00
static BerElement * _get_ber_entry ( pval * * berp )
1999-04-22 08:45:14 +08:00
{
BerElement * ber ;
int type ;
2000-04-02 00:23:39 +08:00
LDAPLS_FETCH ( ) ;
1999-04-22 08:45:14 +08:00
1999-11-22 10:31:32 +08:00
convert_to_long_ex ( berp ) ;
1999-12-18 03:51:39 +08:00
ber = ( BerElement * ) zend_list_find ( ( * berp ) - > value . lval , & type ) ;
1999-04-22 08:45:14 +08:00
2000-04-02 00:23:39 +08:00
if ( type ! = le_ber_entry ) {
1999-11-22 10:31:32 +08:00
php_error ( E_WARNING , " %d is not a BerElement index " , ( * berp ) - > value . lval ) ;
1999-04-22 08:45:14 +08:00
return NULL ;
}
return ber ;
}
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
#if 0
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ber_free )
1999-04-22 08:45:14 +08:00
{
2000-07-24 05:32:02 +08:00
pval * * berp ;
1999-04-22 08:45:14 +08:00
1999-12-19 06:40:35 +08:00
if ( zend_get_parameters_ex ( 1 , & berp ) = = FAILURE ) {
1999-11-22 10:31:32 +08:00
WRONG_PARAM_COUNT ;
}
1999-04-22 08:45:14 +08:00
1999-12-18 03:51:39 +08:00
zend_list_delete ( ( * berp ) - > value . lval ) ;
1999-04-22 08:45:14 +08:00
RETURN_TRUE ;
}
# endif
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto int ldap_bind(int link [, string dn, string password])
Bind to LDAP directory */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_bind )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * link , * * bind_rdn , * * bind_pw ;
1999-07-17 02:01:55 +08:00
char * ldap_bind_rdn , * ldap_bind_pw ;
LDAP * ldap ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
switch ( ZEND_NUM_ARGS ( ) ) {
1999-04-22 08:45:14 +08:00
case 1 : /* Anonymous Bind */
1999-12-19 06:40:35 +08:00
if ( zend_get_parameters_ex ( 1 , & link ) = = FAILURE ) {
1999-11-22 10:31:32 +08:00
WRONG_PARAM_COUNT ;
1999-04-22 08:45:14 +08:00
}
ldap_bind_rdn = NULL ;
ldap_bind_pw = NULL ;
break ;
case 3 :
1999-12-19 06:40:35 +08:00
if ( zend_get_parameters_ex ( 3 , & link , & bind_rdn , & bind_pw ) = = FAILURE ) {
1999-11-22 10:31:32 +08:00
WRONG_PARAM_COUNT ;
1999-04-22 08:45:14 +08:00
}
1999-11-22 10:31:32 +08:00
convert_to_string_ex ( bind_rdn ) ;
convert_to_string_ex ( bind_pw ) ;
1999-04-22 08:45:14 +08:00
1999-11-22 10:31:32 +08:00
ldap_bind_rdn = ( * bind_rdn ) - > value . str . val ;
ldap_bind_pw = ( * bind_pw ) - > value . str . val ;
1999-04-22 08:45:14 +08:00
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
if ( ldap_bind_s ( ldap , ldap_bind_rdn , ldap_bind_pw , LDAP_AUTH_SIMPLE ) ! = LDAP_SUCCESS ) {
# if !HAVE_NSLDAP
# if LDAP_API_VERSION > 2000
/* New versions of OpenLDAP do it this way */
1999-08-03 03:17:14 +08:00
php_error ( E_WARNING , " LDAP: Unable to bind to server: %s " , ldap_err2string ( ldap_get_lderrno ( ldap , NULL , NULL ) ) ) ;
1999-04-22 08:45:14 +08:00
# else
1999-08-03 03:17:14 +08:00
php_error ( E_WARNING , " LDAP: Unable to bind to server: %s " , ldap_err2string ( ldap - > ld_errno ) ) ;
1999-04-22 08:45:14 +08:00
# endif
# endif
RETURN_FALSE ;
} else {
RETURN_TRUE ;
}
}
/* }}} */
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto int ldap_unbind(int link)
Unbind from LDAP directory */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_unbind )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * link ;
1999-07-17 02:01:55 +08:00
LDAP * ldap ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & link ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
1999-11-22 10:31:32 +08:00
convert_to_long_ex ( link ) ;
1999-04-22 08:45:14 +08:00
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
1999-12-18 03:51:39 +08:00
zend_list_delete ( ( * link ) - > value . lval ) ;
1999-04-22 08:45:14 +08:00
RETURN_TRUE ;
}
/* }}} */
1999-12-18 19:49:31 +08:00
static void php_ldap_do_search ( INTERNAL_FUNCTION_PARAMETERS , int scope )
1999-04-22 08:45:14 +08:00
{
2000-07-22 03:00:21 +08:00
pval * * link , * * base_dn , * * filter , * * attrs , * * attr , * * attrsonly , * * sizelimit , * * timelimit , * * deref ;
1999-04-22 08:45:14 +08:00
char * ldap_base_dn , * ldap_filter ;
LDAP * ldap ;
char * * ldap_attrs = NULL ;
2000-07-24 05:32:02 +08:00
int ldap_attrsonly = 0 ;
int ldap_sizelimit = - 1 ;
int ldap_timelimit = - 1 ;
int ldap_deref = - 1 ;
1999-04-22 08:45:14 +08:00
LDAPMessage * ldap_result ;
2000-07-22 03:00:21 +08:00
int num_attribs = 0 ;
int i , errno ;
int myargcount = ZEND_NUM_ARGS ( ) ;
2000-04-02 00:23:39 +08:00
LDAPLS_FETCH ( ) ;
2000-07-22 03:00:21 +08:00
if ( myargcount < 3 | | myargcount > 8 | | zend_get_parameters_ex ( myargcount , & link , & base_dn , & filter , & attrs , & attrsonly , & sizelimit , & timelimit , & deref ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
1999-04-22 08:45:14 +08:00
2000-07-22 03:00:21 +08:00
/* Reverse -> fall through */
switch ( myargcount ) {
case 8 :
convert_to_long_ex ( deref ) ;
ldap_deref = ( * deref ) - > value . lval ;
1999-04-22 08:45:14 +08:00
2000-07-22 03:00:21 +08:00
case 7 :
convert_to_long_ex ( timelimit ) ;
ldap_timelimit = ( * timelimit ) - > value . lval ;
1999-04-22 08:45:14 +08:00
2000-07-22 03:00:21 +08:00
case 6 :
convert_to_long_ex ( sizelimit ) ;
ldap_sizelimit = ( * sizelimit ) - > value . lval ;
1999-04-22 08:45:14 +08:00
2000-07-22 03:00:21 +08:00
case 5 :
convert_to_long_ex ( attrsonly ) ;
ldap_attrsonly = ( * attrsonly ) - > value . lval ;
1999-04-22 08:45:14 +08:00
case 4 :
1999-11-22 10:31:32 +08:00
if ( ( * attrs ) - > type ! = IS_ARRAY ) {
1999-08-03 03:17:14 +08:00
php_error ( E_WARNING , " LDAP: Expected Array as last element " ) ;
1999-04-22 08:45:14 +08:00
RETURN_FALSE ;
}
1999-11-22 10:31:32 +08:00
num_attribs = zend_hash_num_elements ( ( * attrs ) - > value . ht ) ;
1999-04-22 08:45:14 +08:00
if ( ( ldap_attrs = emalloc ( ( num_attribs + 1 ) * sizeof ( char * ) ) ) = = NULL ) {
1999-08-03 03:17:14 +08:00
php_error ( E_WARNING , " LDAP: Could not allocate memory " ) ;
1999-04-22 08:45:14 +08:00
RETURN_FALSE ;
}
for ( i = 0 ; i < num_attribs ; i + + ) {
2000-07-22 03:00:21 +08:00
if ( zend_hash_index_find ( ( * attrs ) - > value . ht , i , ( void * * ) & attr ) = = FAILURE ) {
1999-08-03 03:17:14 +08:00
php_error ( E_WARNING , " LDAP: Array initialization wrong " ) ;
1999-04-22 08:45:14 +08:00
RETURN_FALSE ;
}
2000-07-22 03:00:21 +08:00
1999-08-08 00:32:50 +08:00
SEPARATE_ZVAL ( attr ) ;
1999-11-22 10:31:32 +08:00
convert_to_string_ex ( attr ) ;
1999-08-08 00:32:50 +08:00
ldap_attrs [ i ] = ( * attr ) - > value . str . val ;
1999-04-22 08:45:14 +08:00
}
ldap_attrs [ num_attribs ] = NULL ;
2000-07-22 03:00:21 +08:00
case 3 :
convert_to_string_ex ( base_dn ) ;
convert_to_string_ex ( filter ) ;
ldap_base_dn = ( * base_dn ) - > value . str . val ;
ldap_filter = ( * filter ) - > value . str . val ;
break ;
1999-04-22 08:45:14 +08:00
default :
WRONG_PARAM_COUNT ;
2000-07-22 03:00:21 +08:00
break ;
1999-04-22 08:45:14 +08:00
}
/* fix to make null base_dn's work */
if ( strlen ( ldap_base_dn ) < 1 ) {
ldap_base_dn = NULL ;
}
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
2000-07-22 03:00:21 +08:00
/* sizelimit */
2000-07-24 05:32:02 +08:00
if ( ldap_sizelimit > - 1 ) {
2000-08-07 11:18:00 +08:00
# if LDAP_API_VERSION < 2004
2000-07-22 03:00:21 +08:00
ldap - > ld_sizelimit = ldap_sizelimit ;
2000-08-07 11:18:00 +08:00
# else
ldap_set_option ( ldap , LDAP_OPT_SIZELIMIT , & ldap_sizelimit ) ;
# endif
2000-07-22 03:00:21 +08:00
}
1999-04-22 08:45:14 +08:00
2000-07-22 03:00:21 +08:00
/* timelimit */
2000-07-24 05:32:02 +08:00
if ( ldap_timelimit > - 1 ) {
2000-08-07 11:18:00 +08:00
# if LDAP_API_VERSION < 2004
2000-07-22 03:00:21 +08:00
ldap - > ld_timelimit = ldap_timelimit ;
2000-08-07 11:18:00 +08:00
# else
ldap_set_option ( ldap , LDAP_OPT_TIMELIMIT , & ldap_timelimit ) ;
# endif
2000-07-22 03:00:21 +08:00
}
1999-04-22 08:45:14 +08:00
2000-07-22 03:00:21 +08:00
/* deref */
2000-07-24 05:32:02 +08:00
if ( ldap_deref > - 1 ) {
2000-08-07 11:18:00 +08:00
# if LDAP_API_VERSION < 2004
2000-07-22 03:00:21 +08:00
ldap - > ld_deref = ldap_deref ;
2000-08-07 11:18:00 +08:00
# else
ldap_set_option ( ldap , LDAP_OPT_DEREF , & ldap_deref ) ;
# endif
2000-07-22 03:00:21 +08:00
}
/* Run the actual search */
errno = ldap_search_s ( ldap , ldap_base_dn , scope , ldap_filter , ldap_attrs , ldap_attrsonly , & ldap_result ) ;
if ( ldap_attrs ! = NULL ) {
efree ( ldap_attrs ) ;
}
if ( errno ! = LDAP_SUCCESS & & errno ! = LDAP_SIZELIMIT_EXCEEDED ) {
1999-04-22 08:45:14 +08:00
# if !HAVE_NSLDAP
# if LDAP_API_VERSION > 2000
2000-07-22 03:00:21 +08:00
php_error ( E_WARNING , " LDAP: Unable to perform the search: %s " , ldap_err2string ( ldap_get_lderrno ( ldap , NULL , NULL ) ) ) ;
1999-04-22 08:45:14 +08:00
# else
1999-08-03 03:17:14 +08:00
php_error ( E_WARNING , " LDAP: Unable to perform the search: %s " , ldap_err2string ( ldap - > ld_errno ) ) ;
1999-04-22 08:45:14 +08:00
# endif
# endif
2000-07-22 03:00:21 +08:00
RETVAL_FALSE ;
} else {
if ( errno = = LDAP_SIZELIMIT_EXCEEDED ) {
php_error ( E_WARNING , " LDAP: Partial search results returned: Sizelimit exceeded. " ) ;
}
2000-04-02 00:23:39 +08:00
RETVAL_LONG ( zend_list_insert ( ldap_result , le_result ) ) ;
1999-04-22 08:45:14 +08:00
}
}
2000-07-22 03:00:21 +08:00
/* {{{ proto int ldap_read(int link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]] )
1999-04-22 08:45:14 +08:00
Read an entry */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_read )
1999-04-22 08:45:14 +08:00
{
1999-12-18 19:49:31 +08:00
php_ldap_do_search ( INTERNAL_FUNCTION_PARAM_PASSTHRU , LDAP_SCOPE_BASE ) ;
1999-04-22 08:45:14 +08:00
}
/* }}} */
2000-07-22 03:00:21 +08:00
/* {{{ proto int ldap_list(int link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]] )
1999-04-22 08:45:14 +08:00
Single - level search */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_list )
1999-04-22 08:45:14 +08:00
{
1999-12-18 19:49:31 +08:00
php_ldap_do_search ( INTERNAL_FUNCTION_PARAM_PASSTHRU , LDAP_SCOPE_ONELEVEL ) ;
1999-04-22 08:45:14 +08:00
}
/* }}} */
2000-07-22 03:00:21 +08:00
/* {{{ proto int ldap_search(int link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]] )
1999-04-22 08:45:14 +08:00
Search LDAP tree under base_dn */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_search )
1999-04-22 08:45:14 +08:00
{
1999-12-18 19:49:31 +08:00
php_ldap_do_search ( INTERNAL_FUNCTION_PARAM_PASSTHRU , LDAP_SCOPE_SUBTREE ) ;
1999-04-22 08:45:14 +08:00
}
/* }}} */
2000-07-22 03:00:21 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto int ldap_free_result(int result)
Free result memory */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_free_result )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * result ;
1999-07-17 02:01:55 +08:00
LDAPMessage * ldap_result ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & result ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
2000-02-05 23:16:12 +08:00
ldap_result = _get_ldap_result ( result ) ;
1999-04-22 08:45:14 +08:00
if ( ldap_result = = NULL ) {
RETVAL_FALSE ;
} else {
1999-12-18 03:51:39 +08:00
zend_list_delete ( ( * result ) - > value . lval ) ; /* Delete list entry and call registered destructor function */
1999-04-22 08:45:14 +08:00
RETVAL_TRUE ;
}
return ;
}
/* }}} */
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto int ldap_count_entries(int link, int result)
Count the number of entries in a search result */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_count_entries )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * result , * * link ;
1999-07-17 02:01:55 +08:00
LDAP * ldap ;
LDAPMessage * ldap_result ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & link , & result ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
2000-02-05 23:16:12 +08:00
ldap_result = _get_ldap_result ( result ) ;
1999-04-22 08:45:14 +08:00
if ( ldap_result = = NULL ) RETURN_FALSE ;
RETURN_LONG ( ldap_count_entries ( ldap , ldap_result ) ) ;
}
/* }}} */
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto int ldap_first_entry(int link, int result)
Return first result id */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_first_entry )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * result , * * link ;
1999-04-22 08:45:14 +08:00
LDAP * ldap ;
LDAPMessage * ldap_result ;
LDAPMessage * ldap_result_entry ;
2000-04-02 00:23:39 +08:00
LDAPLS_FETCH ( ) ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & link , & result ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
2000-02-05 23:16:12 +08:00
ldap_result = _get_ldap_result ( result ) ;
1999-04-22 08:45:14 +08:00
if ( ldap_result = = NULL ) RETURN_FALSE ;
if ( ( ldap_result_entry = ldap_first_entry ( ldap , ldap_result ) ) = = NULL ) {
RETURN_FALSE ;
} else {
2000-04-02 00:23:39 +08:00
RETURN_LONG ( zend_list_insert ( ldap_result_entry , le_result_entry ) ) ;
1999-04-22 08:45:14 +08:00
}
}
/* }}} */
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto int ldap_next_entry(int link, int entry)
Get next result entry */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_next_entry )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * result_entry , * * link ;
1999-04-22 08:45:14 +08:00
LDAP * ldap ;
LDAPMessage * ldap_result_entry , * ldap_result_entry_next ;
2000-04-02 00:23:39 +08:00
LDAPLS_FETCH ( ) ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & link , & result_entry ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
2000-02-05 23:16:12 +08:00
ldap_result_entry = _get_ldap_result_entry ( result_entry ) ;
1999-04-22 08:45:14 +08:00
if ( ldap_result_entry = = NULL ) RETURN_FALSE ;
if ( ( ldap_result_entry_next = ldap_next_entry ( ldap , ldap_result_entry ) ) = = NULL ) {
RETURN_FALSE ;
} else {
2000-04-02 00:23:39 +08:00
RETURN_LONG ( zend_list_insert ( ldap_result_entry_next , le_result_entry ) ) ;
1999-04-22 08:45:14 +08:00
}
}
/* }}} */
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto array ldap_get_entries(int link, int result)
Get all result entries */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_get_entries )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * link , * * result ;
1999-07-17 02:01:55 +08:00
LDAPMessage * ldap_result , * ldap_result_entry ;
pval * tmp1 , * tmp2 ;
LDAP * ldap ;
int num_entries , num_attrib , num_values , i ;
BerElement * ber ;
char * attribute ;
1999-12-10 07:45:30 +08:00
size_t attr_len ;
1999-07-17 02:01:55 +08:00
char * * ldap_value ;
char * dn ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & link , & result ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
2000-02-05 23:16:12 +08:00
ldap_result = _get_ldap_result ( result ) ;
1999-04-22 08:45:14 +08:00
if ( ldap_result = = NULL ) RETURN_FALSE ;
num_entries = ldap_count_entries ( ldap , ldap_result ) ;
2000-07-25 23:34:28 +08:00
if ( num_entries = = 0 ) RETURN_FALSE ;
1999-04-22 08:45:14 +08:00
array_init ( return_value ) ;
2000-07-25 23:34:28 +08:00
num_entries = 0 ;
1999-04-22 08:45:14 +08:00
ldap_result_entry = ldap_first_entry ( ldap , ldap_result ) ;
if ( ldap_result_entry = = NULL ) RETURN_FALSE ;
while ( ldap_result_entry ! = NULL ) {
1999-07-17 05:53:17 +08:00
MAKE_STD_ZVAL ( tmp1 ) ;
1999-07-17 02:01:55 +08:00
array_init ( tmp1 ) ;
1999-04-22 08:45:14 +08:00
2000-07-25 23:34:28 +08:00
num_attrib = 0 ;
1999-04-22 08:45:14 +08:00
attribute = ldap_first_attribute ( ldap , ldap_result_entry , & ber ) ;
2000-07-25 23:34:28 +08:00
1999-04-22 08:45:14 +08:00
while ( attribute ! = NULL ) {
ldap_value = ldap_get_values ( ldap , ldap_result_entry , attribute ) ;
num_values = ldap_count_values ( ldap_value ) ;
1999-07-17 05:53:17 +08:00
MAKE_STD_ZVAL ( tmp2 ) ;
1999-07-17 02:01:55 +08:00
array_init ( tmp2 ) ;
add_assoc_long ( tmp2 , " count " , num_values ) ;
2000-07-25 23:34:28 +08:00
for ( i = 0 ; i < num_values ; i + + ) {
1999-07-17 02:01:55 +08:00
add_index_string ( tmp2 , i , ldap_value [ i ] , 1 ) ;
1999-04-22 08:45:14 +08:00
}
ldap_value_free ( ldap_value ) ;
1999-12-10 07:45:30 +08:00
attr_len = strlen ( attribute ) ;
zend_hash_update ( tmp1 - > value . ht , php_strtolower ( attribute , attr_len ) , attr_len + 1 , ( void * ) & tmp2 , sizeof ( pval * ) , NULL ) ;
2000-07-25 23:34:28 +08:00
add_index_string ( tmp1 , num_attrib , attribute , 1 ) ;
1999-04-22 08:45:14 +08:00
2000-07-25 23:34:28 +08:00
num_attrib + + ;
1999-04-22 08:45:14 +08:00
attribute = ldap_next_attribute ( ldap , ldap_result_entry , ber ) ;
}
1999-07-17 02:01:55 +08:00
add_assoc_long ( tmp1 , " count " , num_attrib ) ;
1999-04-22 08:45:14 +08:00
dn = ldap_get_dn ( ldap , ldap_result_entry ) ;
1999-07-17 02:01:55 +08:00
add_assoc_string ( tmp1 , " dn " , dn , 1 ) ;
1999-04-22 08:45:14 +08:00
2000-07-25 23:34:28 +08:00
zend_hash_index_update ( return_value - > value . ht , num_entries , ( void * ) & tmp1 , sizeof ( pval * ) , NULL ) ;
1999-04-22 08:45:14 +08:00
2000-07-25 23:34:28 +08:00
num_entries + + ;
1999-04-22 08:45:14 +08:00
ldap_result_entry = ldap_next_entry ( ldap , ldap_result_entry ) ;
}
add_assoc_long ( return_value , " count " , num_entries ) ;
2000-07-25 23:34:28 +08:00
1999-04-22 08:45:14 +08:00
}
/* }}} */
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto string ldap_first_attribute(int link, int result, int ber)
Return first attribute */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_first_attribute )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * result , * * link , * * berp ;
1999-04-22 08:45:14 +08:00
LDAP * ldap ;
LDAPMessage * ldap_result_entry ;
BerElement * ber ;
char * attribute ;
2000-04-02 00:23:39 +08:00
LDAPLS_FETCH ( ) ;
1999-04-22 08:45:14 +08:00
2000-08-05 01:18:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 3 | | zend_get_parameters_ex ( 3 , & link , & result , & berp ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
2000-02-05 23:16:12 +08:00
ldap_result_entry = _get_ldap_result_entry ( result ) ;
1999-04-22 08:45:14 +08:00
if ( ldap_result_entry = = NULL ) RETURN_FALSE ;
if ( ( attribute = ldap_first_attribute ( ldap , ldap_result_entry , & ber ) ) = = NULL ) {
RETURN_FALSE ;
} else {
/* brep is passed by ref so we do not have to account for memory */
1999-11-22 10:31:32 +08:00
( * berp ) - > type = IS_LONG ;
2000-04-02 00:23:39 +08:00
( * berp ) - > value . lval = zend_list_insert ( ber , le_ber_entry ) ;
1999-04-22 08:45:14 +08:00
RETVAL_STRING ( attribute , 1 ) ;
# ifdef WINDOWS
ldap_memfree ( attribute ) ;
# endif
}
}
/* }}} */
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto string ldap_next_attribute(int link, int result, int ber)
Get the next attribute in result */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_next_attribute )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * result , * * link , * * berp ;
1999-07-17 02:01:55 +08:00
LDAP * ldap ;
LDAPMessage * ldap_result_entry ;
BerElement * ber ;
char * attribute ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 3 | | zend_get_parameters_ex ( 3 , & link , & result , & berp ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
2000-02-05 23:16:12 +08:00
ldap_result_entry = _get_ldap_result_entry ( result ) ;
1999-04-22 08:45:14 +08:00
if ( ldap_result_entry = = NULL ) RETURN_FALSE ;
2000-08-05 01:18:54 +08:00
if ( ( ber = _get_ber_entry ( berp ) ) = = NULL ) {
RETURN_FALSE ;
}
1999-04-22 08:45:14 +08:00
if ( ( attribute = ldap_next_attribute ( ldap , ldap_result_entry , ber ) ) = = NULL ) {
RETURN_FALSE ;
} else {
2000-08-05 01:18:54 +08:00
/* brep is passed by ref so we do not have to account for memory */
( * berp ) - > type = IS_LONG ;
( * berp ) - > value . lval = zend_list_insert ( ber , le_ber_entry ) ;
1999-04-22 08:45:14 +08:00
RETVAL_STRING ( attribute , 1 ) ;
# ifdef WINDOWS
ldap_memfree ( attribute ) ;
# endif
}
}
/* }}} */
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto array ldap_get_attributes(int link, int result)
Get attributes from a search result entry */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_get_attributes )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * link , * * result_entry ;
1999-07-17 02:01:55 +08:00
pval * tmp ;
LDAP * ldap ;
LDAPMessage * ldap_result_entry ;
char * attribute ;
char * * ldap_value ;
2000-07-25 23:34:28 +08:00
int i , num_values , num_attrib ;
1999-07-17 02:01:55 +08:00
BerElement * ber ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & link , & result_entry ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
2000-02-05 23:16:12 +08:00
ldap_result_entry = _get_ldap_result_entry ( result_entry ) ;
1999-04-22 08:45:14 +08:00
if ( ldap_result_entry = = NULL ) RETURN_FALSE ;
2000-07-25 23:34:28 +08:00
array_init ( return_value ) ;
1999-04-22 08:45:14 +08:00
num_attrib = 0 ;
attribute = ldap_first_attribute ( ldap , ldap_result_entry , & ber ) ;
while ( attribute ! = NULL ) {
ldap_value = ldap_get_values ( ldap , ldap_result_entry , attribute ) ;
num_values = ldap_count_values ( ldap_value ) ;
1999-07-17 05:53:17 +08:00
MAKE_STD_ZVAL ( tmp ) ;
1999-07-17 02:01:55 +08:00
array_init ( tmp ) ;
add_assoc_long ( tmp , " count " , num_values ) ;
1999-04-22 08:45:14 +08:00
for ( i = 0 ; i < num_values ; i + + ) {
1999-07-17 02:01:55 +08:00
add_index_string ( tmp , i , ldap_value [ i ] , 1 ) ;
1999-04-22 08:45:14 +08:00
}
ldap_value_free ( ldap_value ) ;
1999-08-03 03:17:14 +08:00
zend_hash_update ( return_value - > value . ht , attribute , strlen ( attribute ) + 1 , ( void * ) & tmp , sizeof ( pval * ) , NULL ) ;
2000-07-25 23:34:28 +08:00
add_index_string ( return_value , num_attrib , attribute , 1 ) ;
1999-04-22 08:45:14 +08:00
2000-07-25 23:34:28 +08:00
num_attrib + + ;
1999-04-22 08:45:14 +08:00
attribute = ldap_next_attribute ( ldap , ldap_result_entry , ber ) ;
}
add_assoc_long ( return_value , " count " , num_attrib ) ;
}
/* }}} */
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto array ldap_get_values(int link, int result, string attribute)
Get all values from a result entry */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_get_values )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * link , * * result_entry , * * attr ;
1999-07-17 02:01:55 +08:00
LDAP * ldap ;
LDAPMessage * ldap_result_entry ;
char * attribute ;
char * * ldap_value ;
int i , num_values ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 3 | | zend_get_parameters_ex ( 3 , & link , & result_entry , & attr ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
2000-02-05 23:16:12 +08:00
ldap_result_entry = _get_ldap_result_entry ( result_entry ) ;
1999-04-22 08:45:14 +08:00
if ( ldap_result_entry = = NULL ) RETURN_FALSE ;
1999-11-22 10:31:32 +08:00
convert_to_string_ex ( attr ) ;
attribute = ( * attr ) - > value . str . val ;
1999-04-22 08:45:14 +08:00
if ( ( ldap_value = ldap_get_values ( ldap , ldap_result_entry , attribute ) ) = = NULL ) {
# if !HAVE_NSLDAP
# if LDAP_API_VERSION > 2000
1999-08-03 03:17:14 +08:00
php_error ( E_WARNING , " LDAP: Cannot get the value(s) of attribute %s " , ldap_err2string ( ldap_get_lderrno ( ldap , NULL , NULL ) ) ) ;
1999-04-22 08:45:14 +08:00
# else
1999-08-03 03:17:14 +08:00
php_error ( E_WARNING , " LDAP: Cannot get the value(s) of attribute %s " , ldap_err2string ( ldap - > ld_errno ) ) ;
1999-04-22 08:45:14 +08:00
# endif
# endif
RETURN_FALSE ;
}
num_values = ldap_count_values ( ldap_value ) ;
if ( array_init ( return_value ) = = FAILURE ) {
RETURN_FALSE ;
}
for ( i = 0 ; i < num_values ; i + + ) {
add_next_index_string ( return_value , ldap_value [ i ] , 1 ) ;
}
add_assoc_long ( return_value , " count " , num_values ) ;
ldap_value_free ( ldap_value ) ;
2000-07-28 08:09:33 +08:00
1999-04-22 08:45:14 +08:00
}
/* }}} */
2000-07-24 05:32:02 +08:00
2000-04-08 07:20:22 +08:00
/* {{{ proto array ldap_get_values_len(int link, int result, string attribute)
2000-07-28 08:09:33 +08:00
Get all values with lengths from a result entry */
2000-04-08 07:20:22 +08:00
PHP_FUNCTION ( ldap_get_values_len )
{
pval * * link , * * result_entry , * * attr ;
LDAP * ldap ;
LDAPMessage * ldap_result_entry ;
char * attribute ;
struct berval * * ldap_value_len ;
int i , num_values ;
2000-07-28 08:09:33 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 3 | | zend_get_parameters_ex ( 3 , & link , & result_entry , & attr ) = = FAILURE ) {
2000-04-08 07:20:22 +08:00
WRONG_PARAM_COUNT ;
}
2000-07-29 06:39:22 +08:00
ldap = _get_ldap_link ( link ) ;
if ( ldap = = NULL ) RETURN_FALSE ;
2000-04-08 07:20:22 +08:00
ldap_result_entry = _get_ldap_result_entry ( result_entry ) ;
2000-07-29 06:39:22 +08:00
if ( ldap_result_entry = = NULL ) RETURN_FALSE ;
2000-04-08 07:20:22 +08:00
convert_to_string_ex ( attr ) ;
attribute = ( * attr ) - > value . str . val ;
if ( ( ldap_value_len = ldap_get_values_len ( ldap , ldap_result_entry , attribute ) ) = = NULL ) {
# if !HAVE_NSLDAP
# if LDAP_API_VERSION > 2000
php_error ( E_WARNING , " LDAP: Cannot get the value(s) of attribute %s " , ldap_err2string ( ldap_get_lderrno ( ldap , NULL , NULL ) ) ) ;
# else
php_error ( E_WARNING , " LDAP: Cannot get the value(s) of attribute %s " , ldap_err2string ( ldap - > ld_errno ) ) ;
# endif
# else
php_error ( E_WARNING , " LDAP: Cannot get the value(s) of attribute %s " , ldap_err2string ( ldap_get_lderrno ( ldap , NULL , NULL ) ) ) ;
# endif
RETURN_FALSE ;
}
num_values = ldap_count_values_len ( ldap_value_len ) ;
if ( array_init ( return_value ) = = FAILURE ) {
php_error ( E_ERROR , " Cannot initialize return value " ) ;
RETURN_FALSE ;
}
for ( i = 0 ; i < num_values ; i + + ) {
2000-07-29 05:48:16 +08:00
add_next_index_stringl ( return_value , ldap_value_len [ i ] - > bv_val , ldap_value_len [ i ] - > bv_len , 1 ) ;
2000-04-08 07:20:22 +08:00
}
add_assoc_long ( return_value , " count " , num_values ) ;
2000-07-28 08:09:33 +08:00
ldap_value_free_len ( ldap_value_len ) ;
2000-04-08 07:20:22 +08:00
}
/* }}} */
1999-04-22 08:45:14 +08:00
/* {{{ proto string ldap_get_dn(int link, int result)
Get the DN of a result entry */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_get_dn )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * link , * * entryp ;
1999-04-22 08:45:14 +08:00
LDAP * ld ;
LDAPMessage * entry ;
char * text ;
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & link , & entryp ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
2000-02-05 23:16:12 +08:00
ld = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ld = = NULL ) RETURN_FALSE ;
2000-02-05 23:16:12 +08:00
entry = _get_ldap_result_entry ( entryp ) ;
1999-04-22 08:45:14 +08:00
if ( entry = = NULL ) RETURN_FALSE ;
text = ldap_get_dn ( ld , entry ) ;
if ( text ! = NULL ) {
RETVAL_STRING ( text , 1 ) ;
# ifdef WINDOWS
ldap_memfree ( text ) ;
# endif
} else {
RETURN_FALSE ;
}
}
/* }}} */
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto array ldap_explode_dn(string dn, int with_attrib)
Splits DN into its component parts */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_explode_dn )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * dn , * * with_attrib ;
1999-07-17 02:01:55 +08:00
char * * ldap_value ;
int i , count ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & dn , & with_attrib ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
1999-11-22 10:31:32 +08:00
convert_to_string_ex ( dn ) ;
convert_to_long_ex ( with_attrib ) ;
1999-04-22 08:45:14 +08:00
1999-11-22 10:31:32 +08:00
ldap_value = ldap_explode_dn ( ( * dn ) - > value . str . val , ( * with_attrib ) - > value . lval ) ;
1999-04-22 08:45:14 +08:00
i = 0 ;
while ( ldap_value [ i ] ! = NULL ) i + + ;
count = i ;
if ( array_init ( return_value ) = = FAILURE ) {
RETURN_FALSE ;
}
add_assoc_long ( return_value , " count " , count ) ;
for ( i = 0 ; i < count ; i + + ) {
add_index_string ( return_value , i , ldap_value [ i ] , 1 ) ;
}
ldap_value_free ( ldap_value ) ;
}
/* }}} */
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto string ldap_dn2ufn(string dn)
Convert DN to User Friendly Naming format */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_dn2ufn )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * dn ;
1999-04-22 08:45:14 +08:00
char * ufn ;
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & dn ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
1999-11-22 10:31:32 +08:00
convert_to_string_ex ( dn ) ;
1999-04-22 08:45:14 +08:00
1999-11-22 10:31:32 +08:00
ufn = ldap_dn2ufn ( ( * dn ) - > value . str . val ) ;
1999-04-22 08:45:14 +08:00
if ( ufn ! = NULL ) {
RETVAL_STRING ( ufn , 1 ) ;
# ifdef WINDOWS
ldap_memfree ( ufn ) ;
# endif
} else {
RETURN_FALSE ;
}
}
/* }}} */
1999-05-21 18:06:25 +08:00
2000-07-24 05:32:02 +08:00
1999-05-21 18:06:25 +08:00
/* added to fix use of ldap_modify_add for doing an ldap_add, gerrit thomson. */
# define PHP_LD_FULL_ADD 0xff
1999-12-18 19:49:31 +08:00
static void php_ldap_do_modify ( INTERNAL_FUNCTION_PARAMETERS , int oper )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * link , * * dn , * * entry , * * value , * * ivalue ;
1999-07-17 02:01:55 +08:00
LDAP * ldap ;
char * ldap_dn ;
LDAPMod * * ldap_mods ;
int i , j , num_attribs , num_values ;
2000-07-29 05:31:02 +08:00
int * num_berval ;
1999-07-17 02:01:55 +08:00
char * attribute ;
ulong index ;
int is_full_add = 0 ; /* flag for full add operation so ldap_mod_add can be put back into oper, gerrit THomson */
1999-05-21 18:06:25 +08:00
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 3 | | zend_get_parameters_ex ( 3 , & link , & dn , & entry ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
1999-11-22 10:31:32 +08:00
if ( ( * entry ) - > type ! = IS_ARRAY ) {
1999-08-03 03:17:14 +08:00
php_error ( E_WARNING , " LDAP: Expected Array as the last element " ) ;
1999-04-22 08:45:14 +08:00
RETURN_FALSE ;
}
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
1999-11-22 10:31:32 +08:00
convert_to_string_ex ( dn ) ;
ldap_dn = ( * dn ) - > value . str . val ;
1999-04-22 08:45:14 +08:00
1999-11-22 10:31:32 +08:00
num_attribs = zend_hash_num_elements ( ( * entry ) - > value . ht ) ;
1999-04-22 08:45:14 +08:00
ldap_mods = emalloc ( ( num_attribs + 1 ) * sizeof ( LDAPMod * ) ) ;
2000-07-29 05:31:02 +08:00
num_berval = emalloc ( num_attribs * sizeof ( int ) ) ;
1999-11-22 10:31:32 +08:00
zend_hash_internal_pointer_reset ( ( * entry ) - > value . ht ) ;
2000-07-29 05:31:02 +08:00
/* added by gerrit thomson to fix ldap_add using ldap_mod_add */
if ( oper = = PHP_LD_FULL_ADD ) {
oper = LDAP_MOD_ADD ;
is_full_add = 1 ;
}
1999-05-21 18:06:25 +08:00
/* end additional , gerrit thomson */
1999-04-22 08:45:14 +08:00
for ( i = 0 ; i < num_attribs ; i + + ) {
ldap_mods [ i ] = emalloc ( sizeof ( LDAPMod ) ) ;
2000-07-29 05:31:02 +08:00
ldap_mods [ i ] - > mod_op = oper | LDAP_MOD_BVALUES ;
1999-04-22 08:45:14 +08:00
1999-11-22 10:31:32 +08:00
if ( zend_hash_get_current_key ( ( * entry ) - > value . ht , & attribute , & index ) = = HASH_KEY_IS_STRING ) {
1999-04-22 08:45:14 +08:00
ldap_mods [ i ] - > mod_type = estrdup ( attribute ) ;
efree ( attribute ) ;
} else {
1999-08-03 03:17:14 +08:00
php_error ( E_WARNING , " LDAP: Unknown Attribute in the data " ) ;
1999-04-22 08:45:14 +08:00
}
1999-11-22 10:31:32 +08:00
zend_hash_get_current_data ( ( * entry ) - > value . ht , ( void * * ) & value ) ;
1999-04-22 08:45:14 +08:00
1999-11-22 10:31:32 +08:00
if ( ( * value ) - > type ! = IS_ARRAY ) {
1999-04-22 08:45:14 +08:00
num_values = 1 ;
} else {
1999-11-22 10:31:32 +08:00
num_values = zend_hash_num_elements ( ( * value ) - > value . ht ) ;
1999-04-22 08:45:14 +08:00
}
2000-07-29 05:31:02 +08:00
num_berval [ i ] = num_values ;
ldap_mods [ i ] - > mod_bvalues = emalloc ( ( num_values + 1 ) * sizeof ( struct berval * ) ) ;
1999-05-21 18:06:25 +08:00
/* allow for arrays with one element, no allowance for arrays with none but probably not required, gerrit thomson. */
/* if (num_values == 1) {*/
2000-07-29 05:31:02 +08:00
if ( ( num_values = = 1 ) & & ( ( * value ) - > type ! = IS_ARRAY ) ) {
1999-11-22 10:31:32 +08:00
convert_to_string_ex ( value ) ;
2000-07-29 05:31:02 +08:00
ldap_mods [ i ] - > mod_bvalues [ 0 ] = ( struct berval * ) emalloc ( sizeof ( struct berval ) ) ;
ldap_mods [ i ] - > mod_bvalues [ 0 ] - > bv_len = ( * value ) - > value . str . len ;
ldap_mods [ i ] - > mod_bvalues [ 0 ] - > bv_val = ( * value ) - > value . str . val ;
1999-04-22 08:45:14 +08:00
} else {
2000-07-29 05:31:02 +08:00
for ( j = 0 ; j < num_values ; j + + ) {
1999-11-22 10:31:32 +08:00
zend_hash_index_find ( ( * value ) - > value . ht , j , ( void * * ) & ivalue ) ;
convert_to_string_ex ( ivalue ) ;
2000-07-29 05:31:02 +08:00
ldap_mods [ i ] - > mod_bvalues [ j ] = ( struct berval * ) emalloc ( sizeof ( struct berval ) ) ;
ldap_mods [ i ] - > mod_bvalues [ j ] - > bv_len = ( * ivalue ) - > value . str . len ;
ldap_mods [ i ] - > mod_bvalues [ j ] - > bv_val = ( * ivalue ) - > value . str . val ;
1999-04-22 08:45:14 +08:00
}
}
2000-07-29 05:31:02 +08:00
ldap_mods [ i ] - > mod_bvalues [ num_values ] = NULL ;
1999-11-22 10:31:32 +08:00
zend_hash_move_forward ( ( * entry ) - > value . ht ) ;
1999-04-22 08:45:14 +08:00
}
ldap_mods [ num_attribs ] = NULL ;
1999-05-21 18:06:25 +08:00
/* check flag to see if do_mod was called to perform full add , gerrit thomson */
/* if (oper == LDAP_MOD_ADD) { */
if ( is_full_add = = 1 ) {
1999-04-22 08:45:14 +08:00
if ( ldap_add_s ( ldap , ldap_dn , ldap_mods ) ! = LDAP_SUCCESS ) {
ldap_perror ( ldap , " LDAP " ) ;
1999-08-03 03:17:14 +08:00
php_error ( E_WARNING , " LDAP: add operation could not be completed. " ) ;
1999-04-22 08:45:14 +08:00
RETVAL_FALSE ;
} else RETVAL_TRUE ;
} else {
if ( ldap_modify_s ( ldap , ldap_dn , ldap_mods ) ! = LDAP_SUCCESS ) {
1999-08-03 03:17:14 +08:00
php_error ( E_WARNING , " LDAP: modify operation could not be completed. " ) ;
1999-04-22 08:45:14 +08:00
RETVAL_FALSE ;
} else RETVAL_TRUE ;
}
2000-07-29 05:31:02 +08:00
for ( i = 0 ; i < num_attribs ; i + + ) {
1999-04-22 08:45:14 +08:00
efree ( ldap_mods [ i ] - > mod_type ) ;
2000-07-29 05:31:02 +08:00
for ( j = 0 ; j < num_berval [ i ] ; j + + ) {
efree ( ldap_mods [ i ] - > mod_bvalues [ j ] ) ;
}
efree ( ldap_mods [ i ] - > mod_bvalues ) ;
1999-04-22 08:45:14 +08:00
efree ( ldap_mods [ i ] ) ;
}
2000-07-29 05:31:02 +08:00
efree ( num_berval ) ;
1999-04-22 08:45:14 +08:00
efree ( ldap_mods ) ;
return ;
}
2000-07-24 05:32:02 +08:00
1999-04-22 08:45:14 +08:00
/* {{{ proto int ldap_add(int link, string dn, array entry)
Add entries to LDAP directory */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_add )
1999-04-22 08:45:14 +08:00
{
1999-05-21 18:06:25 +08:00
/* use a newly define parameter into the do_modify so ldap_mod_add can be used the way it is supposed to be used , Gerrit THomson */
1999-12-18 19:49:31 +08:00
/* php_ldap_do_modify(INTERNAL_FUNCTION_PARAM_PASSTHRU, LDAP_MOD_ADD);*/
php_ldap_do_modify ( INTERNAL_FUNCTION_PARAM_PASSTHRU , PHP_LD_FULL_ADD ) ;
1999-04-22 08:45:14 +08:00
}
/* }}} */
/* {{{ proto int ldap_modify(int link, string dn, array entry)
Modify an LDAP entry */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_modify )
1999-04-22 08:45:14 +08:00
{
1999-12-18 19:49:31 +08:00
php_ldap_do_modify ( INTERNAL_FUNCTION_PARAM_PASSTHRU , LDAP_MOD_REPLACE ) ;
1999-04-22 08:45:14 +08:00
}
/* }}} */
1999-05-21 18:06:25 +08:00
/* three functions for attribute base modifications, gerrit Thomson */
/* {{{ proto int ldap_mod_replace(int link, string dn, array entry)
Replace attribute values with new ones */
PHP_FUNCTION ( ldap_mod_replace )
{
1999-12-18 19:49:31 +08:00
php_ldap_do_modify ( INTERNAL_FUNCTION_PARAM_PASSTHRU , LDAP_MOD_REPLACE ) ; }
1999-05-21 18:06:25 +08:00
/* }}} */
2000-07-24 05:32:02 +08:00
1999-05-21 18:06:25 +08:00
/* {{{ proto int ldap_mod_add(int link, string dn, array entry)
2000-02-23 23:04:36 +08:00
Add attribute values to current */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_mod_add )
{
1999-12-18 19:49:31 +08:00
php_ldap_do_modify ( INTERNAL_FUNCTION_PARAM_PASSTHRU , LDAP_MOD_ADD ) ;
1999-05-21 18:06:25 +08:00
}
/* }}} */
2000-07-24 05:32:02 +08:00
1999-05-21 18:06:25 +08:00
/* {{{ proto int ldap_mod_del(int link, string dn, array entry)
Delete attribute values */
PHP_FUNCTION ( ldap_mod_del )
{
1999-12-18 19:49:31 +08:00
php_ldap_do_modify ( INTERNAL_FUNCTION_PARAM_PASSTHRU , LDAP_MOD_DELETE ) ;
1999-05-21 18:06:25 +08:00
}
2000-07-24 05:32:02 +08:00
/* }}} */
1999-05-21 18:06:25 +08:00
/* end of attribute based functions , gerrit thomson */
1999-04-22 08:45:14 +08:00
/* {{{ proto int ldap_delete(int link, string dn)
Delete an entry from a directory */
1999-05-21 18:06:25 +08:00
PHP_FUNCTION ( ldap_delete )
1999-04-22 08:45:14 +08:00
{
1999-11-22 10:31:32 +08:00
pval * * link , * * dn ;
1999-07-17 02:01:55 +08:00
LDAP * ldap ;
char * ldap_dn ;
1999-04-22 08:45:14 +08:00
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 2 | | zend_get_parameters_ex ( 2 , & link , & dn ) = = FAILURE ) {
1999-04-22 08:45:14 +08:00
WRONG_PARAM_COUNT ;
}
2000-02-05 23:16:12 +08:00
ldap = _get_ldap_link ( link ) ;
1999-04-22 08:45:14 +08:00
if ( ldap = = NULL ) RETURN_FALSE ;
1999-11-22 10:31:32 +08:00
convert_to_string_ex ( dn ) ;
ldap_dn = ( * dn ) - > value . str . val ;
1999-04-22 08:45:14 +08:00
if ( ldap_delete_s ( ldap , ldap_dn ) ! = LDAP_SUCCESS ) {
ldap_perror ( ldap , " LDAP " ) ;
RETURN_FALSE ;
}
RETURN_TRUE ;
}
/* }}} */
2000-07-24 05:32:02 +08:00
2000-04-06 20:36:47 +08:00
/* {{{ proto int ldap_errno(int link)
Get the current ldap error number */
PHP_FUNCTION ( ldap_errno ) {
LDAP * ldap ;
pval * * ldap_link ;
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( ht , & ldap_link ) = = FAILURE ) {
2000-04-06 20:36:47 +08:00
WRONG_PARAM_COUNT ;
}
convert_to_string_ex ( ldap_link ) ;
ldap = _get_ldap_link ( ldap_link ) ;
if ( ldap = = NULL ) {
RETURN_LONG ( 0 ) ;
}
# if !HAVE_NSLDAP
# if LDAP_API_VERSION > 2000
RETURN_LONG ( ldap_get_lderrno ( ldap , NULL , NULL ) ) ;
# else
RETURN_LONG ( ldap - > ld_errno ) ;
# endif
# else
RETURN_LONG ( ldap_get_lderrno ( ldap , NULL , NULL ) ) ;
# endif
}
/* }}} */
/* {{{ proto string ldap_err2str(int errno)
Convert error number to error string */
PHP_FUNCTION ( ldap_err2str ) {
zval * * perrno ;
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( ht , & perrno ) = = FAILURE ) {
2000-04-06 20:36:47 +08:00
WRONG_PARAM_COUNT ;
}
convert_to_long_ex ( perrno ) ;
RETURN_STRING ( ldap_err2string ( ( * perrno ) - > value . lval ) , 1 ) ;
}
/* }}} */
/* {{{ proto string ldap_error(int link)
Get the current ldap error string */
PHP_FUNCTION ( ldap_error ) {
LDAP * ldap ;
pval * * link ;
int ld_errno ;
2000-06-06 03:47:54 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( ht , & link ) = = FAILURE ) {
2000-04-06 20:36:47 +08:00
WRONG_PARAM_COUNT ;
}
ldap = _get_ldap_link ( link ) ;
if ( ldap = = NULL ) {
RETURN_FALSE ;
}
# if !HAVE_NSLDAP
# if LDAP_API_VERSION > 2000
ld_errno = ldap_get_lderrno ( ldap , NULL , NULL ) ;
# else
ld_errno = ldap - > ld_errno ;
# endif
# else
ld_errno = ldap_get_lderrno ( ldap , NULL , NULL ) ;
# endif
RETURN_STRING ( ldap_err2string ( ld_errno ) , 1 ) ;
}
2000-04-07 00:57:33 +08:00
/* }}} */
2000-07-26 19:01:44 +08:00
/* {{{ proto int ldap_compare(int link, string dn, string attr, string value)
2000-07-26 19:28:14 +08:00
Determine if an entry has a specific value for one of its attributes */
2000-07-26 19:01:44 +08:00
PHP_FUNCTION ( ldap_compare ) {
pval * * link , * * dn , * * attr , * * value ;
char * ldap_dn , * ldap_attr , * ldap_value ;
LDAP * ldap ;
int errno ;
if ( ZEND_NUM_ARGS ( ) ! = 4 | | zend_get_parameters_ex ( 4 , & link , & dn , & attr , & value ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
convert_to_string_ex ( link ) ;
ldap = _get_ldap_link ( link ) ;
if ( ldap = = NULL ) RETURN_LONG ( - 1 ) ;
convert_to_string_ex ( dn ) ;
convert_to_string_ex ( attr ) ;
convert_to_string_ex ( value ) ;
ldap_dn = ( * dn ) - > value . str . val ;
ldap_attr = ( * attr ) - > value . str . val ;
ldap_value = ( * value ) - > value . str . val ;
errno = ldap_compare_s ( ldap , ldap_dn , ldap_attr , ldap_value ) ;
switch ( errno ) {
case LDAP_COMPARE_TRUE :
RETURN_TRUE ;
break ;
case LDAP_COMPARE_FALSE :
RETURN_FALSE ;
break ;
}
php_error ( E_WARNING , " LDAP: Compare operation could not be completed: %s " , ldap_err2string ( errno ) ) ;
RETURN_LONG ( - 1 ) ;
}
/* }}} */
2000-08-02 21:11:46 +08:00
# ifdef STR_TRANSLATION
static void php_ldap_do_translate ( INTERNAL_FUNCTION_PARAMETERS , int way ) {
zval * * value ;
char * ldap_buf ;
unsigned long ldap_len ;
int result ;
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & value ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
convert_to_string_ex ( value ) ;
ldap_buf = ( * value ) - > value . str . val ;
ldap_len = ( * value ) - > value . str . len ;
if ( ldap_len = = 0 ) {
RETURN_FALSE ;
}
if ( way = = 1 ) {
result = ldap_8859_to_t61 ( & ldap_buf , & ldap_len , 0 ) ;
} else {
result = ldap_t61_to_8859 ( & ldap_buf , & ldap_len , 0 ) ;
}
if ( result = = LDAP_SUCCESS ) {
RETVAL_STRINGL ( ldap_buf , ldap_len , 1 ) ;
free ( ldap_buf ) ;
} else {
php_error ( E_ERROR , " LDAP: Conversion from iso-8859-1 to t61 failed. " ) ;
RETVAL_FALSE ;
}
return ;
}
/* {{{ proto string ldap_t61_to_8859(string value)
Translate t61 characters to 8859 characters */
PHP_FUNCTION ( ldap_t61_to_8859 ) {
php_ldap_do_translate ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 ) ;
}
/* }}} */
/* {{{ proto string ldap_8859_to_t61(string value)
Translate 8859 characters to t61 characters */
PHP_FUNCTION ( ldap_8859_to_t61 ) {
php_ldap_do_translate ( INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 ) ;
}
/* }}} */
# endif