* grp.cc (read_etc_group): When emulating nonexisting group file on
NT systems, read primary group SID from process token. Use that info to create correct group entry. On error or on 9x systems fallback to emulating Administrators group as before. (read_etc_passwd): When emulating nonexisting passwd file on NT systems, read user and primary group SID from process token. Use that info to create correct passwd entry. On error or on 9x systems fallback to emulating user with Administrator user id and Administrators group as before.
This commit is contained in:
parent
38f3936889
commit
eceee297d5
|
@ -1,3 +1,15 @@
|
|||
2002-06-05 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* grp.cc (read_etc_group): When emulating nonexisting group file on
|
||||
NT systems, read primary group SID from process token. Use that info
|
||||
to create correct group entry. On error or on 9x systems fallback
|
||||
to emulating Administrators group as before.
|
||||
(read_etc_passwd): When emulating nonexisting passwd file on NT systems,
|
||||
read user and primary group SID from process token. Use that info to
|
||||
create correct passwd entry. On error or on 9x systems fallback to
|
||||
emulating user with Administrator user id and Administrators group
|
||||
as before.
|
||||
|
||||
2002-06-05 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* grp.cc (etc_group): Removed.
|
||||
|
|
|
@ -171,19 +171,49 @@ read_etc_group ()
|
|||
SID_NAME_USE acType;
|
||||
static char linebuf [200];
|
||||
|
||||
debug_printf ("Emulating /etc/group");
|
||||
strncpy (group_name, "Administrators", sizeof (group_name));
|
||||
if (! LookupAccountSidA (NULL, well_known_admins_sid, group_name,
|
||||
&group_name_len, domain_name,
|
||||
&domain_name_len, &acType))
|
||||
if (wincap.has_security ())
|
||||
{
|
||||
strcpy (group_name, "unknown");
|
||||
debug_printf ("Failed to get local admins group name. %E");
|
||||
HANDLE ptok;
|
||||
cygsid tg;
|
||||
DWORD siz;
|
||||
|
||||
if (OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &ptok))
|
||||
{
|
||||
if (GetTokenInformation (ptok, TokenPrimaryGroup, &tg,
|
||||
sizeof tg, &siz)
|
||||
&& LookupAccountSidA (NULL, tg, group_name,
|
||||
&group_name_len, domain_name,
|
||||
&domain_name_len, &acType))
|
||||
{
|
||||
char strbuf[100];
|
||||
snprintf (linebuf, sizeof (linebuf), "%s:%s:%u:",
|
||||
group_name,
|
||||
tg.string (strbuf),
|
||||
*GetSidSubAuthority(tg,
|
||||
*GetSidSubAuthorityCount(tg) - 1));
|
||||
debug_printf ("Emulating /etc/group: %s", linebuf);
|
||||
add_grp_line (linebuf);
|
||||
group_state = emulated;
|
||||
}
|
||||
CloseHandle (ptok);
|
||||
}
|
||||
}
|
||||
if (group_state != emulated)
|
||||
{
|
||||
strncpy (group_name, "Administrators", sizeof (group_name));
|
||||
if (!LookupAccountSidA (NULL, well_known_admins_sid, group_name,
|
||||
&group_name_len, domain_name,
|
||||
&domain_name_len, &acType))
|
||||
{
|
||||
strcpy (group_name, "unknown");
|
||||
debug_printf ("Failed to get local admins group name. %E");
|
||||
}
|
||||
snprintf (linebuf, sizeof (linebuf), "%s::%u:", group_name,
|
||||
(unsigned) DEFAULT_GID);
|
||||
debug_printf ("Emulating /etc/group: %s", linebuf);
|
||||
add_grp_line (linebuf);
|
||||
group_state = emulated;
|
||||
}
|
||||
snprintf (linebuf, sizeof (linebuf), "%s::%u:\n", group_name,
|
||||
(unsigned) DEFAULT_GID);
|
||||
add_grp_line (linebuf);
|
||||
group_state = emulated;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -160,14 +160,46 @@ read_etc_passwd ()
|
|||
}
|
||||
else
|
||||
{
|
||||
static char linebuf[400];
|
||||
static char linebuf[1024];
|
||||
|
||||
debug_printf ("Emulating /etc/passwd");
|
||||
snprintf (linebuf, sizeof (linebuf), "%s::%u:%u::%s:/bin/sh",
|
||||
cygheap->user.name (), (unsigned) DEFAULT_UID,
|
||||
(unsigned) DEFAULT_GID, getenv ("HOME") ?: "/");
|
||||
add_pwd_line (linebuf);
|
||||
passwd_state = emulated;
|
||||
if (wincap.has_security ())
|
||||
{
|
||||
HANDLE ptok;
|
||||
cygsid tu, tg;
|
||||
DWORD siz;
|
||||
|
||||
if (OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &ptok))
|
||||
{
|
||||
if (GetTokenInformation (ptok, TokenUser, &tu, sizeof tu,
|
||||
&siz)
|
||||
&& GetTokenInformation (ptok, TokenPrimaryGroup, &tg,
|
||||
sizeof tg, &siz))
|
||||
{
|
||||
char strbuf[100];
|
||||
snprintf (linebuf, sizeof (linebuf),
|
||||
"%s::%u:%u:%s:%s:/bin/sh",
|
||||
cygheap->user.name (),
|
||||
*GetSidSubAuthority(tu,
|
||||
*GetSidSubAuthorityCount(tu) - 1),
|
||||
*GetSidSubAuthority(tg,
|
||||
*GetSidSubAuthorityCount(tg) - 1),
|
||||
tu.string (strbuf), getenv ("HOME") ?: "/");
|
||||
debug_printf ("Emulating /etc/passwd: %s", linebuf);
|
||||
add_pwd_line (linebuf);
|
||||
passwd_state = emulated;
|
||||
}
|
||||
CloseHandle (ptok);
|
||||
}
|
||||
}
|
||||
if (passwd_state != emulated)
|
||||
{
|
||||
snprintf (linebuf, sizeof (linebuf), "%s::%u:%u::%s:/bin/sh",
|
||||
cygheap->user.name (), (unsigned) DEFAULT_UID,
|
||||
(unsigned) DEFAULT_GID, getenv ("HOME") ?: "/");
|
||||
debug_printf ("Emulating /etc/passwd: %s", linebuf);
|
||||
add_pwd_line (linebuf);
|
||||
passwd_state = emulated;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue