r4195: added IDL, test suite and server side code for lsa_LookupPrivValue
authorAndrew Tridgell <tridge@samba.org>
Tue, 14 Dec 2004 05:32:51 +0000 (05:32 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:07:25 +0000 (13:07 -0500)
source/librpc/idl/lsa.idl
source/rpc_server/lsa/dcesrv_lsa.c
source/torture/rpc/lsa.c

index 113411016305ec14f96aad1213b9243ec4b0c9ba..42891eecf79d8f0387777336a049017ce0fa8c2e 100644 (file)
                unistr_noterm *string;
        } lsa_String;
 
+       typedef struct {
+               uint32 low;
+               uint32 high;
+       } lsa_LUID;
+       
        typedef struct {
                lsa_String name;
-               uint32 luid_low;
-               uint32 luid_high;
+               lsa_LUID luid;
        } lsa_PrivEntry;
 
        typedef struct {
        /****************************************/
        /* Function:    0x12                    */
 
-       typedef struct {
-               uint32 low;
-               uint32 high;
-       } lsa_LUID;
-       
        typedef struct {
                lsa_LUID luid;
                uint32 attribute;
                );
 
        /* Function:     0x1f */
-       NTSTATUS lsa_LookupPrivValue();
+       NTSTATUS lsa_LookupPrivValue(
+               [in,ref]     policy_handle *handle,
+               [in,ref]     lsa_String *name,
+               [out,ref]    lsa_LUID *luid
+               );
 
 
        /* Function:      0x20 */
index 8ebbca51866d2bbf8dfb3b7d1f3b67d8ffd43cbf..71978caeb4c2b5131dab7b8f9c5e9aef54d3a37a 100644 (file)
@@ -122,8 +122,8 @@ static NTSTATUS lsa_EnumPrivs(struct dcesrv_call_state *dce_call, TALLOC_CTX *me
                        return NT_STATUS_NO_MEMORY;
                }
                e = &r->out.privs->privs[r->out.privs->count];
-               e->luid_low = i;
-               e->luid_high = 0;
+               e->luid.low = i;
+               e->luid.high = 0;
                e->name.string = privname;
                r->out.privs->count++;
                i++;
@@ -821,18 +821,36 @@ static NTSTATUS lsa_QuerySecret(struct dcesrv_call_state *dce_call, TALLOC_CTX *
 /* 
   lsa_LookupPrivValue
 */
-static NTSTATUS lsa_LookupPrivValue(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct lsa_LookupPrivValue *r)
+static NTSTATUS lsa_LookupPrivValue(struct dcesrv_call_state *dce_call, 
+                                   TALLOC_CTX *mem_ctx,
+                                   struct lsa_LookupPrivValue *r)
 {
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       struct dcesrv_handle *h;
+       struct lsa_policy_state *state;
+       int id;
+
+       DCESRV_PULL_HANDLE(h, r->in.handle, LSA_HANDLE_POLICY);
+
+       state = h->data;
+
+       id = sec_privilege_id(r->in.name->string);
+       if (id == -1) {
+               return NT_STATUS_NO_SUCH_PRIVILEGE;
+       }
+
+       r->out.luid->low = id;
+       r->out.luid->high = 0;
+
+       return NT_STATUS_OK;    
 }
 
 
 /* 
   lsa_LookupPrivName 
 */
-static NTSTATUS lsa_LookupPrivName(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct lsa_LookupPrivName *r)
+static NTSTATUS lsa_LookupPrivName(struct dcesrv_call_state *dce_call, 
+                                  TALLOC_CTX *mem_ctx,
+                                  struct lsa_LookupPrivName *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
index f816b5dc1a0d2903114fdb19e19e1507e698fac5..84fd246538a5fcd2f1187d38d9d5219db8fa48f2 100644 (file)
@@ -283,7 +283,7 @@ static BOOL test_many_LookupSids(struct dcerpc_pipe *p,
        names.count = 0;
        names.names = NULL;
 
-       sids.num_sids = 1000;
+       sids.num_sids = 100;
 
        sids.sids = talloc_array_p(mem_ctx, struct lsa_SidPtr, sids.num_sids);
 
@@ -317,6 +317,26 @@ static BOOL test_many_LookupSids(struct dcerpc_pipe *p,
        return True;
 }
 
+static BOOL test_LookupPrivValue(struct dcerpc_pipe *p, 
+                                TALLOC_CTX *mem_ctx, 
+                                struct policy_handle *handle,
+                                struct lsa_String *name)
+{
+       NTSTATUS status;
+       struct lsa_LookupPrivValue r;
+
+       r.in.handle = handle;
+       r.in.name = name;
+
+       status = dcerpc_lsa_LookupPrivValue(p, mem_ctx, &r);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("\nLookupPrivValue failed - %s\n", nt_errstr(status));
+               return False;
+       }
+
+       return True;
+}
+
 static BOOL test_LookupPrivName(struct dcerpc_pipe *p, 
                                TALLOC_CTX *mem_ctx, 
                                struct policy_handle *handle,
@@ -805,7 +825,7 @@ static BOOL test_EnumPrivs(struct dcerpc_pipe *p,
 
        r.in.handle = handle;
        r.in.resume_handle = &resume_handle;
-       r.in.max_count = 1000;
+       r.in.max_count = 100;
        r.out.resume_handle = &resume_handle;
        r.out.privs = &privs1;
 
@@ -818,6 +838,7 @@ static BOOL test_EnumPrivs(struct dcerpc_pipe *p,
 
        for (i = 0; i< privs1.count; i++) {
                test_LookupPrivDisplayName(p, mem_ctx, handle, &privs1.privs[i].name);
+               test_LookupPrivValue(p, mem_ctx, handle, &privs1.privs[i].name);
                if (!test_EnumAccountsWithUserRight(p, mem_ctx, handle, &privs1.privs[i].name)) {
                        ret = False;
                }
@@ -842,7 +863,7 @@ static BOOL test_EnumTrustDom(struct dcerpc_pipe *p,
 
        r.in.handle = handle;
        r.in.resume_handle = &resume_handle;
-       r.in.num_entries = 1000;
+       r.in.num_entries = 100;
        r.out.domains = &domains;
        r.out.resume_handle = &resume_handle;