summaryrefslogtreecommitdiff
path: root/source3/winbindd
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2010-06-09 15:12:37 +0200
committerAndreas Schneider <asn@samba.org>2010-07-05 15:59:08 +0200
commit645ce68e357948c8bddf46e7b3777788af4d0a72 (patch)
treed9867c380c3317f81be337440bf0b9b3fe58d178 /source3/winbindd
parentd92cb43b7723c8103a62602dfe1a02eba2526576 (diff)
downloadsamba-645ce68e357948c8bddf46e7b3777788af4d0a72.tar.gz
samba-645ce68e357948c8bddf46e7b3777788af4d0a72.tar.bz2
samba-645ce68e357948c8bddf46e7b3777788af4d0a72.zip
s3-winbind: Implemented samr backend function common_lookup_useraliases.
Diffstat (limited to 'source3/winbindd')
-rw-r--r--source3/winbindd/winbindd_samr.c107
1 files changed, 103 insertions, 4 deletions
diff --git a/source3/winbindd/winbindd_samr.c b/source3/winbindd/winbindd_samr.c
index d2ce4259b3..b611602e8b 100644
--- a/source3/winbindd/winbindd_samr.c
+++ b/source3/winbindd/winbindd_samr.c
@@ -1292,11 +1292,110 @@ static NTSTATUS common_lookup_useraliases(struct winbindd_domain *domain,
TALLOC_CTX *mem_ctx,
uint32_t num_sids,
const struct dom_sid *sids,
- uint32_t *p_num_aliases,
- uint32_t **rids)
+ uint32_t *pnum_aliases,
+ uint32_t **palias_rids)
{
- /* TODO FIXME */
- return NT_STATUS_NOT_IMPLEMENTED;
+#define MAX_SAM_ENTRIES_W2K 0x400 /* 1024 */
+ struct rpc_pipe_client *samr_pipe;
+ struct policy_handle dom_pol;
+ uint32_t num_query_sids = 0;
+ uint32_t num_queries = 1;
+ uint32_t num_aliases = 0;
+ uint32_t total_sids = 0;
+ uint32_t rangesize = MAX_SAM_ENTRIES_W2K;
+ uint32_t i;
+ struct samr_Ids alias_rids_query;
+ TALLOC_CTX *tmp_ctx;
+ NTSTATUS status;
+
+ DEBUG(3,("samr: lookup useraliases\n"));
+
+ if (pnum_aliases) {
+ *pnum_aliases = 0;
+ }
+
+ if (palias_rids) {
+ *palias_rids = NULL;
+ }
+
+ tmp_ctx = talloc_stackframe();
+ if (tmp_ctx == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ status = open_internal_samr_conn(tmp_ctx, domain, &samr_pipe, &dom_pol);
+ if (!NT_STATUS_IS_OK(status)) {
+ goto error;
+ }
+
+ do {
+ /* prepare query */
+ struct lsa_SidArray sid_array;
+
+ ZERO_STRUCT(sid_array);
+
+ num_query_sids = MIN(num_sids - total_sids, rangesize);
+
+ DEBUG(10,("rpc: lookup_useraliases: entering query %d for %d sids\n",
+ num_queries, num_query_sids));
+
+ if (num_query_sids) {
+ sid_array.sids = TALLOC_ZERO_ARRAY(tmp_ctx, struct lsa_SidPtr, num_query_sids);
+ if (sid_array.sids == NULL) {
+ status = NT_STATUS_NO_MEMORY;
+ goto error;
+ }
+ } else {
+ sid_array.sids = NULL;
+ }
+
+ for (i = 0; i < num_query_sids; i++) {
+ sid_array.sids[i].sid = sid_dup_talloc(tmp_ctx, &sids[total_sids++]);
+ if (sid_array.sids[i].sid == NULL) {
+ status = NT_STATUS_NO_MEMORY;
+ goto error;
+ }
+ }
+ sid_array.num_sids = num_query_sids;
+
+ /* do request */
+ status = rpccli_samr_GetAliasMembership(samr_pipe,
+ tmp_ctx,
+ &dom_pol,
+ &sid_array,
+ &alias_rids_query);
+ if (!NT_STATUS_IS_OK(status)) {
+ goto error;
+ }
+
+ if (palias_rids) {
+ /* process output */
+ for (i = 0; i < alias_rids_query.count; i++) {
+ size_t na = num_aliases;
+
+ if (!add_rid_to_array_unique(mem_ctx,
+ alias_rids_query.ids[i],
+ palias_rids,
+ &na)) {
+ status = NT_STATUS_NO_MEMORY;
+ goto error;
+ }
+ num_aliases = na;
+ }
+ }
+
+ num_queries++;
+
+ } while (total_sids < num_sids);
+
+ if (pnum_aliases) {
+ *pnum_aliases = num_aliases;
+ }
+
+error:
+ TALLOC_FREE(tmp_ctx);
+ return status;
+#undef MAX_SAM_ENTRIES_W2K
}
/* find the sequence number for a domain */