* uinfo.cc (fetch_windows_home): New function fetching Windows-compliant
home directory. Include longish comment to explain what we're doing. (cygheap_pwdgrp::get_home): Take additional sid parameter. In NSS_SCHEME_WINDOWS case, call fetch_windows_home to create home directory. (pwdgrp::fetch_account_from_windows): Call cygheap_pwdgrp::get_home with additional sid argument. * cygheap.h (cygheap_pwdgrp::get_home): Align declaration to above change.
This commit is contained in:
parent
4fe712cd80
commit
44cacc7f44
|
@ -1,3 +1,15 @@
|
||||||
|
2014-12-02 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* uinfo.cc (fetch_windows_home): New function fetching Windows-compliant
|
||||||
|
home directory. Include longish comment to explain what we're doing.
|
||||||
|
(cygheap_pwdgrp::get_home): Take additional sid parameter. In
|
||||||
|
NSS_SCHEME_WINDOWS case, call fetch_windows_home to create home
|
||||||
|
directory.
|
||||||
|
(pwdgrp::fetch_account_from_windows): Call cygheap_pwdgrp::get_home
|
||||||
|
with additional sid argument.
|
||||||
|
* cygheap.h (cygheap_pwdgrp::get_home): Align declaration to above
|
||||||
|
change.
|
||||||
|
|
||||||
2014-12-02 Corinna Vinschen <corinna@vinschen.de>
|
2014-12-02 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* uinfo.cc (cygheap_user::ontherange): Fix order of fallbacks creating
|
* uinfo.cc (cygheap_user::ontherange): Fix order of fallbacks creating
|
||||||
|
|
|
@ -470,8 +470,10 @@ public:
|
||||||
inline bool nss_cygserver_caching () const { return caching; }
|
inline bool nss_cygserver_caching () const { return caching; }
|
||||||
inline void nss_disable_cygserver_caching () { caching = false; }
|
inline void nss_disable_cygserver_caching () { caching = false; }
|
||||||
|
|
||||||
char *get_home (cyg_ldap *pldap, PCWSTR dom, PCWSTR name, bool fq);
|
char *get_home (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom, PCWSTR name,
|
||||||
char *get_home (struct _USER_INFO_3 *ui, PCWSTR dom, PCWSTR name, bool fq);
|
bool fq);
|
||||||
|
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 (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 (struct _USER_INFO_3 *ui, PCWSTR dom, PCWSTR name, bool fq);
|
||||||
|
|
|
@ -814,6 +814,36 @@ cygheap_pwdgrp::nss_init_line (const char *line)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
fetch_windows_home (PCWSTR home_from_db, cygpsid &sid)
|
||||||
|
{
|
||||||
|
char *home = NULL;
|
||||||
|
|
||||||
|
if (home_from_db && *home_from_db)
|
||||||
|
home = (char *) cygwin_create_path (CCP_WIN_W_TO_POSIX, home_from_db);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The db fields are empty, so we have to evaluate the local profile
|
||||||
|
path, which is the same thing as the default home directory on
|
||||||
|
Windows. So what we do here is to try to find out if the user
|
||||||
|
already has a profile on this machine.
|
||||||
|
Note that we don't try to generate the profile if it doesn't exist.
|
||||||
|
Think what would happen if we actually have the permissions to do
|
||||||
|
so and call getpwent... in a domain environment. The problem is,
|
||||||
|
of course, that we can't know the profile path, unless the OS
|
||||||
|
created it.
|
||||||
|
The only reason this could occur is if a user account, which never
|
||||||
|
logged on to the machine before, tries to logon via a Cygwin service
|
||||||
|
like sshd. */
|
||||||
|
WCHAR profile[MAX_PATH];
|
||||||
|
WCHAR sidstr[128];
|
||||||
|
|
||||||
|
if (get_user_profile_directory (sid.string (sidstr), profile, MAX_PATH))
|
||||||
|
home = (char *) cygwin_create_path (CCP_WIN_W_TO_POSIX, profile);
|
||||||
|
}
|
||||||
|
return home;
|
||||||
|
}
|
||||||
|
|
||||||
/* Local SAM accounts have only a handful attributes available to home users.
|
/* Local SAM accounts have only a handful attributes available to home users.
|
||||||
Therefore, allow to fetch additional passwd/group attributes from the
|
Therefore, allow to fetch additional passwd/group attributes from the
|
||||||
"Comment" field in XML short style. For symmetry, this is also allowed
|
"Comment" field in XML short style. For symmetry, this is also allowed
|
||||||
|
@ -897,8 +927,8 @@ fetch_from_path (PCWSTR str, PCWSTR dom, PCWSTR name, bool full_qualified)
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
cygheap_pwdgrp::get_home (cyg_ldap *pldap, PCWSTR dom, PCWSTR name,
|
cygheap_pwdgrp::get_home (cyg_ldap *pldap, cygpsid &sid, PCWSTR dom,
|
||||||
bool full_qualified)
|
PCWSTR name, bool full_qualified)
|
||||||
{
|
{
|
||||||
PWCHAR val;
|
PWCHAR val;
|
||||||
char *home = NULL;
|
char *home = NULL;
|
||||||
|
@ -913,8 +943,7 @@ cygheap_pwdgrp::get_home (cyg_ldap *pldap, PCWSTR dom, PCWSTR name,
|
||||||
val = pldap->get_string_attribute (L"homeDrive");
|
val = pldap->get_string_attribute (L"homeDrive");
|
||||||
if (!val || !*val)
|
if (!val || !*val)
|
||||||
val = pldap->get_string_attribute (L"homeDirectory");
|
val = pldap->get_string_attribute (L"homeDirectory");
|
||||||
if (val && *val)
|
home = fetch_windows_home (val, sid);
|
||||||
home = (char *) cygwin_create_path (CCP_WIN_W_TO_POSIX, val);
|
|
||||||
break;
|
break;
|
||||||
case NSS_SCHEME_CYGWIN:
|
case NSS_SCHEME_CYGWIN:
|
||||||
val = pldap->get_string_attribute (L"cygwinHome");
|
val = pldap->get_string_attribute (L"cygwinHome");
|
||||||
|
@ -951,9 +980,10 @@ cygheap_pwdgrp::get_home (cyg_ldap *pldap, PCWSTR dom, PCWSTR name,
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
cygheap_pwdgrp::get_home (PUSER_INFO_3 ui, PCWSTR dom, PCWSTR name,
|
cygheap_pwdgrp::get_home (PUSER_INFO_3 ui, cygpsid &sid, PCWSTR dom,
|
||||||
bool full_qualified)
|
PCWSTR name, bool full_qualified)
|
||||||
{
|
{
|
||||||
|
PWCHAR val = NULL;
|
||||||
char *home = NULL;
|
char *home = NULL;
|
||||||
|
|
||||||
for (uint16_t idx = 0; !home && idx < NSS_SCHEME_MAX; ++idx)
|
for (uint16_t idx = 0; !home && idx < NSS_SCHEME_MAX; ++idx)
|
||||||
|
@ -964,11 +994,10 @@ cygheap_pwdgrp::get_home (PUSER_INFO_3 ui, PCWSTR dom, PCWSTR name,
|
||||||
return NULL;
|
return NULL;
|
||||||
case NSS_SCHEME_WINDOWS:
|
case NSS_SCHEME_WINDOWS:
|
||||||
if (ui->usri3_home_dir_drive && *ui->usri3_home_dir_drive)
|
if (ui->usri3_home_dir_drive && *ui->usri3_home_dir_drive)
|
||||||
home = (char *) cygwin_create_path (CCP_WIN_W_TO_POSIX,
|
val = ui->usri3_home_dir_drive;
|
||||||
ui->usri3_home_dir_drive);
|
|
||||||
else if (ui->usri3_home_dir && *ui->usri3_home_dir)
|
else if (ui->usri3_home_dir && *ui->usri3_home_dir)
|
||||||
home = (char *) cygwin_create_path (CCP_WIN_W_TO_POSIX,
|
val = ui->usri3_home_dir;
|
||||||
ui->usri3_home_dir);
|
home = fetch_windows_home (val, sid);
|
||||||
break;
|
break;
|
||||||
case NSS_SCHEME_CYGWIN:
|
case NSS_SCHEME_CYGWIN:
|
||||||
case NSS_SCHEME_UNIX:
|
case NSS_SCHEME_UNIX:
|
||||||
|
@ -2035,7 +2064,7 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, cyg_ldap *pldap)
|
||||||
gid = posix_offset + id_val;
|
gid = posix_offset + id_val;
|
||||||
if (!is_group ())
|
if (!is_group ())
|
||||||
{
|
{
|
||||||
home = cygheap->pg.get_home (cldap, dom, name,
|
home = cygheap->pg.get_home (cldap, sid, dom, name,
|
||||||
fully_qualified_name);
|
fully_qualified_name);
|
||||||
shell = cygheap->pg.get_shell (cldap, dom, name,
|
shell = cygheap->pg.get_shell (cldap, dom, name,
|
||||||
fully_qualified_name);
|
fully_qualified_name);
|
||||||
|
@ -2091,7 +2120,7 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, cyg_ldap *pldap)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Fetch user attributes. */
|
/* Fetch user attributes. */
|
||||||
home = cygheap->pg.get_home (ui, dom, name,
|
home = cygheap->pg.get_home (ui, sid, dom, name,
|
||||||
fully_qualified_name);
|
fully_qualified_name);
|
||||||
shell = cygheap->pg.get_shell (ui, dom, name,
|
shell = cygheap->pg.get_shell (ui, dom, name,
|
||||||
fully_qualified_name);
|
fully_qualified_name);
|
||||||
|
|
Loading…
Reference in New Issue