diff options
Diffstat (limited to 'source4/torture/rpc')
-rw-r--r-- | source4/torture/rpc/lsa.c | 77 |
1 files changed, 71 insertions, 6 deletions
diff --git a/source4/torture/rpc/lsa.c b/source4/torture/rpc/lsa.c index a4062d1181..a542cad636 100644 --- a/source4/torture/rpc/lsa.c +++ b/source4/torture/rpc/lsa.c @@ -21,6 +21,39 @@ #include "includes.h" +/* + this really shouldn't be here .... +*/ +static char *lsa_sid_string_talloc(TALLOC_CTX *mem_ctx, struct dom_sid *sid) +{ + int i, ofs, maxlen; + uint32 ia; + char *ret; + + if (!sid) { + return talloc_asprintf(mem_ctx, "(NULL SID)"); + } + + maxlen = sid->num_auths * 11 + 25; + ret = talloc(mem_ctx, maxlen); + if (!ret) return NULL; + + ia = (sid->id_auth[5]) + + (sid->id_auth[4] << 8 ) + + (sid->id_auth[3] << 16) + + (sid->id_auth[2] << 24); + + ofs = snprintf(ret, maxlen, "S-%u-%lu", + (unsigned int)sid->sid_rev_num, (unsigned long)ia); + + for (i = 0; i < sid->num_auths; i++) { + ofs += snprintf(ret + ofs, maxlen - ofs, "-%lu", (unsigned long)sid->sub_auths[i]); + } + + return ret; +} + + static BOOL test_OpenPolicy(struct dcerpc_pipe *p) { struct lsa_ObjectAttribute attr; @@ -28,7 +61,7 @@ static BOOL test_OpenPolicy(struct dcerpc_pipe *p) struct lsa_QosInfo qos; NTSTATUS status; - printf("testing OpenPolicy\n"); + printf("\ntesting OpenPolicy\n"); qos.impersonation_level = 2; qos.context_mode = 1; @@ -54,14 +87,13 @@ static BOOL test_OpenPolicy(struct dcerpc_pipe *p) } -static BOOL test_OpenPolicy2(struct dcerpc_pipe *p) +static BOOL test_OpenPolicy2(struct dcerpc_pipe *p, struct policy_handle *handle) { struct lsa_ObjectAttribute attr; - struct policy_handle handle; struct lsa_QosInfo qos; NTSTATUS status; - printf("testing OpenPolicy2\n"); + printf("\ntesting OpenPolicy2\n"); qos.impersonation_level = 2; qos.context_mode = 1; @@ -77,7 +109,7 @@ static BOOL test_OpenPolicy2(struct dcerpc_pipe *p) "\\", &attr, SEC_RIGHTS_MAXIMUM_ALLOWED, - &handle); + handle); if (!NT_STATUS_IS_OK(status)) { printf("OpenPolicy2 failed - %s\n", nt_errstr(status)); return False; @@ -86,12 +118,41 @@ static BOOL test_OpenPolicy2(struct dcerpc_pipe *p) return True; } + +static BOOL test_EnumSids(struct dcerpc_pipe *p, + TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + NTSTATUS status; + struct dom_sid **sids; + uint32 num_entries = 100; + int i; + + printf("\ntesting EnumSids\n"); + + status = dcerpc_lsa_EnumSids(p, mem_ctx, handle, 0, &num_entries, &sids); + if (!NT_STATUS_IS_OK(status)) { + printf("EnumSids failed - %s\n", nt_errstr(status)); + return False; + } + + printf("Got %d sids\n", num_entries); + + for (i=0;i<num_entries;i++) { + printf("%s\n", lsa_sid_string_talloc(mem_ctx, sids[i])); + } + + + return True; +} + BOOL torture_rpc_lsa(int dummy) { NTSTATUS status; struct dcerpc_pipe *p; TALLOC_CTX *mem_ctx; BOOL ret = True; + struct policy_handle handle; mem_ctx = talloc_init("torture_rpc_lsa"); @@ -104,10 +165,14 @@ BOOL torture_rpc_lsa(int dummy) ret = False; } - if (!test_OpenPolicy2(p)) { + if (!test_OpenPolicy2(p, &handle)) { ret = False; } + if (!test_EnumSids(p, mem_ctx, &handle)) { + ret = False; + } + torture_rpc_close(p); return ret; |