summaryrefslogtreecommitdiff
path: root/source4/rpc_server
diff options
context:
space:
mode:
Diffstat (limited to 'source4/rpc_server')
-rw-r--r--source4/rpc_server/config.mk2
-rw-r--r--source4/rpc_server/drsuapi/dcesrv_drsuapi.c50
-rw-r--r--source4/rpc_server/drsuapi/drsuapi_cracknames.c128
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;
+}