* cygheap.h (cygheap_pwdgrp::get_shell): Add sid to argument list.
(cygheap_pwdgrp::get_gecos): Ditto. * uinfo.cc (fetch_windows_home): Accept cyg_ldap and PUSER_INFO_3 arguments, and fetch db home dir values right here. (fetch_from_path): Accept cyg_ldap, PUSER_INFO_3 pointers and sid arguments. Add '%H' format specifier to fetch Windows home dir in POSIX notation. (cygheap_pwdgrp::get_home): Accommodate changes to fetch_windows_home and fetch_from_path. (cygheap_pwdgrp::get_shell): Ditto. (cygheap_pwdgrp::get_gecos): Ditto. (pwdgrp::fetch_account_from_windows): Accommodate sid argument to cygheap_pwdgrp::get_shell and cygheap_pwdgrp::get_gecos.
This commit is contained in:
parent
4a3f4e039c
commit
fae48dd783
|
@ -1,3 +1,19 @@
|
|||
2015-01-08 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* cygheap.h (cygheap_pwdgrp::get_shell): Add sid to argument list.
|
||||
(cygheap_pwdgrp::get_gecos): Ditto.
|
||||
* uinfo.cc (fetch_windows_home): Accept cyg_ldap and PUSER_INFO_3
|
||||
arguments, and fetch db home dir values right here.
|
||||
(fetch_from_path): Accept cyg_ldap, PUSER_INFO_3 pointers and sid
|
||||
arguments. Add '%H' format specifier to fetch Windows home dir in
|
||||
POSIX notation.
|
||||
(cygheap_pwdgrp::get_home): Accommodate changes to fetch_windows_home
|
||||
and fetch_from_path.
|
||||
(cygheap_pwdgrp::get_shell): Ditto.
|
||||
(cygheap_pwdgrp::get_gecos): Ditto.
|
||||
(pwdgrp::fetch_account_from_windows): Accommodate sid argument to
|
||||
cygheap_pwdgrp::get_shell and cygheap_pwdgrp::get_gecos.
|
||||
|
||||
2015-01-08 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* include/cygwin/socket.h (struct cmsghdr): Redefine cmsg_len as type
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* cygheap.h: Cygwin heap manager.
|
||||
|
||||
Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||
2011, 2012, 2013, 2014 Red Hat, Inc.
|
||||
2011, 2012, 2013, 2014, 2015 Red Hat, Inc.
|
||||
|
||||
This file is part of Cygwin.
|
||||
|
||||
|
@ -475,11 +475,15 @@ public:
|
|||
char *get_home (struct _USER_INFO_3 *ui, cygpsid &sid, PCWSTR dom,
|
||||
PCWSTR name, bool fq);
|
||||
|
||||
char *get_shell (cyg_ldap *pldap, PCWSTR dom, PCWSTR name, bool fq);
|
||||
char *get_shell (struct _USER_INFO_3 *ui, PCWSTR dom, PCWSTR name, bool fq);
|
||||
char *get_shell (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom, PCWSTR name,
|
||||
bool fq);
|
||||
char *get_shell (struct _USER_INFO_3 *ui, cygpsid &sid, PCWSTR dom,
|
||||
PCWSTR name, bool fq);
|
||||
|
||||
char *get_gecos (cyg_ldap *pldap, PCWSTR dom, PCWSTR name, bool fq);
|
||||
char *get_gecos (struct _USER_INFO_3 *ui, PCWSTR dom, PCWSTR name, bool fq);
|
||||
char *get_gecos (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom, PCWSTR name,
|
||||
bool fq);
|
||||
char *get_gecos (struct _USER_INFO_3 *ui, cygpsid &sid, PCWSTR dom,
|
||||
PCWSTR name, bool fq);
|
||||
|
||||
inline int nss_db_enums () const { return enums; }
|
||||
inline PCWSTR nss_db_enum_tdoms () const { return enum_tdoms; }
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* uinfo.cc: user info (uid, gid, etc...)
|
||||
|
||||
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
|
||||
2007, 2008, 2009, 2010, 2011, 2012, 2014 Red Hat, Inc.
|
||||
2007, 2008, 2009, 2010, 2011, 2012, 2014, 2015 Red Hat, Inc.
|
||||
|
||||
This file is part of Cygwin.
|
||||
|
||||
|
@ -815,10 +815,24 @@ cygheap_pwdgrp::nss_init_line (const char *line)
|
|||
}
|
||||
|
||||
static char *
|
||||
fetch_windows_home (PCWSTR home_from_db, cygpsid &sid)
|
||||
fetch_windows_home (cyg_ldap *pldap, PUSER_INFO_3 ui, cygpsid &sid)
|
||||
{
|
||||
PCWSTR home_from_db = NULL;
|
||||
char *home = NULL;
|
||||
|
||||
if (pldap)
|
||||
{
|
||||
home_from_db = pldap->get_string_attribute (L"homeDrive");
|
||||
if (!home_from_db || !*home_from_db)
|
||||
home_from_db = pldap->get_string_attribute (L"homeDirectory");
|
||||
}
|
||||
else if (ui)
|
||||
{
|
||||
if (ui->usri3_home_dir_drive && *ui->usri3_home_dir_drive)
|
||||
home_from_db = ui->usri3_home_dir_drive;
|
||||
else if (ui->usri3_home_dir && *ui->usri3_home_dir)
|
||||
home_from_db = ui->usri3_home_dir;
|
||||
}
|
||||
if (home_from_db && *home_from_db)
|
||||
home = (char *) cygwin_create_path (CCP_WIN_W_TO_POSIX, home_from_db);
|
||||
else
|
||||
|
@ -880,12 +894,14 @@ fetch_from_description (PCWSTR desc, PCWSTR search, size_t len)
|
|||
}
|
||||
|
||||
static char *
|
||||
fetch_from_path (PCWSTR str, PCWSTR dom, PCWSTR name, bool full_qualified)
|
||||
fetch_from_path (cyg_ldap *pldap, PUSER_INFO_3 ui, cygpsid &sid,
|
||||
PCWSTR str, PCWSTR dom, PCWSTR name, bool full_qualified)
|
||||
{
|
||||
tmp_pathbuf tp;
|
||||
PWCHAR wpath = tp.w_get ();
|
||||
PWCHAR w = wpath;
|
||||
PWCHAR we = wpath + NT_MAX_PATH - 1;
|
||||
char *home;
|
||||
char *ret = NULL;
|
||||
|
||||
while (*str && w < we)
|
||||
|
@ -911,6 +927,19 @@ fetch_from_path (PCWSTR str, PCWSTR dom, PCWSTR name, bool full_qualified)
|
|||
case L'D':
|
||||
w = wcpncpy (w, dom, we - w);
|
||||
break;
|
||||
case L'H':
|
||||
home = fetch_windows_home (pldap, ui, sid);
|
||||
if (home)
|
||||
{
|
||||
/* Drop one leading slash to accommodate home being an
|
||||
absolute path. We don't check for broken usage of
|
||||
%H here, of course. */
|
||||
if (w > wpath && w[-1] == L'/')
|
||||
--w;
|
||||
w += sys_mbstowcs (w, we - w, home) - 1;
|
||||
free (home);
|
||||
}
|
||||
break;
|
||||
case L'_':
|
||||
*w++ = L' ';
|
||||
break;
|
||||
|
@ -940,10 +969,7 @@ cygheap_pwdgrp::get_home (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
|
|||
case NSS_SCHEME_FALLBACK:
|
||||
return NULL;
|
||||
case NSS_SCHEME_WINDOWS:
|
||||
val = pldap->get_string_attribute (L"homeDrive");
|
||||
if (!val || !*val)
|
||||
val = pldap->get_string_attribute (L"homeDirectory");
|
||||
home = fetch_windows_home (val, sid);
|
||||
home = fetch_windows_home (pldap, NULL, sid);
|
||||
break;
|
||||
case NSS_SCHEME_CYGWIN:
|
||||
val = pldap->get_string_attribute (L"cygwinHome");
|
||||
|
@ -961,8 +987,8 @@ cygheap_pwdgrp::get_home (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
|
|||
home = fetch_from_description (val, L"home=\"", 6);
|
||||
break;
|
||||
case NSS_SCHEME_PATH:
|
||||
home = fetch_from_path (home_scheme[idx].attrib, dom, name,
|
||||
full_qualified);
|
||||
home = fetch_from_path (pldap, NULL, sid, home_scheme[idx].attrib,
|
||||
dom, name, full_qualified);
|
||||
break;
|
||||
case NSS_SCHEME_FREEATTR:
|
||||
val = pldap->get_string_attribute (home_scheme[idx].attrib);
|
||||
|
@ -983,7 +1009,6 @@ char *
|
|||
cygheap_pwdgrp::get_home (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
|
||||
PCWSTR name, bool full_qualified)
|
||||
{
|
||||
PWCHAR val = NULL;
|
||||
char *home = NULL;
|
||||
|
||||
for (uint16_t idx = 0; !home && idx < NSS_SCHEME_MAX; ++idx)
|
||||
|
@ -993,11 +1018,7 @@ cygheap_pwdgrp::get_home (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
|
|||
case NSS_SCHEME_FALLBACK:
|
||||
return NULL;
|
||||
case NSS_SCHEME_WINDOWS:
|
||||
if (ui->usri3_home_dir_drive && *ui->usri3_home_dir_drive)
|
||||
val = ui->usri3_home_dir_drive;
|
||||
else if (ui->usri3_home_dir && *ui->usri3_home_dir)
|
||||
val = ui->usri3_home_dir;
|
||||
home = fetch_windows_home (val, sid);
|
||||
home = fetch_windows_home (NULL, ui, sid);
|
||||
break;
|
||||
case NSS_SCHEME_CYGWIN:
|
||||
case NSS_SCHEME_UNIX:
|
||||
|
@ -1007,8 +1028,8 @@ cygheap_pwdgrp::get_home (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
|
|||
home = fetch_from_description (ui->usri3_comment, L"home=\"", 6);
|
||||
break;
|
||||
case NSS_SCHEME_PATH:
|
||||
home = fetch_from_path (home_scheme[idx].attrib, dom, name,
|
||||
full_qualified);
|
||||
home = fetch_from_path (NULL, ui, sid, home_scheme[idx].attrib,
|
||||
dom, name, full_qualified);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1016,8 +1037,8 @@ cygheap_pwdgrp::get_home (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
|
|||
}
|
||||
|
||||
char *
|
||||
cygheap_pwdgrp::get_shell (cyg_ldap *pldap, PCWSTR dom, PCWSTR name,
|
||||
bool full_qualified)
|
||||
cygheap_pwdgrp::get_shell (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
|
||||
PCWSTR name, bool full_qualified)
|
||||
{
|
||||
PWCHAR val;
|
||||
char *shell = NULL;
|
||||
|
@ -1046,8 +1067,8 @@ cygheap_pwdgrp::get_shell (cyg_ldap *pldap, PCWSTR dom, PCWSTR name,
|
|||
shell = fetch_from_description (val, L"shell=\"", 7);
|
||||
break;
|
||||
case NSS_SCHEME_PATH:
|
||||
shell = fetch_from_path (shell_scheme[idx].attrib, dom, name,
|
||||
full_qualified);
|
||||
shell = fetch_from_path (pldap, NULL, sid, shell_scheme[idx].attrib,
|
||||
dom, name, full_qualified);
|
||||
break;
|
||||
case NSS_SCHEME_FREEATTR:
|
||||
val = pldap->get_string_attribute (shell_scheme[idx].attrib);
|
||||
|
@ -1065,8 +1086,8 @@ cygheap_pwdgrp::get_shell (cyg_ldap *pldap, PCWSTR dom, PCWSTR name,
|
|||
}
|
||||
|
||||
char *
|
||||
cygheap_pwdgrp::get_shell (PUSER_INFO_3 ui, PCWSTR dom, PCWSTR name,
|
||||
bool full_qualified)
|
||||
cygheap_pwdgrp::get_shell (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
|
||||
PCWSTR name, bool full_qualified)
|
||||
{
|
||||
char *shell = NULL;
|
||||
|
||||
|
@ -1085,8 +1106,8 @@ cygheap_pwdgrp::get_shell (PUSER_INFO_3 ui, PCWSTR dom, PCWSTR name,
|
|||
shell = fetch_from_description (ui->usri3_comment, L"shell=\"", 7);
|
||||
break;
|
||||
case NSS_SCHEME_PATH:
|
||||
shell = fetch_from_path (shell_scheme[idx].attrib, dom, name,
|
||||
full_qualified);
|
||||
shell = fetch_from_path (NULL, ui, sid, shell_scheme[idx].attrib,
|
||||
dom, name, full_qualified);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1103,8 +1124,8 @@ colon_to_semicolon (char *str)
|
|||
}
|
||||
|
||||
char *
|
||||
cygheap_pwdgrp::get_gecos (cyg_ldap *pldap, PCWSTR dom, PCWSTR name,
|
||||
bool full_qualified)
|
||||
cygheap_pwdgrp::get_gecos (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
|
||||
PCWSTR name, bool full_qualified)
|
||||
{
|
||||
PWCHAR val;
|
||||
char *gecos = NULL;
|
||||
|
@ -1136,8 +1157,9 @@ cygheap_pwdgrp::get_gecos (cyg_ldap *pldap, PCWSTR dom, PCWSTR name,
|
|||
gecos = fetch_from_description (val, L"gecos=\"", 7);
|
||||
break;
|
||||
case NSS_SCHEME_PATH:
|
||||
gecos = fetch_from_path (gecos_scheme[idx].attrib + 1, dom, name,
|
||||
full_qualified);
|
||||
gecos = fetch_from_path (pldap, NULL, sid,
|
||||
gecos_scheme[idx].attrib + 1,
|
||||
dom, name, full_qualified);
|
||||
break;
|
||||
case NSS_SCHEME_FREEATTR:
|
||||
val = pldap->get_string_attribute (gecos_scheme[idx].attrib);
|
||||
|
@ -1152,8 +1174,8 @@ cygheap_pwdgrp::get_gecos (cyg_ldap *pldap, PCWSTR dom, PCWSTR name,
|
|||
}
|
||||
|
||||
char *
|
||||
cygheap_pwdgrp::get_gecos (PUSER_INFO_3 ui, PCWSTR dom, PCWSTR name,
|
||||
bool full_qualified)
|
||||
cygheap_pwdgrp::get_gecos (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
|
||||
PCWSTR name, bool full_qualified)
|
||||
{
|
||||
char *gecos = NULL;
|
||||
|
||||
|
@ -1175,8 +1197,8 @@ cygheap_pwdgrp::get_gecos (PUSER_INFO_3 ui, PCWSTR dom, PCWSTR name,
|
|||
gecos = fetch_from_description (ui->usri3_comment, L"gecos=\"", 7);
|
||||
break;
|
||||
case NSS_SCHEME_PATH:
|
||||
gecos = fetch_from_path (gecos_scheme[idx].attrib + 1, dom, name,
|
||||
full_qualified);
|
||||
gecos = fetch_from_path (NULL, ui, sid, gecos_scheme[idx].attrib + 1,
|
||||
dom, name, full_qualified);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -2066,9 +2088,9 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, cyg_ldap *pldap)
|
|||
{
|
||||
home = cygheap->pg.get_home (cldap, sid, dom, name,
|
||||
fully_qualified_name);
|
||||
shell = cygheap->pg.get_shell (cldap, dom, name,
|
||||
shell = cygheap->pg.get_shell (cldap, sid, dom, name,
|
||||
fully_qualified_name);
|
||||
gecos = cygheap->pg.get_gecos (cldap, dom, name,
|
||||
gecos = cygheap->pg.get_gecos (cldap, sid, dom, name,
|
||||
fully_qualified_name);
|
||||
}
|
||||
/* Check and, if necessary, add unix<->windows id mapping on
|
||||
|
@ -2122,9 +2144,9 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, cyg_ldap *pldap)
|
|||
/* Fetch user attributes. */
|
||||
home = cygheap->pg.get_home (ui, sid, dom, name,
|
||||
fully_qualified_name);
|
||||
shell = cygheap->pg.get_shell (ui, dom, name,
|
||||
shell = cygheap->pg.get_shell (ui, sid, dom, name,
|
||||
fully_qualified_name);
|
||||
gecos = cygheap->pg.get_gecos (ui, dom, name,
|
||||
gecos = cygheap->pg.get_gecos (ui, sid, dom, name,
|
||||
fully_qualified_name);
|
||||
uxid = fetch_from_description (ui->usri3_comment,
|
||||
L"unix=\"", 6);
|
||||
|
|
Loading…
Reference in New Issue