r11923: Add samr_lookup_rids for the builtin domain. Doing it this way feels a bit
authorVolker Lendecke <vlendec@samba.org>
Sat, 26 Nov 2005 22:28:41 +0000 (22:28 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:05:36 +0000 (11:05 -0500)
wrong, but so far we don't have proper multi-domain support in passdb yet...

Volker
(This used to be commit c917cfc320f0250d23fda3525a7632bc01643707)

source3/passdb/pdb_interface.c
source3/rpc_server/srv_samr_nt.c
source3/rpcclient/cmd_samr.c

index 9605349781f56766773b7c3d2e6f75b3bf003ea6..875e264bf01ff09ab043a5fa972f77d6db149f46 100644 (file)
@@ -1652,24 +1652,38 @@ NTSTATUS pdb_default_lookup_rids(struct pdb_methods *methods,
        BOOL have_mapped = False;
        BOOL have_unmapped = False;
 
-       if (!sid_equal(domain_sid, get_global_sam_sid())) {
-               /* TODO: Sooner or later we need to look up BUILTIN rids as
-                * well. -- vl */
+       if (sid_check_is_builtin(domain_sid)) {
+
+               for (i=0; i<num_rids; i++) {
+                       fstring name;
+
+                       if (lookup_builtin_rid(rids[i], name)) {
+                               attrs[i] = SID_NAME_ALIAS;
+                               names[i] = talloc_strdup(names, name);
+                               if (names[i] == NULL) {
+                                       return NT_STATUS_NO_MEMORY;
+                               }
+                               DEBUG(5,("lookup_rids: %s:%d\n",
+                                        names[i], attrs[i]));
+                               have_mapped = True;
+                       } else {
+                               have_unmapped = True;
+                               attrs[i] = SID_NAME_UNKNOWN;
+                       }
+               }
                goto done;
        }
 
+       /* Should not happen, but better check once too many */
+       if (!sid_check_is_domain(domain_sid)) {
+               return NT_STATUS_INVALID_HANDLE;
+       }
+
        for (i = 0; i < num_rids; i++) {
                fstring tmpname;
-               fstring domname;
-               DOM_SID sid;
                enum SID_NAME_USE type;
 
-               attrs[i] = SID_NAME_UNKNOWN;
-
-               sid_copy(&sid, domain_sid);
-               sid_append_rid(&sid, rids[i]);
-
-               if (lookup_sid(&sid, domname, tmpname, &type)) {
+               if (lookup_global_sam_rid(rids[i], tmpname, &type)) {
                        attrs[i] = (uint32)type;
                        names[i] = talloc_strdup(names, tmpname);
                        if (names[i] == NULL)
@@ -1678,6 +1692,7 @@ NTSTATUS pdb_default_lookup_rids(struct pdb_methods *methods,
                        have_mapped = True;
                } else {
                        have_unmapped = True;
+                       attrs[i] = SID_NAME_UNKNOWN;
                }
        }
 
index 65bb0ef1ab3f8d20ec70c3a3a31b753f74f358d9..b4d699188af20f32bb85856158a2953c89d2723a 100644 (file)
@@ -1516,19 +1516,11 @@ NTSTATUS _samr_lookup_rids(pipes_struct *p, SAMR_Q_LOOKUP_RIDS *q_u, SAMR_R_LOOK
        if ((num_rids != 0) && ((names == NULL) || (attrs == NULL)))
                return NT_STATUS_NO_MEMORY;
 
-       if (!sid_equal(&pol_sid, get_global_sam_sid())) {
-               /* TODO: Sooner or later we need to look up BUILTIN rids as
-                * well. -- vl */
-               goto done;
-       }
-
        become_root();  /* lookup_sid can require root privs */
        r_u->status = pdb_lookup_rids(&pol_sid, num_rids, q_u->rid,
                                      names, attrs);
        unbecome_root();
 
- done:
-
        if(!make_samr_lookup_rids(p->mem_ctx, num_rids, names,
                                  &hdr_name, &uni_name))
                return NT_STATUS_NO_MEMORY;
index 7727330388f26d0062c5772b2944f8afdad389bd..68ceead69d3ba53c93282ae6187abfde49bc78ee 100644 (file)
@@ -1457,8 +1457,8 @@ static NTSTATUS cmd_samr_lookup_rids(struct rpc_pipe_client *cli,
        char **names;
        int i;
 
-       if (argc < 2) {
-               printf("Usage: %s rid1 [rid2 [rid3] [...]]\n", argv[0]);
+       if (argc < 3) {
+               printf("Usage: %s domain|builtin rid1 [rid2 [rid3] [...]]\n", argv[0]);
                return NT_STATUS_OK;
        }
 
@@ -1470,20 +1470,27 @@ static NTSTATUS cmd_samr_lookup_rids(struct rpc_pipe_client *cli,
        if (!NT_STATUS_IS_OK(result))
                goto done;
 
-       result = rpccli_samr_open_domain(cli, mem_ctx, &connect_pol,
-                                     MAXIMUM_ALLOWED_ACCESS,
-                                     &domain_sid, &domain_pol);
+       if (StrCaseCmp(argv[1], "domain")==0)
+               result = rpccli_samr_open_domain(cli, mem_ctx, &connect_pol,
+                                             MAXIMUM_ALLOWED_ACCESS,
+                                             &domain_sid, &domain_pol);
+       else if (StrCaseCmp(argv[1], "builtin")==0)
+               result = rpccli_samr_open_domain(cli, mem_ctx, &connect_pol,
+                                             MAXIMUM_ALLOWED_ACCESS,
+                                             &global_sid_Builtin, &domain_pol);
+       else
+               return NT_STATUS_OK;
 
        if (!NT_STATUS_IS_OK(result))
                goto done;
 
        /* Look up rids */
 
-       num_rids = argc - 1;
+       num_rids = argc - 2;
        rids = TALLOC_ARRAY(mem_ctx, uint32, num_rids);
 
-       for (i = 0; i < argc - 1; i++)
-                sscanf(argv[i + 1], "%i", &rids[i]);
+       for (i = 0; i < argc - 2; i++)
+                sscanf(argv[i + 2], "%i", &rids[i]);
 
        result = rpccli_samr_lookup_rids(cli, mem_ctx, &domain_pol, num_rids, rids,
                                      &num_names, &names, &name_types);