added IDL and test for lsa_EnumAccountRights()
authorAndrew Tridgell <tridge@samba.org>
Mon, 10 Nov 2003 12:12:22 +0000 (12:12 +0000)
committerAndrew Tridgell <tridge@samba.org>
Mon, 10 Nov 2003 12:12:22 +0000 (12:12 +0000)
interestingly, win2000 doesn't return the same list of rights via
lsa_EnumAccountRights() and lsa_EnumPrivsAccount()
(This used to be commit 447c5f13d40d05a49b8bfa1c28c2797371ff5352)

source4/librpc/idl/lsa.idl
source4/librpc/ndr/ndr_lsa.c
source4/librpc/ndr/ndr_lsa.h
source4/librpc/rpc/rpc_lsa.c
source4/torture/rpc/lsa.c

index 6766775c9cca82c216cb4dc13a281d04bad23d2d..fc8fddd85d04f5d9453250eaea8bc0e55b1c4a39 100644 (file)
        NTSTATUS DELETEOBJECT ();
        /* Function:   0x23 */
        NTSTATUS ENUMACCTWITHRIGHT ();
+
        /* Function:      0x24 */
-       NTSTATUS ENUMACCTRIGHTS ();
+       typedef struct {
+               unistr *name;
+       } lsa_RightAttribute;
+       
+       typedef struct {
+               uint32 count;
+               [size_is(count)] lsa_Name *names;
+       } lsa_RightSet;
+       
+       NTSTATUS lsa_EnumAccountRights (
+               [in,ref]     policy_handle *handle,
+               [in,ref]     dom_sid2 *sid,
+               [out,ref]    lsa_RightSet *rights
+               );
+
+
        /* Function:       0x25 */
        NTSTATUS ADDACCTRIGHTS ();
        /* Function:    0x26 */
index 59d3fc9b7bf97a9e8e3fc10b60efd476992620f1..1b73482e9c127ec24e461f764faf9f50b110ec91 100644 (file)
@@ -1179,14 +1179,84 @@ NTSTATUS ndr_pull_ENUMACCTWITHRIGHT(struct ndr_pull *ndr, struct ENUMACCTWITHRIG
        return NT_STATUS_OK;
 }
 
-NTSTATUS ndr_push_ENUMACCTRIGHTS(struct ndr_push *ndr, struct ENUMACCTRIGHTS *r)
+static NTSTATUS ndr_push_lsa_RightAttribute(struct ndr_push *ndr, int ndr_flags, struct lsa_RightAttribute *r)
 {
+       if (!(ndr_flags & NDR_SCALARS)) goto buffers;
+       NDR_CHECK(ndr_push_ptr(ndr, r->name));
+buffers:
+       if (!(ndr_flags & NDR_BUFFERS)) goto done;
+       if (r->name) {
+               NDR_CHECK(ndr_push_unistr(ndr, r->name));
+       }
+done:
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS ndr_pull_lsa_RightAttribute(struct ndr_pull *ndr, int ndr_flags, struct lsa_RightAttribute *r)
+{
+       uint32 _ptr_name;
+       if (!(ndr_flags & NDR_SCALARS)) goto buffers;
+       NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_name));
+       if (_ptr_name) {
+               NDR_ALLOC(ndr, r->name);
+       } else {
+               r->name = NULL;
+       }
+buffers:
+       if (!(ndr_flags & NDR_BUFFERS)) goto done;
+       if (r->name) {
+               NDR_CHECK(ndr_pull_unistr(ndr, &r->name));
+       }
+done:
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS ndr_push_lsa_RightSet(struct ndr_push *ndr, int ndr_flags, struct lsa_RightSet *r)
+{
+       if (!(ndr_flags & NDR_SCALARS)) goto buffers;
+       NDR_CHECK(ndr_push_uint32(ndr, r->count));
+       NDR_CHECK(ndr_push_ptr(ndr, r->names));
+buffers:
+       if (!(ndr_flags & NDR_BUFFERS)) goto done;
+       if (r->names) {
+               NDR_CHECK(ndr_push_array(ndr, ndr_flags, r->names, sizeof(r->names[0]), r->count, (ndr_push_flags_fn_t)ndr_push_lsa_Name));
+       }
+done:
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS ndr_pull_lsa_RightSet(struct ndr_pull *ndr, int ndr_flags, struct lsa_RightSet *r)
+{
+       uint32 _ptr_names;
+       if (!(ndr_flags & NDR_SCALARS)) goto buffers;
+       NDR_CHECK(ndr_pull_uint32(ndr, &r->count));
+       NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_names));
+       if (_ptr_names) {
+               NDR_ALLOC(ndr, r->names);
+       } else {
+               r->names = NULL;
+       }
+buffers:
+       if (!(ndr_flags & NDR_BUFFERS)) goto done;
+       if (r->names) {
+               NDR_ALLOC_N_SIZE(ndr, r->names, r->count, sizeof(r->names[0]));
+               NDR_CHECK(ndr_pull_array(ndr, ndr_flags, (void **)r->names, sizeof(r->names[0]), r->count, (ndr_pull_flags_fn_t)ndr_pull_lsa_Name));
+       }
+done:
+       return NT_STATUS_OK;
+}
+
+NTSTATUS ndr_push_lsa_EnumAccountRights(struct ndr_push *ndr, struct lsa_EnumAccountRights *r)
+{
+       NDR_CHECK(ndr_push_policy_handle(ndr, r->in.handle));
+       NDR_CHECK(ndr_push_dom_sid2(ndr, r->in.sid));
 
        return NT_STATUS_OK;
 }
 
