r12608: Remove some unused #include lines.
[abartlet/samba.git/.git] / source4 / rpc_server / drsuapi / dcesrv_drsuapi.c
index 617bc027424e962ddaee73ee37b1d2b20e5cdf29..6bfcfb20170d0f0d233744266a440da5cf3ab3a5 100644 (file)
 #include "rpc_server/dcerpc_server.h"
 #include "rpc_server/common/common.h"
 #include "rpc_server/drsuapi/dcesrv_drsuapi.h"
-
-/*
-  destroy a general handle. 
-*/
-static void drsuapi_handle_destroy(struct dcesrv_connection *conn, struct dcesrv_handle *h)
-{
-       talloc_free(h->data);
-}
+#include "dsdb/samdb/samdb.h"
 
 /* 
   drsuapi_DsBind 
@@ -42,28 +35,41 @@ static WERROR drsuapi_DsBind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem
 {
        struct drsuapi_bind_state *b_state;
        struct dcesrv_handle *handle;
+       struct drsuapi_DsBindInfoCtr *bind_info;
+       struct GUID site_guid;
 
        r->out.bind_info = NULL;
        ZERO_STRUCTP(r->out.bind_handle);
 
-       b_state = talloc_p(dce_call->conn, struct drsuapi_bind_state);
+       b_state = talloc(dce_call->conn, struct drsuapi_bind_state);
        WERR_TALLOC_CHECK(b_state);
 
-       b_state->sam_ctx = samdb_connect(b_state);
+       b_state->sam_ctx = samdb_connect(b_state, dce_call->conn->auth_state.session_info); 
        if (!b_state->sam_ctx) {
                talloc_free(b_state);
                return WERR_FOOBAR;
        }
 
-       handle = dcesrv_handle_new(dce_call->conn, DRSUAPI_BIND_HANDLE);
+       handle = dcesrv_handle_new(dce_call->context, DRSUAPI_BIND_HANDLE);
        if (!handle) {
                talloc_free(b_state);
                return WERR_NOMEM;
        }
 
-       handle->data = b_state;
-       handle->destroy = drsuapi_handle_destroy;
+       handle->data = talloc_steal(handle, b_state);
+
+       bind_info = talloc(mem_ctx, struct drsuapi_DsBindInfoCtr);
+       WERR_TALLOC_CHECK(bind_info);
 
+       ZERO_STRUCT(site_guid);
+
+       bind_info->length                               = 28;
+       bind_info->info.info28.supported_extensions     = 0;
+       bind_info->info.info28.site_guid                = site_guid;
+       bind_info->info.info28.u1                       = 0;
+       bind_info->info.info28.repl_epoch               = 0;
+
+       r->out.bind_info = bind_info;
        *r->out.bind_handle = handle->wire_handle;
 
        return WERR_OK;
@@ -74,7 +80,7 @@ static WERROR drsuapi_DsBind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem
   drsuapi_DsUnbind 
 */
 static WERROR drsuapi_DsUnbind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct drsuapi_DsUnbind *r)
