1998-05-06 17:43:44 +00:00
# ifdef USE_LDAP
# include "includes.h"
# include "lber.h"
# include "ldap.h"
extern int DEBUGLEVEL ;
/*******************************************************************
find a user or a machine return a smbpass struct .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void make_ldap_sam_user_info_21 ( LDAP * ldap_struct , LDAPMessage * entry , SAM_USER_INFO_21 * user )
{
pstring cn ;
pstring fullname ;
pstring home_dir ;
pstring dir_drive ;
pstring logon_script ;
pstring profile_path ;
pstring acct_desc ;
pstring workstations ;
pstring temp ;
if ( ldap_check_user ( ldap_struct , entry ) = = True )
{
get_single_attribute ( ldap_struct , entry , " cn " , cn ) ;
get_single_attribute ( ldap_struct , entry , " userFullName " , fullname ) ;
get_single_attribute ( ldap_struct , entry , " homeDirectory " , home_dir ) ;
get_single_attribute ( ldap_struct , entry , " homeDrive " , dir_drive ) ;
get_single_attribute ( ldap_struct , entry , " scriptPath " , logon_script ) ;
get_single_attribute ( ldap_struct , entry , " profilePath " , profile_path ) ;
get_single_attribute ( ldap_struct , entry , " comment " , acct_desc ) ;
get_single_attribute ( ldap_struct , entry , " userWorkstations " , workstations ) ;
get_single_attribute ( ldap_struct , entry , " rid " , temp ) ;
user - > user_rid = atoi ( temp ) ;
get_single_attribute ( ldap_struct , entry , " primaryGroupID " , temp ) ;
user - > group_rid = atoi ( temp ) ;
get_single_attribute ( ldap_struct , entry , " controlAccessRights " , temp ) ;
user - > acb_info = atoi ( temp ) ;
make_unistr2 ( & ( user - > uni_user_name ) , cn , strlen ( cn ) ) ;
make_uni_hdr ( & ( user - > hdr_user_name ) , strlen ( cn ) , strlen ( cn ) , 1 ) ;
make_unistr2 ( & ( user - > uni_full_name ) , fullname , strlen ( fullname ) ) ;
make_uni_hdr ( & ( user - > hdr_full_name ) , strlen ( fullname ) , strlen ( fullname ) , 1 ) ;
make_unistr2 ( & ( user - > uni_home_dir ) , home_dir , strlen ( home_dir ) ) ;
make_uni_hdr ( & ( user - > hdr_home_dir ) , strlen ( home_dir ) , strlen ( home_dir ) , 1 ) ;
make_unistr2 ( & ( user - > uni_dir_drive ) , dir_drive , strlen ( dir_drive ) ) ;
make_uni_hdr ( & ( user - > hdr_dir_drive ) , strlen ( dir_drive ) , strlen ( dir_drive ) , 1 ) ;
make_unistr2 ( & ( user - > uni_logon_script ) , logon_script , strlen ( logon_script ) ) ;
make_uni_hdr ( & ( user - > hdr_logon_script ) , strlen ( logon_script ) , strlen ( logon_script ) , 1 ) ;
make_unistr2 ( & ( user - > uni_profile_path ) , profile_path , strlen ( profile_path ) ) ;
make_uni_hdr ( & ( user - > hdr_profile_path ) , strlen ( profile_path ) , strlen ( profile_path ) , 1 ) ;
make_unistr2 ( & ( user - > uni_acct_desc ) , acct_desc , strlen ( acct_desc ) ) ;
make_uni_hdr ( & ( user - > hdr_acct_desc ) , strlen ( acct_desc ) , strlen ( acct_desc ) , 1 ) ;
make_unistr2 ( & ( user - > uni_workstations ) , workstations , strlen ( workstations ) ) ;
make_uni_hdr ( & ( user - > hdr_workstations ) , strlen ( workstations ) , strlen ( workstations ) , 1 ) ;
}
}
/*******************************************************************
find a user or a machine return a smbpass struct .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL get_ldap_entries ( SAM_USER_INFO_21 * pw_buf ,
int * total_entries , int * num_entries ,
int max_num_entries ,
uint16 acb_mask , int switch_level )
{
LDAP * ldap_struct ;
LDAPMessage * result ;
LDAPMessage * entry ;
int scope = LDAP_SCOPE_ONELEVEL ;
int rc ;
char filter [ 256 ] ;
( * num_entries ) = 0 ;
( * total_entries ) = 0 ;
if ( ! ldap_open_connection ( & ldap_struct ) ) /* open a connection to the server */
return ( False ) ;
if ( ! ldap_connect_system ( ldap_struct ) ) /* connect as system account */
return ( False ) ;
/* when the class is known the search is much faster */
switch ( switch_level )
{
case 1 : strcpy ( filter , " objectclass=sambaAccount " ) ;
break ;
case 2 : strcpy ( filter , " objectclass=sambaMachine " ) ;
break ;
default : strcpy ( filter , " (|(objectclass=sambaMachine)(objectclass=sambaAccount)) " ) ;
break ;
}
rc = ldap_search_s ( ldap_struct , lp_ldap_suffix ( ) , scope , filter , NULL , 0 , & result ) ;
DEBUG ( 2 , ( " %d entries in the base! \n " , ldap_count_entries ( ldap_struct , result ) ) ) ;
for ( entry = ldap_first_entry ( ldap_struct , result ) ;
( entry ! = NULL ) & & ( * num_entries ) < max_num_entries ;
entry = ldap_next_entry ( ldap_struct , entry ) )
{
make_ldap_sam_user_info_21 ( ldap_struct , entry , & ( pw_buf [ ( * num_entries ) ] ) ) ;
if ( acb_mask = = 0 | | IS_BITS_SET_SOME ( pw_buf [ ( * num_entries ) ] . acb_info , acb_mask ) )
{
DEBUG ( 5 , ( " acb_mask %x accepts \n " , acb_mask ) ) ;
( * num_entries ) + + ;
}
else
{
DEBUG ( 5 , ( " acb_mask %x rejects \n " , acb_mask ) ) ;
}
( * total_entries ) + + ;
}
ldap_msgfree ( result ) ;
ldap_unbind ( ldap_struct ) ;
return ( * num_entries ) > 0 ;
}
BOOL ldap_get_user_info_21 ( SAM_USER_INFO_21 * id21 , uint32 rid )
{
LDAP * ldap_struct ;
LDAPMessage * result ;
LDAPMessage * entry ;
if ( ! ldap_open_connection ( & ldap_struct ) )
return ( False ) ;
if ( ! ldap_connect_system ( ldap_struct ) )
return ( False ) ;
if ( ! ldap_search_one_user_by_uid ( ldap_struct , rid , & result ) )
return ( False ) ;
if ( ldap_count_entries ( ldap_struct , result ) = = 0 )
{
DEBUG ( 2 , ( " %s: Non existant user! \n " , timestring ( ) ) ) ;
return ( False ) ;
}
if ( ldap_count_entries ( ldap_struct , result ) > 1 )
{
DEBUG ( 2 , ( " %s: Strange %d users in the base! \n " ,
timestring ( ) , ldap_count_entries ( ldap_struct , result ) ) ) ;
}
/* take the first and unique entry */
entry = ldap_first_entry ( ldap_struct , result ) ;
make_ldap_sam_user_info_21 ( ldap_struct , entry , id21 ) ;
ldap_msgfree ( result ) ;
ldap_unbind ( ldap_struct ) ;
return ( True ) ;
}
1998-05-06 18:14:02 +00:00
# else /* USE_LDAP */
/* this keeps fussy compilers happy */
1998-05-06 18:45:57 +00:00
void ldap_helper_dummy ( void )
{ }
# endif /* USE_LDAP */