s4: add dcesrv_mgmt_inq_princ_name implementation
authorMatthieu Patou <mat@matws.net>
Mon, 1 Aug 2011 09:51:48 +0000 (13:51 +0400)
committerMatthieu Patou <mat@matws.net>
Fri, 3 Oct 2014 19:23:00 +0000 (12:23 -0700)
source4/rpc_server/dcesrv_mgmt.c
source4/rpc_server/wscript_build

index 8c4eb63ec306ec72dcfe60896aec01ff67516a8c..33b5519db672509f151c15d31285d4ddc86eaf79 100644 (file)
 #include "includes.h"
 #include "rpc_server/dcerpc_server.h"
 #include "librpc/gen_ndr/ndr_mgmt.h"
+#include "auth/session.h"
+#include "dsdb/common/util.h"
+#include "dsdb/samdb/samdb.h"
+#include "lib/ldb/include/ldb_errors.h"
+#include "../lib/util/util_ldb.h"
+#include "param/param.h"
 
 /* 
   mgmt_inq_if_ids 
@@ -93,7 +99,59 @@ static WERROR dcesrv_mgmt_stop_server_listening(struct dcesrv_call_state *dce_ca
 static WERROR dcesrv_mgmt_inq_princ_name(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct mgmt_inq_princ_name *r)
 {
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       if (r->in.authn_proto == 0x9) {
+               /* Look for our UPN */
+               struct ldb_context *ldb_ctx;
+               struct ldb_result *res;
+               char *account;
+               char *value;
+               int ret;
+
+               struct ldb_dn *machine_dn;
+               const char* attrs[] = {"samAccountName", NULL};
+               struct loadparm_context *lp_ctx = dce_call->conn->dce_ctx->lp_ctx;
+               char *realm = lpcfg_realm(lp_ctx);
+
+               ldb_ctx = samdb_connect(mem_ctx, dce_call->event_ctx,
+                               dce_call->conn->dce_ctx->lp_ctx,
+                               system_session(dce_call->conn->dce_ctx->lp_ctx), 0);
+
+               ret = samdb_server_reference_dn(ldb_ctx, mem_ctx, &machine_dn);
+               if (ret != LDB_SUCCESS) {
+                       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+               }
+               W_ERROR_HAVE_NO_MEMORY(machine_dn);
+
+               ret = ldb_search(ldb_ctx, mem_ctx, &res, machine_dn,
+                               LDB_SCOPE_BASE, attrs, NULL);
+
+               if (ret != LDB_SUCCESS) {
+                       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+               }
+
+               if (res->count != 1) {
+                       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+               }
+               account = ldb_msg_find_attr_as_string(res->msgs[0], "samAccountName", NULL);
+
+               if (account == NULL) {
+                       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+               }
+
+               value = talloc_asprintf(mem_ctx, "%s@%s", account, realm);
+               W_ERROR_HAVE_NO_MEMORY(value);
+
+               if (r->in.princ_name_size > strlen(value)) {
+                       r->out.princ_name = talloc_steal(r, value);
+                       return WERR_OK;
+               } else {
+                       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+               }
+
+
+       } else {
+               DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       }
 }
 
 
index 28662578eba6ed5f97c9846f376c669a740f9934..1762c0d4fd8c3fdc50820c89280daad4b0f5c113 100755 (executable)
@@ -116,7 +116,7 @@ bld.SAMBA_MODULE('dcerpc_backupkey',
        autoproto='backupkey/proto.h',
        subsystem='dcerpc_server',
        init_function='dcerpc_server_backupkey_init',
-       deps='samdb DCERPC_COMMON NDR_BACKUPKEY RPC_NDR_BACKUPKEY krb5 hx509 hcrypto'
+       deps='samdb DCERPC_COMMON NDR_BACKUPKEY krb5 hx509 hcrypto'
        )