1
0
mirror of https://github.com/samba-team/samba.git synced 2025-12-12 12:23:50 +03:00

modified domain_client_validate to take trust account name / type. this

is to pass DOMAIN_NAME$ and SEC_CHAN_DOMAIN instead of WKSTA_NAME$ and
SEC_CHAN_WKSTA.

modified check_domain_security to determine if domain name is own domain,
and to use wksta trust account if so, otherwise check "trusting domains"
parameter and use inter-domain trust account if so, otherwise return
False.
This commit is contained in:
Luke Leighton
-
parent 3ec269b402
commit 97ec74e1fa
7 changed files with 108 additions and 15 deletions

View File

@@ -624,6 +624,7 @@ void string_free(char **s);
BOOL string_set(char **dest,const char *src);
void string_sub(char *s,const char *pattern,const char *insert);
void all_string_sub(char *s,const char *pattern,const char *insert);
void split_at_first_component(char *path, char *front, char sep, char *back);
void split_at_last_component(char *path, char *front, char sep, char *back);
char *bit_field_to_str(uint32 type, struct field_info *bs);
char *enum_field_to_str(uint32 type, struct field_info *bs, BOOL first_default);
@@ -4027,7 +4028,8 @@ struct cli_state *server_cryptkey(void);
BOOL server_validate(char *user, char *domain,
char *pass, int passlen,
char *ntpass, int ntpasslen);
BOOL domain_client_validate( char *user, char *domain,
BOOL domain_client_validate( char *user, char *domain, char *server_list,
char *acct_name, uint16 acct_type,
char *smb_apasswd, int smb_apasslen,
char *smb_ntpasswd, int smb_ntpasslen);

View File

@@ -139,7 +139,8 @@ BOOL get_member_domain_sid(void)
}
}
return get_domain_sids(NULL, &global_member_sid, lp_passwordserver());
return get_domain_sids(global_myname, NULL,
&global_member_sid, lp_passwordserver());
}

View File

@@ -634,7 +634,8 @@ BOOL pwdb_initialise(BOOL is_server)
{
srvs = lp_passwordserver();
}
if (!get_domain_sids(&global_member_sid, &global_sam_sid, srvs))
if (!get_domain_sids(global_myname, &global_member_sid,
&global_sam_sid, srvs))
{
return False;
}

View File

