s4-drs: DsExecuteKCC() implementation
authorErick Nascimento <erick.nogueira.nascimento@gmail.com>
Wed, 11 Nov 2009 20:25:13 +0000 (18:25 -0200)
committerAndrew Tridgell <tridge@samba.org>
Sat, 14 Nov 2009 01:11:02 +0000 (12:11 +1100)
I implemented the DsExecuteKCC() handling code on kccsrv_execute_kcc().

Signed-off-by: Andrew Tridgell <tridge@samba.org>
source4/dsdb/kcc/kcc_periodic.c
source4/dsdb/kcc/kcc_service.c
source4/rpc_server/drsuapi/dcesrv_drsuapi.c

index 30d43033cbc80402dca36b812d640906662f92b2..097fff41ecf5a083f8470db59f4b2deda8d4e024 100644 (file)
@@ -115,7 +115,7 @@ static NTSTATUS kccsrv_add_repsFrom(struct kccsrv_service *s, TALLOC_CTX *mem_ct
   We just add a repsFrom entry for all DCs we find that have nTDSDSA
   objects, except for ourselves
  */
   We just add a repsFrom entry for all DCs we find that have nTDSDSA
   objects, except for ourselves
  */
-static NTSTATUS kccsrv_simple_update(struct kccsrv_service *s, TALLOC_CTX *mem_ctx)
+NTSTATUS kccsrv_simple_update(struct kccsrv_service *s, TALLOC_CTX *mem_ctx)
 {
        struct ldb_result *res;
        int ret, i;
 {
        struct ldb_result *res;
        int ret, i;
index b088d2ed896cd94105999eec29a4ba5438a6f96d..4196eb840c9611ada10293cab1d80a51add9eda5 100644 (file)
@@ -136,6 +136,25 @@ static WERROR kccsrv_load_partitions(struct kccsrv_service *s)
        return WERR_OK;
 }
 
        return WERR_OK;
 }
 
+static NTSTATUS kccsrv_execute_kcc(struct irpc_message *msg,
+                                       struct drsuapi_DsExecuteKCC *r)
+{
+       TALLOC_CTX *mem_ctx;
+       NTSTATUS status;
+       struct kccsrv_service *service = talloc_get_type(msg->private_data, struct kccsrv_service);
+
+       mem_ctx = talloc_new(service);
+       status = kccsrv_simple_update(service, mem_ctx);
+
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("kccsrv_simple_update failed - %s\n", nt_errstr(status)));
+               talloc_free(mem_ctx);
+               return status;
+       }
+
+       talloc_free(mem_ctx);
+       return NT_STATUS_OK;
+}
 
 /*
   startup the kcc service task
 
 /*
   startup the kcc service task
@@ -208,6 +227,7 @@ static void kccsrv_task_init(struct task_server *task)
        }
 
        irpc_add_name(task->msg_ctx, "kccsrv");
        }
 
        irpc_add_name(task->msg_ctx, "kccsrv");
+       IRPC_REGISTER(task->msg_ctx, drsuapi, DRSUAPI_DSEXECUTEKCC, kccsrv_execute_kcc, service);
 }
 
 /*
 }
 
 /*
index b5b77a0bf74bafdf21169a42b14d89467d9b1113..3d928801622dda3f8282e90182f2642cd1096fca 100644 (file)
@@ -796,7 +796,16 @@ static WERROR dcesrv_drsuapi_DsGetDomainControllerInfo(struct dcesrv_call_state
 static WERROR dcesrv_drsuapi_DsExecuteKCC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                                  struct drsuapi_DsExecuteKCC *r)
 {
 static WERROR dcesrv_drsuapi_DsExecuteKCC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                                  struct drsuapi_DsExecuteKCC *r)
 {
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       WERROR status;
+       status = drs_security_level_check(dce_call, "DsExecuteKCC");
+
+       if (!W_ERROR_IS_OK(status)) {
+               return status;
+       }
+
+       dcesrv_irpc_forward_rpc_call(dce_call, mem_ctx, r, NDR_DRSUAPI_DSEXECUTEKCC,
+                                                               &ndr_table_drsuapi, "kccsrv", "DsExecuteKCC");
+       return WERR_OK;
 }
 
 
 }