1998-05-06 17:43:44 +00:00
/*
Unix SMB / Netbios implementation .
1999-12-13 13:27:58 +00:00
Version 1.9 .
1998-05-06 17:43:44 +00:00
LDAP protocol helper functions for SAMBA
Copyright ( C ) Jean Fran <EFBFBD> ois Micouleau 1998
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
1998-12-07 21:37:17 +00:00
# ifdef WITH_LDAP
1999-12-13 13:27:58 +00:00
# include "includes.h"
1998-05-18 14:43:06 +00:00
# include <lber.h>
1998-05-18 14:55:17 +00:00
# include <ldap.h>
1998-05-18 14:43:06 +00:00
1999-12-13 13:27:58 +00:00
# define ADD_USER 1
# define MODIFY_USER 2
1998-05-06 17:43:44 +00:00
extern int DEBUGLEVEL ;
1999-12-13 13:27:58 +00:00
/*******************************************************************
open a connection to the ldap serve .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL ldap_open_connection ( LDAP * * ldap_struct )
{
if ( ( * ldap_struct = ldap_open ( lp_ldap_server ( ) , lp_ldap_port ( ) ) ) = = NULL )
{
DEBUG ( 0 , ( " The LDAP server is not responding ! \n " ) ) ;
return ( False ) ;
}
DEBUG ( 2 , ( " ldap_open_connection: connection opened \n " ) ) ;
return ( True ) ;
}
1998-05-06 17:43:44 +00:00
1999-12-13 13:27:58 +00:00
/*******************************************************************
connect anonymously to the ldap server .
FIXME : later ( jfm )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL ldap_connect_anonymous ( LDAP * ldap_struct )
{
if ( ldap_simple_bind_s ( ldap_struct , lp_ldap_root ( ) , lp_ldap_rootpasswd ( ) ) ! = LDAP_SUCCESS )
{
DEBUG ( 0 , ( " Couldn't bind to the LDAP server ! \n " ) ) ;
return ( False ) ;
}
return ( True ) ;
}
1998-05-06 17:43:44 +00:00
/*******************************************************************
1999-12-13 13:27:58 +00:00
connect to the ldap server under system privileg .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL ldap_connect_system ( LDAP * ldap_struct )
{
if ( ldap_simple_bind_s ( ldap_struct , lp_ldap_root ( ) , lp_ldap_rootpasswd ( ) ) ! = LDAP_SUCCESS )
{
DEBUG ( 0 , ( " Couldn't bind to the LDAP server! \n " ) ) ;
return ( False ) ;
}
DEBUG ( 2 , ( " ldap_connect_system: succesful connection to the LDAP server \n " ) ) ;
return ( True ) ;
}
1998-05-06 17:43:44 +00:00
1999-12-13 13:27:58 +00:00
/*******************************************************************
connect to the ldap server under a particular user .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL ldap_connect_user ( LDAP * ldap_struct , char * user , char * password )
1998-05-06 17:43:44 +00:00
{
1999-12-13 13:27:58 +00:00
if ( ldap_simple_bind_s ( ldap_struct , lp_ldap_root ( ) , lp_ldap_rootpasswd ( ) ) ! = LDAP_SUCCESS )
{
DEBUG ( 0 , ( " Couldn't bind to the LDAP server ! \n " ) ) ;
return ( False ) ;
}
DEBUG ( 2 , ( " ldap_connect_user: succesful connection to the LDAP server \n " ) ) ;
return ( True ) ;
}
1998-05-06 17:43:44 +00:00
1999-12-13 13:27:58 +00:00
/*******************************************************************
run the search by name .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL ldap_search_one_user ( LDAP * ldap_struct , char * filter , LDAPMessage * * result )
{
int scope = LDAP_SCOPE_ONELEVEL ;
int rc ;
DEBUG ( 2 , ( " ldap_search_one_user: searching for:[%s] \n " , filter ) ) ;
rc = ldap_search_s ( ldap_struct , lp_ldap_suffix ( ) , scope , filter , NULL , 0 , result ) ;
if ( rc ! = LDAP_SUCCESS )
{
DEBUG ( 0 , ( " Problem during the LDAP search \n " ) ) ;
return ( False ) ;
1998-05-06 17:43:44 +00:00
}
1999-12-13 13:27:58 +00:00
return ( True ) ;
}
1998-05-06 17:43:44 +00:00
1999-12-13 13:27:58 +00:00
/*******************************************************************
run the search by name .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL ldap_search_one_user_by_name ( LDAP * ldap_struct , char * user , LDAPMessage * * result )
{
pstring filter ;
/*
in the filter expression , replace % u with the real name
so in ldap filter , % u MUST exist : - )
*/
pstrcpy ( filter , lp_ldap_filter ( ) ) ;
pstring_sub ( filter , " %u " , user ) ;
if ( ! ldap_search_one_user ( ldap_struct , filter , result ) )
{
return ( False ) ;
1998-05-06 17:43:44 +00:00
}
1999-12-13 13:27:58 +00:00
return ( True ) ;
}
1998-05-06 17:43:44 +00:00
1999-12-13 13:27:58 +00:00
/*******************************************************************
run the search by uid .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL ldap_search_one_user_by_uid ( LDAP * ldap_struct , int uid , LDAPMessage * * result )
{
pstring filter ;
slprintf ( filter , sizeof ( pstring ) - 1 , " uidAccount = %d " , uid ) ;
if ( ! ldap_search_one_user ( ldap_struct , filter , result ) )
{
return ( False ) ;
}
1998-05-06 17:43:44 +00:00
return ( True ) ;
}
1998-12-08 00:30:23 +00:00
/*******************************************************************
1999-12-13 13:27:58 +00:00
search an attribute and return the first value found .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void get_single_attribute ( LDAP * ldap_struct , LDAPMessage * entry , char * attribute , char * value )
{
char * * valeurs ;
if ( ( valeurs = ldap_get_values ( ldap_struct , entry , attribute ) ) ! = NULL )
{
pstrcpy ( value , valeurs [ 0 ] ) ;
ldap_value_free ( valeurs ) ;
DEBUG ( 3 , ( " get_single_attribute: [%s] = [%s] \n " , attribute , value ) ) ;
}
else
{
value = NULL ;
}
}
1998-12-08 00:30:23 +00:00
1999-12-13 13:27:58 +00:00
/*******************************************************************
check if the returned entry is a sambaAccount objectclass .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL ldap_check_user ( LDAP * ldap_struct , LDAPMessage * entry )
1998-05-06 17:43:44 +00:00
{
1999-12-13 13:27:58 +00:00
BOOL sambaAccount = False ;
char * * valeur ;
int i ;
1998-05-06 17:43:44 +00:00
1999-12-13 13:27:58 +00:00
DEBUG ( 2 , ( " ldap_check_user: " ) ) ;
valeur = ldap_get_values ( ldap_struct , entry , " objectclass " ) ;
if ( valeur ! = NULL )
{
for ( i = 0 ; valeur [ i ] ! = NULL ; i + + )
{
if ( ! strcmp ( valeur [ i ] , " sambaAccount " ) ) sambaAccount = True ;
}
}
DEBUG ( 2 , ( " %s \n " , sambaAccount ? " yes " : " no " ) ) ;
ldap_value_free ( valeur ) ;
return ( sambaAccount ) ;
}
1998-05-06 17:43:44 +00:00
1999-12-13 13:27:58 +00:00
/*******************************************************************
check if the returned entry is a sambaTrust objectclass .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL ldap_check_trust ( LDAP * ldap_struct , LDAPMessage * entry )
{
BOOL sambaTrust = False ;
char * * valeur ;
int i ;
1998-05-06 17:43:44 +00:00
1999-12-13 13:27:58 +00:00
DEBUG ( 2 , ( " ldap_check_trust: " ) ) ;
valeur = ldap_get_values ( ldap_struct , entry , " objectclass " ) ;
if ( valeur ! = NULL )
{
for ( i = 0 ; valeur [ i ] ! = NULL ; i + + )
{
if ( ! strcmp ( valeur [ i ] , " sambaTrust " ) ) sambaTrust = True ;
}
}
DEBUG ( 2 , ( " %s \n " , sambaTrust ? " yes " : " no " ) ) ;
ldap_value_free ( valeur ) ;
return ( sambaTrust ) ;
1998-05-06 17:43:44 +00:00
}
/*******************************************************************
1999-12-13 13:27:58 +00:00
retrieve the user ' s info and contruct a smb_passwd structure .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void ldap_get_smb_passwd ( LDAP * ldap_struct , LDAPMessage * entry ,
struct smb_passwd * user )
{
static pstring user_name ;
static pstring user_pass ;
static pstring temp ;
static unsigned char smblmpwd [ 16 ] ;
static unsigned char smbntpwd [ 16 ] ;
1998-05-12 16:49:26 +00:00
1999-12-13 13:27:58 +00:00
pdb_init_smb ( user ) ;
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
memset ( ( char * ) smblmpwd , ' \0 ' , sizeof ( smblmpwd ) ) ;
memset ( ( char * ) smbntpwd , ' \0 ' , sizeof ( smbntpwd ) ) ;
1998-05-12 16:49:26 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " cn " , user_name ) ;
DEBUG ( 2 , ( " ldap_get_smb_passwd: user: %s \n " , user_name ) ) ;
# ifdef LDAP_PLAINTEXT_PASSWORD
get_single_attribute ( ldap_struct , entry , " userPassword " , temp ) ;
nt_lm_owf_gen ( temp , user - > smb_nt_passwd , user - > smb_passwd ) ;
memset ( ( char * ) temp , ' \0 ' , sizeof ( temp ) ) ; /* destroy local copy of the password */
# else
get_single_attribute ( ldap_struct , entry , " unicodePwd " , temp ) ;
pdb_gethexpwd ( temp , smbntpwd ) ;
memset ( ( char * ) temp , ' \0 ' , sizeof ( temp ) ) ; /* destroy local copy of the password */
1998-05-12 16:49:26 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " dBCSPwd " , temp ) ;
pdb_gethexpwd ( temp , smblmpwd ) ;
memset ( ( char * ) temp , ' \0 ' , sizeof ( temp ) ) ; /* destroy local copy of the password */
# endif
get_single_attribute ( ldap_struct , entry , " userAccountControl " , temp ) ;
user - > acct_ctrl = pdb_decode_acct_ctrl ( temp ) ;
1998-05-12 16:49:26 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " pwdLastSet " , temp ) ;
user - > pass_last_set_time = ( time_t ) strtol ( temp , NULL , 16 ) ;
1998-05-12 16:49:26 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " rid " , temp ) ;
1998-05-12 16:49:26 +00:00
1999-12-13 13:27:58 +00:00
/* the smb (unix) ids are not stored: they are created */
user - > smb_userid = pdb_user_rid_to_uid ( atoi ( temp ) ) ;
1998-05-12 16:49:26 +00:00
1999-12-13 13:27:58 +00:00
if ( user - > acct_ctrl & ( ACB_DOMTRUST | ACB_WSTRUST | ACB_SVRTRUST ) )
{
DEBUG ( 0 , ( " Inconsistency in the LDAP database \n " ) ) ;
}
if ( user - > acct_ctrl & ACB_NORMAL )
{
user - > smb_name = user_name ;
user - > smb_passwd = smblmpwd ;
user - > smb_nt_passwd = smbntpwd ;
}
1998-05-12 16:49:26 +00:00
}
1999-12-13 13:27:58 +00:00
/*******************************************************************
retrieve the user ' s info and contruct a sam_passwd structure .
calls ldap_get_smb_passwd function first , though , to save code duplication .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void ldap_get_sam_passwd ( LDAP * ldap_struct , LDAPMessage * entry ,
struct sam_passwd * user )
{
static pstring user_name ;
static pstring fullname ;
static pstring home_dir ;
static pstring dir_drive ;
static pstring logon_script ;
static pstring profile_path ;
static pstring acct_desc ;
static pstring workstations ;
static pstring temp ;
static struct smb_passwd pw_buf ;
pdb_init_sam ( user ) ;
ldap_get_smb_passwd ( ldap_struct , entry , & pw_buf ) ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
user - > pass_last_set_time = pw_buf . pass_last_set_time ;
1998-05-06 17:43:44 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " logonTime " , temp ) ;
user - > pass_last_set_time = ( time_t ) strtol ( temp , NULL , 16 ) ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " logoffTime " , temp ) ;
user - > pass_last_set_time = ( time_t ) strtol ( temp , NULL , 16 ) ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " kickoffTime " , temp ) ;
user - > pass_last_set_time = ( time_t ) strtol ( temp , NULL , 16 ) ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " pwdLastSet " , temp ) ;
user - > pass_last_set_time = ( time_t ) strtol ( temp , NULL , 16 ) ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " pwdCanChange " , temp ) ;
user - > pass_last_set_time = ( time_t ) strtol ( temp , NULL , 16 ) ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " pwdMustChange " , temp ) ;
user - > pass_last_set_time = ( time_t ) strtol ( temp , NULL , 16 ) ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
user - > smb_name = pw_buf . smb_name ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
DEBUG ( 2 , ( " ldap_get_sam_passwd: user: %s \n " , user_name ) ) ;
get_single_attribute ( ldap_struct , entry , " userFullName " , fullname ) ;
user - > full_name = fullname ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " homeDirectory " , home_dir ) ;
user - > home_dir = home_dir ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " homeDrive " , dir_drive ) ;
user - > dir_drive = dir_drive ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " scriptPath " , logon_script ) ;
user - > logon_script = logon_script ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " profilePath " , profile_path ) ;
user - > profile_path = profile_path ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " comment " , acct_desc ) ;
user - > acct_desc = acct_desc ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " userWorkstations " , workstations ) ;
user - > workstations = workstations ;
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
user - > unknown_str = NULL ; /* don't know, yet! */
user - > munged_dial = NULL ; /* "munged" dial-back telephone number */
1998-12-07 21:37:17 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " rid " , temp ) ;
user - > user_rid = atoi ( temp ) ;
1998-12-07 21:37:17 +00:00
1999-12-13 13:27:58 +00:00
get_single_attribute ( ldap_struct , entry , " primaryGroupID " , temp ) ;
user - > group_rid = atoi ( temp ) ;
/* the smb (unix) ids are not stored: they are created */
user - > smb_userid = pw_buf . smb_userid ;
user - > smb_grpid = group_rid_to_uid ( user - > group_rid ) ;
user - > acct_ctrl = pw_buf . acct_ctrl ;
1998-05-07 18:19:05 +00:00
1999-12-13 13:27:58 +00:00
user - > unknown_3 = 0xffffff ; /* don't know */
user - > logon_divs = 168 ; /* hours per week */
user - > hours_len = 21 ; /* 21 times 8 bits = 168 */
memset ( user - > hours , 0xff , user - > hours_len ) ; /* available at all hours */
user - > unknown_5 = 0x00020000 ; /* don't know */
user - > unknown_5 = 0x000004ec ; /* don't know */
if ( user - > acct_ctrl & ( ACB_DOMTRUST | ACB_WSTRUST | ACB_SVRTRUST ) )
{
DEBUG ( 0 , ( " Inconsistency in the LDAP database \n " ) ) ;
}
if ( ! ( user - > acct_ctrl & ACB_NORMAL ) )
{
DEBUG ( 0 , ( " User's acct_ctrl bits not set to ACT_NORMAL in LDAP database \n " ) ) ;
return ;
}
}
1998-12-07 21:37:17 +00:00
1998-05-18 11:54:00 +00:00
/************************************************************************
1999-12-13 13:27:58 +00:00
Routine to manage the LDAPMod structure array
manage memory used by the array , by each struct , and values
1998-05-18 11:54:00 +00:00
1999-12-13 13:27:58 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void make_a_mod ( LDAPMod * * * modlist , int modop , char * attribute , char * value )
1998-05-18 14:06:49 +00:00
{
LDAPMod * * mods ;
int i ;
int j ;
mods = * modlist ;
1999-12-13 13:27:58 +00:00
if ( mods = = NULL )
{
mods = ( LDAPMod * * ) malloc ( sizeof ( LDAPMod * ) ) ;
if ( mods = = NULL )
{
DEBUG ( 0 , ( " make_a_mod: out of memory! \n " ) ) ;
return ;
}
1998-05-18 14:06:49 +00:00
mods [ 0 ] = NULL ;
}
1999-12-13 13:27:58 +00:00
for ( i = 0 ; mods [ i ] ! = NULL ; + + i )
{
if ( mods [ i ] - > mod_op = = modop & &
! strcasecmp ( mods [ i ] - > mod_type , attribute ) )
{
1998-05-18 14:06:49 +00:00
break ;
}
}
1999-12-13 13:27:58 +00:00
if ( mods [ i ] = = NULL )
{
mods = ( LDAPMod * * ) realloc ( mods , ( i + 2 ) * sizeof ( LDAPMod * ) ) ;
if ( mods = = NULL )
{
DEBUG ( 0 , ( " make_a_mod: out of memory! \n " ) ) ;
return ;
}
mods [ i ] = ( LDAPMod * ) malloc ( sizeof ( LDAPMod ) ) ;
if ( mods [ i ] = = NULL )
{
DEBUG ( 0 , ( " make_a_mod: out of memory! \n " ) ) ;
return ;
}
1998-05-18 14:06:49 +00:00
mods [ i ] - > mod_op = modop ;
mods [ i ] - > mod_values = NULL ;
1999-12-13 13:27:58 +00:00
mods [ i ] - > mod_type = strdup ( attribute ) ;
1998-05-18 14:06:49 +00:00
mods [ i + 1 ] = NULL ;
}
1999-12-13 13:27:58 +00:00
if ( value ! = NULL )
{
1998-05-18 14:06:49 +00:00
j = 0 ;
1999-12-13 13:27:58 +00:00
if ( mods [ i ] - > mod_values ! = NULL )
{
for ( ; mods [ i ] - > mod_values [ j ] ! = NULL ; j + + ) ;
1998-05-18 14:06:49 +00:00
}
1999-12-13 13:27:58 +00:00
mods [ i ] - > mod_values = ( char * * ) realloc ( mods [ i ] - > mod_values ,
( j + 2 ) * sizeof ( char * ) ) ;
if ( mods [ i ] - > mod_values = = NULL )
{
DEBUG ( 0 , " make_a_mod: Memory allocation failure! \n " ) ;
return ;
}
mods [ i ] - > mod_values [ j ] = strdup ( value ) ;
mods [ i ] - > mod_values [ j + 1 ] = NULL ;
1998-05-18 14:06:49 +00:00
}
* modlist = mods ;
}
/************************************************************************
1999-12-13 13:27:58 +00:00
Add or modify an entry . Only the smb struct values
1998-05-18 11:54:00 +00:00
1999-12-13 13:27:58 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL modadd_ldappwd_entry ( struct smb_passwd * newpwd , int flag )
1998-05-18 11:54:00 +00:00
{
1999-12-13 13:27:58 +00:00
/* assume the struct is correct and filled
that ' s the job of passdb . c to check */
int scope = LDAP_SCOPE_ONELEVEL ;
int rc ;
char * smb_name ;
int trust = False ;
int ldap_state ;
pstring filter ;
pstring dn ;
pstring lmhash ;
pstring nthash ;
pstring rid ;
pstring lst ;
pstring temp ;
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
LDAP * ldap_struct ;
LDAPMessage * result ;
LDAPMod * * mods ;
smb_name = newpwd - > smb_name ;
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
if ( ! ldap_open_connection ( & ldap_struct ) ) /* open a connection to the server */
{
return False ;
}
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
if ( ! ldap_connect_system ( ldap_struct ) ) /* connect as system account */
{
ldap_unbind ( ldap_struct ) ;
return False ;
}
if ( smb_name [ strlen ( smb_name ) - 1 ] = = ' $ ' )
{
smb_name [ strlen ( smb_name ) - 1 ] = ' \0 ' ;
trust = True ;
1998-05-18 14:06:49 +00:00
}
1999-12-13 13:27:58 +00:00
slprintf ( filter , sizeof ( filter ) - 1 ,
" (&(cn = %s)(|(objectclass = sambaTrust)(objectclass = sambaAccount))) " ,
smb_name ) ;
rc = ldap_search_s ( ldap_struct , lp_ldap_suffix ( ) , scope , filter , NULL , 0 , & result ) ;
switch ( flag )
{
case ADD_USER :
{
if ( ldap_count_entries ( ldap_struct , result ) ! = 0 )
{
DEBUG ( 0 , ( " User already in the base, with samba properties \n " ) ) ;
ldap_unbind ( ldap_struct ) ;
return False ;
}
ldap_state = LDAP_MOD_ADD ;
break ;
}
case MODIFY_USER :
{
if ( ldap_count_entries ( ldap_struct , result ) ! = 1 )
{
DEBUG ( 0 , ( " No user to modify ! \n " ) ) ;
ldap_unbind ( ldap_struct ) ;
return False ;
}
ldap_state = LDAP_MOD_REPLACE ;
break ;
}
default :
{
DEBUG ( 0 , ( " How did you come here? \n " ) ) ;
ldap_unbind ( ldap_struct ) ;
return False ;
break ;
}
1998-05-18 14:06:49 +00:00
}
1999-12-13 13:27:58 +00:00
slprintf ( dn , sizeof ( dn ) - 1 , " cn = %s, %s " , smb_name , lp_ldap_suffix ( ) ) ;
1998-12-07 21:37:17 +00:00
1999-12-13 13:27:58 +00:00
if ( newpwd - > smb_passwd ! = NULL )
{
int i ;
for ( i = 0 ; i < 16 ; i + + )
{
slprintf ( & temp [ 2 * i ] , sizeof ( temp ) - 1 , " %02X " , newpwd - > smb_passwd [ i ] ) ;
}
1998-05-18 14:06:49 +00:00
}
1999-12-13 13:27:58 +00:00
else
{
if ( newpwd - > acct_ctrl & ACB_PWNOTREQ )
{
slprintf ( temp , sizeof ( temp ) - 1 , " NO PASSWORDXXXXXXXXXXXXXXXXXXXXX " ) ;
}
else
{
slprintf ( temp , sizeof ( temp ) - 1 , " XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " ) ;
}
}
slprintf ( lmhash , sizeof ( lmhash ) - 1 , " %s " , temp ) ;
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
if ( newpwd - > smb_nt_passwd ! = NULL )
{
int i ;
for ( i = 0 ; i < 16 ; i + + )
{
slprintf ( & temp [ 2 * i ] , sizeof ( temp ) - 1 , " %02X " , newpwd - > smb_nt_passwd [ i ] ) ;
}
}
else
{
if ( newpwd - > acct_ctrl & ACB_PWNOTREQ )
{
slprintf ( temp , sizeof ( temp ) - 1 , " NO PASSWORDXXXXXXXXXXXXXXXXXXXXX " ) ;
}
else
{
slprintf ( temp , sizeof ( temp ) - 1 , " XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " ) ;
}
}
slprintf ( nthash , sizeof ( nthash ) - 1 , " %s " , temp ) ;
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
slprintf ( rid , sizeof ( rid ) - 1 , " %d " , uid_to_user_rid ( newpwd - > smb_userid ) ) ;
slprintf ( lst , sizeof ( lst ) - 1 , " %08X " , newpwd - > pass_last_set_time ) ;
mods = NULL ;
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
if ( trust )
{
make_a_mod ( & mods , ldap_state , " objectclass " , " sambaTrust " ) ;
make_a_mod ( & mods , ldap_state , " netbiosTrustName " , smb_name ) ;
make_a_mod ( & mods , ldap_state , " trustPassword " , nthash ) ;
}
else
{
make_a_mod ( & mods , ldap_state , " objectclass " , " sambaAccount " ) ;
make_a_mod ( & mods , ldap_state , " dBCSPwd " , lmhash ) ;
make_a_mod ( & mods , ldap_state , " uid " , smb_name ) ;
make_a_mod ( & mods , ldap_state , " unicodePwd " , nthash ) ;
}
make_a_mod ( & mods , ldap_state , " cn " , smb_name ) ;
make_a_mod ( & mods , ldap_state , " rid " , rid ) ;
make_a_mod ( & mods , ldap_state , " pwdLastSet " , lst ) ;
make_a_mod ( & mods , ldap_state , " userAccountControl " , pdb_encode_acct_ctrl ( newpwd - > acct_ctrl , NEW_PW_FORMAT_SPACE_PADDED_LEN ) ) ;
switch ( flag )
{
case ADD_USER :
{
ldap_add_s ( ldap_struct , dn , mods ) ;
DEBUG ( 2 , ( " modadd_ldappwd_entry: added: cn = %s in the LDAP database \n " , smb_name ) ) ;
break ;
}
case MODIFY_USER :
{
ldap_modify_s ( ldap_struct , dn , mods ) ;
DEBUG ( 2 , ( " modadd_ldappwd_entry: changed: cn = %s in the LDAP database_n " , smb_name ) ) ;
break ;
}
default :
{
DEBUG ( 2 , ( " modadd_ldappwd_entry: How did you come here? \n " ) ) ;
ldap_unbind ( ldap_struct ) ;
return False ;
break ;
}
}
ldap_mods_free ( mods , 1 ) ;
ldap_unbind ( ldap_struct ) ;
return True ;
}
1998-05-18 14:06:49 +00:00
1998-12-07 21:37:17 +00:00
/************************************************************************
1999-12-13 13:27:58 +00:00
Add or modify an entry . everything except the smb struct
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL modadd_ldap21pwd_entry ( struct sam_passwd * newpwd , int flag )
1998-05-18 14:06:49 +00:00
{
1999-12-13 13:27:58 +00:00
/* assume the struct is correct and filled
that ' s the job of passdb . c to check */
int scope = LDAP_SCOPE_ONELEVEL ;
int rc ;
char * smb_name ;
int trust = False ;
int ldap_state ;
1999-01-15 05:00:26 +00:00
pstring filter ;
1999-12-13 13:27:58 +00:00
pstring dn ;
pstring lmhash ;
pstring nthash ;
pstring rid ;
pstring lst ;
pstring temp ;
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
LDAP * ldap_struct ;
LDAPMessage * result ;
LDAPMod * * mods ;
smb_name = newpwd - > smb_name ;
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
if ( ! ldap_open_connection ( & ldap_struct ) ) /* open a connection to the server */
{
return False ;
}
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
if ( ! ldap_connect_system ( ldap_struct ) ) /* connect as system account */
1999-01-15 05:00:26 +00:00
{
1999-12-13 13:27:58 +00:00
ldap_unbind ( ldap_struct ) ;
return False ;
1999-01-15 05:00:26 +00:00
}
1999-12-13 13:27:58 +00:00
if ( smb_name [ strlen ( smb_name ) - 1 ] = = ' $ ' )
1999-01-15 05:00:26 +00:00
{
1999-12-13 13:27:58 +00:00
smb_name [ strlen ( smb_name ) - 1 ] = ' \0 ' ;
trust = True ;
1999-01-15 05:00:26 +00:00
}
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
slprintf ( filter , sizeof ( filter ) - 1 ,
" (&(cn = %s)(|(objectclass = sambaTrust)(objectclass = sambaAccount))) " ,
smb_name ) ;
rc = ldap_search_s ( ldap_struct , lp_ldap_suffix ( ) , scope , filter , NULL , 0 , & result ) ;
switch ( flag )
1999-01-15 05:00:26 +00:00
{
1999-12-13 13:27:58 +00:00
case ADD_USER :
{
if ( ldap_count_entries ( ldap_struct , result ) ! = 1 )
{
DEBUG ( 2 , ( " User already in the base, with samba properties \n " ) ) ;
ldap_unbind ( ldap_struct ) ;
return False ;
}
ldap_state = LDAP_MOD_ADD ;
break ;
}
case MODIFY_USER :
{
if ( ldap_count_entries ( ldap_struct , result ) ! = 1 )
{
DEBUG ( 2 , ( " No user to modify ! \n " ) ) ;
ldap_unbind ( ldap_struct ) ;
return False ;
}
ldap_state = LDAP_MOD_REPLACE ;
break ;
}
default :
{
DEBUG ( 2 , ( " How did you come here? \n " ) ) ;
ldap_unbind ( ldap_struct ) ;
return False ;
break ;
}
1998-05-18 14:06:49 +00:00
}
1999-12-13 13:27:58 +00:00
slprintf ( dn , sizeof ( dn ) - 1 , " cn = %s, %s " , smb_name , lp_ldap_suffix ( ) ) ;
mods = NULL ;
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
if ( trust )
{
}
else
{
}
make_a_mod ( & mods , ldap_state , " cn " , smb_name ) ;
make_a_mod ( & mods , ldap_state , " rid " , rid ) ;
make_a_mod ( & mods , ldap_state , " pwdLastSet " , lst ) ;
make_a_mod ( & mods , ldap_state , " userAccountControl " , pdb_encode_acct_ctrl ( newpwd - > acct_ctrl , NEW_PW_FORMAT_SPACE_PADDED_LEN ) ) ;
ldap_modify_s ( ldap_struct , dn , mods ) ;
1998-05-18 14:06:49 +00:00
ldap_mods_free ( mods , 1 ) ;
1999-12-13 13:27:58 +00:00
ldap_unbind ( ldap_struct ) ;
return True ;
1998-05-18 11:54:00 +00:00
}
1999-12-13 13:27:58 +00:00
/************************************************************************
Routine to add an entry to the ldap passwd file .
do not call this function directly . use passdb . c instead .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL add_ldappwd_entry ( struct smb_passwd * newpwd )
{
return ( modadd_ldappwd_entry ( newpwd , ADD_USER ) ) ;
}
1998-05-07 20:44:45 +00:00
1999-01-15 05:00:26 +00:00
/************************************************************************
1999-12-13 13:27:58 +00:00
Routine to search the ldap passwd file for an entry matching the username .
and then modify its password entry . We can ' t use the startldappwent ( ) /
getldappwent ( ) / endldappwent ( ) interfaces here as we depend on looking
in the actual file to decide how much room we have to write data .
override = False , normal
override = True , override XXXXXXXX ' d out password or NO PASS
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
do not call this function directly . use passdb . c instead .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL mod_ldappwd_entry ( struct smb_passwd * pwd , BOOL override )
1999-01-15 05:00:26 +00:00
{
1999-12-13 13:27:58 +00:00
return ( modadd_ldappwd_entry ( pwd , MODIFY_USER ) ) ;
}
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
/************************************************************************
Routine to add an entry to the ldap passwd file .
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
do not call this function directly . use passdb . c instead .
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL add_ldap21pwd_entry ( struct sam_passwd * newpwd )
{
return ( modadd_ldappwd_entry ( newpwd , ADD_USER ) ?
modadd_ldap21pwd_entry ( newpwd , ADD_USER ) : False ) ;
}
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
/************************************************************************
Routine to search the ldap passwd file for an entry matching the username .
and then modify its password entry . We can ' t use the startldappwent ( ) /
getldappwent ( ) / endldappwent ( ) interfaces here as we depend on looking
in the actual file to decide how much room we have to write data .
override = False , normal
override = True , override XXXXXXXX ' d out password or NO PASS
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
do not call this function directly . use passdb . c instead .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL mod_ldap21pwd_entry ( struct sam_passwd * pwd , BOOL override )
{
return ( modadd_ldappwd_entry ( pwd , MODIFY_USER ) ?
modadd_ldap21pwd_entry ( pwd , MODIFY_USER ) : False ) ;
}
struct ldap_enum_info
{
LDAP * ldap_struct ;
LDAPMessage * result ;
LDAPMessage * entry ;
} ;
static struct ldap_enum_info ldap_ent ;
/***************************************************************
Start to enumerate the ldap passwd list . Returns a void pointer
to ensure no modification outside this module .
do not call this function directly . use passdb . c instead .
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void * startldappwent ( BOOL update )
{
int scope = LDAP_SCOPE_ONELEVEL ;
int rc ;
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
pstring filter ;
if ( ! ldap_open_connection ( & ldap_ent . ldap_struct ) ) /* open a connection to the server */
1999-01-15 05:00:26 +00:00
{
1999-12-13 13:27:58 +00:00
return NULL ;
1999-01-15 05:00:26 +00:00
}
1999-12-13 13:27:58 +00:00
if ( ! ldap_connect_system ( ldap_ent . ldap_struct ) ) /* connect as system account */
{
return NULL ;
}
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
/* when the class is known the search is much faster */
switch ( 0 )
1999-01-15 05:00:26 +00:00
{
1999-12-13 13:27:58 +00:00
case 1 :
{
pstrcpy ( filter , " objectclass = sambaAccount " ) ;
break ;
}
case 2 :
{
pstrcpy ( filter , " objectclass = sambaTrust " ) ;
break ;
}
default :
{
pstrcpy ( filter , " (|(objectclass = sambaTrust)(objectclass = sambaAccount)) " ) ;
break ;
}
1999-01-15 05:00:26 +00:00
}
1999-12-13 13:27:58 +00:00
rc = ldap_search_s ( ldap_ent . ldap_struct , lp_ldap_suffix ( ) , scope , filter , NULL , 0 , & ldap_ent . result ) ;
DEBUG ( 2 , ( " %d entries in the base! \n " , ldap_count_entries ( ldap_ent . ldap_struct , ldap_ent . result ) ) ) ;
ldap_ent . entry = ldap_first_entry ( ldap_ent . ldap_struct , ldap_ent . result ) ;
return & ldap_ent ;
1999-01-15 05:00:26 +00:00
}
1999-12-13 13:27:58 +00:00
/*************************************************************************
Routine to return the next entry in the ldap passwd list .
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
do not call this function directly . use passdb . c instead .
1998-05-07 20:44:45 +00:00
1999-12-13 13:27:58 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct smb_passwd * getldappwent ( void * vp )
1998-05-07 20:44:45 +00:00
{
1999-12-13 13:27:58 +00:00
static struct smb_passwd user ;
struct ldap_enum_info * ldap_vp = ( struct ldap_enum_info * ) vp ;
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
ldap_vp - > entry = ldap_next_entry ( ldap_vp - > ldap_struct , ldap_vp - > entry ) ;
1998-05-18 14:06:49 +00:00
1999-12-13 13:27:58 +00:00
if ( ldap_vp - > entry ! = NULL )
{
ldap_get_smb_passwd ( ldap_vp - > ldap_struct , ldap_vp - > entry , & user ) ;
return & user ;
}
return NULL ;
1998-05-07 20:44:45 +00:00
}
1999-12-13 13:27:58 +00:00
/*************************************************************************
Routine to return the next entry in the ldap passwd list .
1998-05-18 11:54:00 +00:00
1999-12-13 13:27:58 +00:00
do not call this function directly . use passdb . c instead .
1998-05-07 20:44:45 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 13:27:58 +00:00
static struct sam_passwd * getldap21pwent ( void * vp )
1998-12-07 21:37:17 +00:00
{
1999-12-13 13:27:58 +00:00
static struct sam_passwd user ;
struct ldap_enum_info * ldap_vp = ( struct ldap_enum_info * ) vp ;
1998-05-11 18:03:01 +00:00
1999-12-13 13:27:58 +00:00
ldap_vp - > entry = ldap_next_entry ( ldap_vp - > ldap_struct , ldap_vp - > entry ) ;
if ( ldap_vp - > entry ! = NULL )
{
ldap_get_sam_passwd ( ldap_vp - > ldap_struct , ldap_vp - > entry , & user ) ;
return & user ;
}
return NULL ;
1998-05-07 21:09:58 +00:00
}
1999-12-13 13:27:58 +00:00
/***************************************************************
End enumeration of the ldap passwd list .
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
do not call this function directly . use passdb . c instead .
1998-05-11 15:56:01 +00:00
1999-12-13 13:27:58 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void endldappwent ( void * vp )
1998-05-07 21:09:58 +00:00
{
1999-12-13 13:27:58 +00:00
struct ldap_enum_info * ldap_vp = ( struct ldap_enum_info * ) vp ;
ldap_msgfree ( ldap_vp - > result ) ;
ldap_unbind ( ldap_vp - > ldap_struct ) ;
}
1998-05-07 20:44:45 +00:00
1999-12-13 13:27:58 +00:00
/*************************************************************************
Return the current position in the ldap passwd list as an SMB_BIG_UINT .
This must be treated as an opaque token .
1998-05-07 20:44:45 +00:00
1999-12-13 13:27:58 +00:00
do not call this function directly . use passdb . c instead .
1998-05-07 20:44:45 +00:00
1999-12-13 13:27:58 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static SMB_BIG_UINT getldappwpos ( void * vp )
1998-05-07 20:44:45 +00:00
{
1999-12-13 13:27:58 +00:00
return ( SMB_BIG_UINT ) 0 ;
}
1998-05-07 18:19:05 +00:00
1999-12-13 13:27:58 +00:00
/*************************************************************************
Set the current position in the ldap passwd list from SMB_BIG_UINT .
This must be treated as an opaque token .
1998-05-18 23:57:28 +00:00
1999-12-13 13:27:58 +00:00
do not call this function directly . use passdb . c instead .
1998-05-18 23:57:28 +00:00
1999-12-13 13:27:58 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL setldappwpos ( void * vp , SMB_BIG_UINT tok )
{
return False ;
1998-05-18 23:57:28 +00:00
}
1999-12-13 13:27:58 +00:00
/*
* Ldap derived functions .
*/
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
static struct smb_passwd * getldappwnam ( char * name )
{
return pdb_sam_to_smb ( iterate_getsam21pwnam ( name ) ) ;
1998-10-21 21:11:16 +00:00
}
1999-12-13 13:27:58 +00:00
static struct smb_passwd * getldappwuid ( uid_t smb_userid )
{
return pdb_sam_to_smb ( iterate_getsam21pwuid ( smb_userid ) ) ;
}
1998-05-18 23:57:28 +00:00
1999-12-13 13:27:58 +00:00
static struct smb_passwd * getldappwrid ( uint32 user_rid )
1998-05-18 23:57:28 +00:00
{
1999-12-13 13:27:58 +00:00
return pdb_sam_to_smb ( iterate_getsam21pwuid ( pdb_user_rid_to_uid ( user_rid ) ) ) ;
}
1998-05-18 23:57:28 +00:00
1999-12-13 13:27:58 +00:00
static struct smb_passwd * getldappwent ( void * vp )
{
return pdb_sam_to_smb ( getldap21pwent ( vp ) ) ;
}
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
static BOOL add_ldappwd_entry ( struct smb_passwd * newpwd )
{
return add_ldap21pwd_entry ( pdb_smb_to_sam ( newpwd ) ) ;
1998-05-18 23:57:28 +00:00
}
1999-12-13 13:27:58 +00:00
static BOOL mod_ldappwd_entry ( struct smb_passwd * pwd , BOOL override )
1998-05-19 19:17:35 +00:00
{
1999-12-13 13:27:58 +00:00
return mod_ldap21pwd_entry ( pdb_smb_to_sam ( pwd ) , override ) ;
}
1998-05-19 19:17:35 +00:00
2000-02-25 22:25:25 +00:00
static BOOL del_ldappwd_entry ( const char * name )
{
return False ; /* Dummy... */
}
1999-12-13 13:27:58 +00:00
static struct sam_disp_info * getldapdispnam ( char * name )
{
return pdb_sam_to_dispinfo ( getldap21pwnam ( name ) ) ;
}
1999-01-15 05:00:26 +00:00
1999-12-13 13:27:58 +00:00
static struct sam_disp_info * getldapdisprid ( uint32 rid )
{
return pdb_sam_to_dispinfo ( getldap21pwrid ( rid ) ) ;
1998-05-19 19:17:35 +00:00
}
1999-12-13 13:27:58 +00:00
static struct sam_disp_info * getldapdispent ( void * vp )
{
return pdb_sam_to_dispinfo ( getldap21pwent ( vp ) ) ;
}
1998-05-19 19:17:35 +00:00
1999-12-13 13:27:58 +00:00
static struct sam_passwd * getldap21pwuid ( uid_t uid )
1998-05-19 19:17:35 +00:00
{
1999-12-13 13:27:58 +00:00
return pdb_smb_to_sam ( iterate_getsam21pwuid ( pdb_uid_to_user_rid ( uid ) ) ) ;
}
1998-05-19 19:17:35 +00:00
1999-12-13 13:27:58 +00:00
static struct passdb_ops ldap_ops =
{
startldappwent ,
endldappwent ,
getldappwpos ,
setldappwpos ,
getldappwnam ,
getldappwuid ,
getldappwrid ,
getldappwent ,
add_ldappwd_entry ,
mod_ldappwd_entry ,
2000-02-25 22:25:25 +00:00
del_ldappwd_entry ,
1999-12-13 13:27:58 +00:00
getldap21pwent ,
iterate_getsam21pwnam , /* From passdb.c */
iterate_getsam21pwuid , /* From passdb.c */
iterate_getsam21pwrid , /* From passdb.c */
add_ldap21pwd_entry ,
mod_ldap21pwd_entry ,
getldapdispnam ,
getldapdisprid ,
getldapdispent
1998-05-18 23:57:28 +00:00
} ;
1999-12-13 13:27:58 +00:00
struct passdb_ops * ldap_initialize_password_db ( void )
1998-05-18 23:57:28 +00:00
{
1999-12-13 13:27:58 +00:00
return & ldap_ops ;
1998-05-18 23:57:28 +00:00
}
1998-05-18 14:17:47 +00:00
# else
1999-12-13 13:27:58 +00:00
void dummy_function ( void ) ;
void dummy_function ( void ) { } /* stop some compilers complaining */
1998-05-06 17:43:44 +00:00
# endif