@@ -1063,6 +1063,38 @@ void all_string_sub(char *s,const char *pattern,const char *insert)
}
}
/****************************************************************************
splits out the front and back at a separator.
****************************************************************************/
void split_at_first_component(char *path, char *front, char sep, char *back)
{
char *p = strchr(path, sep);
if (p != NULL)
{
*p = 0;
}
if (front != NULL)
{
pstrcpy(front, path);
}
if (p != NULL)
{
if (back != NULL)
{
pstrcpy(back, p+1);
}
*p = sep;
}
else
{
if (back != NULL)
{
back[0] = 0;
}
}
}
/****************************************************************************
splits out the front and back at a separator.
****************************************************************************/
@@ -1084,7 +1116,7 @@ void split_at_last_component(char *path, char *front, char sep, char *back)
{
pstrcpy(back, p+1);
}
*p = '\\';
*p = sep;
}
else
{

View File

@@ -626,6 +626,7 @@ BOOL check_oem_password(char *user,
uchar new_p16[16];
uchar unenc_old_pw[16];
char no_pw[2];
uint32 len;
BOOL nt_pass_set = (ntdata != NULL && nthash != NULL);
@@ -682,7 +683,7 @@ BOOL check_oem_password(char *user,
*/
SamOEMhash( (uchar *)lmdata, (uchar *)smbpw->smb_passwd, True);
if (!decode_pw_buffer(lmdata, new_passwd, new_passwd_size, nt_pass_set))
if (!decode_pw_buffer(lmdata, new_passwd, new_passwd_size, &len))
{
return False;
}

View File

@@ -1095,7 +1095,8 @@ use this machine as the password server.\n"));
key from the workstation trust account password.
************************************************************************/
BOOL domain_client_validate( char *user, char *domain,
BOOL domain_client_validate( char *user, char *domain, char *server_list,
char *acct_name, uint16 acct_type,
char *smb_apasswd, int smb_apasslen,
char *smb_ntpasswd, int smb_ntpasslen)
{
@@ -1108,6 +1109,10 @@ BOOL domain_client_validate( char *user, char *domain,
NET_USER_INFO_3 info3;
struct cli_state cli;
uint32 smb_uid_low;
fstring trust_acct;
fstrcpy(trust_acct, acct_name);
fstrcat(trust_acct, "$");
/*
* Check that the requested domain is not our own machine name.
@@ -1126,7 +1131,7 @@ BOOL domain_client_validate( char *user, char *domain,
*/
if(((smb_apasslen != 24) && (smb_apasslen != 0)) ||
((smb_ntpasslen != 24) && (smb_ntpasslen != 0)))
((smb_ntpasslen <= 24) && (smb_ntpasslen != 0)))
{
/*
* Not encrypted - do so.
@@ -1158,7 +1163,7 @@ BOOL domain_client_validate( char *user, char *domain,
/*
* Get the workstation trust account password.
*/
if (!trust_get_passwd( trust_passwd, global_myworkgroup, global_myname))
if (!trust_get_passwd( trust_passwd, domain, acct_name))
{
return False;
}
@@ -1171,7 +1176,7 @@ BOOL domain_client_validate( char *user, char *domain,
* see if they were valid.
*/
if (!cli_connect_serverlist(&cli, lp_passwordserver()))
if (!cli_connect_serverlist(&cli, server_list))
{
DEBUG(0,("domain_client_validate: Domain password server not available.\n"));
return False;
@@ -1192,7 +1197,7 @@ BOOL domain_client_validate( char *user, char *domain,
}
if(cli_nt_setup_creds(&cli, nt_pipe_fnum,
cli.mach_acct, global_myname, trust_passwd, SEC_CHAN_WKSTA) != 0x0)
trust_acct, global_myname, trust_passwd, acct_type) != 0x0)
{
DEBUG(0,("domain_client_validate: unable to setup the PDC credentials to machine \
%s. Error was : %s.\n", cli.desthost, cli_errstr(&cli)));

View File

@@ -39,6 +39,7 @@ extern BOOL case_preserve;
extern BOOL short_case_preserve;
extern pstring sesssetup_user;
extern fstring global_myworkgroup;
extern fstring global_myname;
extern int Client;
extern int global_oplock_break;
uint32 global_client_caps = 0;
@@ -501,12 +502,62 @@ static BOOL check_domain_security(char *orig_user, char *domain,
char *smb_apasswd, int smb_apasslen,
char *smb_ntpasswd, int smb_ntpasslen)
{
if(lp_security() != SEC_DOMAIN)
return False;
fstring acct_name;
uint16 acct_type = 0;
return domain_client_validate(orig_user, domain,
smb_apasswd, smb_apasslen,
smb_ntpasswd, smb_ntpasslen);
char *server_list = NULL;
pstring srv_list;
char *trusted_list = lp_trusted_domains();
if (lp_security() == SEC_SHARE || lp_security() == SEC_SERVER)
{
return False;
}
if (lp_security() == SEC_DOMAIN)
{
fstrcpy(acct_name, global_myname);
acct_type = SEC_CHAN_WKSTA;
if (strequal(lp_workgroup(), domain))
{
DEBUG(10,("local domain server list: %s\n", server_list));
pstrcpy(srv_list, lp_passwordserver());
server_list = srv_list;
}
}
if (server_list == NULL)
{
pstring tmp;
if (next_token(&trusted_list, tmp, NULL, sizeof(tmp)))
{
do
{
fstring trust_dom;
split_at_first_component(tmp, trust_dom, '=', srv_list);
if (strequal(domain, trust_dom))
{
DEBUG(10,("trusted domain server list: %s\n", server_list));
fstrcpy(acct_name, global_myworkgroup);
acct_type = SEC_CHAN_DOMAIN;
server_list = srv_list;
break;
}
} while (next_token(NULL, tmp, NULL, sizeof(tmp)));
}
}
if (server_list == NULL)
{
return False;
}
return domain_client_validate(orig_user, domain, server_list,
acct_name, acct_type,
smb_apasswd, smb_apasslen,
smb_ntpasswd, smb_ntpasslen);
}
/****************************************************************************