[SCM] Samba Shared Repository - branch master updated -
release-4-0-0alpha7-2228-g96df53f
Volker Lendecke
vlendec at samba.org
Wed Jun 10 21:08:48 GMT 2009
The branch, master has been updated
via 96df53fdc72a36cea849572c8386b77611c0f380 (commit)
via 6e9e0334ff9b0aff935fcdcdd2a5380e12446a06 (commit)
from a9ec21cf219c3aef0388c252539f315d3e606a71 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 96df53fdc72a36cea849572c8386b77611c0f380
Author: Volker Lendecke <vl at samba.org>
Date: Wed Jun 10 12:54:05 2009 +0200
Implement pdb_ads_lookup_rids
commit 6e9e0334ff9b0aff935fcdcdd2a5380e12446a06
Author: Volker Lendecke <vl at samba.org>
Date: Wed Jun 10 11:48:31 2009 +0200
Fix a segfault in pdb_ads_delete_user()
If a user comes from the passdb cache, priv is NULL
-----------------------------------------------------------------------
Summary of changes:
source3/passdb/pdb_ads.c | 86 ++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 80 insertions(+), 6 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/passdb/pdb_ads.c b/source3/passdb/pdb_ads.c
index 8e30dfb..927c1aa 100644
--- a/source3/passdb/pdb_ads.c
+++ b/source3/passdb/pdb_ads.c
@@ -443,12 +443,20 @@ static NTSTATUS pdb_ads_delete_user(struct pdb_methods *m,
{
struct pdb_ads_state *state = talloc_get_type_abort(
m->private_data, struct pdb_ads_state);
- struct pdb_ads_samu_private *priv = pdb_ads_get_samu_private(m, sam);
+ NTSTATUS status;
+ char *dn;
int rc;
- rc = tldap_delete(state->ld, priv->dn, NULL, NULL);
+ status = pdb_ads_sid2dn(state, pdb_get_user_sid(sam), talloc_tos(),
+ &dn);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ rc = tldap_delete(state->ld, dn, NULL, NULL);
+ TALLOC_FREE(dn);
if (rc != TLDAP_SUCCESS) {
- DEBUG(10, ("ldap_delete for %s failed: %s\n", priv->dn,
+ DEBUG(10, ("ldap_delete for %s failed: %s\n", dn,
tldap_errstr(debug_ctx(), state->ld, rc)));
return NT_STATUS_LDAP(rc);
}
@@ -1329,10 +1337,76 @@ static NTSTATUS pdb_ads_lookup_rids(struct pdb_methods *m,
const DOM_SID *domain_sid,
int num_rids,
uint32 *rids,
- const char **pp_names,
- enum lsa_SidType *attrs)
+ const char **names,
+ enum lsa_SidType *lsa_attrs)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ struct pdb_ads_state *state = talloc_get_type_abort(
+ m->private_data, struct pdb_ads_state);
+ const char *attrs[2] = { "sAMAccountType", "sAMAccountName" };
+ int i, num_mapped;
+
+ if (num_rids == 0) {
+ return NT_STATUS_NONE_MAPPED;
+ }
+
+ num_mapped = 0;
+
+ for (i=0; i<num_rids; i++) {
+ struct dom_sid sid;
+ struct tldap_message **msg;
+ char *sidstr;
+ uint32_t attr;
+ int rc;
+
+ lsa_attrs[i] = SID_NAME_UNKNOWN;
+
+ sid_compose(&sid, domain_sid, rids[i]);
+
+ sidstr = sid_binstring(talloc_tos(), &sid);
+ NT_STATUS_HAVE_NO_MEMORY(sidstr);
+
+ rc = tldap_search_fmt(state->ld, state->domaindn,
+ TLDAP_SCOPE_SUB, attrs,
+ ARRAY_SIZE(attrs), 0, talloc_tos(),
+ &msg, "(objectsid=%s)", sidstr);
+ TALLOC_FREE(sidstr);
+ if (rc != TLDAP_SUCCESS) {
+ DEBUG(10, ("ldap_search failed %s\n",
+ tldap_errstr(debug_ctx(), state->ld, rc)));
+ continue;
+ }
+
+ switch talloc_array_length(msg) {
+ case 0:
+ DEBUG(10, ("rid %d not found\n", (int)rids[i]));
+ continue;
+ case 1:
+ break;
+ default:
+ return NT_STATUS_INTERNAL_DB_CORRUPTION;
+ }
+
+ names[i] = tldap_talloc_single_attribute(
+ msg[0], "samAccountName", talloc_tos());
+ if (names[i] == NULL) {
+ DEBUG(10, ("no samAccountName\n"));
+ continue;
+ }
+ if (!tldap_pull_uint32(msg[0], "samAccountType", &attr)) {
+ DEBUG(10, ("no samAccountType"));
+ continue;
+ }
+ lsa_attrs[i] = ads_atype_map(attr);
+ num_mapped += 1;
+ }
+
+ if (num_mapped == 0) {
+ return NT_STATUS_NONE_MAPPED;
+ }
+ if (num_mapped < num_rids) {
+ return STATUS_SOME_UNMAPPED;
+ }
+ return NT_STATUS_OK;
}
static NTSTATUS pdb_ads_lookup_names(struct pdb_methods *m,
--
Samba Shared Repository
More information about the samba-cvs
mailing list