mirror of
https://github.com/samba-team/samba.git
synced 2025-02-04 17:47:26 +03:00
password.c: Fixed machine_passwd_lock() problems. lib/rpc/server/srv_ldap_helpers.c: Oops - broke proto.h with dummy function. Fixed now. Jeremy. (This used to be commit d28427f21fff49da6b38c24625e3e2dae49a9713)
167 lines
5.6 KiB
C
167 lines
5.6 KiB
C
#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);
|
|
}
|
|
|
|
#else /* USE_LDAP */
|
|
/* this keeps fussy compilers happy */
|
|
void ldap_helper_dummy(void)
|
|
{}
|
|
#endif /* USE_LDAP */
|