diff options
Diffstat (limited to 'source4/rpc_server')
-rw-r--r-- | source4/rpc_server/config.mk | 2 | ||||
-rw-r--r-- | source4/rpc_server/drsuapi/dcesrv_drsuapi.c | 50 | ||||
-rw-r--r-- | source4/rpc_server/drsuapi/drsuapi_cracknames.c | 128 |
3 files changed, 133 insertions, 47 deletions
diff --git a/source4/rpc_server/config.mk b/source4/rpc_server/config.mk index 350803afd9..9c0751a1b9 100644 --- a/source4/rpc_server/config.mk +++ b/source4/rpc_server/config.mk @@ -153,6 +153,8 @@ REQUIRED_SUBSYSTEMS = \ [MODULE::dcerpc_drsuapi] INIT_OBJ_FILES = \ rpc_server/drsuapi/dcesrv_drsuapi.o +ADD_OBJ_FILES = \ + rpc_server/drsuapi/drsuapi_cracknames.o REQUIRED_SUBSYSTEMS = \ SAMDB \ DCERPC_COMMON diff --git a/source4/rpc_server/drsuapi/dcesrv_drsuapi.c b/source4/rpc_server/drsuapi/dcesrv_drsuapi.c index 06fa1bba95..503a54b6b3 100644 --- a/source4/rpc_server/drsuapi/dcesrv_drsuapi.c +++ b/source4/rpc_server/drsuapi/dcesrv_drsuapi.c @@ -190,54 +190,10 @@ static NTSTATUS DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TA /* - drsuapi_DsCrackNames + drsuapi_DsCrackNames => drsuapip_cracknames.c */ -static NTSTATUS drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, - struct drsuapi_DsCrackNames *r) -{ - struct dcesrv_handle *h; - - r->out.level = r->in.level; - ZERO_STRUCT(r->out.out); - - DCESRV_PULL_HANDLE(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE); - - switch (r->in.level) { - case 1: { - int i; - - r->out.out.info1 = talloc_p(mem_ctx, struct drsuapi_DsCrackNamesOutInfo1); - NTSTATUS_TALLOC_CHECK(r->out.out.info1); - - r->out.out.info1->names = talloc_array_p(mem_ctx, - struct drsuapi_DsCrackNamesOutInfo1Names, - r->in.in.info1.count); - NTSTATUS_TALLOC_CHECK(r->out.out.info1->names); - - r->out.out.info1->count = r->in.in.info1.count; - - for (i=0; i < r->out.out.info1->count; i++) { - const char *name; - r->out.out.info1->names[i].unknown1 = 2; - r->out.out.info1->names[i].name1 = NULL; - r->out.out.info1->names[i].name2 = NULL; - - /* TODO: fill crack the right names! */ - name = talloc_asprintf(mem_ctx, "%s/", lp_realm()); - if (strcmp(name, r->in.in.info1.names[i].str) != 0) { - continue; - } - r->out.out.info1->names[i].unknown1 = 0; - r->out.out.info1->names[i].name1 = talloc_asprintf(mem_ctx, "%s", lp_realm()); - r->out.out.info1->names[i].name2 = talloc_asprintf(mem_ctx, "%s\\", lp_workgroup()); - } - return NT_STATUS_OK; - } - } - - return NT_STATUS_INVALID_LEVEL; -} - +static NTSTATUS (*drsuapi_DsCrackNames)(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct drsuapi_DsCrackNames *r) = dcesrv_drsuapi_DsCrackNames; /* DRSUAPI_WRITE_SPN diff --git a/source4/rpc_server/drsuapi/drsuapi_cracknames.c b/source4/rpc_server/drsuapi/drsuapi_cracknames.c new file mode 100644 index 0000000000..1a31d541ba --- /dev/null +++ b/source4/rpc_server/drsuapi/drsuapi_cracknames.c @@ -0,0 +1,128 @@ +/* + Unix SMB/CIFS implementation. + + endpoint server for the drsuapi pipe + DsCrackNames() + + Copyright (C) Stefan Metzmacher 2004 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" +#include "rpc_server/common/common.h" +#include "rpc_server/drsuapi/dcesrv_drsuapi.h" + + +static NTSTATUS DsCrackNameOneName(struct drsuapi_bind_state *b_state, TALLOC_CTX *mem_ctx, + uint32 format_offered, uint32 format_desired, const char *name, + struct drsuapi_DsNameInfo1 *info1) +{ + info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR; + info1->dns_domain_name = NULL; + info1->result_name = NULL; + + /* TODO: fill crack the correct names in all cases! */ + switch (format_offered) { + case DRSUAPI_DS_NAME_FORMAT_CANONICAL: { + int ret; + char *str; + + str = talloc_asprintf(mem_ctx, "%s/", lp_realm()); + NTSTATUS_TALLOC_CHECK(str); + + ret = strcasecmp(str, name); + talloc_free(str); + if (ret != 0) { + info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND; + return NT_STATUS_OK; + } + + info1->status = DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY; + info1->dns_domain_name = talloc_asprintf(mem_ctx, "%s", lp_realm()); + NTSTATUS_TALLOC_CHECK(info1->dns_domain_name); + switch (format_desired) { + case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT: + info1->status = DRSUAPI_DS_NAME_STATUS_OK; + info1->result_name = talloc_asprintf(mem_ctx, "%s\\", + lp_workgroup()); + NTSTATUS_TALLOC_CHECK(info1->result_name); + return NT_STATUS_OK; + default: + return NT_STATUS_OK; + } + return NT_STATUS_INVALID_PARAMETER; + } + default: { + info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND; + return NT_STATUS_OK; + } + } + + return NT_STATUS_INVALID_PARAMETER; +} + +/* + drsuapi_DsCrackNames +*/ +NTSTATUS dcesrv_drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, + struct drsuapi_DsCrackNames *r) +{ + NTSTATUS 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(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE); + b_state = h->data; + + switch (r->in.level) { + case 1: { + struct drsuapi_DsNameInfo1 *names; + int count; + int i; + + r->out.ctr.ctr1 = talloc_p(mem_ctx, struct drsuapi_DsNameCtr1); + NTSTATUS_TALLOC_CHECK(r->out.ctr.ctr1); + + r->out.ctr.ctr1->count = 0; + r->out.ctr.ctr1->array = NULL; + + count = r->in.req.req1.count; + names = talloc_array_p(mem_ctx, struct drsuapi_DsNameInfo1, count); + NTSTATUS_TALLOC_CHECK(names); + + for (i=0; i < count; i++) { + status = DsCrackNameOneName(b_state, mem_ctx, + r->in.req.req1.format_offered, + r->in.req.req1.format_desired, + r->in.req.req1.names[i].str, + &names[i]); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + } + + r->out.ctr.ctr1->count = count; + r->out.ctr.ctr1->array = names; + + return NT_STATUS_OK; + } + } + + return NT_STATUS_INVALID_LEVEL; +} |