From f41d24a14d5672c152938abd44226108d236aca1 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Sat, 3 Nov 2001 21:19:50 +0000 Subject: * security.cc (get_supplementary_group_sidlist): New function. (get_group_sidlist): Call get_supplementary_group_sidlist() to retrieve list of supplementary groups SIDs from /etc/group and add them to the user's group list. --- winsup/cygwin/ChangeLog | 7 +++++++ winsup/cygwin/security.cc | 31 +++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index bc752f670..593690a00 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2001-11-03 Corinna Vinschen + + * security.cc (get_supplementary_group_sidlist): New function. + (get_group_sidlist): Call get_supplementary_group_sidlist() to + retrieve list of supplementary groups SIDs from /etc/group and + add them to the user's group list. + 2001-11-03 Christopher Faylor * fhandler.cc (fhandler_base::read): Return just read ahead characters diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc index 971612e17..934ceed9a 100644 --- a/winsup/cygwin/security.cc +++ b/winsup/cygwin/security.cc @@ -448,6 +448,30 @@ get_user_primary_group (WCHAR *wlogonserver, const char *user, return retval; } +static int +get_supplementary_group_sidlist (const char *username, cygsidlist &grp_list) +{ + struct group *gr; + int cnt = 0; + + for (int gidx = 0; (gr = internal_getgrent (gidx)); ++gidx) + { + 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; + } + } + return cnt; +} + static BOOL get_group_sidlist (const char *logonserver, cygsidlist &grp_list, cygsid &usersid, cygsid &pgrpsid, @@ -459,6 +483,7 @@ get_group_sidlist (const char *logonserver, cygsidlist &grp_list, DWORD ulen = INTERNET_MAX_HOST_NAME_LENGTH + 1; DWORD dlen = INTERNET_MAX_HOST_NAME_LENGTH + 1; SID_NAME_USE use; + cygsidlist sup_list; auth_pos = -1; sys_mbstowcs (wserver, logonserver, INTERNET_MAX_HOST_NAME_LENGTH + 1); @@ -514,6 +539,12 @@ get_group_sidlist (const char *logonserver, cygsidlist &grp_list, return FALSE; if (!grp_list.contains (pgrpsid)) grp_list += pgrpsid; + if (get_supplementary_group_sidlist (user, 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]; + } return TRUE; } -- cgit v1.2.3