* autoload.cc (ldap_abandon): Import.
(ldap_result): Import. (ldap_searchW): Import. (NetGroupEnum): Import. (NetLocalGroupEnum): Import. (NetUserEnum): Import. * cygheap.h (class cygheap_pwdgrp): Add members enums and enum_tdoms. (cygheap_pwdgrp::nss_db_enums): New inline method. (cygheap_pwdgrp::nss_db_enum_tdoms): Ditto. * cygtls.h (struct _local_storage): Drop unused members pw_pos and grp_pos. * grp.cc (grent): New static variable of class gr_ent. (gr_ent::enumerate_caches): New method. (gr_ent::enumerate_local): New method. (gr_ent::getgrent): New method. (setgrent): Call gr_ent method. (getgrent32): Ditto. (endgrent): Ditto. * ldap.cc (sid_attr): Rename from nfs_attr. (cyg_ldap::close): Abandon still running asynchronous search. (cyg_ldap::fetch_ad_account): Reduce filter buffer size. (cyg_ldap::enumerate_ad_accounts): New method. (cyg_ldap::next_account): New method. (cyg_ldap::fetch_posix_offset_for_domain): Reduce filter buffer size. (cyg_ldap::fetch_unix_sid_from_ad): Ditto. Fix return value in case no value has been read. (cyg_ldap::fetch_unix_name_from_rfc2307): Reduce filter buffer size. * ldap.h (class cyg_ldap): Add msg_id member. (cyg_ldap::enumerate_ad_accounts): Declare. (cyg_ldap::next_account): Declare: * passwd.cc (pwent): New static variable of class pw_ent. (pg_ent::clear_cache): New method. (pg_ent::setent): New method. (pg_ent::getent): New method. (pg_ent::endent): New method. (pg_ent::enumerate_file): New method. (pg_ent::enumerate_builtin): New method. (pg_ent::enumerate_sam): New method. (pg_ent::enumerate_ad): New method. (pw_ent::enumerate_caches): New method. (pw_ent::enumerate_local): New method. (pw_ent::getpwent): New method. (setpwent): Call pw_ent method. (getpwent): Ditto. (endpwent): Ditto. * pwdgrp.h (class pwdgrp): Define pg_ent, pw_ent and gr_ent as friend classes. (pwdgrp::add_account_post_fetch): Declare with extra bool parameter. (pwdgrp::file_attr): New inline method. (enum nss_enum_t): Define. (class pg_ent): Define. (class pw_ent): Define. (class gr_ent): Define. * tlsoffsets.h: Regenerate. * tlsoffsets64.h: Ditto. * uinfo.cc (cygheap_pwdgrp::init): Initialize enums and enum_tdoms. (cygheap_pwdgrp::nss_init_line): Fix typo in preceeding comment. Handle new "db_enum" keyword. (pwdgrp::add_account_post_fetch): Take additional `bool lock' parameter and acquire pglock before adding element to array if lock is true. (pwdgrp::add_account_from_file): Call add_account_post_fetch with lock set to true. (pwdgrp::add_account_from_windows): Ditto in case of caching. (pwdgrp::fetch_account_from_windows): Handle builtin aliases only known to the domain controller. Only call NetLocalGroupGetInfo for aliases.
This commit is contained in:
parent
1e705e2932
commit
a8cf6887a2
|
@ -1,3 +1,72 @@
|
||||||
|
2014-02-17 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* autoload.cc (ldap_abandon): Import.
|
||||||
|
(ldap_result): Import.
|
||||||
|
(ldap_searchW): Import.
|
||||||
|
(NetGroupEnum): Import.
|
||||||
|
(NetLocalGroupEnum): Import.
|
||||||
|
(NetUserEnum): Import.
|
||||||
|
* cygheap.h (class cygheap_pwdgrp): Add members enums and enum_tdoms.
|
||||||
|
(cygheap_pwdgrp::nss_db_enums): New inline method.
|
||||||
|
(cygheap_pwdgrp::nss_db_enum_tdoms): Ditto.
|
||||||
|
* cygtls.h (struct _local_storage): Drop unused members pw_pos and
|
||||||
|
grp_pos.
|
||||||
|
* grp.cc (grent): New static variable of class gr_ent.
|
||||||
|
(gr_ent::enumerate_caches): New method.
|
||||||
|
(gr_ent::enumerate_local): New method.
|
||||||
|
(gr_ent::getgrent): New method.
|
||||||
|
(setgrent): Call gr_ent method.
|
||||||
|
(getgrent32): Ditto.
|
||||||
|
(endgrent): Ditto.
|
||||||
|
* ldap.cc (sid_attr): Rename from nfs_attr.
|
||||||
|
(cyg_ldap::close): Abandon still running asynchronous search.
|
||||||
|
(cyg_ldap::fetch_ad_account): Reduce filter buffer size.
|
||||||
|
(cyg_ldap::enumerate_ad_accounts): New method.
|
||||||
|
(cyg_ldap::next_account): New method.
|
||||||
|
(cyg_ldap::fetch_posix_offset_for_domain): Reduce filter buffer size.
|
||||||
|
(cyg_ldap::fetch_unix_sid_from_ad): Ditto. Fix return value in case
|
||||||
|
no value has been read.
|
||||||
|
(cyg_ldap::fetch_unix_name_from_rfc2307): Reduce filter buffer size.
|
||||||
|
* ldap.h (class cyg_ldap): Add msg_id member.
|
||||||
|
(cyg_ldap::enumerate_ad_accounts): Declare.
|
||||||
|
(cyg_ldap::next_account): Declare:
|
||||||
|
* passwd.cc (pwent): New static variable of class pw_ent.
|
||||||
|
(pg_ent::clear_cache): New method.
|
||||||
|
(pg_ent::setent): New method.
|
||||||
|
(pg_ent::getent): New method.
|
||||||
|
(pg_ent::endent): New method.
|
||||||
|
(pg_ent::enumerate_file): New method.
|
||||||
|
(pg_ent::enumerate_builtin): New method.
|
||||||
|
(pg_ent::enumerate_sam): New method.
|
||||||
|
(pg_ent::enumerate_ad): New method.
|
||||||
|
(pw_ent::enumerate_caches): New method.
|
||||||
|
(pw_ent::enumerate_local): New method.
|
||||||
|
(pw_ent::getpwent): New method.
|
||||||
|
(setpwent): Call pw_ent method.
|
||||||
|
(getpwent): Ditto.
|
||||||
|
(endpwent): Ditto.
|
||||||
|
* pwdgrp.h (class pwdgrp): Define pg_ent, pw_ent and gr_ent as friend
|
||||||
|
classes.
|
||||||
|
(pwdgrp::add_account_post_fetch): Declare with extra bool parameter.
|
||||||
|
(pwdgrp::file_attr): New inline method.
|
||||||
|
(enum nss_enum_t): Define.
|
||||||
|
(class pg_ent): Define.
|
||||||
|
(class pw_ent): Define.
|
||||||
|
(class gr_ent): Define.
|
||||||
|
* tlsoffsets.h: Regenerate.
|
||||||
|
* tlsoffsets64.h: Ditto.
|
||||||
|
* uinfo.cc (cygheap_pwdgrp::init): Initialize enums and enum_tdoms.
|
||||||
|
(cygheap_pwdgrp::nss_init_line): Fix typo in preceeding comment.
|
||||||
|
Handle new "db_enum" keyword.
|
||||||
|
(pwdgrp::add_account_post_fetch): Take additional `bool lock' parameter
|
||||||
|
and acquire pglock before adding element to array if lock is true.
|
||||||
|
(pwdgrp::add_account_from_file): Call add_account_post_fetch with lock
|
||||||
|
set to true.
|
||||||
|
(pwdgrp::add_account_from_windows): Ditto in case of caching.
|
||||||
|
(pwdgrp::fetch_account_from_windows): Handle builtin aliases only
|
||||||
|
known to the domain controller. Only call NetLocalGroupGetInfo for
|
||||||
|
aliases.
|
||||||
|
|
||||||
2014-02-16 Corinna Vinschen <corinna@vinschen.de>
|
2014-02-16 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* miscfuncs.h (NT_readline::close): New function to close handle.
|
* miscfuncs.h (NT_readline::close): New function to close handle.
|
||||||
|
|
|
@ -584,6 +584,7 @@ LoadDLLfunc (LocaleNameToLCID, 8, kernel32)
|
||||||
#pragma push_macro ("mangle")
|
#pragma push_macro ("mangle")
|
||||||
#undef mangle
|
#undef mangle
|
||||||
#define mangle(name, n) #name
|
#define mangle(name, n) #name
|
||||||
|
LoadDLLfunc (ldap_abandon, 0, wldap32)
|
||||||
LoadDLLfunc (ldap_bind_s, 0, wldap32)
|
LoadDLLfunc (ldap_bind_s, 0, wldap32)
|
||||||
LoadDLLfunc (ldap_count_valuesW, 0, wldap32)
|
LoadDLLfunc (ldap_count_valuesW, 0, wldap32)
|
||||||
LoadDLLfunc (ldap_first_entry, 0, wldap32)
|
LoadDLLfunc (ldap_first_entry, 0, wldap32)
|
||||||
|
@ -592,6 +593,8 @@ LoadDLLfunc (ldap_get_values_lenW, 0, wldap32)
|
||||||
LoadDLLfunc (ldap_initW, 0, wldap32)
|
LoadDLLfunc (ldap_initW, 0, wldap32)
|
||||||
LoadDLLfunc (ldap_memfreeW, 0, wldap32)
|
LoadDLLfunc (ldap_memfreeW, 0, wldap32)
|
||||||
LoadDLLfunc (ldap_next_entry, 0, wldap32)
|
LoadDLLfunc (ldap_next_entry, 0, wldap32)
|
||||||
|
LoadDLLfunc (ldap_result, 0, wldap32)
|
||||||
|
LoadDLLfunc (ldap_searchW, 0, wldap32)
|
||||||
LoadDLLfunc (ldap_search_stW, 0, wldap32)
|
LoadDLLfunc (ldap_search_stW, 0, wldap32)
|
||||||
LoadDLLfunc (ldap_set_option, 0, wldap32)
|
LoadDLLfunc (ldap_set_option, 0, wldap32)
|
||||||
LoadDLLfunc (ldap_sslinitW, 0, wldap32)
|
LoadDLLfunc (ldap_sslinitW, 0, wldap32)
|
||||||
|
@ -610,8 +613,11 @@ LoadDLLfunc (WNetOpenEnumA, 20, mpr)
|
||||||
LoadDLLfunc (DsEnumerateDomainTrustsW, 16, netapi32)
|
LoadDLLfunc (DsEnumerateDomainTrustsW, 16, netapi32)
|
||||||
LoadDLLfunc (DsGetDcNameW, 24, netapi32)
|
LoadDLLfunc (DsGetDcNameW, 24, netapi32)
|
||||||
LoadDLLfunc (NetApiBufferFree, 4, netapi32)
|
LoadDLLfunc (NetApiBufferFree, 4, netapi32)
|
||||||
|
LoadDLLfunc (NetGroupEnum, 28, netapi32)
|
||||||
|
LoadDLLfunc (NetLocalGroupEnum, 28, netapi32)
|
||||||
LoadDLLfunc (NetLocalGroupGetInfo, 16, netapi32)
|
LoadDLLfunc (NetLocalGroupGetInfo, 16, netapi32)
|
||||||
LoadDLLfunc (NetUseGetInfo, 16, netapi32)
|
LoadDLLfunc (NetUseGetInfo, 16, netapi32)
|
||||||
|
LoadDLLfunc (NetUserEnum, 32, netapi32)
|
||||||
LoadDLLfunc (NetUserGetGroups, 28, netapi32)
|
LoadDLLfunc (NetUserGetGroups, 28, netapi32)
|
||||||
LoadDLLfunc (NetUserGetInfo, 16, netapi32)
|
LoadDLLfunc (NetUserGetInfo, 16, netapi32)
|
||||||
LoadDLLfunc (NetUserGetLocalGroups, 32, netapi32)
|
LoadDLLfunc (NetUserGetLocalGroups, 32, netapi32)
|
||||||
|
|
|
@ -400,12 +400,14 @@ class cygheap_pwdgrp
|
||||||
NSS_PRIMARY,
|
NSS_PRIMARY,
|
||||||
NSS_ALWAYS
|
NSS_ALWAYS
|
||||||
};
|
};
|
||||||
bool nss_inited;
|
bool nss_inited;
|
||||||
int pwd_src;
|
int pwd_src;
|
||||||
int grp_src;
|
int grp_src;
|
||||||
pfx_t prefix;
|
pfx_t prefix;
|
||||||
WCHAR separator[2];
|
WCHAR separator[2];
|
||||||
bool caching;
|
bool caching;
|
||||||
|
int enums;
|
||||||
|
PWCHAR enum_tdoms;
|
||||||
|
|
||||||
void nss_init_line (const char *line);
|
void nss_init_line (const char *line);
|
||||||
void _nss_init ();
|
void _nss_init ();
|
||||||
|
@ -432,6 +434,8 @@ public:
|
||||||
inline bool nss_prefix_always () const { return prefix == NSS_ALWAYS; }
|
inline bool nss_prefix_always () const { return prefix == NSS_ALWAYS; }
|
||||||
inline PCWSTR nss_separator () const { return separator; }
|
inline PCWSTR nss_separator () const { return separator; }
|
||||||
inline bool nss_db_caching () const { return caching; }
|
inline bool nss_db_caching () const { return caching; }
|
||||||
|
inline int nss_db_enums () const { return enums; }
|
||||||
|
inline PCWSTR nss_db_enum_tdoms () const { return enum_tdoms; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class cygheap_ugid_cache
|
class cygheap_ugid_cache
|
||||||
|
|
|
@ -82,11 +82,9 @@ struct _local_storage
|
||||||
/* passwd.cc */
|
/* passwd.cc */
|
||||||
void *pwbuf;
|
void *pwbuf;
|
||||||
char pass[_PASSWORD_LEN];
|
char pass[_PASSWORD_LEN];
|
||||||
ULONG pw_pos;
|
|
||||||
|
|
||||||
/* grp.cc */
|
/* grp.cc */
|
||||||
void *grbuf;
|
void *grbuf;
|
||||||
ULONG grp_pos;
|
|
||||||
|
|
||||||
/* dlfcn.cc */
|
/* dlfcn.cc */
|
||||||
int dl_error;
|
int dl_error;
|
||||||
|
|
|
@ -13,6 +13,7 @@ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
details. */
|
details. */
|
||||||
|
|
||||||
#include "winsup.h"
|
#include "winsup.h"
|
||||||
|
#include <lm.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -23,6 +24,9 @@ details. */
|
||||||
#include "dtable.h"
|
#include "dtable.h"
|
||||||
#include "cygheap.h"
|
#include "cygheap.h"
|
||||||
#include "ntdll.h"
|
#include "ntdll.h"
|
||||||
|
#include "miscfuncs.h"
|
||||||
|
#include "ldap.h"
|
||||||
|
#include "tls_pbuf.h"
|
||||||
|
|
||||||
static char * NO_COPY_RO null_ptr;
|
static char * NO_COPY_RO null_ptr;
|
||||||
|
|
||||||
|
@ -309,29 +313,102 @@ getgrnam (const char *name)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern "C" void
|
/* getgrent functions are not reentrant. */
|
||||||
endgrent ()
|
static gr_ent grent;
|
||||||
|
|
||||||
|
void *
|
||||||
|
gr_ent::enumerate_caches ()
|
||||||
{
|
{
|
||||||
_my_tls.locals.grp_pos = 0;
|
if (!max && from_files)
|
||||||
|
{
|
||||||
|
pwdgrp &grf = cygheap->pg.grp_cache.file;
|
||||||
|
grf.check_file (true);
|
||||||
|
if (cnt < grf.cached_groups ())
|
||||||
|
return &grf.group ()[cnt++].g;
|
||||||
|
cnt = 0;
|
||||||
|
max = 1;
|
||||||
|
}
|
||||||
|
if (from_db && cygheap->pg.nss_db_caching ())
|
||||||
|
{
|
||||||
|
pwdgrp &grw = cygheap->pg.grp_cache.win;
|
||||||
|
if (cnt < grw.cached_groups ())
|
||||||
|
return &grw.group ()[cnt++].g;
|
||||||
|
}
|
||||||
|
cnt = max = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
gr_ent::enumerate_local ()
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (!cnt)
|
||||||
|
{
|
||||||
|
DWORD total;
|
||||||
|
NET_API_STATUS ret;
|
||||||
|
|
||||||
|
if (buf)
|
||||||
|
{
|
||||||
|
NetApiBufferFree (buf);
|
||||||
|
buf = NULL;
|
||||||
|
}
|
||||||
|
if (resume == ULONG_MAX)
|
||||||
|
ret = ERROR_NO_MORE_ITEMS;
|
||||||
|
else
|
||||||
|
ret = NetLocalGroupEnum (NULL, 0, (PBYTE *) &buf,
|
||||||
|
MAX_PREFERRED_LENGTH,
|
||||||
|
&max, &total, &resume);
|
||||||
|
if (ret == NERR_Success)
|
||||||
|
resume = ULONG_MAX;
|
||||||
|
else if (ret != ERROR_MORE_DATA)
|
||||||
|
{
|
||||||
|
cnt = max = resume = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (cnt < max)
|
||||||
|
{
|
||||||
|
cygsid sid;
|
||||||
|
DWORD slen = MAX_SID_LEN;
|
||||||
|
WCHAR dom[DNLEN + 1];
|
||||||
|
DWORD dlen = DNLEN + 1;
|
||||||
|
SID_NAME_USE acc_type;
|
||||||
|
|
||||||
|
LookupAccountNameW (NULL,
|
||||||
|
((PLOCALGROUP_INFO_0) buf)[cnt++].lgrpi0_name,
|
||||||
|
sid, &slen, dom, &dlen, &acc_type);
|
||||||
|
fetch_user_arg_t arg;
|
||||||
|
arg.type = SID_arg;
|
||||||
|
arg.sid = &sid;
|
||||||
|
char *line = pg.fetch_account_from_windows (arg, true);
|
||||||
|
if (line)
|
||||||
|
return pg.add_account_post_fetch (line, false);
|
||||||
|
}
|
||||||
|
cnt = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct group *
|
||||||
|
gr_ent::getgrent (void)
|
||||||
|
{
|
||||||
|
if (state == rewound)
|
||||||
|
setent (true);
|
||||||
|
else
|
||||||
|
clear_cache ();
|
||||||
|
return (struct group *) getent ();
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
setgrent ()
|
||||||
|
{
|
||||||
|
grent.setgrent ();
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" struct group *
|
extern "C" struct group *
|
||||||
getgrent32 ()
|
getgrent32 (void)
|
||||||
{
|
{
|
||||||
pwdgrp &grf = cygheap->pg.grp_cache.file;
|
return grent.getgrent ();
|
||||||
if (cygheap->pg.nss_grp_files ())
|
|
||||||
{
|
|
||||||
cygheap->pg.grp_cache.file.check_file (true);
|
|
||||||
if (_my_tls.locals.grp_pos < grf.cached_groups ())
|
|
||||||
return &grf.group ()[_my_tls.locals.grp_pos++].g;
|
|
||||||
}
|
|
||||||
if ((cygheap->pg.nss_grp_db ()) && cygheap->pg.nss_db_caching ())
|
|
||||||
{
|
|
||||||
pwdgrp &grw = cygheap->pg.grp_cache.win;
|
|
||||||
if (_my_tls.locals.grp_pos - grf.cached_groups () < grw.cached_groups ())
|
|
||||||
return &grw.group ()[_my_tls.locals.grp_pos++ - grf.cached_groups ()].g;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __x86_64__
|
#ifdef __x86_64__
|
||||||
|
@ -347,9 +424,9 @@ getgrent ()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
setgrent ()
|
endgrent (void)
|
||||||
{
|
{
|
||||||
_my_tls.locals.grp_pos = 0;
|
grent.endgrent ();
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -20,6 +20,7 @@ details. */
|
||||||
#include "pinfo.h"
|
#include "pinfo.h"
|
||||||
#include "lm.h"
|
#include "lm.h"
|
||||||
#include "dsgetdc.h"
|
#include "dsgetdc.h"
|
||||||
|
#include "tls_pbuf.h"
|
||||||
|
|
||||||
static LDAP_TIMEVAL tv = { 3, 0 };
|
static LDAP_TIMEVAL tv = { 3, 0 };
|
||||||
|
|
||||||
|
@ -54,7 +55,7 @@ PWCHAR tdom_attr[] =
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
PWCHAR nfs_attr[] =
|
PWCHAR sid_attr[] =
|
||||||
{
|
{
|
||||||
(PWCHAR) L"objectSid",
|
(PWCHAR) L"objectSid",
|
||||||
NULL
|
NULL
|
||||||
|
@ -216,6 +217,8 @@ err:
|
||||||
void
|
void
|
||||||
cyg_ldap::close ()
|
cyg_ldap::close ()
|
||||||
{
|
{
|
||||||
|
if (msg_id != (ULONG) -1)
|
||||||
|
ldap_abandon (lh, msg_id);
|
||||||
if (lh)
|
if (lh)
|
||||||
ldap_unbind (lh);
|
ldap_unbind (lh);
|
||||||
if (msg)
|
if (msg)
|
||||||
|
@ -228,12 +231,13 @@ cyg_ldap::close ()
|
||||||
msg = entry = NULL;
|
msg = entry = NULL;
|
||||||
val = NULL;
|
val = NULL;
|
||||||
rootdse = NULL;
|
rootdse = NULL;
|
||||||
|
msg_id = (ULONG) -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
cyg_ldap::fetch_ad_account (PSID sid, bool group)
|
cyg_ldap::fetch_ad_account (PSID sid, bool group)
|
||||||
{
|
{
|
||||||
WCHAR filter[512], *f;
|
WCHAR filter[140], *f;
|
||||||
LONG len = (LONG) RtlLengthSid (sid);
|
LONG len = (LONG) RtlLengthSid (sid);
|
||||||
PBYTE s = (PBYTE) sid;
|
PBYTE s = (PBYTE) sid;
|
||||||
static WCHAR hex_wchars[] = L"0123456789abcdef";
|
static WCHAR hex_wchars[] = L"0123456789abcdef";
|
||||||
|
@ -273,10 +277,109 @@ cyg_ldap::fetch_ad_account (PSID sid, bool group)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
cyg_ldap::enumerate_ad_accounts (PCWSTR domain, bool group)
|
||||||
|
{
|
||||||
|
tmp_pathbuf tp;
|
||||||
|
PCWSTR filter;
|
||||||
|
PWCHAR dse;
|
||||||
|
|
||||||
|
if (msg)
|
||||||
|
{
|
||||||
|
ldap_memfreeW ((PWCHAR) msg);
|
||||||
|
msg = entry = NULL;
|
||||||
|
}
|
||||||
|
if (val)
|
||||||
|
{
|
||||||
|
ldap_value_freeW (val);
|
||||||
|
val = NULL;
|
||||||
|
}
|
||||||
|
if (!group)
|
||||||
|
filter = L"(&(objectClass=User)"
|
||||||
|
"(objectCategory=Person)"
|
||||||
|
/* 512 == ADS_UF_NORMAL_ACCOUNT */
|
||||||
|
"(userAccountControl:" LDAP_MATCHING_RULE_BIT_AND ":=512)"
|
||||||
|
"(objectSid=*))";
|
||||||
|
else if (!domain)
|
||||||
|
filter = L"(&(objectClass=Group)"
|
||||||
|
"(objectSid=*))";
|
||||||
|
else
|
||||||
|
filter = L"(&(objectClass=Group)"
|
||||||
|
/* 1 == ACCOUNT_GROUP */
|
||||||
|
"(!(groupType:" LDAP_MATCHING_RULE_BIT_AND ":=1))"
|
||||||
|
"(objectSid=*))";
|
||||||
|
if (!domain)
|
||||||
|
dse = rootdse;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* create rootdse from domain name. */
|
||||||
|
dse = tp.w_get ();
|
||||||
|
PCWSTR ps, pe;
|
||||||
|
PWCHAR d;
|
||||||
|
|
||||||
|
d = dse;
|
||||||
|
for (ps = domain; (pe = wcschr (ps, L'.')); ps = pe + 1)
|
||||||
|
{
|
||||||
|
if (d > dse)
|
||||||
|
d = wcpcpy (d, L",");
|
||||||
|
d = wcpncpy (wcpcpy (d, L"DC="), ps, pe - ps);
|
||||||
|
}
|
||||||
|
if (d > dse)
|
||||||
|
d = wcpcpy (d, L",");
|
||||||
|
d = wcpcpy (wcpcpy (d, L"DC="), ps);
|
||||||
|
}
|
||||||
|
msg_id = ldap_searchW (lh, dse, LDAP_SCOPE_SUBTREE, (PWCHAR) filter,
|
||||||
|
sid_attr, 0);
|
||||||
|
if (msg_id == (ULONG) -1)
|
||||||
|
{
|
||||||
|
debug_printf ("ldap_searchW(%W,%W) error 0x%02x", dse, filter,
|
||||||
|
LdapGetLastError ());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
cyg_ldap::next_account (cygsid &sid)
|
||||||
|
{
|
||||||
|
ULONG ret;
|
||||||
|
PLDAP_BERVAL *bval;
|
||||||
|
|
||||||
|
if (msg)
|
||||||
|
{
|
||||||
|
ldap_memfreeW ((PWCHAR) msg);
|
||||||
|
msg = entry = NULL;
|
||||||
|
}
|
||||||
|
if (val)
|
||||||
|
{
|
||||||
|
ldap_value_freeW (val);
|
||||||
|
val = NULL;
|
||||||
|
}
|
||||||
|
ret = ldap_result (lh, msg_id, LDAP_MSG_ONE, &tv, &msg);
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
debug_printf ("ldap_result() timeout!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (ret == (ULONG) -1)
|
||||||
|
{
|
||||||
|
debug_printf ("ldap_result() error 0x%02x", LdapGetLastError ());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ((entry = ldap_first_entry (lh, msg))
|
||||||
|
&& (bval = ldap_get_values_lenW (lh, entry, sid_attr[0])))
|
||||||
|
{
|
||||||
|
sid = (PSID) bval[0]->bv_val;
|
||||||
|
ldap_value_free_len (bval);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
cyg_ldap::fetch_posix_offset_for_domain (PCWSTR domain)
|
cyg_ldap::fetch_posix_offset_for_domain (PCWSTR domain)
|
||||||
{
|
{
|
||||||
WCHAR filter[512];
|
WCHAR filter[300];
|
||||||
ULONG ret;
|
ULONG ret;
|
||||||
|
|
||||||
if (msg)
|
if (msg)
|
||||||
|
@ -331,7 +434,7 @@ cyg_ldap::get_num_attribute (int idx)
|
||||||
bool
|
bool
|
||||||
cyg_ldap::fetch_unix_sid_from_ad (uint32_t id, cygsid &sid, bool group)
|
cyg_ldap::fetch_unix_sid_from_ad (uint32_t id, cygsid &sid, bool group)
|
||||||
{
|
{
|
||||||
WCHAR filter[512];
|
WCHAR filter[48];
|
||||||
ULONG ret;
|
ULONG ret;
|
||||||
PLDAP_BERVAL *bval;
|
PLDAP_BERVAL *bval;
|
||||||
|
|
||||||
|
@ -345,25 +448,26 @@ cyg_ldap::fetch_unix_sid_from_ad (uint32_t id, cygsid &sid, bool group)
|
||||||
else
|
else
|
||||||
__small_swprintf (filter, L"(&(objectClass=User)(uidNumber=%u))", id);
|
__small_swprintf (filter, L"(&(objectClass=User)(uidNumber=%u))", id);
|
||||||
if ((ret = ldap_search_stW (lh, rootdse, LDAP_SCOPE_SUBTREE, filter,
|
if ((ret = ldap_search_stW (lh, rootdse, LDAP_SCOPE_SUBTREE, filter,
|
||||||
nfs_attr, 0, &tv, &msg)) != LDAP_SUCCESS)
|
sid_attr, 0, &tv, &msg)) != LDAP_SUCCESS)
|
||||||
{
|
{
|
||||||
debug_printf ("ldap_search_stW(%W,%W) error 0x%02x",
|
debug_printf ("ldap_search_stW(%W,%W) error 0x%02x",
|
||||||
rootdse, filter, ret);
|
rootdse, filter, ret);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ((entry = ldap_first_entry (lh, msg))
|
if ((entry = ldap_first_entry (lh, msg))
|
||||||
&& (bval = ldap_get_values_lenW (lh, entry, nfs_attr[0])))
|
&& (bval = ldap_get_values_lenW (lh, entry, sid_attr[0])))
|
||||||
{
|
{
|
||||||
sid = (PSID) bval[0]->bv_val;
|
sid = (PSID) bval[0]->bv_val;
|
||||||
ldap_value_free_len (bval);
|
ldap_value_free_len (bval);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
PWCHAR
|
PWCHAR
|
||||||
cyg_ldap::fetch_unix_name_from_rfc2307 (uint32_t id, bool group)
|
cyg_ldap::fetch_unix_name_from_rfc2307 (uint32_t id, bool group)
|
||||||
{
|
{
|
||||||
WCHAR filter[512];
|
WCHAR filter[52];
|
||||||
ULONG ret;
|
ULONG ret;
|
||||||
|
|
||||||
if (msg)
|
if (msg)
|
||||||
|
|
|
@ -8,6 +8,8 @@ This software is a copyrighted work licensed under the terms of the
|
||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
details. */
|
details. */
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#pragma push_macro ("DECLSPEC_IMPORT")
|
#pragma push_macro ("DECLSPEC_IMPORT")
|
||||||
#undef DECLSPEC_IMPORT
|
#undef DECLSPEC_IMPORT
|
||||||
#define DECLSPEC_IMPORT
|
#define DECLSPEC_IMPORT
|
||||||
|
@ -32,6 +34,7 @@ class cyg_ldap {
|
||||||
PWCHAR *val;
|
PWCHAR *val;
|
||||||
PWCHAR *attr;
|
PWCHAR *attr;
|
||||||
bool isAD;
|
bool isAD;
|
||||||
|
ULONG msg_id;
|
||||||
|
|
||||||
bool connect_ssl (PCWSTR domain);
|
bool connect_ssl (PCWSTR domain);
|
||||||
bool connect_non_ssl (PCWSTR domain);
|
bool connect_non_ssl (PCWSTR domain);
|
||||||
|
@ -42,7 +45,7 @@ class cyg_ldap {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
cyg_ldap () : lh (NULL), rootdse (NULL), msg (NULL), entry (NULL),
|
cyg_ldap () : lh (NULL), rootdse (NULL), msg (NULL), entry (NULL),
|
||||||
val (NULL), isAD (false)
|
val (NULL), isAD (false), msg_id ((ULONG) -1)
|
||||||
{}
|
{}
|
||||||
~cyg_ldap () { close (); }
|
~cyg_ldap () { close (); }
|
||||||
|
|
||||||
|
@ -50,6 +53,8 @@ public:
|
||||||
bool open (PCWSTR in_domain);
|
bool open (PCWSTR in_domain);
|
||||||
void close ();
|
void close ();
|
||||||
bool fetch_ad_account (PSID sid, bool group);
|
bool fetch_ad_account (PSID sid, bool group);
|
||||||
|
bool enumerate_ad_accounts (PCWSTR domain, bool group);
|
||||||
|
bool next_account (cygsid &sid);
|
||||||
uint32_t fetch_posix_offset_for_domain (PCWSTR domain);
|
uint32_t fetch_posix_offset_for_domain (PCWSTR domain);
|
||||||
uid_t remap_uid (uid_t uid);
|
uid_t remap_uid (uid_t uid);
|
||||||
gid_t remap_gid (gid_t gid);
|
gid_t remap_gid (gid_t gid);
|
||||||
|
|
|
@ -10,6 +10,7 @@ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
details. */
|
details. */
|
||||||
|
|
||||||
#include "winsup.h"
|
#include "winsup.h"
|
||||||
|
#include <lm.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "cygerrno.h"
|
#include "cygerrno.h"
|
||||||
|
@ -20,6 +21,9 @@ details. */
|
||||||
#include "pinfo.h"
|
#include "pinfo.h"
|
||||||
#include "cygheap.h"
|
#include "cygheap.h"
|
||||||
#include "shared_info.h"
|
#include "shared_info.h"
|
||||||
|
#include "miscfuncs.h"
|
||||||
|
#include "ldap.h"
|
||||||
|
#include "tls_pbuf.h"
|
||||||
|
|
||||||
/* Parse /etc/passwd line into passwd structure. */
|
/* Parse /etc/passwd line into passwd structure. */
|
||||||
bool
|
bool
|
||||||
|
@ -275,23 +279,365 @@ getpwnam_r (const char *nam, struct passwd *pwd, char *buffer, size_t bufsize, s
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* getpwent functions are not reentrant. */
|
||||||
|
static pw_ent pwent;
|
||||||
|
|
||||||
|
void
|
||||||
|
pg_ent::clear_cache ()
|
||||||
|
{
|
||||||
|
if (pg.curr_lines)
|
||||||
|
{
|
||||||
|
if (state > from_file)
|
||||||
|
cfree (group ? grp.g.gr_name : pwd.p.pw_name);
|
||||||
|
pg.curr_lines = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pg_ent::setent (bool _group, int _enums, PCWSTR _enum_tdoms)
|
||||||
|
{
|
||||||
|
endent (_group);
|
||||||
|
if (!_enums && !_enum_tdoms)
|
||||||
|
{
|
||||||
|
enums = cygheap->pg.nss_db_enums ();
|
||||||
|
enum_tdoms = cygheap->pg.nss_db_enum_tdoms ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
enums = _enums;
|
||||||
|
enum_tdoms = _enum_tdoms;
|
||||||
|
}
|
||||||
|
if (_group)
|
||||||
|
{
|
||||||
|
from_files = cygheap->pg.nss_grp_files ();
|
||||||
|
from_db = cygheap->pg.nss_grp_db ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
from_files = cygheap->pg.nss_pwd_files ();
|
||||||
|
from_db = cygheap->pg.nss_pwd_db ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
pg_ent::getent (void)
|
||||||
|
{
|
||||||
|
void *entry;
|
||||||
|
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case rewound:
|
||||||
|
state = from_cache;
|
||||||
|
/*FALLTHRU*/
|
||||||
|
case from_cache:
|
||||||
|
if (nss_db_enum_caches ()
|
||||||
|
&& (entry = enumerate_caches ()))
|
||||||
|
return entry;
|
||||||
|
state = from_file;
|
||||||
|
/*FALLTHRU*/
|
||||||
|
case from_file:
|
||||||
|
if (from_files
|
||||||
|
&& nss_db_enum_files ()
|
||||||
|
&& (entry = enumerate_file ()))
|
||||||
|
return entry;
|
||||||
|
state = from_builtin;
|
||||||
|
/*FALLTHRU*/
|
||||||
|
case from_builtin:
|
||||||
|
if (from_db
|
||||||
|
&& nss_db_enum_builtin ()
|
||||||
|
&& (entry = enumerate_builtin ()))
|
||||||
|
return entry;
|
||||||
|
state = from_local;
|
||||||
|
/*FALLTHRU*/
|
||||||
|
case from_local:
|
||||||
|
if (from_db
|
||||||
|
&& nss_db_enum_local ()
|
||||||
|
&& (!cygheap->dom.member_machine ()
|
||||||
|
|| !nss_db_enum_primary ())
|
||||||
|
&& (entry = enumerate_local ()))
|
||||||
|
return entry;
|
||||||
|
state = from_sam;
|
||||||
|
/*FALLTHRU*/
|
||||||
|
case from_sam:
|
||||||
|
if (from_db
|
||||||
|
&& nss_db_enum_local ()
|
||||||
|
&& (entry = enumerate_sam ()))
|
||||||
|
return entry;
|
||||||
|
state = from_ad;
|
||||||
|
/*FALLTHRU*/
|
||||||
|
case from_ad:
|
||||||
|
if (cygheap->dom.member_machine ()
|
||||||
|
&& from_db
|
||||||
|
&& (entry = enumerate_ad ()))
|
||||||
|
return entry;
|
||||||
|
state = finished;
|
||||||
|
/*FALLTHRU*/
|
||||||
|
case finished:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pg_ent::endent (bool _group)
|
||||||
|
{
|
||||||
|
if (buf)
|
||||||
|
{
|
||||||
|
if (state == from_file)
|
||||||
|
free (buf);
|
||||||
|
else if (state == from_local || state == from_sam)
|
||||||
|
NetApiBufferFree (buf);
|
||||||
|
buf = NULL;
|
||||||
|
}
|
||||||
|
if (!pg.curr_lines)
|
||||||
|
{
|
||||||
|
if ((group = _group))
|
||||||
|
{
|
||||||
|
pg.init_grp ();
|
||||||
|
pg.pwdgrp_buf = (void *) &grp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pg.init_pwd ();
|
||||||
|
pg.pwdgrp_buf = (void *) &pwd;
|
||||||
|
}
|
||||||
|
pg.max_lines = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
clear_cache ();
|
||||||
|
cldap.close ();
|
||||||
|
rl.close ();
|
||||||
|
cnt = max = resume = 0;
|
||||||
|
enums = 0;
|
||||||
|
enum_tdoms = NULL;
|
||||||
|
state = rewound;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
pg_ent::enumerate_file ()
|
||||||
|
{
|
||||||
|
void *entry;
|
||||||
|
|
||||||
|
if (!cnt)
|
||||||
|
{
|
||||||
|
pwdgrp &prf = group ? cygheap->pg.grp_cache.file
|
||||||
|
: cygheap->pg.pwd_cache.file;
|
||||||
|
if (prf.check_file (group))
|
||||||
|
{
|
||||||
|
if (!buf)
|
||||||
|
buf = (char *) malloc (NT_MAX_PATH);
|
||||||
|
if (buf
|
||||||
|
&& !rl.init (prf.file_attr (), buf, NT_MAX_PATH))
|
||||||
|
{
|
||||||
|
free (buf);
|
||||||
|
buf = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++cnt;
|
||||||
|
if ((entry = pg.add_account_post_fetch (rl.gets (), false)))
|
||||||
|
return entry;
|
||||||
|
rl.close ();
|
||||||
|
free (buf);
|
||||||
|
buf = NULL;
|
||||||
|
cnt = max = resume = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
pg_ent::enumerate_builtin ()
|
||||||
|
{
|
||||||
|
static const char *pwd_builtins[] = {
|
||||||
|
/* SYSTEM */
|
||||||
|
"S-1-5-18",
|
||||||
|
/* LocalService */
|
||||||
|
"S-1-5-19",
|
||||||
|
/* NetworkService */
|
||||||
|
"S-1-5-20",
|
||||||
|
/* Administrators */
|
||||||
|
"S-1-5-32-544",
|
||||||
|
/* TrustedInstaller */
|
||||||
|
"S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464",
|
||||||
|
/* The end */
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
static const char *grp_builtins[] = {
|
||||||
|
/* SYSTEM */
|
||||||
|
"S-1-5-18",
|
||||||
|
/* TrustedInstaller */
|
||||||
|
"S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464",
|
||||||
|
/* The end */
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
const char **builtins = group ? grp_builtins : pwd_builtins;
|
||||||
|
if (!builtins[cnt])
|
||||||
|
{
|
||||||
|
cnt = max = resume = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
cygsid sid (builtins[cnt++]);
|
||||||
|
fetch_user_arg_t arg;
|
||||||
|
arg.type = SID_arg;
|
||||||
|
arg.sid = &sid;
|
||||||
|
char *line = pg.fetch_account_from_windows (arg, group);
|
||||||
|
return pg.add_account_post_fetch (line, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
pg_ent::enumerate_sam ()
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (!cnt)
|
||||||
|
{
|
||||||
|
DWORD total;
|
||||||
|
NET_API_STATUS ret;
|
||||||
|
|
||||||
|
if (buf)
|
||||||
|
{
|
||||||
|
NetApiBufferFree (buf);
|
||||||
|
buf = NULL;
|
||||||
|
}
|
||||||
|
if (resume == ULONG_MAX)
|
||||||
|
ret = ERROR_NO_MORE_ITEMS;
|
||||||
|
else if (group)
|
||||||
|
ret = NetGroupEnum (NULL, 2, (PBYTE *) &buf, MAX_PREFERRED_LENGTH,
|
||||||
|
&max, &total, &resume);
|
||||||
|
else
|
||||||
|
ret = NetUserEnum (NULL, 20, FILTER_NORMAL_ACCOUNT, (PBYTE *) &buf,
|
||||||
|
MAX_PREFERRED_LENGTH, &max, &total,
|
||||||
|
(PDWORD) &resume);
|
||||||
|
if (ret == NERR_Success)
|
||||||
|
resume = ULONG_MAX;
|
||||||
|
else if (ret != ERROR_MORE_DATA)
|
||||||
|
{
|
||||||
|
cnt = max = resume = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (cnt < max)
|
||||||
|
{
|
||||||
|
cygsid sid (cygheap->dom.account_sid ());
|
||||||
|
sid_sub_auth (sid, sid_sub_auth_count (sid)) =
|
||||||
|
group ? ((PGROUP_INFO_2) buf)[cnt].grpi2_group_id
|
||||||
|
: ((PUSER_INFO_20) buf)[cnt].usri20_user_id;
|
||||||
|
++cnt;
|
||||||
|
++sid_sub_auth_count (sid);
|
||||||
|
fetch_user_arg_t arg;
|
||||||
|
arg.type = SID_arg;
|
||||||
|
arg.sid = &sid;
|
||||||
|
char *line = pg.fetch_account_from_windows (arg, group);
|
||||||
|
if (line)
|
||||||
|
return pg.add_account_post_fetch (line, false);
|
||||||
|
}
|
||||||
|
cnt = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
pg_ent::enumerate_ad ()
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (!cnt)
|
||||||
|
{
|
||||||
|
PDS_DOMAIN_TRUSTSW td;
|
||||||
|
|
||||||
|
if (!resume)
|
||||||
|
{
|
||||||
|
if (!cldap.open (NULL))
|
||||||
|
return NULL;
|
||||||
|
++resume;
|
||||||
|
if (!nss_db_enum_primary ()
|
||||||
|
|| !cldap.enumerate_ad_accounts (NULL, group))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if ((td = cygheap->dom.trusted_domain (resume - 1)))
|
||||||
|
{
|
||||||
|
++resume;
|
||||||
|
if ((td->Flags & DS_DOMAIN_PRIMARY)
|
||||||
|
|| !td->DomainSid
|
||||||
|
|| (!nss_db_enum_tdom (td->NetbiosDomainName)
|
||||||
|
&& !nss_db_enum_tdom (td->DnsDomainName))
|
||||||
|
|| !cldap.enumerate_ad_accounts (td->DnsDomainName, group))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cldap.close ();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++cnt;
|
||||||
|
cygsid sid;
|
||||||
|
if (cldap.next_account (sid))
|
||||||
|
{
|
||||||
|
fetch_user_arg_t arg;
|
||||||
|
arg.type = SID_arg;
|
||||||
|
arg.sid = &sid;
|
||||||
|
char *line = pg.fetch_account_from_windows (arg, group);
|
||||||
|
if (line)
|
||||||
|
return pg.add_account_post_fetch (line, false);
|
||||||
|
}
|
||||||
|
cnt = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
pw_ent::enumerate_caches ()
|
||||||
|
{
|
||||||
|
if (!max && from_files)
|
||||||
|
{
|
||||||
|
pwdgrp &prf = cygheap->pg.pwd_cache.file;
|
||||||
|
prf.check_file (false);
|
||||||
|
if (cnt < prf.cached_users ())
|
||||||
|
return &prf.passwd ()[cnt++].p;
|
||||||
|
cnt = 0;
|
||||||
|
max = 1;
|
||||||
|
}
|
||||||
|
if (from_db && cygheap->pg.nss_db_caching ())
|
||||||
|
{
|
||||||
|
pwdgrp &prw = cygheap->pg.pwd_cache.win;
|
||||||
|
if (cnt < prw.cached_users ())
|
||||||
|
return &prw.passwd ()[cnt++].p;
|
||||||
|
}
|
||||||
|
cnt = max = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
pw_ent::enumerate_local ()
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct passwd *
|
||||||
|
pw_ent::getpwent (void)
|
||||||
|
{
|
||||||
|
if (state == rewound)
|
||||||
|
setent (false);
|
||||||
|
else
|
||||||
|
clear_cache ();
|
||||||
|
return (struct passwd *) getent ();
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
setpwent ()
|
||||||
|
{
|
||||||
|
pwent.setpwent ();
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" struct passwd *
|
extern "C" struct passwd *
|
||||||
getpwent (void)
|
getpwent (void)
|
||||||
{
|
{
|
||||||
pwdgrp &prf = cygheap->pg.pwd_cache.file;
|
return pwent.getpwent ();
|
||||||
if (cygheap->pg.nss_pwd_files ())
|
}
|
||||||
{
|
|
||||||
cygheap->pg.pwd_cache.file.check_file (false);
|
extern "C" void
|
||||||
if (_my_tls.locals.pw_pos < prf.cached_users ())
|
endpwent (void)
|
||||||
return &prf.passwd ()[_my_tls.locals.pw_pos++].p;
|
{
|
||||||
}
|
pwent.endpwent ();
|
||||||
if ((cygheap->pg.nss_pwd_db ()) && cygheap->pg.nss_db_caching ())
|
|
||||||
{
|
|
||||||
pwdgrp &prw = cygheap->pg.pwd_cache.win;
|
|
||||||
if (_my_tls.locals.pw_pos - prf.cached_users () < prw.cached_users ())
|
|
||||||
return &prw.passwd ()[_my_tls.locals.pw_pos++ - prf.cached_users ()].p;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __x86_64__
|
#ifndef __x86_64__
|
||||||
|
@ -302,18 +648,6 @@ getpwduid (__uid16_t)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern "C" void
|
|
||||||
setpwent (void)
|
|
||||||
{
|
|
||||||
_my_tls.locals.pw_pos = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void
|
|
||||||
endpwent (void)
|
|
||||||
{
|
|
||||||
_my_tls.locals.pw_pos = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" int
|
extern "C" int
|
||||||
setpassent (int)
|
setpassent (int)
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,6 +23,8 @@ extern struct group *internal_getgrnam (const char *);
|
||||||
int internal_getgroups (int, gid_t *, cygpsid * = NULL);
|
int internal_getgroups (int, gid_t *, cygpsid * = NULL);
|
||||||
|
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
|
#include "ldap.h"
|
||||||
|
#include "miscfuncs.h"
|
||||||
|
|
||||||
enum fetch_user_arg_type_t {
|
enum fetch_user_arg_type_t {
|
||||||
SID_arg,
|
SID_arg,
|
||||||
|
@ -56,6 +58,10 @@ struct pg_grp
|
||||||
|
|
||||||
class pwdgrp
|
class pwdgrp
|
||||||
{
|
{
|
||||||
|
friend class pg_ent;
|
||||||
|
friend class pw_ent;
|
||||||
|
friend class gr_ent;
|
||||||
|
|
||||||
unsigned pwdgrp_buf_elem_size;
|
unsigned pwdgrp_buf_elem_size;
|
||||||
void *pwdgrp_buf;
|
void *pwdgrp_buf;
|
||||||
bool (pwdgrp::*parse) ();
|
bool (pwdgrp::*parse) ();
|
||||||
|
@ -87,7 +93,7 @@ class pwdgrp
|
||||||
i = (int) x;
|
i = (int) x;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
void *add_account_post_fetch (char *line);
|
void *add_account_post_fetch (char *line, bool lock);
|
||||||
void *add_account_from_file (cygpsid &sid);
|
void *add_account_from_file (cygpsid &sid);
|
||||||
void *add_account_from_file (const char *name);
|
void *add_account_from_file (const char *name);
|
||||||
void *add_account_from_file (uint32_t id);
|
void *add_account_from_file (uint32_t id);
|
||||||
|
@ -103,6 +109,7 @@ class pwdgrp
|
||||||
public:
|
public:
|
||||||
ULONG cached_users () const { return curr_lines; }
|
ULONG cached_users () const { return curr_lines; }
|
||||||
ULONG cached_groups () const { return curr_lines; }
|
ULONG cached_groups () const { return curr_lines; }
|
||||||
|
POBJECT_ATTRIBUTES file_attr () { return &attr; }
|
||||||
bool check_file (bool group);
|
bool check_file (bool group);
|
||||||
|
|
||||||
void init_pwd ();
|
void init_pwd ();
|
||||||
|
@ -141,3 +148,96 @@ public:
|
||||||
struct group *find_group (const char *name);
|
struct group *find_group (const char *name);
|
||||||
struct group *find_group (gid_t gid);
|
struct group *find_group (gid_t gid);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum nss_enum_t
|
||||||
|
{
|
||||||
|
ENUM_NONE = 0x00,
|
||||||
|
ENUM_CACHE = 0x01,
|
||||||
|
ENUM_FILES = 0x02,
|
||||||
|
ENUM_BUILTIN = 0x04,
|
||||||
|
ENUM_LOCAL = 0x08,
|
||||||
|
ENUM_PRIMARY = 0x10,
|
||||||
|
ENUM_TDOMS = 0x20,
|
||||||
|
ENUM_TDOMS_ALL = 0x40,
|
||||||
|
ENUM_ALL = 0x7f
|
||||||
|
};
|
||||||
|
|
||||||
|
class pg_ent
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
pwdgrp pg;
|
||||||
|
bool group;
|
||||||
|
pg_pwd pwd;
|
||||||
|
pg_grp grp;
|
||||||
|
NT_readline rl;
|
||||||
|
cyg_ldap cldap;
|
||||||
|
PCHAR buf;
|
||||||
|
ULONG cnt;
|
||||||
|
ULONG max;
|
||||||
|
ULONG_PTR resume;
|
||||||
|
int enums;
|
||||||
|
PCWSTR enum_tdoms;
|
||||||
|
bool from_files;
|
||||||
|
bool from_db;
|
||||||
|
enum {
|
||||||
|
rewound = 0,
|
||||||
|
from_cache,
|
||||||
|
from_file,
|
||||||
|
from_builtin,
|
||||||
|
from_local,
|
||||||
|
from_sam,
|
||||||
|
from_ad,
|
||||||
|
finished
|
||||||
|
} state;
|
||||||
|
|
||||||
|
void clear_cache ();
|
||||||
|
inline bool nss_db_enum_caches () const { return !!(enums & ENUM_CACHE); }
|
||||||
|
inline bool nss_db_enum_files () const { return !!(enums & ENUM_FILES); }
|
||||||
|
inline bool nss_db_enum_builtin () const { return !!(enums & ENUM_BUILTIN); }
|
||||||
|
inline bool nss_db_enum_local () const { return !!(enums & ENUM_LOCAL); }
|
||||||
|
inline bool nss_db_enum_primary () const { return !!(enums & ENUM_PRIMARY); }
|
||||||
|
inline bool nss_db_enum_tdom (PWCHAR domain)
|
||||||
|
{
|
||||||
|
if (enums & ENUM_TDOMS_ALL)
|
||||||
|
return true;
|
||||||
|
if (!(enums & ENUM_TDOMS) || !enum_tdoms || !domain)
|
||||||
|
return false;
|
||||||
|
for (PCWSTR td = enum_tdoms; td && *td; td = wcschr (td, L'\0'))
|
||||||
|
if (!wcscasecmp (td, domain))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
virtual void *enumerate_caches () = 0;
|
||||||
|
virtual void *enumerate_file ();
|
||||||
|
virtual void *enumerate_builtin ();
|
||||||
|
virtual void *enumerate_local () = 0;
|
||||||
|
virtual void *enumerate_sam ();
|
||||||
|
virtual void *enumerate_ad ();
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setent (bool _group, int _enums = 0, PCWSTR _enum_tdoms = NULL);
|
||||||
|
void *getent ();
|
||||||
|
void endent (bool _group);
|
||||||
|
};
|
||||||
|
|
||||||
|
class pw_ent : public pg_ent
|
||||||
|
{
|
||||||
|
void *enumerate_caches ();
|
||||||
|
void *enumerate_local ();
|
||||||
|
public:
|
||||||
|
inline void setpwent (int _enums = 0, PCWSTR _enum_tdoms = NULL)
|
||||||
|
{ setent (false, _enums, _enum_tdoms); }
|
||||||
|
struct passwd *getpwent ();
|
||||||
|
inline void endpwent () { endent (false); }
|
||||||
|
};
|
||||||
|
|
||||||
|
class gr_ent : public pg_ent
|
||||||
|
{
|
||||||
|
void *enumerate_caches ();
|
||||||
|
void *enumerate_local ();
|
||||||
|
public:
|
||||||
|
inline void setgrent (int _enums = 0, PCWSTR _enum_tdoms = NULL)
|
||||||
|
{ setent (true, _enums, _enum_tdoms); }
|
||||||
|
struct group *getgrent ();
|
||||||
|
inline void endgrent () { endent (true); }
|
||||||
|
};
|
||||||
|
|
|
@ -3,115 +3,115 @@
|
||||||
//; $tls::start_offset = -12700;
|
//; $tls::start_offset = -12700;
|
||||||
//; $tls::locals = -12700;
|
//; $tls::locals = -12700;
|
||||||
//; $tls::plocals = 0;
|
//; $tls::plocals = 0;
|
||||||
//; $tls::local_clib = -11284;
|
//; $tls::local_clib = -11292;
|
||||||
//; $tls::plocal_clib = 1416;
|
//; $tls::plocal_clib = 1408;
|
||||||
//; $tls::__dontuse = -11284;
|
//; $tls::__dontuse = -11292;
|
||||||
//; $tls::p__dontuse = 1416;
|
//; $tls::p__dontuse = 1408;
|
||||||
//; $tls::func = -10196;
|
//; $tls::func = -10204;
|
||||||
//; $tls::pfunc = 2504;
|
//; $tls::pfunc = 2496;
|
||||||
//; $tls::saved_errno = -10192;
|
//; $tls::saved_errno = -10200;
|
||||||
//; $tls::psaved_errno = 2508;
|
//; $tls::psaved_errno = 2500;
|
||||||
//; $tls::sa_flags = -10188;
|
//; $tls::sa_flags = -10196;
|
||||||
//; $tls::psa_flags = 2512;
|
//; $tls::psa_flags = 2504;
|
||||||
//; $tls::oldmask = -10184;
|
//; $tls::oldmask = -10192;
|
||||||
//; $tls::poldmask = 2516;
|
//; $tls::poldmask = 2508;
|
||||||
//; $tls::deltamask = -10180;
|
//; $tls::deltamask = -10188;
|
||||||
//; $tls::pdeltamask = 2520;
|
//; $tls::pdeltamask = 2512;
|
||||||
//; $tls::errno_addr = -10176;
|
//; $tls::errno_addr = -10184;
|
||||||
//; $tls::perrno_addr = 2524;
|
//; $tls::perrno_addr = 2516;
|
||||||
//; $tls::sigmask = -10172;
|
//; $tls::sigmask = -10180;
|
||||||
//; $tls::psigmask = 2528;
|
//; $tls::psigmask = 2520;
|
||||||
//; $tls::sigwait_mask = -10168;
|
//; $tls::sigwait_mask = -10176;
|
||||||
//; $tls::psigwait_mask = 2532;
|
//; $tls::psigwait_mask = 2524;
|
||||||
//; $tls::sigwait_info = -10164;
|
//; $tls::sigwait_info = -10172;
|
||||||
//; $tls::psigwait_info = 2536;
|
//; $tls::psigwait_info = 2528;
|
||||||
//; $tls::signal_arrived = -10160;
|
//; $tls::signal_arrived = -10168;
|
||||||
//; $tls::psignal_arrived = 2540;
|
//; $tls::psignal_arrived = 2532;
|
||||||
//; $tls::will_wait_for_signal = -10156;
|
//; $tls::will_wait_for_signal = -10164;
|
||||||
//; $tls::pwill_wait_for_signal = 2544;
|
//; $tls::pwill_wait_for_signal = 2536;
|
||||||
//; $tls::thread_context = -10152;
|
//; $tls::thread_context = -10160;
|
||||||
//; $tls::pthread_context = 2548;
|
//; $tls::pthread_context = 2540;
|
||||||
//; $tls::thread_id = -9940;
|
//; $tls::thread_id = -9948;
|
||||||
//; $tls::pthread_id = 2760;
|
//; $tls::pthread_id = 2752;
|
||||||
//; $tls::infodata = -9936;
|
//; $tls::infodata = -9944;
|
||||||
//; $tls::pinfodata = 2764;
|
//; $tls::pinfodata = 2756;
|
||||||
//; $tls::tid = -9788;
|
//; $tls::tid = -9796;
|
||||||
//; $tls::ptid = 2912;
|
//; $tls::ptid = 2904;
|
||||||
//; $tls::_ctinfo = -9784;
|
//; $tls::_ctinfo = -9792;
|
||||||
//; $tls::p_ctinfo = 2916;
|
//; $tls::p_ctinfo = 2908;
|
||||||
//; $tls::andreas = -9780;
|
//; $tls::andreas = -9788;
|
||||||
//; $tls::pandreas = 2920;
|
//; $tls::pandreas = 2912;
|
||||||
//; $tls::wq = -9776;
|
//; $tls::wq = -9784;
|
||||||
//; $tls::pwq = 2924;
|
//; $tls::pwq = 2916;
|
||||||
//; $tls::sig = -9748;
|
//; $tls::sig = -9756;
|
||||||
//; $tls::psig = 2952;
|
//; $tls::psig = 2944;
|
||||||
//; $tls::incyg = -9744;
|
//; $tls::incyg = -9752;
|
||||||
//; $tls::pincyg = 2956;
|
//; $tls::pincyg = 2948;
|
||||||
//; $tls::spinning = -9740;
|
//; $tls::spinning = -9748;
|
||||||
//; $tls::pspinning = 2960;
|
//; $tls::pspinning = 2952;
|
||||||
//; $tls::stacklock = -9736;
|
//; $tls::stacklock = -9744;
|
||||||
//; $tls::pstacklock = 2964;
|
//; $tls::pstacklock = 2956;
|
||||||
//; $tls::stackptr = -9732;
|
//; $tls::stackptr = -9740;
|
||||||
//; $tls::pstackptr = 2968;
|
//; $tls::pstackptr = 2960;
|
||||||
//; $tls::stack = -9728;
|
//; $tls::stack = -9736;
|
||||||
//; $tls::pstack = 2972;
|
//; $tls::pstack = 2964;
|
||||||
//; $tls::initialized = -8704;
|
//; $tls::initialized = -8712;
|
||||||
//; $tls::pinitialized = 3996;
|
//; $tls::pinitialized = 3988;
|
||||||
//; __DATA__
|
//; __DATA__
|
||||||
|
|
||||||
#define tls_locals (-12700)
|
#define tls_locals (-12700)
|
||||||
#define tls_plocals (0)
|
#define tls_plocals (0)
|
||||||
#define tls_local_clib (-11284)
|
#define tls_local_clib (-11292)
|
||||||
#define tls_plocal_clib (1416)
|
#define tls_plocal_clib (1408)
|
||||||
#define tls___dontuse (-11284)
|
#define tls___dontuse (-11292)
|
||||||
#define tls_p__dontuse (1416)
|
#define tls_p__dontuse (1408)
|
||||||
#define tls_func (-10196)
|
#define tls_func (-10204)
|
||||||
#define tls_pfunc (2504)
|
#define tls_pfunc (2496)
|
||||||
#define tls_saved_errno (-10192)
|
#define tls_saved_errno (-10200)
|
||||||
#define tls_psaved_errno (2508)
|
#define tls_psaved_errno (2500)
|
||||||
#define tls_sa_flags (-10188)
|
#define tls_sa_flags (-10196)
|
||||||
#define tls_psa_flags (2512)
|
#define tls_psa_flags (2504)
|
||||||
#define tls_oldmask (-10184)
|
#define tls_oldmask (-10192)
|
||||||
#define tls_poldmask (2516)
|
#define tls_poldmask (2508)
|
||||||
#define tls_deltamask (-10180)
|
#define tls_deltamask (-10188)
|
||||||
#define tls_pdeltamask (2520)
|
#define tls_pdeltamask (2512)
|
||||||
#define tls_errno_addr (-10176)
|
#define tls_errno_addr (-10184)
|
||||||
#define tls_perrno_addr (2524)
|
#define tls_perrno_addr (2516)
|
||||||
#define tls_sigmask (-10172)
|
#define tls_sigmask (-10180)
|
||||||
#define tls_psigmask (2528)
|
#define tls_psigmask (2520)
|
||||||
#define tls_sigwait_mask (-10168)
|
#define tls_sigwait_mask (-10176)
|
||||||
#define tls_psigwait_mask (2532)
|
#define tls_psigwait_mask (2524)
|
||||||
#define tls_sigwait_info (-10164)
|
#define tls_sigwait_info (-10172)
|
||||||
#define tls_psigwait_info (2536)
|
#define tls_psigwait_info (2528)
|
||||||
#define tls_signal_arrived (-10160)
|
#define tls_signal_arrived (-10168)
|
||||||
#define tls_psignal_arrived (2540)
|
#define tls_psignal_arrived (2532)
|
||||||
#define tls_will_wait_for_signal (-10156)
|
#define tls_will_wait_for_signal (-10164)
|
||||||
#define tls_pwill_wait_for_signal (2544)
|
#define tls_pwill_wait_for_signal (2536)
|
||||||
#define tls_thread_context (-10152)
|
#define tls_thread_context (-10160)
|
||||||
#define tls_pthread_context (2548)
|
#define tls_pthread_context (2540)
|
||||||
#define tls_thread_id (-9940)
|
#define tls_thread_id (-9948)
|
||||||
#define tls_pthread_id (2760)
|
#define tls_pthread_id (2752)
|
||||||
#define tls_infodata (-9936)
|
#define tls_infodata (-9944)
|
||||||
#define tls_pinfodata (2764)
|
#define tls_pinfodata (2756)
|
||||||
#define tls_tid (-9788)
|
#define tls_tid (-9796)
|
||||||
#define tls_ptid (2912)
|
#define tls_ptid (2904)
|
||||||
#define tls__ctinfo (-9784)
|
#define tls__ctinfo (-9792)
|
||||||
#define tls_p_ctinfo (2916)
|
#define tls_p_ctinfo (2908)
|
||||||
#define tls_andreas (-9780)
|
#define tls_andreas (-9788)
|
||||||
#define tls_pandreas (2920)
|
#define tls_pandreas (2912)
|
||||||
#define tls_wq (-9776)
|
#define tls_wq (-9784)
|
||||||
#define tls_pwq (2924)
|
#define tls_pwq (2916)
|
||||||
#define tls_sig (-9748)
|
#define tls_sig (-9756)
|
||||||
#define tls_psig (2952)
|
#define tls_psig (2944)
|
||||||
#define tls_incyg (-9744)
|
#define tls_incyg (-9752)
|
||||||
#define tls_pincyg (2956)
|
#define tls_pincyg (2948)
|
||||||
#define tls_spinning (-9740)
|
#define tls_spinning (-9748)
|
||||||
#define tls_pspinning (2960)
|
#define tls_pspinning (2952)
|
||||||
#define tls_stacklock (-9736)
|
#define tls_stacklock (-9744)
|
||||||
#define tls_pstacklock (2964)
|
#define tls_pstacklock (2956)
|
||||||
#define tls_stackptr (-9732)
|
#define tls_stackptr (-9740)
|
||||||
#define tls_pstackptr (2968)
|
#define tls_pstackptr (2960)
|
||||||
#define tls_stack (-9728)
|
#define tls_stack (-9736)
|
||||||
#define tls_pstack (2972)
|
#define tls_pstack (2964)
|
||||||
#define tls_initialized (-8704)
|
#define tls_initialized (-8712)
|
||||||
#define tls_pinitialized (3996)
|
#define tls_pinitialized (3988)
|
||||||
|
|
|
@ -3,115 +3,115 @@
|
||||||
//; $tls::start_offset = -12800;
|
//; $tls::start_offset = -12800;
|
||||||
//; $tls::locals = -12800;
|
//; $tls::locals = -12800;
|
||||||
//; $tls::plocals = 0;
|
//; $tls::plocals = 0;
|
||||||
//; $tls::local_clib = -11240;
|
//; $tls::local_clib = -11248;
|
||||||
//; $tls::plocal_clib = 1560;
|
//; $tls::plocal_clib = 1552;
|
||||||
//; $tls::__dontuse = -11240;
|
//; $tls::__dontuse = -11248;
|
||||||
//; $tls::p__dontuse = 1560;
|
//; $tls::p__dontuse = 1552;
|
||||||
//; $tls::func = -9352;
|
//; $tls::func = -9360;
|
||||||
//; $tls::pfunc = 3448;
|
//; $tls::pfunc = 3440;
|
||||||
//; $tls::saved_errno = -9344;
|
//; $tls::saved_errno = -9352;
|
||||||
//; $tls::psaved_errno = 3456;
|
//; $tls::psaved_errno = 3448;
|
||||||
//; $tls::sa_flags = -9340;
|
//; $tls::sa_flags = -9348;
|
||||||
//; $tls::psa_flags = 3460;
|
//; $tls::psa_flags = 3452;
|
||||||
//; $tls::oldmask = -9336;
|
//; $tls::oldmask = -9344;
|
||||||
//; $tls::poldmask = 3464;
|
//; $tls::poldmask = 3456;
|
||||||
//; $tls::deltamask = -9328;
|
//; $tls::deltamask = -9336;
|
||||||
//; $tls::pdeltamask = 3472;
|
//; $tls::pdeltamask = 3464;
|
||||||
//; $tls::errno_addr = -9320;
|
//; $tls::errno_addr = -9328;
|
||||||
//; $tls::perrno_addr = 3480;
|
//; $tls::perrno_addr = 3472;
|
||||||
//; $tls::sigmask = -9312;
|
//; $tls::sigmask = -9320;
|
||||||
//; $tls::psigmask = 3488;
|
//; $tls::psigmask = 3480;
|
||||||
//; $tls::sigwait_mask = -9304;
|
//; $tls::sigwait_mask = -9312;
|
||||||
//; $tls::psigwait_mask = 3496;
|
//; $tls::psigwait_mask = 3488;
|
||||||
//; $tls::sigwait_info = -9296;
|
//; $tls::sigwait_info = -9304;
|
||||||
//; $tls::psigwait_info = 3504;
|
//; $tls::psigwait_info = 3496;
|
||||||
//; $tls::signal_arrived = -9288;
|
//; $tls::signal_arrived = -9296;
|
||||||
//; $tls::psignal_arrived = 3512;
|
//; $tls::psignal_arrived = 3504;
|
||||||
//; $tls::will_wait_for_signal = -9280;
|
//; $tls::will_wait_for_signal = -9288;
|
||||||
//; $tls::pwill_wait_for_signal = 3520;
|
//; $tls::pwill_wait_for_signal = 3512;
|
||||||
//; $tls::thread_context = -9272;
|
//; $tls::thread_context = -9280;
|
||||||
//; $tls::pthread_context = 3528;
|
//; $tls::pthread_context = 3520;
|
||||||
//; $tls::thread_id = -8440;
|
//; $tls::thread_id = -8448;
|
||||||
//; $tls::pthread_id = 4360;
|
//; $tls::pthread_id = 4352;
|
||||||
//; $tls::infodata = -8436;
|
//; $tls::infodata = -8444;
|
||||||
//; $tls::pinfodata = 4364;
|
//; $tls::pinfodata = 4356;
|
||||||
//; $tls::tid = -8288;
|
//; $tls::tid = -8296;
|
||||||
//; $tls::ptid = 4512;
|
//; $tls::ptid = 4504;
|
||||||
//; $tls::_ctinfo = -8280;
|
//; $tls::_ctinfo = -8288;
|
||||||
//; $tls::p_ctinfo = 4520;
|
//; $tls::p_ctinfo = 4512;
|
||||||
//; $tls::andreas = -8272;
|
//; $tls::andreas = -8280;
|
||||||
//; $tls::pandreas = 4528;
|
//; $tls::pandreas = 4520;
|
||||||
//; $tls::wq = -8264;
|
//; $tls::wq = -8272;
|
||||||
//; $tls::pwq = 4536;
|
//; $tls::pwq = 4528;
|
||||||
//; $tls::sig = -8216;
|
//; $tls::sig = -8224;
|
||||||
//; $tls::psig = 4584;
|
//; $tls::psig = 4576;
|
||||||
//; $tls::incyg = -8212;
|
//; $tls::incyg = -8220;
|
||||||
//; $tls::pincyg = 4588;
|
//; $tls::pincyg = 4580;
|
||||||
//; $tls::spinning = -8208;
|
//; $tls::spinning = -8216;
|
||||||
//; $tls::pspinning = 4592;
|
//; $tls::pspinning = 4584;
|
||||||
//; $tls::stacklock = -8204;
|
//; $tls::stacklock = -8212;
|
||||||
//; $tls::pstacklock = 4596;
|
//; $tls::pstacklock = 4588;
|
||||||
//; $tls::stackptr = -8200;
|
//; $tls::stackptr = -8208;
|
||||||
//; $tls::pstackptr = 4600;
|
//; $tls::pstackptr = 4592;
|
||||||
//; $tls::stack = -8192;
|
//; $tls::stack = -8200;
|
||||||
//; $tls::pstack = 4608;
|
//; $tls::pstack = 4600;
|
||||||
//; $tls::initialized = -6144;
|
//; $tls::initialized = -6152;
|
||||||
//; $tls::pinitialized = 6656;
|
//; $tls::pinitialized = 6648;
|
||||||
//; __DATA__
|
//; __DATA__
|
||||||
|
|
||||||
#define tls_locals (-12800)
|
#define tls_locals (-12800)
|
||||||
#define tls_plocals (0)
|
#define tls_plocals (0)
|
||||||
#define tls_local_clib (-11240)
|
#define tls_local_clib (-11248)
|
||||||
#define tls_plocal_clib (1560)
|
#define tls_plocal_clib (1552)
|
||||||
#define tls___dontuse (-11240)
|
#define tls___dontuse (-11248)
|
||||||
#define tls_p__dontuse (1560)
|
#define tls_p__dontuse (1552)
|
||||||
#define tls_func (-9352)
|
#define tls_func (-9360)
|
||||||
#define tls_pfunc (3448)
|
#define tls_pfunc (3440)
|
||||||
#define tls_saved_errno (-9344)
|
#define tls_saved_errno (-9352)
|
||||||
#define tls_psaved_errno (3456)
|
#define tls_psaved_errno (3448)
|
||||||
#define tls_sa_flags (-9340)
|
#define tls_sa_flags (-9348)
|
||||||
#define tls_psa_flags (3460)
|
#define tls_psa_flags (3452)
|
||||||
#define tls_oldmask (-9336)
|
#define tls_oldmask (-9344)
|
||||||
#define tls_poldmask (3464)
|
#define tls_poldmask (3456)
|
||||||
#define tls_deltamask (-9328)
|
#define tls_deltamask (-9336)
|
||||||
#define tls_pdeltamask (3472)
|
#define tls_pdeltamask (3464)
|
||||||
#define tls_errno_addr (-9320)
|
#define tls_errno_addr (-9328)
|
||||||
#define tls_perrno_addr (3480)
|
#define tls_perrno_addr (3472)
|
||||||
#define tls_sigmask (-9312)
|
#define tls_sigmask (-9320)
|
||||||
#define tls_psigmask (3488)
|
#define tls_psigmask (3480)
|
||||||
#define tls_sigwait_mask (-9304)
|
#define tls_sigwait_mask (-9312)
|
||||||
#define tls_psigwait_mask (3496)
|
#define tls_psigwait_mask (3488)
|
||||||
#define tls_sigwait_info (-9296)
|
#define tls_sigwait_info (-9304)
|
||||||
#define tls_psigwait_info (3504)
|
#define tls_psigwait_info (3496)
|
||||||
#define tls_signal_arrived (-9288)
|
#define tls_signal_arrived (-9296)
|
||||||
#define tls_psignal_arrived (3512)
|
#define tls_psignal_arrived (3504)
|
||||||
#define tls_will_wait_for_signal (-9280)
|
#define tls_will_wait_for_signal (-9288)
|
||||||
#define tls_pwill_wait_for_signal (3520)
|
#define tls_pwill_wait_for_signal (3512)
|
||||||
#define tls_thread_context (-9272)
|
#define tls_thread_context (-9280)
|
||||||
#define tls_pthread_context (3528)
|
#define tls_pthread_context (3520)
|
||||||
#define tls_thread_id (-8440)
|
#define tls_thread_id (-8448)
|
||||||
#define tls_pthread_id (4360)
|
#define tls_pthread_id (4352)
|
||||||
#define tls_infodata (-8436)
|
#define tls_infodata (-8444)
|
||||||
#define tls_pinfodata (4364)
|
#define tls_pinfodata (4356)
|
||||||
#define tls_tid (-8288)
|
#define tls_tid (-8296)
|
||||||
#define tls_ptid (4512)
|
#define tls_ptid (4504)
|
||||||
#define tls__ctinfo (-8280)
|
#define tls__ctinfo (-8288)
|
||||||
#define tls_p_ctinfo (4520)
|
#define tls_p_ctinfo (4512)
|
||||||
#define tls_andreas (-8272)
|
#define tls_andreas (-8280)
|
||||||
#define tls_pandreas (4528)
|
#define tls_pandreas (4520)
|
||||||
#define tls_wq (-8264)
|
#define tls_wq (-8272)
|
||||||
#define tls_pwq (4536)
|
#define tls_pwq (4528)
|
||||||
#define tls_sig (-8216)
|
#define tls_sig (-8224)
|
||||||
#define tls_psig (4584)
|
#define tls_psig (4576)
|
||||||
#define tls_incyg (-8212)
|
#define tls_incyg (-8220)
|
||||||
#define tls_pincyg (4588)
|
#define tls_pincyg (4580)
|
||||||
#define tls_spinning (-8208)
|
#define tls_spinning (-8216)
|
||||||
#define tls_pspinning (4592)
|
#define tls_pspinning (4584)
|
||||||
#define tls_stacklock (-8204)
|
#define tls_stacklock (-8212)
|
||||||
#define tls_pstacklock (4596)
|
#define tls_pstacklock (4588)
|
||||||
#define tls_stackptr (-8200)
|
#define tls_stackptr (-8208)
|
||||||
#define tls_pstackptr (4600)
|
#define tls_pstackptr (4592)
|
||||||
#define tls_stack (-8192)
|
#define tls_stack (-8200)
|
||||||
#define tls_pstack (4608)
|
#define tls_pstack (4600)
|
||||||
#define tls_initialized (-6144)
|
#define tls_initialized (-6152)
|
||||||
#define tls_pinitialized (6656)
|
#define tls_pinitialized (6648)
|
||||||
|
|
|
@ -562,15 +562,18 @@ cygheap_pwdgrp::init ()
|
||||||
db_prefix: auto
|
db_prefix: auto
|
||||||
db_cache: yes
|
db_cache: yes
|
||||||
db_separator: +
|
db_separator: +
|
||||||
|
db_enum: cache builtin
|
||||||
*/
|
*/
|
||||||
pwd_src = (NSS_FILES | NSS_DB);
|
pwd_src = (NSS_FILES | NSS_DB);
|
||||||
grp_src = (NSS_FILES | NSS_DB);
|
grp_src = (NSS_FILES | NSS_DB);
|
||||||
prefix = NSS_AUTO;
|
prefix = NSS_AUTO;
|
||||||
separator[0] = L'+';
|
separator[0] = L'+';
|
||||||
caching = true;
|
caching = true;
|
||||||
|
enums = (ENUM_CACHE | ENUM_BUILTIN);
|
||||||
|
enum_tdoms = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The /etc/nssswitch.conf file is read exactly once by the root process of a
|
/* The /etc/nsswitch.conf file is read exactly once by the root process of a
|
||||||
process tree. We can't afford methodical changes during the lifetime of a
|
process tree. We can't afford methodical changes during the lifetime of a
|
||||||
process tree. */
|
process tree. */
|
||||||
void
|
void
|
||||||
|
@ -662,6 +665,58 @@ cygheap_pwdgrp::nss_init_line (const char *line)
|
||||||
else
|
else
|
||||||
debug_printf ("Invalid nsswitch.conf content: %s", line);
|
debug_printf ("Invalid nsswitch.conf content: %s", line);
|
||||||
}
|
}
|
||||||
|
else if (!strncmp (c, "enum:", 5))
|
||||||
|
{
|
||||||
|
tmp_pathbuf tp;
|
||||||
|
char *tdoms = tp.c_get ();
|
||||||
|
char *td = tdoms;
|
||||||
|
int new_enums = ENUM_NONE;
|
||||||
|
|
||||||
|
td[0] = '\0';
|
||||||
|
c += 5;
|
||||||
|
c += strspn (c, " \t");
|
||||||
|
while (!strchr (" \t", *c))
|
||||||
|
{
|
||||||
|
const char *e = c + strcspn (c, " \t");
|
||||||
|
if (!strncmp (c, "none", 4) && strchr (" \t", c[4]))
|
||||||
|
new_enums = ENUM_NONE;
|
||||||
|
else if (!strncmp (c, "builtin", 7) && strchr (" \t", c[7]))
|
||||||
|
new_enums |= ENUM_BUILTIN;
|
||||||
|
else if (!strncmp (c, "cache", 5) && strchr (" \t", c[5]))
|
||||||
|
new_enums |= ENUM_CACHE;
|
||||||
|
else if (!strncmp (c, "files", 5) && strchr (" \t", c[5]))
|
||||||
|
new_enums |= ENUM_FILES;
|
||||||
|
else if (!strncmp (c, "local", 5) && strchr (" \t", c[5]))
|
||||||
|
new_enums |= ENUM_LOCAL;
|
||||||
|
else if (!strncmp (c, "primary", 7) && strchr (" \t", c[7]))
|
||||||
|
new_enums |= ENUM_PRIMARY;
|
||||||
|
else if (!strncmp (c, "alltrusted", 10) && strchr (" \t", c[10]))
|
||||||
|
new_enums |= ENUM_TDOMS | ENUM_TDOMS_ALL;
|
||||||
|
else if (!strncmp (c, "all", 3) && strchr (" \t", c[3]))
|
||||||
|
new_enums |= ENUM_ALL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
td = stpcpy (stpncpy (td, c, e - c), " ");
|
||||||
|
new_enums |= ENUM_TDOMS;
|
||||||
|
}
|
||||||
|
c = e;
|
||||||
|
c += strspn (c, " \t");
|
||||||
|
}
|
||||||
|
if ((new_enums & (ENUM_TDOMS | ENUM_TDOMS_ALL)) == ENUM_TDOMS)
|
||||||
|
{
|
||||||
|
if (td > tdoms)
|
||||||
|
{
|
||||||
|
PWCHAR spc;
|
||||||
|
sys_mbstowcs_alloc (&enum_tdoms, HEAP_BUF, tdoms);
|
||||||
|
/* Convert string to REG_MULTI_SZ-style. */
|
||||||
|
while ((spc = wcsrchr (enum_tdoms, L' ')))
|
||||||
|
*spc = L'\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
new_enums &= ~(ENUM_TDOMS | ENUM_TDOMS_ALL);
|
||||||
|
}
|
||||||
|
enums = new_enums;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case '\0':
|
case '\0':
|
||||||
case '#':
|
case '#':
|
||||||
|
@ -867,15 +922,17 @@ get_logon_sid ()
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
pwdgrp::add_account_post_fetch (char *line)
|
pwdgrp::add_account_post_fetch (char *line, bool lock)
|
||||||
{
|
{
|
||||||
if (line)
|
if (line)
|
||||||
{
|
{
|
||||||
void *ret;
|
void *ret;
|
||||||
pglock.init ("pglock")->acquire ();
|
if (lock)
|
||||||
|
pglock.init ("pglock")->acquire ();
|
||||||
add_line (line);
|
add_line (line);
|
||||||
ret = ((char *) pwdgrp_buf) + (curr_lines - 1) * pwdgrp_buf_elem_size;
|
ret = ((char *) pwdgrp_buf) + (curr_lines - 1) * pwdgrp_buf_elem_size;
|
||||||
pglock.release ();
|
if (lock)
|
||||||
|
pglock.release ();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -890,7 +947,7 @@ pwdgrp::add_account_from_file (cygpsid &sid)
|
||||||
arg.type = SID_arg;
|
arg.type = SID_arg;
|
||||||
arg.sid = &sid;
|
arg.sid = &sid;
|
||||||
char *line = fetch_account_from_file (arg);
|
char *line = fetch_account_from_file (arg);
|
||||||
return (struct passwd *) add_account_post_fetch (line);
|
return (struct passwd *) add_account_post_fetch (line, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
|
@ -902,7 +959,7 @@ pwdgrp::add_account_from_file (const char *name)
|
||||||
arg.type = NAME_arg;
|
arg.type = NAME_arg;
|
||||||
arg.name = name;
|
arg.name = name;
|
||||||
char *line = fetch_account_from_file (arg);
|
char *line = fetch_account_from_file (arg);
|
||||||
return (struct passwd *) add_account_post_fetch (line);
|
return (struct passwd *) add_account_post_fetch (line, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
|
@ -914,7 +971,7 @@ pwdgrp::add_account_from_file (uint32_t id)
|
||||||
arg.type = ID_arg;
|
arg.type = ID_arg;
|
||||||
arg.id = id;
|
arg.id = id;
|
||||||
char *line = fetch_account_from_file (arg);
|
char *line = fetch_account_from_file (arg);
|
||||||
return (struct passwd *) add_account_post_fetch (line);
|
return (struct passwd *) add_account_post_fetch (line, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
|
@ -927,8 +984,8 @@ pwdgrp::add_account_from_windows (cygpsid &sid, bool group)
|
||||||
if (!line)
|
if (!line)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (cygheap->pg.nss_db_caching ())
|
if (cygheap->pg.nss_db_caching ())
|
||||||
return add_account_post_fetch (line);
|
return add_account_post_fetch (line, true);
|
||||||
return (prep_tls_pwbuf ())->add_account_post_fetch (line);
|
return (prep_tls_pwbuf ())->add_account_post_fetch (line, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
|
@ -941,8 +998,8 @@ pwdgrp::add_account_from_windows (const char *name, bool group)
|
||||||
if (!line)
|
if (!line)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (cygheap->pg.nss_db_caching ())
|
if (cygheap->pg.nss_db_caching ())
|
||||||
return add_account_post_fetch (line);
|
return add_account_post_fetch (line, true);
|
||||||
return (prep_tls_pwbuf ())->add_account_post_fetch (line);
|
return (prep_tls_pwbuf ())->add_account_post_fetch (line, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
|
@ -955,8 +1012,8 @@ pwdgrp::add_account_from_windows (uint32_t id, bool group)
|
||||||
if (!line)
|
if (!line)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (cygheap->pg.nss_db_caching ())
|
if (cygheap->pg.nss_db_caching ())
|
||||||
return add_account_post_fetch (line);
|
return add_account_post_fetch (line, true);
|
||||||
return (prep_tls_pwbuf ())->add_account_post_fetch (line);
|
return (prep_tls_pwbuf ())->add_account_post_fetch (line, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if file exists and if it has been written to since last checked.
|
/* Check if file exists and if it has been written to since last checked.
|
||||||
|
@ -1149,6 +1206,28 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, bool group)
|
||||||
case SID_arg:
|
case SID_arg:
|
||||||
sid = *arg.sid;
|
sid = *arg.sid;
|
||||||
ret = LookupAccountSidW (NULL, sid, name, &nlen, dom, &dlen, &acc_type);
|
ret = LookupAccountSidW (NULL, sid, name, &nlen, dom, &dlen, &acc_type);
|
||||||
|
if (!ret
|
||||||
|
&& cygheap->dom.member_machine ()
|
||||||
|
&& sid_id_auth (sid) == 5 /* SECURITY_NT_AUTHORITY */
|
||||||
|
&& sid_sub_auth (sid, 0) == SECURITY_BUILTIN_DOMAIN_RID)
|
||||||
|
{
|
||||||
|
/* LookupAccountSid called on a non-DC cannot resolve aliases which
|
||||||
|
are not defined in the local SAM. If we encounter an alias which
|
||||||
|
can't be resolved, and if we're a domain member machine, ask a DC.
|
||||||
|
Do *not* use LookupAccountSidW. It can take ages when called on a
|
||||||
|
DC for some weird reason. Use LDAP instead. */
|
||||||
|
PWCHAR val;
|
||||||
|
|
||||||
|
if ((ldap_open = cldap.open (NULL))
|
||||||
|
&& cldap.fetch_ad_account (sid, group)
|
||||||
|
&& (val = cldap.get_group_name ()))
|
||||||
|
{
|
||||||
|
wcpcpy (name, val);
|
||||||
|
wcpcpy (dom, L"BUILTIN");
|
||||||
|
acc_type = SidTypeAlias;
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!ret)
|
if (!ret)
|
||||||
debug_printf ("LookupAccountSid(%W), %E", sid.string (sidstr));
|
debug_printf ("LookupAccountSid(%W), %E", sid.string (sidstr));
|
||||||
break;
|
break;
|
||||||
|
@ -1478,7 +1557,7 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, bool group)
|
||||||
/* Set comment variable for below attribute loop. */
|
/* Set comment variable for below attribute loop. */
|
||||||
comment = ui->usri4_comment;
|
comment = ui->usri4_comment;
|
||||||
}
|
}
|
||||||
else /* SidTypeGroup || SidTypeAlias */
|
else if (acc_type == SidTypeAlias)
|
||||||
{
|
{
|
||||||
nas = NetLocalGroupGetInfo (NULL, name, 1, (PBYTE *) &gi);
|
nas = NetLocalGroupGetInfo (NULL, name, 1, (PBYTE *) &gi);
|
||||||
if (nas != NERR_Success)
|
if (nas != NERR_Success)
|
||||||
|
@ -1489,6 +1568,8 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, bool group)
|
||||||
/* Set comment variable for below attribute loop. */
|
/* Set comment variable for below attribute loop. */
|
||||||
comment = gi->lgrpi1_comment;
|
comment = gi->lgrpi1_comment;
|
||||||
}
|
}
|
||||||
|
else /* SidTypeGroup. No way to add a comment to "None" :( */
|
||||||
|
break;
|
||||||
/* Local SAM accounts have only a handful attributes
|
/* Local SAM accounts have only a handful attributes
|
||||||
available to home users. Therefore, fetch additional
|
available to home users. Therefore, fetch additional
|
||||||
passwd/group attributes from the "Description" field
|
passwd/group attributes from the "Description" field
|
||||||
|
|
Loading…
Reference in New Issue