-NTSTATUS ndr_pull_ENUMACCTRIGHTS(struct ndr_pull *ndr, struct ENUMACCTRIGHTS *r)
+NTSTATUS ndr_pull_lsa_EnumAccountRights(struct ndr_pull *ndr, struct lsa_EnumAccountRights *r)
 {
+       NDR_CHECK(ndr_pull_lsa_RightSet(ndr, NDR_SCALARS|NDR_BUFFERS, r->out.rights));
        NDR_CHECK(ndr_pull_NTSTATUS(ndr, &r->out.result));
 
        return NT_STATUS_OK;
index f8c4ab5f6ad77521fcadd437d3574853c65c7372..a3d395760c53b4b6e05a0cd2bf492668907782c1 100644 (file)
@@ -504,11 +504,23 @@ struct ENUMACCTWITHRIGHT {
 
 };
 
-struct ENUMACCTRIGHTS {
+struct lsa_RightAttribute {
+       const char *name;
+};
+
+struct lsa_RightSet {
+       uint32 count;
+       struct lsa_Name *names;
+};
+
+struct lsa_EnumAccountRights {
        struct {
+               struct policy_handle *handle;
+               struct dom_sid2 *sid;
        } in;
 
        struct {
+               struct lsa_RightSet *rights;
                NTSTATUS result;
        } out;
 
@@ -654,7 +666,7 @@ struct QUERYINFO2 {
 #define DCERPC_PRIV_GET_DISPNAME 33
 #define DCERPC_DELETEOBJECT 34
 #define DCERPC_ENUMACCTWITHRIGHT 35
-#define DCERPC_ENUMACCTRIGHTS 36
+#define DCERPC_LSA_ENUMACCOUNTRIGHTS 36
 #define DCERPC_ADDACCTRIGHTS 37
 #define DCERPC_REMOVEACCTRIGHTS 38
 #define DCERPC_QUERYTRUSTDOMINFO 39
index c514cdbb78bdebf0525f8a4e4be05f6e72bdf64e..dce1c7037e9617da7bcd1306a6f902526f7a0497 100644 (file)
@@ -507,12 +507,12 @@ NTSTATUS dcerpc_ENUMACCTWITHRIGHT(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, st
        return r->out.result;
 }
 
-NTSTATUS dcerpc_ENUMACCTRIGHTS(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct ENUMACCTRIGHTS *r)
+NTSTATUS dcerpc_lsa_EnumAccountRights(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct lsa_EnumAccountRights *r)
 {
        NTSTATUS status;
-       status = dcerpc_ndr_request(p, DCERPC_ENUMACCTRIGHTS, mem_ctx,
-                                   (ndr_push_fn_t) ndr_push_ENUMACCTRIGHTS,
-                                   (ndr_pull_fn_t) ndr_pull_ENUMACCTRIGHTS,
+       status = dcerpc_ndr_request(p, DCERPC_LSA_ENUMACCOUNTRIGHTS, mem_ctx,
+                                   (ndr_push_fn_t) ndr_push_lsa_EnumAccountRights,
+                                   (ndr_pull_fn_t) ndr_pull_lsa_EnumAccountRights,
                                    r);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
index f4c4858c8e6d1ca6c238c7fecd61b4b14073b1b3..0e316ff39524ab3925bc6d9096cc7c415b0d8d24 100644 (file)
@@ -305,6 +305,36 @@ static BOOL test_EnumPrivsAccount(struct dcerpc_pipe *p,
        return True;
 }
 
+static BOOL test_EnumAccountRights(struct dcerpc_pipe *p, 
+                                  TALLOC_CTX *mem_ctx, 
+                                  struct policy_handle *acct_handle,
+                                  struct dom_sid *sid)
+{
+       NTSTATUS status;
+       struct lsa_EnumAccountRights r;
+       struct lsa_RightSet rights;
+       int i;
+
+       printf("Testing EnumAccountRights\n");
+
+       r.in.handle = acct_handle;
+       r.in.sid = sid;
+       r.out.rights = &rights;
+
+       status = dcerpc_lsa_EnumAccountRights(p, mem_ctx, &r);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("EnumAccountRights failed - %s\n", nt_errstr(status));
+               return False;
+       }
+
+       printf("received %d rights\n", rights.count);
+       for (i=0;i<rights.count;i++) {
+               printf("\t'%s'\n", rights.names[i].name);
+       }
+
+       return True;
+}
+
 static BOOL test_OpenAccount(struct dcerpc_pipe *p, 
                             TALLOC_CTX *mem_ctx, 
                             struct policy_handle *handle,
@@ -372,9 +402,10 @@ static BOOL test_EnumAccounts(struct dcerpc_pipe *p,
        printf("testing all accounts\n");
        for (i=0;i<sids1.num_sids;i++) {
                test_OpenAccount(p, mem_ctx, handle, sids1.sids[i].sid);
+               test_EnumAccountRights(p, mem_ctx, handle, sids1.sids[i].sid);
        }
        printf("\n");
-       
+
        if (sids1.num_sids < 3) {
                return True;
        }