1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-04 17:47:26 +03:00

Implement pdb_enum_alias_memberships

This commit is contained in:
Volker Lendecke 2009-06-11 18:03:11 +02:00
parent 3174de69d5
commit 117c19efa4

View File

@ -1387,10 +1387,95 @@ static NTSTATUS pdb_ads_enum_alias_memberships(struct pdb_methods *m,
const DOM_SID *domain_sid,
const DOM_SID *members,
size_t num_members,
uint32 **pp_alias_rids,
size_t *p_num_alias_rids)
uint32_t **palias_rids,
size_t *pnum_alias_rids)
{
return NT_STATUS_NOT_IMPLEMENTED;
struct pdb_ads_state *state = talloc_get_type_abort(
m->private_data, struct pdb_ads_state);
const char *attrs[1] = { "objectSid" };
struct tldap_message **msg;
uint32_t *alias_rids = NULL;
size_t num_alias_rids = 0;
int i, rc, count;
bool got_members = false;
char *filter;
NTSTATUS status;
/*
* TODO: Get the filter right so that we only get the aliases from
* either the SAM or BUILTIN
*/
filter = talloc_asprintf(talloc_tos(),
"(&(|(grouptype=%d)(grouptype=%d))"
"(objectclass=group)(|",
GTYPE_SECURITY_BUILTIN_LOCAL_GROUP,
GTYPE_SECURITY_DOMAIN_LOCAL_GROUP);
if (filter == NULL) {
return NT_STATUS_NO_MEMORY;
}
for (i=0; i<num_members; i++) {
char *dn;
status = pdb_ads_sid2dn(state, &members[i], talloc_tos(), &dn);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(10, ("pdb_ads_sid2dn failed for %s: %s\n",
sid_string_dbg(&members[i]),
nt_errstr(status)));
continue;
}
filter = talloc_asprintf_append_buffer(
filter, "(member=%s)", dn);
TALLOC_FREE(dn);
if (filter == NULL) {
return NT_STATUS_NO_MEMORY;
}
got_members = true;
}
if (!got_members) {
goto done;
}
rc = tldap_search_fmt(state->ld, state->domaindn, LDAP_SCOPE_SUB,
attrs, ARRAY_SIZE(attrs), 0, talloc_tos(),
&msg, "%s))", filter);
TALLOC_FREE(filter);
if (rc != TLDAP_SUCCESS) {
DEBUG(10, ("tldap_search failed %s\n",
tldap_errstr(debug_ctx(), state->ld, rc)));
return NT_STATUS_LDAP(rc);
}
count = talloc_array_length(msg);
if (count == 0) {
goto done;
}
alias_rids = talloc_array(mem_ctx, uint32_t, count);
if (alias_rids == NULL) {
TALLOC_FREE(msg);
return NT_STATUS_NO_MEMORY;
}
for (i=0; i<count; i++) {
struct dom_sid sid;
if (!tldap_pull_binsid(msg[i], "objectSid", &sid)) {
DEBUG(10, ("Could not pull SID for member %d\n", i));
continue;
}
if (sid_peek_check_rid(domain_sid, &sid,
&alias_rids[num_alias_rids])) {
num_alias_rids += 1;
}
}
done:
TALLOC_FREE(msg);
*palias_rids = alias_rids;
*pnum_alias_rids = 0;
return NT_STATUS_OK;
}
static NTSTATUS pdb_ads_lookup_rids(struct pdb_methods *m,