+                              struct drsuapi_DsUnbind *r)
 {
        struct dcesrv_handle *h;
 
@@ -82,10 +88,7 @@ static WERROR drsuapi_DsUnbind(struct dcesrv_call_state *dce_call, TALLOC_CTX *m
 
        DCESRV_PULL_HANDLE_WERR(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE);
 
-       /* this causes the callback drsuapi_handle_destroy() to be called by
-          the handle destroy code which destroys the state associated
-          with the handle */
-       dcesrv_handle_destroy(dce_call->conn, h);
+       talloc_free(h);
 
        ZERO_STRUCTP(r->out.bind_handle);
 
@@ -94,30 +97,34 @@ static WERROR drsuapi_DsUnbind(struct dcesrv_call_state *dce_call, TALLOC_CTX *m
 
 
 /* 
-  DRSUAPI_REPLICA_SYNC 
+  drsuapi_DsReplicaSync 
 */
-static WERROR DRSUAPI_REPLICA_SYNC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct DRSUAPI_REPLICA_SYNC *r)
+static WERROR drsuapi_DsReplicaSync(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct drsuapi_DsReplicaSync *r)
 {
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       /* TODO: implement this call correct!
+        *       for now we just say yes,
+        *       because we have no output parameter
+        */
+       return WERR_OK;
 }
 
 
 /* 
-  DRSUAPI_GET_NC_CHANGES 
+  drsuapi_DsGetNCChanges
 */
-static WERROR DRSUAPI_GET_NC_CHANGES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct DRSUAPI_GET_NC_CHANGES *r)
+static WERROR drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct drsuapi_DsGetNCChanges *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
-  DRSUAPI_UPDATE_REFS 
+  drsuapi_DsReplicaUpdateRefs
 */
-static WERROR DRSUAPI_UPDATE_REFS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct DRSUAPI_UPDATE_REFS *r)
+static WERROR drsuapi_DsReplicaUpdateRefs(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct drsuapi_DsReplicaUpdateRefs *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
@@ -194,16 +201,63 @@ static WERROR DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TALL
 
 
 /* 
-  drsuapi_DsCrackNames => drsuapip_cracknames.c
+  drsuapi_DsCrackNames 
 */
-static WERROR (*drsuapi_DsCrackNames)(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct drsuapi_DsCrackNames *r) = dcesrv_drsuapi_DsCrackNames;
+WERROR drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                           struct drsuapi_DsCrackNames *r)
+{
+       WERROR 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_WERR(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE);
+       b_state = h->data;
+
+       switch (r->in.level) {
+               case 1: {
+                       struct drsuapi_DsNameCtr1 *ctr1;
+                       struct drsuapi_DsNameInfo1 *names;
+                       int count;
+                       int i;
+
+                       ctr1 = talloc(mem_ctx, struct drsuapi_DsNameCtr1);
+                       WERR_TALLOC_CHECK(ctr1);
+
+                       count = r->in.req.req1.count;
+                       names = talloc_array(mem_ctx, struct drsuapi_DsNameInfo1, count);
+                       WERR_TALLOC_CHECK(names);
+
+                       for (i=0; i < count; i++) {
+                               status = DsCrackNameOneName(b_state->sam_ctx, mem_ctx,
+                                                           r->in.req.req1.format_flags,
+                                                           r->in.req.req1.format_offered,
+                                                           r->in.req.req1.format_desired,
+                                                           r->in.req.req1.names[i].str,
+                                                           &names[i]);
+                               if (!W_ERROR_IS_OK(status)) {
+                                       return status;
+                               }
+                       }
+
+                       ctr1->count = count;
+                       ctr1->array = names;
+                       r->out.ctr.ctr1 = ctr1;
+
+                       return WERR_OK;
+               }
+       }
+       
+       return WERR_UNKNOWN_LEVEL;
+}
 
 /* 
-  DRSUAPI_WRITE_SPN 
+  drsuapi_DsWriteAccountSpn 
 */
-static WERROR DRSUAPI_WRITE_SPN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct DRSUAPI_WRITE_SPN *r)
+static WERROR drsuapi_DsWriteAccountSpn(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct drsuapi_DsWriteAccountSpn *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
@@ -233,17 +287,17 @@ static WERROR DRSUAPI_REMOVE_DS_DOMAIN(struct dcesrv_call_state *dce_call, TALLO
   drsuapi_DsGetDomainControllerInfo 
 */
 static WERROR drsuapi_DsGetDomainControllerInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct drsuapi_DsGetDomainControllerInfo *r)
+                                               struct drsuapi_DsGetDomainControllerInfo *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
-  DRSUAPI_ADD_ENTRY 
+  drsuapi_DsAddEntry
 */
-static WERROR DRSUAPI_ADD_ENTRY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct DRSUAPI_ADD_ENTRY *r)
+static WERROR drsuapi_DsAddEntry(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct drsuapi_DsAddEntry *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
@@ -260,10 +314,10 @@ static WERROR DRSUAPI_EXECUTE_KCC(struct dcesrv_call_state *dce_call, TALLOC_CTX
 
 
 /* 
-  DRSUAPI_GET_REPL_INFO 
+  drsuapi_DsReplicaGetInfo 
 */
-static WERROR DRSUAPI_GET_REPL_INFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct DRSUAPI_GET_REPL_INFO *r)
+static WERROR drsuapi_DsReplicaGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct drsuapi_DsReplicaGetInfo *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }