s3-winbind: Implemented samr backend function common_lookup_useraliases.
authorAndreas Schneider <asn@samba.org>
Wed, 9 Jun 2010 13:12:37 +0000 (15:12 +0200)
committerAndreas Schneider <asn@samba.org>
Mon, 5 Jul 2010 13:59:08 +0000 (15:59 +0200)
source3/winbindd/winbindd_samr.c

index d2ce4259b31a1b7e8431f552456eb14704153769..b611602e8b058240c35d1c64b005a926a2fc5d05 100644 (file)
@@ -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 */