diff options
author | Andrew Bartlett <abartlet@samba.org> | 2005-10-23 22:20:42 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:45:11 -0500 |
commit | db4b95827e4e6d13577513946bff4f956c849756 (patch) | |
tree | d87779f6511101d981bf958a90bdaddca92f8744 /source4/rpc_server/drsuapi/dcesrv_drsuapi.c | |
parent | 28a3bc645b49ea6e997b3576ba7a8ba55e7caa9c (diff) | |
download | samba-db4b95827e4e6d13577513946bff4f956c849756.tar.gz samba-db4b95827e4e6d13577513946bff4f956c849756.tar.bz2 samba-db4b95827e4e6d13577513946bff4f956c849756.zip |
r11270: Move the core CrackNames code from rpc_server/drsuapi to dsdb/samdb.
I'm sure this will not be the final resting place, but it will do for
now.
Use the cracknames code in auth/ for creating a server_info given a
principal name only (should avoid assumtions about spliting a
user@realm principal).
Andrew Bartlett
(This used to be commit c9d5d8e45dd7b7c99b6cf35b087bc18012f31222)
Diffstat (limited to 'source4/rpc_server/drsuapi/dcesrv_drsuapi.c')
-rw-r--r-- | source4/rpc_server/drsuapi/dcesrv_drsuapi.c | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/source4/rpc_server/drsuapi/dcesrv_drsuapi.c b/source4/rpc_server/drsuapi/dcesrv_drsuapi.c index c8578a7cc1..a762b44878 100644 --- a/source4/rpc_server/drsuapi/dcesrv_drsuapi.c +++ b/source4/rpc_server/drsuapi/dcesrv_drsuapi.c @@ -201,10 +201,57 @@ static WERROR DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TALL /* - drsuapi_DsCrackNames => drsuapip_cracknames.c + drsuapi_DsCrackNames */ -static WERROR (*drsuapi_DsCrackNames)(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, - struct drsuapi_DsCrackNames *r) = dcesrv_drsuapi_DsCrackNames; +WERROR drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct drsuapi_DsCrackNames *r) +{ + WERROR status; + struct drsuapi_bind_state *b_state; + struct dcesrv_handle *h; + + r->out.level = r->in.level; + ZERO_STRUCT(r->out.ctr); + + DCESRV_PULL_HANDLE_WERR(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE); + b_state = h->data; + + switch (r->in.level) { + case 1: { + struct drsuapi_DsNameCtr1 *ctr1; + struct drsuapi_DsNameInfo1 *names; + int count; + int i; + + ctr1 = talloc(mem_ctx, struct drsuapi_DsNameCtr1); + WERR_TALLOC_CHECK(ctr1); + + count = r->in.req.req1.count; + names = talloc_array(mem_ctx, struct drsuapi_DsNameInfo1, count); + WERR_TALLOC_CHECK(names); + + for (i=0; i < count; i++) { + status = DsCrackNameOneName(b_state->sam_ctx, mem_ctx, + r->in.req.req1.format_flags, + r->in.req.req1.format_offered, + r->in.req.req1.format_desired, + r->in.req.req1.names[i].str, + &names[i]); + if (!W_ERROR_IS_OK(status)) { + return status; + } + } + + ctr1->count = count; + ctr1->array = names; + r->out.ctr.ctr1 = ctr1; + + return WERR_OK; + } + } + + return WERR_UNKNOWN_LEVEL; +} /* drsuapi_DsWriteAccountSpn |