newlib/winsup/cygwin/uinfo.cc
Corinna Vinschen 64b3062937 * cygwin.din: Define symbols for `cygwin_logon_user' and
`cygwin_set_impersonation_token'.
        * dcrt0.cc (dll_crt0_1): Eliminate superfluous conditional
        statements.
        Add load statements for `ImpersonateLoggedOnUser', `LogonUserA'
        and `RevertToSelf'.
        * fork.cc (fork): Care for correct impersonation of parent
        and child process.
        * security.cc (cygwin_set_impersonation_token): New function.
        (cygwin_logon_user): Ditto.
        shared.h (class pinfo): New members `orig_uid', `orig_gid',
        `real_uid' nad `real_gid'.
        spawn.cc (spawn_guts): Care for impersonation when starting
        child process in a different user context.
        * syscalls.cc (setgid): Call `setegid' now. Set real_gid.
        (setuid): Call `seteuid' now. Set real_uid.
        (seteuid): Functionality moved from setuid to here. Care for
        correct impersonation.
        (setegid): Functionality moved from setgid to here.
        * uinfo.cc (uinfo_init): Initialization of additional pinfo
        members.
        (getuid): Return real uid.
        (getgid): Return real gid.
        (geteuid): Return effective uid.
        (getegid): Return effective gid.
        include/sys/cygwin.h: Add prototypes for `cygwin_logon_user' and
        `cygwin_set_impersonation_token'.
        include/cygwin/version.h: Bumb API minor version to 22.
2000-06-16 19:36:07 +00:00

209 lines
5.0 KiB
C++

/* uinfo.cc: user info (uid, gid, etc...)
Copyright 1996, 1997, 1998 Cygnus Solutions.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#include <pwd.h>
#include "winsup.h"
#include <utmp.h>
#include <limits.h>
#include <unistd.h>
#include "autoload.h"
#include <stdlib.h>
#include <wchar.h>
#include <lm.h>
/* FIXME: shouldn't violate internal object space -- these two
should be static inside grp.cc */
void read_etc_group ();
extern int group_in_memory_p;
char *
internal_getlogin (struct pinfo *pi)
{
DWORD username_len = MAX_USER_NAME;
LPWKSTA_USER_INFO_1 ui = NULL;
if (! pi)
api_fatal ("pinfo pointer is NULL!\n");
if (os_being_run == winNT)
{
int ret = NetWkstaUserGetInfo (NULL, 1, (LPBYTE *)&ui);
if (! ret)
{
wcstombs (pi->domain,
ui->wkui1_logon_domain,
(wcslen (ui->wkui1_logon_domain) + 1) * sizeof (WCHAR));
debug_printf ("Domain: %s", pi->domain);
wcstombs (pi->logsrv,
ui->wkui1_logon_server,
(wcslen (ui->wkui1_logon_server) + 1) * sizeof (WCHAR));
if (! *pi->logsrv)
{
LPWSTR logon_srv = NULL;
if (!NetGetDCName (NULL,
ui->wkui1_logon_domain,
(LPBYTE *)&logon_srv))
wcstombs (pi->logsrv,
logon_srv, // filter leading double backslashes
(wcslen (logon_srv) + 1) * sizeof (WCHAR));
if (logon_srv)
NetApiBufferFree (logon_srv);
debug_printf ("AnyDC Server: %s", pi->logsrv);
}
else
debug_printf ("Logon Server: %s", pi->logsrv);
wcstombs (pi->username,
ui->wkui1_username,
(wcslen (ui->wkui1_username) + 1) * sizeof (WCHAR));
debug_printf ("Windows Username: %s", pi->username);
NetApiBufferFree (ui);
}
else
{
debug_printf ("%d = NetWkstaUserGetInfo ()\n", ret);
if (! GetUserName (pi->username, &username_len))
strcpy (pi->username, "unknown");
}
if (!lookup_name (pi->username, pi->logsrv, pi->psid))
{
debug_printf ("myself->psid = NULL");
pi->psid = NULL;
}
else if (allow_ntsec)
{
extern BOOL get_pw_sid (PSID, struct passwd*);
struct passwd *pw;
char psidbuf[40];
PSID psid = (PSID) psidbuf;
while ((pw = getpwent ()) != NULL)
if (get_pw_sid (psid, pw) && EqualSid (pi->psid, psid))
{
strcpy (pi->username, pw->pw_name);
break;
}
endpwent ();
}
}
else
{
debug_printf ("myself->psid = NULL");
pi->psid = NULL;
if (! GetUserName (pi->username, &username_len))
strcpy (pi->username, "unknown");
}
debug_printf ("Cygwins Username: %s\n", pi->username);
return pi->username;
}
void
uinfo_init ()
{
struct passwd *p;
myself->psid = (PSID) myself->sidbuf;
if ((p = getpwnam (internal_getlogin (myself))) != NULL)
{
/* calling getpwnam assures us that /etc/password has been
read in, but we can't be sure about /etc/group */
if (!group_in_memory_p)
read_etc_group ();
myself->uid = p->pw_uid;
myself->gid = p->pw_gid;
}
else
{
myself->uid = DEFAULT_UID;
myself->gid = DEFAULT_GID;
}
/* Set to non impersonated value. */
myself->token = INVALID_HANDLE_VALUE;
myself->impersonated = TRUE;
myself->orig_uid = myself->real_uid = myself->uid;
myself->orig_gid = myself->real_gid = myself->gid;
}
extern "C" char *
getlogin (void)
{
#ifdef _MT_SAFE
char *this_username=_reent_winsup()->_username;
#else
static NO_COPY char this_username[MAX_USER_NAME];
#endif
return strcpy (this_username, myself->username);
}
extern "C" uid_t
getuid (void)
{
return myself->real_uid;
}
extern "C" gid_t
getgid (void)
{
return myself->real_gid;
}
extern "C" uid_t
geteuid (void)
{
return myself->uid;
}
extern "C" gid_t
getegid (void)
{
return myself->gid;
}
/* Not quite right - cuserid can change, getlogin can't */
extern "C" char *
cuserid (char *src)
{
if (src)
{
strcpy (src, getlogin ());
return src;
}
else
{
return getlogin ();
}
}
extern "C" {
LoadDLLinitfunc (netapi32)
{
HANDLE h;
if ((h = LoadLibrary ("netapi32.dll")) != NULL)
netapi32_handle = h;
else if (! netapi32_handle)
api_fatal ("could not load netapi32.dll. %d", GetLastError ());
return 0;
}
static void dummy_autoload (void) __attribute__ ((unused));
static void
dummy_autoload (void)
{
LoadDLLinit (netapi32)
LoadDLLfunc (NetWkstaUserGetInfo, 12, netapi32)
LoadDLLfunc (NetGetDCName, 12, netapi32)
LoadDLLfunc (NetApiBufferFree, 4, netapi32)
}
}