summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/ldap.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2014-11-26 19:46:59 +0000
committerCorinna Vinschen <corinna@vinschen.de>2014-11-26 19:46:59 +0000
commit93d15b36efe67e26e89bcd4def82c4d73c7a6dcb (patch)
tree15661bd5ab69acf7b742e30925c631bf4abcc659 /winsup/cygwin/ldap.cc
parent8a2ab1aea1ccd84400d4f7dfd1ac87fa67485036 (diff)
downloadcygnal-93d15b36efe67e26e89bcd4def82c4d73c7a6dcb.tar.gz
cygnal-93d15b36efe67e26e89bcd4def82c4d73c7a6dcb.tar.bz2
cygnal-93d15b36efe67e26e89bcd4def82c4d73c7a6dcb.zip
* Makefile.in (install): Add install-ldif target.
(install-ldif): New target to install cygwin.ldif. * cygheap.h (class cygheap_pwdgrp): Rename pfx_t to nss_pfx_t. Add PFX to enum value. Add nss_scheme_method enum and nss_scheme_t structure. Add home_scheme, shell_scheme and gecos_scheme members. (NSS_SCHEME_MAX): Define. (cygheap_pwdgrp::get_home): Declare. (cygheap_pwdgrp::get_shell): Declare. (cygheap_pwdgrp::get_gecos): Declare. * cygwin.ldif: New file. * ldap.cc (std_user_attr): New array, just defining the standard attributes. (group_attr): Add cygwinUnixGid. (user_attr): Convert to macro pointing to cygheap->pg.ldap_user_attr. (cygheap_pwdgrp::init_ldap_user_attr): New method. (cyg_ldap::fetch_ad_account): Call cygheap_pwdgrp::init_ldap_user_attr if user_attr initialization is required. Fix comment. (cyg_ldap::get_string_attribute): Implement taking attribute name as argument. * ldap.h: Drop unused macros. (cyg_ldap::get_gecos): Remove. (cyg_ldap::get_home): Remove. (cyg_ldap::get_shell): Remove. (cyg_ldap::get_string_attribute): Declare name argument variant public. * uinfo.cc (cygheap_user::ontherange): Fix indentation. (cygheap_pwdgrp::init): Initialize new home_scheme, shell_scheme and gecos_scheme members. Align comment. (NSS_NCMP): Define comparison macro. (NSS_CMP): Ditto. (cygheap_pwdgrp::nss_init_line): Use aforementioned macros throughout. Fix comment handling. Add db_home, db_shell and db_gecos handling. (fetch_from_description): New function to fetch XML-style attributes from (description) string. (fetch_from_path): New function to evaluate path string with wildcards. (cygheap_pwdgrp::get_home): New methods to fetch pw_dir value. (cygheap_pwdgrp::get_shell): Ditto for pw_shell. (cygheap_pwdgrp::get_gecos): Ditto for pw_gecos. (colon_to_semicolon): Move up. (pwdgrp::fetch_account_from_windows): Convert home, shell, gecos variables to char*. Drop statement breaking extended group info. Fetch home, shell and gecos values using new methods. Use fetch_from_description calls to fetch UNIX id and primary groups from SAM comment field. Accommodate uxid being a char* now. Accommodate the fact that extended info is malloc'ed, rather then alloca'ed. Create linebuf content as multibyte string. Create line buffer by just calling cstrdup.
Diffstat (limited to 'winsup/cygwin/ldap.cc')
-rw-r--r--winsup/cygwin/ldap.cc68
1 files changed, 57 insertions, 11 deletions
diff --git a/winsup/cygwin/ldap.cc b/winsup/cygwin/ldap.cc
index df7756809..9daf89b6d 100644
--- a/winsup/cygwin/ldap.cc
+++ b/winsup/cygwin/ldap.cc
@@ -31,20 +31,32 @@ static PWCHAR rootdse_attr[] =
NULL
};
-static PWCHAR user_attr[] =
+static const PCWSTR std_user_attr[] =
{
- (PWCHAR) L"primaryGroupID",
- (PWCHAR) L"gecos",
- (PWCHAR) L"unixHomeDirectory",
- (PWCHAR) L"loginShell",
- (PWCHAR) L"uidNumber",
- NULL
+ L"primaryGroupID",
+ L"uidNumber",
+ L"cygwinUnixUid", /* TODO */
+ /* windows scheme */
+ L"displayName",
+ L"homeDrive",
+ L"homeDirectory",
+ /* cygwin scheme */
+ L"cygwinGecos",
+ L"cygwinHome",
+ L"cygwinShell",
+ /* unix scheme */
+ L"gecos",
+ L"unixHomeDirectory",
+ L"loginShell",
+ /* desc scheme */
+ L"description"
};
static PWCHAR group_attr[] =
{
(PWCHAR) L"cn",
(PWCHAR) L"gidNumber",
+ (PWCHAR) L"cygwinUnixGid", /* TODO */
NULL
};
@@ -73,6 +85,32 @@ PWCHAR rfc2307_gid_attr[] =
};
/* ================================================================= */
+/* Helper method of cygheap_pwdgrp class. It sets the user attribs */
+/* from the settings in nsswitch.conf. */
+/* ================================================================= */
+
+#define user_attr (cygheap->pg.ldap_user_attr)
+
+void
+cygheap_pwdgrp::init_ldap_user_attr ()
+{
+ ldap_user_attr = (PWCHAR *)
+ ccalloc_abort (HEAP_BUF, sizeof (std_user_attr) / sizeof (*std_user_attr)
+ + 3 * NSS_SCHEME_MAX + 1, sizeof (PWCHAR));
+ memcpy (ldap_user_attr, std_user_attr, sizeof (std_user_attr));
+ uint16_t freeattr_idx = sizeof (std_user_attr) / sizeof (*std_user_attr);
+ for (uint16_t idx = 0; idx < NSS_SCHEME_MAX; ++idx)
+ {
+ if (home_scheme[idx].method == NSS_SCHEME_FREEATTR)
+ ldap_user_attr[freeattr_idx++] = home_scheme[idx].attrib;
+ if (shell_scheme[idx].method == NSS_SCHEME_FREEATTR)
+ ldap_user_attr[freeattr_idx++] = shell_scheme[idx].attrib;
+ if (gecos_scheme[idx].method == NSS_SCHEME_FREEATTR)
+ ldap_user_attr[freeattr_idx++] = gecos_scheme[idx].attrib;
+ }
+}
+
+/* ================================================================= */
/* Helper methods. */
/* ================================================================= */
@@ -388,6 +426,8 @@ cyg_ldap::fetch_ad_account (PSID sid, bool group, PCWSTR domain)
r = wcpcpy (r, domain);
}
}
+ if (!user_attr)
+ cygheap->pg.init_ldap_user_attr ();
attr = group ? group_attr : user_attr;
if (search (rdse, filter, attr) != 0)
return false;
@@ -421,7 +461,7 @@ cyg_ldap::enumerate_ad_accounts (PCWSTR domain, bool group)
"(objectSid=*))";
else
filter = L"(&(objectClass=Group)"
- /* 1 == ACCOUNT_GROUP */
+ /* 1 == BUILTIN_LOCAL_GROUP */
"(!(groupType:" LDAP_MATCHING_RULE_BIT_AND ":=1))"
"(objectSid=*))";
srch_id = ldap_search_init_pageW (lh, rootdse, LDAP_SCOPE_SUBTREE,
@@ -503,20 +543,26 @@ cyg_ldap::fetch_posix_offset_for_domain (PCWSTR domain)
}
PWCHAR
-cyg_ldap::get_string_attribute (int idx)
+cyg_ldap::get_string_attribute (PCWSTR name)
{
if (val)
ldap_value_freeW (val);
- val = ldap_get_valuesW (lh, entry, attr[idx]);
+ val = ldap_get_valuesW (lh, entry, (PWCHAR) name);
if (val)
return val[0];
return NULL;
}
+PWCHAR
+cyg_ldap::get_string_attribute (int idx)
+{
+ return get_string_attribute (attr[idx]);
+}
+
uint32_t
cyg_ldap::get_num_attribute (int idx)
{
- PWCHAR ret = get_string_attribute (idx);
+ PWCHAR ret = get_string_attribute (attr[idx]);
if (ret)
return (uint32_t) wcstoul (ret, NULL, 10);
return (uint32_t) -1;