svn commit: samba r3784 - in branches/SAMBA_4_0/source/rpc_server/drsuapi: .

metze at samba.org metze at samba.org
Tue Nov 16 10:56:51 GMT 2004


Author: metze
Date: 2004-11-16 10:56:51 +0000 (Tue, 16 Nov 2004)
New Revision: 3784

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=3784

Log:
do a samdb lookup for the DsCrackNames server

metze

Modified:
   branches/SAMBA_4_0/source/rpc_server/drsuapi/dcesrv_drsuapi.c
   branches/SAMBA_4_0/source/rpc_server/drsuapi/dcesrv_drsuapi.h
   branches/SAMBA_4_0/source/rpc_server/drsuapi/drsuapi_cracknames.c


Changeset:
Modified: branches/SAMBA_4_0/source/rpc_server/drsuapi/dcesrv_drsuapi.c
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/drsuapi/dcesrv_drsuapi.c	2004-11-16 09:00:52 UTC (rev 3783)
+++ branches/SAMBA_4_0/source/rpc_server/drsuapi/dcesrv_drsuapi.c	2004-11-16 10:56:51 UTC (rev 3784)
@@ -50,6 +50,11 @@
 	WERR_TALLOC_CHECK(b_state);
 
 	/* TODO: fill b_state here */
+	b_state->sam_ctx = samdb_connect(b_state);
+	if (!b_state->sam_ctx) {
+		talloc_free(b_state);
+		return WERR_FOOBAR;
+	}
 
 	handle = dcesrv_handle_new(dce_call->conn, DRSUAPI_BIND_HANDLE);
 	if (!handle) {

Modified: branches/SAMBA_4_0/source/rpc_server/drsuapi/dcesrv_drsuapi.h
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/drsuapi/dcesrv_drsuapi.h	2004-11-16 09:00:52 UTC (rev 3783)
+++ branches/SAMBA_4_0/source/rpc_server/drsuapi/dcesrv_drsuapi.h	2004-11-16 10:56:51 UTC (rev 3784)
@@ -31,5 +31,5 @@
   state asscoiated with a drsuapi_DsBind*() operation
 */
 struct drsuapi_bind_state {
-	uint8_t __dummy;
+	void *sam_ctx;
 };

Modified: branches/SAMBA_4_0/source/rpc_server/drsuapi/drsuapi_cracknames.c
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/drsuapi/drsuapi_cracknames.c	2004-11-16 09:00:52 UTC (rev 3783)
+++ branches/SAMBA_4_0/source/rpc_server/drsuapi/drsuapi_cracknames.c	2004-11-16 10:56:51 UTC (rev 3784)
@@ -26,12 +26,21 @@
 #include "rpc_server/dcerpc_server.h"
 #include "rpc_server/common/common.h"
 #include "rpc_server/drsuapi/dcesrv_drsuapi.h"
+#include "lib/ldb/include/ldb.h"
 
-
 static WERROR DsCrackNameOneName(struct drsuapi_bind_state *b_state, TALLOC_CTX *mem_ctx,
 			uint32 format_offered, uint32 format_desired, const char *name,
 			struct drsuapi_DsNameInfo1 *info1)
 {
+	int ret;
+	const char *domain_filter;
+	const char * const *domain_attrs;
+	struct ldb_message **domain_res;
+	const char *result_basedn;
+	const char *result_filter = NULL;
+	const char * const *result_attrs;
+	struct ldb_message **result_res;
+
 	info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
 	info1->dns_domain_name = NULL;
 	info1->result_name = NULL;
@@ -39,7 +48,6 @@
 	/* 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());
@@ -52,20 +60,43 @@
 				return WERR_OK;
 			}
 
-			info1->status = DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY;
-			info1->dns_domain_name = talloc_asprintf(mem_ctx, "%s", lp_realm());
-			WERR_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());
-					WERR_TALLOC_CHECK(info1->result_name);
-					return WERR_OK;
-				default:
-					return WERR_OK;
+			domain_filter = talloc_asprintf(mem_ctx, "(&(objectClass=domainDNS)(name=%s))",
+								lp_workgroup());
+			WERR_TALLOC_CHECK(domain_filter);
+
+			break;
+		}
+		case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT: {
+			char *p;
+			char *domain;
+			const char *account = NULL;
+
+			domain = talloc_strdup(mem_ctx, name);
+			WERR_TALLOC_CHECK(domain);
+
+			p = strchr(domain, '\\');
+			if (!p) {
+				/* invalid input format */
+				info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
+				return WERR_OK;
 			}
-			return WERR_INVALID_PARAM;
+			p[0] = '\0';
+
+			if (p[1]) {
+				account = &p[1];
+			}
+
+			domain_filter = talloc_asprintf(mem_ctx, "(&(objectClass=domainDNS)(name=%s))",
+								domain);
+			WERR_TALLOC_CHECK(domain_filter);
+			if (account) {
+				result_filter = talloc_asprintf(mem_ctx, "(sAMAccountName=%s)",
+								account);
+				WERR_TALLOC_CHECK(result_filter);
+			}
+
+			talloc_free(domain);
+			break;
 		}
 		default: {
 			info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;
@@ -73,6 +104,108 @@
 		}
 	}
 
