summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2006-12-28 04:52:45 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:30:19 -0500
commit6d85ab62752cbc9bb7426c8df67b7dc644871099 (patch)
tree22e0ec32d556db8e2d32e2d2d4499caba901798c
parent2bbf187698f6f2ec465173fd21078b4d27abc15b (diff)
downloadsamba-6d85ab62752cbc9bb7426c8df67b7dc644871099.tar.gz
samba-6d85ab62752cbc9bb7426c8df67b7dc644871099.tar.bz2
samba-6d85ab62752cbc9bb7426c8df67b7dc644871099.zip
r20377: Rework the CrackNames implementation to handle some of the BUILTIN sid
cases. Adjust our 'look for this value in this attribute, of the result' function samdb_find_attribute() to use the correct comparison function, no matter what that may be. Andrew Bartlett (This used to be commit 3c5ff4e68748cce0bb93d7d141083922d92c3845)
-rw-r--r--source4/dsdb/samdb/cracknames.c63
-rw-r--r--source4/dsdb/samdb/samdb.c13
2 files changed, 44 insertions, 32 deletions
diff --git a/source4/dsdb/samdb/cracknames.c b/source4/dsdb/samdb/cracknames.c
index aa4b2fe121..991ccfca03 100644
--- a/source4/dsdb/samdb/cracknames.c
+++ b/source4/dsdb/samdb/cracknames.c
@@ -632,7 +632,7 @@ static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_
const char * const _result_attrs_canonical[] = { "canonicalName", NULL };
const char * const _domain_attrs_nt4[] = { "ncName", "dnsRoot", "nETBIOSName", NULL};
- const char * const _result_attrs_nt4[] = { "sAMAccountName", "objectSid", NULL};
+ const char * const _result_attrs_nt4[] = { "sAMAccountName", "objectSid", "objectClass", NULL};
const char * const _domain_attrs_guid[] = { "ncName", "dnsRoot", NULL};
const char * const _result_attrs_guid[] = { "objectGUID", NULL};
@@ -786,15 +786,11 @@ static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_
result->dn, name, info1);
}
case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT: {
+
const struct dom_sid *sid = samdb_result_dom_sid(mem_ctx, result, "objectSid");
const char *_acc = "", *_dom = "";
- if (!sid || (sid->num_auths < 4) || (sid->num_auths > 5)) {
- info1->status = DRSUAPI_DS_NAME_STATUS_NO_MAPPING;
- return WERR_OK;
- }
-
- if (sid->num_auths == 4) {
+ if (samdb_find_attribute(sam_ctx, result, "objectClass", "domain")) {
ldb_ret = gendb_search(sam_ctx, mem_ctx, partitions_basedn, &domain_res, domain_attrs,
"(ncName=%s)", ldb_dn_get_linearized(result->dn));
if (ldb_ret != 1) {
@@ -803,33 +799,38 @@ static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_
}
_dom = samdb_result_string(domain_res[0], "nETBIOSName", NULL);
W_ERROR_HAVE_NO_MEMORY(_dom);
-
- } else if (sid->num_auths == 5) {
- const char *attrs[] = { NULL };
- struct ldb_message **domain_res2;
- struct dom_sid *dom_sid = dom_sid_dup(mem_ctx, sid);
- if (!dom_sid) {
- return WERR_OK;
- }
- dom_sid->num_auths--;
- ldb_ret = gendb_search(sam_ctx, mem_ctx, NULL, &domain_res, attrs,
- "(&(objectSid=%s)(objectClass=domain))", ldap_encode_ndr_dom_sid(mem_ctx, dom_sid));
- if (ldb_ret != 1) {
- info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;
+ } else {
+ _acc = samdb_result_string(result, "sAMAccountName", NULL);
+ if (!_acc) {
+ info1->status = DRSUAPI_DS_NAME_STATUS_NO_MAPPING;
return WERR_OK;
}
- ldb_ret = gendb_search(sam_ctx, mem_ctx, partitions_basedn, &domain_res2, domain_attrs,
- "(ncName=%s)", ldb_dn_get_linearized(domain_res[0]->dn));
- if (ldb_ret != 1) {
- info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;
- return WERR_OK;
+ if (dom_sid_in_domain(dom_sid_parse_talloc(mem_ctx, SID_BUILTIN), sid)) {
+ _dom = "BUILTIN";
+ } else {
+ const char *attrs[] = { NULL };
+ struct ldb_message **domain_res2;
+ struct dom_sid *dom_sid = dom_sid_dup(mem_ctx, sid);
+ if (!dom_sid) {
+ return WERR_OK;
+ }
+ dom_sid->num_auths--;
+ ldb_ret = gendb_search(sam_ctx, mem_ctx, NULL, &domain_res, attrs,
+ "(&(objectSid=%s)(objectClass=domain))", ldap_encode_ndr_dom_sid(mem_ctx, dom_sid));
+ if (ldb_ret != 1) {
+ info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;
+ return WERR_OK;
+ }
+ ldb_ret = gendb_search(sam_ctx, mem_ctx, partitions_basedn, &domain_res2, domain_attrs,
+ "(ncName=%s)", ldb_dn_get_linearized(domain_res[0]->dn));
+ if (ldb_ret != 1) {
+ info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;
+ return WERR_OK;
+ }
+
+ _dom = samdb_result_string(domain_res2[0], "nETBIOSName", NULL);
+ W_ERROR_HAVE_NO_MEMORY(_dom);
}
-
- _dom = samdb_result_string(domain_res2[0], "nETBIOSName", NULL);
- W_ERROR_HAVE_NO_MEMORY(_dom);
-
- _acc = samdb_result_string(result, "sAMAccountName", NULL);
- W_ERROR_HAVE_NO_MEMORY(_acc);
}
info1->result_name = talloc_asprintf(mem_ctx, "%s\\%s", _dom, _acc);
diff --git a/source4/dsdb/samdb/samdb.c b/source4/dsdb/samdb/samdb.c
index 19c6ed773d..e5eafb9188 100644
--- a/source4/dsdb/samdb/samdb.c
+++ b/source4/dsdb/samdb/samdb.c
@@ -632,21 +632,32 @@ struct ldb_message_element *samdb_find_attribute(struct ldb_context *ldb,
{
int i;
struct ldb_message_element *el = ldb_msg_find_element(msg, name);
+ const struct ldb_schema_attribute *a;
struct ldb_val v;
+ TALLOC_CTX *tmp_ctx = talloc_new(ldb);
+ if (!tmp_ctx) {
+ return NULL;
+ }
+
v.data = discard_const_p(uint8_t, value);
v.length = strlen(value);
if (!el) {
+ talloc_free(tmp_ctx);
return NULL;
}
+ a = ldb_schema_attribute_by_name(ldb, name);
+
for (i=0;i<el->num_values;i++) {
- if (strcasecmp(value, (char *)el->values[i].data) == 0) {
+ if (a->syntax->comparison_fn(ldb, tmp_ctx, &el->values[i], &v) == 0) {
+ talloc_free(tmp_ctx);
return el;
}
}
+ talloc_free(tmp_ctx);
return NULL;
}