mirror of
https://github.com/samba-team/samba.git
synced 2024-12-28 07:21:54 +03:00
b5fde9d2df
- we currently only do it for our REALM
metze
(This used to be commit e2df8c4285
)
364 lines
8.5 KiB
C
364 lines
8.5 KiB
C
/*
|
|
Unix SMB/CIFS implementation.
|
|
|
|
endpoint server for the drsuapi pipe
|
|
|
|
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"
|
|
|
|
/*
|
|
destroy a general handle.
|
|
*/
|
|
static void drsuapi_handle_destroy(struct dcesrv_connection *conn, struct dcesrv_handle *h)
|
|
{
|
|
talloc_free(h->data);
|
|
}
|
|
|
|
/*
|
|
drsuapi_DsBind
|
|
*/
|
|
static NTSTATUS drsuapi_DsBind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct drsuapi_DsBind *r)
|
|
{
|
|
struct drsuapi_bind_state *b_state;
|
|
struct dcesrv_handle *handle;
|
|
|
|
r->out.info = NULL;
|
|
ZERO_STRUCTP(r->out.bind_handle);
|
|
|
|
b_state = talloc_p(dce_call->conn, struct drsuapi_bind_state);
|
|
if (!b_state) {
|
|
return NT_STATUS_NO_MEMORY;
|
|
}
|
|
|
|
/* TODO: fill b_state here */
|
|
|
|
handle = dcesrv_handle_new(dce_call->conn, DRSUAPI_BIND_HANDLE);
|
|
if (!handle) {
|
|
talloc_free(b_state);
|
|
return NT_STATUS_NO_MEMORY;
|
|
}
|
|
|
|
handle->data = b_state;
|
|
handle->destroy = drsuapi_handle_destroy;
|
|
|
|
*r->out.bind_handle = handle->wire_handle;
|
|
|
|
return NT_STATUS_OK;
|
|
}
|
|
|
|
|
|
/*
|
|
drsuapi_DsUnbind
|
|
*/
|
|
static NTSTATUS drsuapi_DsUnbind(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct drsuapi_DsUnbind *r)
|
|
{
|
|
struct dcesrv_handle *h;
|
|
|
|
*r->out.bind_handle = *r->in.bind_handle;
|
|
|
|
DCESRV_PULL_HANDLE(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);
|
|
|
|
ZERO_STRUCTP(r->out.bind_handle);
|
|
|
|
return NT_STATUS_OK;
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_REPLICA_SYNC
|
|
*/
|
|
static NTSTATUS DRSUAPI_REPLICA_SYNC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_REPLICA_SYNC *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_GET_NC_CHANGES
|
|
*/
|
|
static NTSTATUS DRSUAPI_GET_NC_CHANGES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_GET_NC_CHANGES *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_UPDATE_REFS
|
|
*/
|
|
static NTSTATUS DRSUAPI_UPDATE_REFS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_UPDATE_REFS *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_REPLICA_ADD
|
|
*/
|
|
static NTSTATUS DRSUAPI_REPLICA_ADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_REPLICA_ADD *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_REPLICA_DEL
|
|
*/
|
|
static NTSTATUS DRSUAPI_REPLICA_DEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_REPLICA_DEL *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_REPLICA_MODIFY
|
|
*/
|
|
static NTSTATUS DRSUAPI_REPLICA_MODIFY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_REPLICA_MODIFY *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_VERIFY_NAMES
|
|
*/
|
|
static NTSTATUS DRSUAPI_VERIFY_NAMES(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_VERIFY_NAMES *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_GET_MEMBERSHIPS
|
|
*/
|
|
static NTSTATUS DRSUAPI_GET_MEMBERSHIPS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_GET_MEMBERSHIPS *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_INTER_DOMAIN_MOVE
|
|
*/
|
|
static NTSTATUS DRSUAPI_INTER_DOMAIN_MOVE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_INTER_DOMAIN_MOVE *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_GET_NT4_CHANGELOG
|
|
*/
|
|
static NTSTATUS DRSUAPI_GET_NT4_CHANGELOG(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_GET_NT4_CHANGELOG *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
drsuapi_DsCrackNames
|
|
*/
|
|
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;
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_WRITE_SPN
|
|
*/
|
|
static NTSTATUS DRSUAPI_WRITE_SPN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_WRITE_SPN *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_REMOVE_DS_SERVER
|
|
*/
|
|
static NTSTATUS DRSUAPI_REMOVE_DS_SERVER(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_REMOVE_DS_SERVER *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_REMOVE_DS_DOMAIN
|
|
*/
|
|
static NTSTATUS DRSUAPI_REMOVE_DS_DOMAIN(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_REMOVE_DS_DOMAIN *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_DOMAIN_CONTROLLER_INFO
|
|
*/
|
|
static NTSTATUS DRSUAPI_DOMAIN_CONTROLLER_INFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_DOMAIN_CONTROLLER_INFO *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_ADD_ENTRY
|
|
*/
|
|
static NTSTATUS DRSUAPI_ADD_ENTRY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_ADD_ENTRY *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_EXECUTE_KCC
|
|
*/
|
|
static NTSTATUS DRSUAPI_EXECUTE_KCC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_EXECUTE_KCC *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_GET_REPL_INFO
|
|
*/
|
|
static NTSTATUS DRSUAPI_GET_REPL_INFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_GET_REPL_INFO *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_ADD_SID_HISTORY
|
|
*/
|
|
static NTSTATUS DRSUAPI_ADD_SID_HISTORY(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_ADD_SID_HISTORY *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_GET_MEMBERSHIPS2
|
|
*/
|
|
static NTSTATUS DRSUAPI_GET_MEMBERSHIPS2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_GET_MEMBERSHIPS2 *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_REPLICA_VERIFY_OBJECTS
|
|
*/
|
|
static NTSTATUS DRSUAPI_REPLICA_VERIFY_OBJECTS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_REPLICA_VERIFY_OBJECTS *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_GET_OBJECT_EXISTENCE
|
|
*/
|
|
static NTSTATUS DRSUAPI_GET_OBJECT_EXISTENCE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_GET_OBJECT_EXISTENCE *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
DRSUAPI_QUERY_SITES_BY_COST
|
|
*/
|
|
static NTSTATUS DRSUAPI_QUERY_SITES_BY_COST(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct DRSUAPI_QUERY_SITES_BY_COST *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/* include the generated boilerplate */
|
|
#include "librpc/gen_ndr/ndr_drsuapi_s.c"
|