+	switch (format_desired) {
+		case DRSUAPI_DS_NAME_FORMAT_FQDN_1779: {
+			const char * const _domain_attrs[] = { "dn", "dnsDomain", NULL};
+			const char * const _result_attrs[] = { "dn", NULL};
+			
+			domain_attrs = _domain_attrs;
+			result_attrs = _result_attrs;
+			break;
+		}
+		case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT: {
+			const char * const _domain_attrs[] = { "name", "dnsDomain", "dn", NULL};
+			const char * const _result_attrs[] = { "sAMAccountName", NULL};
+			
+			domain_attrs = _domain_attrs;
+			result_attrs = _result_attrs;
+			break;
+		}
+		case DRSUAPI_DS_NAME_FORMAT_GUID: {
+			const char * const _domain_attrs[] = { "objectGUID", "dnsDomain", "dn", NULL};
+			const char * const _result_attrs[] = { "objectGUID", NULL};
+			
+			domain_attrs = _domain_attrs;
+			result_attrs = _result_attrs;
+			break;
+		}
+		default:
+			return WERR_OK;
+	}
+
+	ret = samdb_search(b_state->sam_ctx, mem_ctx, NULL, &domain_res, domain_attrs,
+				"%s", domain_filter);
+	switch (ret) {
+		case 1: 
+			break;
+		case 0: 
+			info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;
+			return WERR_OK;
+		case -1: 
+			info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
+			return WERR_OK;
+		default:
+			info1->status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE;
+			return WERR_OK;
+	}
+
+	info1->dns_domain_name	= samdb_result_string(domain_res[0], "dnsDomain", NULL);
+	WERR_TALLOC_CHECK(info1->dns_domain_name);
+	info1->status		= DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY;
+
+	if (result_filter) {
+		result_basedn = samdb_result_string(domain_res[0], "dn", NULL);
+		
+		ret = samdb_search(b_state->sam_ctx, mem_ctx, result_basedn, &result_res,
+					result_attrs, "%s", result_filter);
+		switch (ret) {
+			case 1:
+				break;
+			case 0:
+				return WERR_OK;
+			case -1:
+				info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
+				return WERR_OK;
+			default:
+				info1->status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE;
+				return WERR_OK;
+		}
+	} else {
+		result_res = domain_res;
+	}
+
+	switch (format_desired) {
+		case DRSUAPI_DS_NAME_FORMAT_FQDN_1779: {
+			info1->result_name	= samdb_result_string(result_res[0], "dn", NULL);
+			WERR_TALLOC_CHECK(info1->result_name);
+			info1->status		= DRSUAPI_DS_NAME_STATUS_OK;
+			return WERR_OK;
+		}
+		case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT: {
+			const char *_dom = samdb_result_string(domain_res[0], "name", NULL);
+			const char *_acc = "";
+			WERR_TALLOC_CHECK(_dom);
+			if (result_filter) {
+				_acc = samdb_result_string(result_res[0], "sAMAccountName", NULL);
+				WERR_TALLOC_CHECK(_acc);
+			}
+			info1->result_name	= talloc_asprintf(mem_ctx, "%s\\%s", _dom, _acc);
+			WERR_TALLOC_CHECK(info1->result_name);
+			info1->status		= DRSUAPI_DS_NAME_STATUS_OK;
+			return WERR_OK;
+		}
+		case DRSUAPI_DS_NAME_FORMAT_GUID: {
+			const char *result = samdb_result_string(result_res[0], "objectGUID", NULL);
+			WERR_TALLOC_CHECK(result);
+			info1->result_name	= talloc_asprintf(mem_ctx, "{%s}", result);
+			WERR_TALLOC_CHECK(info1->result_name);
+			info1->status		= DRSUAPI_DS_NAME_STATUS_OK;
+			return WERR_OK;
+		}
+		default:
+			return WERR_OK;
+	}
+
 	return WERR_INVALID_PARAM;
 }
 



More information about the samba-cvs mailing list