mirror of
https://github.com/samba-team/samba.git
synced 2025-02-04 17:47:26 +03:00
Fix 'security = domain' without winbind. This stores the sid we got
from the PDC as a mapping to the uid we got from getpwnam in the local idmap. This should not be worse than the current state, so I decided to commit it. It is different from abartlet's preliminary patch, but I believe this is the better solution. Feel free to comment and/or revert it. Volker (This used to be commit 0c16965e6f49a2c0d73b1392e9f8cfc7449e2e59)
This commit is contained in:
parent
97ef504fd0
commit
a7e1bbbd06
@ -842,6 +842,52 @@ NTSTATUS make_server_info_guest(auth_serversupplied_info **server_info)
|
|||||||
return nt_status;
|
return nt_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NTSTATUS fill_sam_account(const char *domain,
|
||||||
|
const char *username,
|
||||||
|
const DOM_SID *user_sid,
|
||||||
|
const DOM_SID *group_sid,
|
||||||
|
SAM_ACCOUNT **sam_account)
|
||||||
|
{
|
||||||
|
fstring dom_user;
|
||||||
|
struct passwd *passwd;
|
||||||
|
NTSTATUS result;
|
||||||
|
unid_t id;
|
||||||
|
|
||||||
|
fstr_sprintf(dom_user, "%s%s%s",
|
||||||
|
domain, lp_winbind_separator(), username);
|
||||||
|
|
||||||
|
passwd = Get_Pwnam(dom_user);
|
||||||
|
|
||||||
|
if ( (passwd == NULL) && is_myworkgroup(domain) ) {
|
||||||
|
/* For our own domain also try unqualified */
|
||||||
|
passwd = Get_Pwnam(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (passwd == NULL)
|
||||||
|
return NT_STATUS_NO_SUCH_USER;
|
||||||
|
|
||||||
|
result = pdb_init_sam_pw(sam_account, passwd);
|
||||||
|
|
||||||
|
if (!NT_STATUS_IS_OK(result))
|
||||||
|
return result;
|
||||||
|
|
||||||
|
id.uid = passwd->pw_uid;
|
||||||
|
result = idmap_set_mapping(user_sid, id, ID_USERID);
|
||||||
|
if (!NT_STATUS_IS_OK(result))
|
||||||
|
return result;
|
||||||
|
|
||||||
|
/* This is currently broken. We have two different sources of
|
||||||
|
information for the primary group: The info3 and
|
||||||
|
/etc/passwd. To make this work at all, the info3 sid is
|
||||||
|
mapped to the user's primary group from /etc/passwd.
|
||||||
|
This is broken, but it basically works. */
|
||||||
|
|
||||||
|
id.gid = passwd->pw_gid;
|
||||||
|
result = idmap_set_mapping(group_sid, id, ID_GROUPID);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
Make a server_info struct from the info3 returned by a domain logon
|
Make a server_info struct from the info3 returned by a domain logon
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
@ -910,38 +956,20 @@ NTSTATUS make_server_info_info3(TALLOC_CTX *mem_ctx,
|
|||||||
nt_status = pdb_init_sam_pw(&sam_account, passwd);
|
nt_status = pdb_init_sam_pw(&sam_account, passwd);
|
||||||
passwd_free(&passwd);
|
passwd_free(&passwd);
|
||||||
} else {
|
} else {
|
||||||
int try = 0;
|
|
||||||
while (try < 2) {
|
|
||||||
char *dom_user;
|
|
||||||
dom_user = talloc_asprintf(mem_ctx, "%s%s%s",
|
|
||||||
nt_domain,
|
|
||||||
lp_winbind_separator(),
|
|
||||||
internal_username);
|
|
||||||
|
|
||||||
if (!dom_user) {
|
nt_status = fill_sam_account(nt_domain,
|
||||||
DEBUG(0, ("talloc_asprintf failed!\n"));
|
internal_username,
|
||||||
nt_status = NT_STATUS_NO_MEMORY;
|
&user_sid, &group_sid,
|
||||||
} else {
|
&sam_account);
|
||||||
|
|
||||||
if (!(passwd = Get_Pwnam(dom_user))
|
if (NT_STATUS_EQUAL(nt_status, NT_STATUS_NO_SUCH_USER)) {
|
||||||
/* Only lookup local for the local
|
DEBUG(3,("User %s does not exist, trying to add it\n",
|
||||||
domain, we don't want this for
|
internal_username));
|
||||||
trusted domains */
|
|
||||||
&& strequal(nt_domain, lp_workgroup())) {
|
|
||||||
passwd = Get_Pwnam(internal_username);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!passwd) {
|
|
||||||
nt_status = NT_STATUS_NO_SUCH_USER;
|
|
||||||
} else {
|
|
||||||
nt_status = pdb_init_sam_pw(&sam_account, passwd);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (try == 0) {
|
|
||||||
auth_add_user_script(nt_domain, internal_username);
|
auth_add_user_script(nt_domain, internal_username);
|
||||||
}
|
nt_status = fill_sam_account(nt_domain,
|
||||||
try++;
|
internal_username,
|
||||||
|
&user_sid, &group_sid,
|
||||||
|
&sam_account);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user