* 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:
Corinna Vinschen
2014-02-17 15:36:33 +00:00
parent 1e705e2932
commit a8cf6887a2
12 changed files with 1072 additions and 294 deletions

View File

@ -23,6 +23,8 @@ extern struct group *internal_getgrnam (const char *);
int internal_getgroups (int, gid_t *, cygpsid * = NULL);
#include "sync.h"
#include "ldap.h"
#include "miscfuncs.h"
enum fetch_user_arg_type_t {
SID_arg,
@ -56,6 +58,10 @@ struct pg_grp
class pwdgrp
{
friend class pg_ent;
friend class pw_ent;
friend class gr_ent;
unsigned pwdgrp_buf_elem_size;
void *pwdgrp_buf;
bool (pwdgrp::*parse) ();
@ -87,7 +93,7 @@ class pwdgrp
i = (int) x;
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 (const char *name);
void *add_account_from_file (uint32_t id);
@ -103,6 +109,7 @@ class pwdgrp
public:
ULONG cached_users () const { return curr_lines; }
ULONG cached_groups () const { return curr_lines; }
POBJECT_ATTRIBUTES file_attr () { return &attr; }
bool check_file (bool group);
void init_pwd ();
@ -141,3 +148,96 @@ public:
struct group *find_group (const char *name);
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); }
};