* security.cc (get_unix_group_sidlist): Create.
(get_supplementary_group_sidlist): Evolve into get_unix_group_sidlist. (get_user_local_groups): Add check for duplicates. (get_user_primary_group): Suppress. (get_group_sidlist): Silently ignore PDC unavailability. Call get_unix_group_sidlist() before get_user_local_groups(). Remove call to get_supplementary_group_sidlist(). Never call get_user_primary_group() as the passwd group is always included. Add well_known_authenticated_users_sid in only one statement.
This commit is contained in:
parent
86620e8f92
commit
095a1272e8
|
@ -1,3 +1,15 @@
|
|||
2002-07-18 Pierre Humblet <pierre.humblet@ieee.org>
|
||||
|
||||
* security.cc (get_unix_group_sidlist): Create.
|
||||
(get_supplementary_group_sidlist): Evolve into get_unix_group_sidlist.
|
||||
(get_user_local_groups): Add check for duplicates.
|
||||
(get_user_primary_group): Suppress.
|
||||
(get_group_sidlist): Silently ignore PDC unavailability.
|
||||
Call get_unix_group_sidlist() before get_user_local_groups().
|
||||
Remove call to get_supplementary_group_sidlist(). Never call
|
||||
get_user_primary_group() as the passwd group is always included.
|
||||
Add well_known_authenticated_users_sid in only one statement.
|
||||
|
||||
2002-07-19 Christopher Faylor <cgf@redhat.com>
|
||||
|
||||
* fhandler_serial.cc (fhandler_serial::tcflush): Fix typo.
|
||||
|
|
|
@ -388,18 +388,18 @@ get_user_local_groups (cygsidlist &grp_list, PSID pusersid)
|
|||
sys_wcstombs (bgroup + blen, buf[i].lgrpi0_name, GNLEN + 1);
|
||||
if (!LookupAccountName (NULL, bgroup, gsid, &glen, domain, &dlen, &use))
|
||||
{
|
||||
if (GetLastError () != ERROR_NONE_MAPPED)
|
||||
debug_printf ("LookupAccountName(%s): %E", bgroup);
|
||||
strcpy (lgroup + llen, bgroup + blen);
|
||||
if (!LookupAccountName (NULL, lgroup, gsid, &glen,
|
||||
domain, &dlen, &use))
|
||||
debug_printf ("LookupAccountName(%s): %E", lgroup);
|
||||
if (GetLastError () != ERROR_NONE_MAPPED)
|
||||
debug_printf ("LookupAccountName(%s): %E", bgroup);
|
||||
strcpy (lgroup + llen, bgroup + blen);
|
||||
if (!LookupAccountName (NULL, lgroup, gsid, &glen,
|
||||
domain, &dlen, &use))
|
||||
debug_printf ("LookupAccountName(%s): %E", lgroup);
|
||||
}
|
||||
if (legal_sid_type (use))
|
||||
if (!legal_sid_type (use))
|
||||
debug_printf ("Rejecting local %s. use: %d", bgroup + blen, use);
|
||||
else if (!grp_list.contains (gsid))
|
||||
grp_list += gsid;
|
||||
else debug_printf ("Rejecting local %s. use: %d", bgroup + blen, use);
|
||||
}
|
||||
|
||||
NetApiBufferFree (buf);
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -415,6 +415,7 @@ sid_in_token_groups (PTOKEN_GROUPS grps, cygsid &sid)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
#if 0 /* Unused */
|
||||
static BOOL
|
||||
get_user_primary_group (WCHAR *wlogonserver, const char *user,
|
||||
PSID pusersid, cygsid &pgrpsid)
|
||||
|
@ -448,34 +449,33 @@ get_user_primary_group (WCHAR *wlogonserver, const char *user,
|
|||
NetApiBufferFree (buf);
|
||||
return retval;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
get_supplementary_group_sidlist (const char *username, cygsidlist &grp_list)
|
||||
static void
|
||||
get_unix_group_sidlist (struct passwd * pw, cygsidlist &grp_list)
|
||||
{
|
||||
struct __group32 *gr;
|
||||
int cnt = 0;
|
||||
cygsid gsid;
|
||||
|
||||
for (int gidx = 0; (gr = internal_getgrent (gidx)); ++gidx)
|
||||
{
|
||||
if (gr->gr_mem)
|
||||
if (gr->gr_gid == (__gid32_t) pw->pw_gid)
|
||||
goto found;
|
||||
else if (gr->gr_mem)
|
||||
for (int gi = 0; gr->gr_mem[gi]; ++gi)
|
||||
if (strcasematch (username, gr->gr_mem[gi]))
|
||||
{
|
||||
if (gr->gr_passwd && *gr->gr_passwd)
|
||||
{
|
||||
cygsid sid (gr->gr_passwd);
|
||||
if ((PSID)sid && grp_list.add (sid))
|
||||
++cnt;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (strcasematch (pw->pw_name, gr->gr_mem[gi]))
|
||||
goto found;
|
||||
continue;
|
||||
found:
|
||||
if (gsid.getfromgr (gr) && !grp_list.contains (gsid))
|
||||
grp_list += gsid;
|
||||
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
get_group_sidlist (cygsidlist &grp_list,
|
||||
cygsid &usersid, cygsid &pgrpsid, struct passwd * pw,
|
||||
cygsid &usersid, cygsid &pgrpsid, struct passwd * pw,
|
||||
PTOKEN_GROUPS my_grps, LUID auth_luid, int &auth_pos,
|
||||
BOOL * special_pgrp)
|
||||
{
|
||||
|
@ -488,16 +488,14 @@ get_group_sidlist (cygsidlist &grp_list,
|
|||
auth_pos = -1;
|
||||
|
||||
grp_list += well_known_world_sid;
|
||||
grp_list += well_known_authenticated_users_sid;
|
||||
if (usersid == well_known_system_sid)
|
||||
{
|
||||
grp_list += well_known_authenticated_users_sid;
|
||||
grp_list += well_known_admins_sid;
|
||||
get_unix_group_sidlist (pw, grp_list);
|
||||
}
|
||||
else
|
||||
{
|
||||
extract_nt_dom_user (pw, domain, user);
|
||||
if (!get_logon_server (domain, server, wserver))
|
||||
return FALSE;
|
||||
if (my_grps)
|
||||
{
|
||||
if (sid_in_token_groups (my_grps, well_known_local_sid))
|
||||
|
@ -512,13 +510,11 @@ get_group_sidlist (cygsidlist &grp_list,
|
|||
grp_list += well_known_interactive_sid;
|
||||
if (sid_in_token_groups (my_grps, well_known_service_sid))
|
||||
grp_list += well_known_service_sid;
|
||||
grp_list += well_known_authenticated_users_sid;
|
||||
}
|
||||
else
|
||||
{
|
||||
grp_list += well_known_local_sid;
|
||||
grp_list += well_known_interactive_sid;
|
||||
grp_list += well_known_authenticated_users_sid;
|
||||
}
|
||||
if (auth_luid.QuadPart != 999) /* != SYSTEM_LUID */
|
||||
{
|
||||
|
@ -528,28 +524,22 @@ get_group_sidlist (cygsidlist &grp_list,
|
|||
grp_list += buf;
|
||||
auth_pos = grp_list.count - 1;
|
||||
}
|
||||
if (!get_user_groups (wserver, grp_list, user, domain) ||
|
||||
!get_user_local_groups (grp_list, usersid))
|
||||
extract_nt_dom_user (pw, domain, user);
|
||||
/* Fail silently if DC is not reachable */
|
||||
if (get_logon_server (domain, server, wserver) &&
|
||||
!get_user_groups (wserver, grp_list, user, domain))
|
||||
return FALSE;
|
||||
get_unix_group_sidlist (pw, grp_list);
|
||||
if (!get_user_local_groups (grp_list, usersid))
|
||||
return FALSE;
|
||||
}
|
||||
/* special_pgrp true if pgrpsid is not null and not in normal groups */
|
||||
if (!pgrpsid)
|
||||
*special_pgrp = FALSE;
|
||||
if (pgrpsid && !grp_list.contains (pgrpsid))
|
||||
{
|
||||
*special_pgrp = FALSE;
|
||||
get_user_primary_group (wserver, user, usersid, pgrpsid);
|
||||
*special_pgrp = TRUE;
|
||||
grp_list += pgrpsid;
|
||||
}
|
||||
else
|
||||
*special_pgrp = TRUE;
|
||||
if (pw->pw_name && get_supplementary_group_sidlist (pw->pw_name, sup_list))
|
||||
{
|
||||
for (int i = 0; i < sup_list.count; ++i)
|
||||
if (!grp_list.contains (sup_list.sids[i]))
|
||||
grp_list += sup_list.sids[i];
|
||||
}
|
||||
if (!grp_list.contains (pgrpsid))
|
||||
grp_list += pgrpsid;
|
||||
else
|
||||
*special_pgrp = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -856,7 +846,7 @@ create_token (cygsid &usersid, cygsid &pgrpsid, struct passwd * pw)
|
|||
if (psa->lpSecurityDescriptor &&
|
||||
!SetSecurityDescriptorGroup (
|
||||
(PSECURITY_DESCRIPTOR) psa->lpSecurityDescriptor,
|
||||
special_pgrp?pgrpsid:well_known_null_sid, FALSE))
|
||||
special_pgrp ? pgrpsid : well_known_null_sid, FALSE))
|
||||
debug_printf ("SetSecurityDescriptorGroup %E");
|
||||
/* Convert to primary token. */
|
||||
if (!DuplicateTokenEx (token, MAXIMUM_ALLOWED, psa,
|
||||
|
|
Loading…
Reference in New Issue