2004-10-10 05:35:33 +04:00
/*
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 0213 9 , USA .
*/
# include "includes.h"
2004-11-01 13:30:34 +03:00
# include "librpc/gen_ndr/ndr_drsuapi.h"
2004-11-02 10:42:47 +03:00
# include "rpc_server/dcerpc_server.h"
2004-10-10 05:35:33 +04:00
# include "rpc_server/common/common.h"
# include "rpc_server/drsuapi/dcesrv_drsuapi.h"
2005-12-28 18:38:36 +03:00
# include "dsdb/samdb/samdb.h"
2004-10-10 05:35:33 +04:00
/*
drsuapi_DsBind
*/
2004-10-15 15:08:14 +04:00
static WERROR drsuapi_DsBind ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct drsuapi_DsBind * r )
{
struct drsuapi_bind_state * b_state ;
struct dcesrv_handle * handle ;
2004-12-14 10:18:58 +03:00
struct drsuapi_DsBindInfoCtr * bind_info ;
struct GUID site_guid ;
2004-10-10 05:35:33 +04:00
2004-10-14 15:11:21 +04:00
r - > out . bind_info = NULL ;
2004-10-10 05:35:33 +04:00
ZERO_STRUCTP ( r - > out . bind_handle ) ;
2005-01-27 10:08:20 +03:00
b_state = talloc ( dce_call - > conn , struct drsuapi_bind_state ) ;
2006-04-29 15:48:56 +04:00
W_ERROR_HAVE_NO_MEMORY ( b_state ) ;
2004-10-10 05:35:33 +04:00
2005-10-07 15:31:45 +04:00
b_state - > sam_ctx = samdb_connect ( b_state , dce_call - > conn - > auth_state . session_info ) ;
2004-11-16 13:56:51 +03:00
if ( ! b_state - > sam_ctx ) {
talloc_free ( b_state ) ;
return WERR_FOOBAR ;
}
2004-10-10 05:35:33 +04:00
2005-01-10 15:15:26 +03:00
handle = dcesrv_handle_new ( dce_call - > context , DRSUAPI_BIND_HANDLE ) ;
2004-10-10 05:35:33 +04:00
if ( ! handle ) {
talloc_free ( b_state ) ;
2004-10-15 15:08:14 +04:00
return WERR_NOMEM ;
2004-10-10 05:35:33 +04:00
}
2005-01-10 15:15:26 +03:00
handle - > data = talloc_steal ( handle , b_state ) ;
2004-10-10 05:35:33 +04:00
2005-01-27 10:08:20 +03:00
bind_info = talloc ( mem_ctx , struct drsuapi_DsBindInfoCtr ) ;
2006-04-29 15:48:56 +04:00
W_ERROR_HAVE_NO_MEMORY ( bind_info ) ;
2004-12-14 10:18:58 +03:00
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 ;
2004-11-29 14:13:56 +03:00
r - > out . bind_info = bind_info ;
2004-10-10 05:35:33 +04:00
* r - > out . bind_handle = handle - > wire_handle ;
2004-10-15 15:08:14 +04:00
return WERR_OK ;
2004-10-10 05:35:33 +04:00
}
/*
drsuapi_DsUnbind
*/
2004-10-15 15:08:14 +04:00
static WERROR drsuapi_DsUnbind ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2005-01-10 15:15:26 +03:00
struct drsuapi_DsUnbind * r )
2004-10-10 05:35:33 +04:00
{
struct dcesrv_handle * h ;
* r - > out . bind_handle = * r - > in . bind_handle ;
2004-10-15 15:08:14 +04:00
DCESRV_PULL_HANDLE_WERR ( h , r - > in . bind_handle , DRSUAPI_BIND_HANDLE ) ;
2004-10-10 05:35:33 +04:00
2005-01-10 15:15:26 +03:00
talloc_free ( h ) ;
2004-10-10 05:35:33 +04:00
ZERO_STRUCTP ( r - > out . bind_handle ) ;
2004-10-15 15:08:14 +04:00
return WERR_OK ;
2004-10-10 05:35:33 +04:00
}
/*
2004-11-29 14:13:56 +03:00
drsuapi_DsReplicaSync
2004-10-10 05:35:33 +04:00
*/
2004-11-29 14:13:56 +03:00
static WERROR drsuapi_DsReplicaSync ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
struct drsuapi_DsReplicaSync * r )
2004-10-10 05:35:33 +04:00
{
2004-12-14 10:18:58 +03:00
/* TODO: implement this call correct!
* for now we just say yes ,
* because we have no output parameter
2004-11-29 14:13:56 +03:00
*/
return WERR_OK ;
2004-10-10 05:35:33 +04:00
}
/*
2005-03-11 15:15:50 +03:00
drsuapi_DsGetNCChanges
2004-10-10 05:35:33 +04:00
*/
2005-03-11 15:15:50 +03:00
static WERROR drsuapi_DsGetNCChanges ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
struct drsuapi_DsGetNCChanges * r )
2004-10-10 05:35:33 +04:00
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
2005-03-11 15:15:50 +03:00
drsuapi_DsReplicaUpdateRefs
2004-10-10 05:35:33 +04:00
*/
2005-03-11 15:15:50 +03:00
static WERROR drsuapi_DsReplicaUpdateRefs ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
struct drsuapi_DsReplicaUpdateRefs * r )
2004-10-10 05:35:33 +04:00
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_REPLICA_ADD
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_REPLICA_ADD ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct DRSUAPI_REPLICA_ADD * r )
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_REPLICA_DEL
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_REPLICA_DEL ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct DRSUAPI_REPLICA_DEL * r )
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_REPLICA_MODIFY
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_REPLICA_MODIFY ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct DRSUAPI_REPLICA_MODIFY * r )
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_VERIFY_NAMES
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_VERIFY_NAMES ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct DRSUAPI_VERIFY_NAMES * r )
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
2006-07-04 14:25:04 +04:00
drsuapi_DsGetMemberships
2004-10-10 05:35:33 +04:00
*/
2006-07-04 14:25:04 +04:00
static WERROR drsuapi_DsGetMemberships ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
struct drsuapi_DsGetMemberships * r )
2004-10-10 05:35:33 +04:00
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_INTER_DOMAIN_MOVE
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_INTER_DOMAIN_MOVE ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct DRSUAPI_INTER_DOMAIN_MOVE * r )
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_GET_NT4_CHANGELOG
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_GET_NT4_CHANGELOG ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct DRSUAPI_GET_NT4_CHANGELOG * r )
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
2005-10-24 02:20:42 +04:00
drsuapi_DsCrackNames
2004-10-10 05:35:33 +04:00
*/
2005-10-24 02:20:42 +04:00
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 ) ;
2006-04-29 15:48:56 +04:00
W_ERROR_HAVE_NO_MEMORY ( ctr1 ) ;
2005-10-24 02:20:42 +04:00
count = r - > in . req . req1 . count ;
names = talloc_array ( mem_ctx , struct drsuapi_DsNameInfo1 , count ) ;
2006-04-29 15:48:56 +04:00
W_ERROR_HAVE_NO_MEMORY ( names ) ;
2005-10-24 02:20:42 +04:00
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 ;
}
2004-10-10 05:35:33 +04:00
/*
2004-11-23 11:57:42 +03:00
drsuapi_DsWriteAccountSpn
2004-10-10 05:35:33 +04:00
*/
2004-11-23 11:57:42 +03:00
static WERROR drsuapi_DsWriteAccountSpn ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
struct drsuapi_DsWriteAccountSpn * r )
2004-10-10 05:35:33 +04:00
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_REMOVE_DS_SERVER
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_REMOVE_DS_SERVER ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct DRSUAPI_REMOVE_DS_SERVER * r )
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_REMOVE_DS_DOMAIN
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_REMOVE_DS_DOMAIN ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct DRSUAPI_REMOVE_DS_DOMAIN * r )
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
2004-10-15 13:48:40 +04:00
drsuapi_DsGetDomainControllerInfo
2004-10-10 05:35:33 +04:00
*/
2004-10-15 15:08:14 +04:00
static WERROR drsuapi_DsGetDomainControllerInfo ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2005-09-17 05:11:50 +04:00
struct drsuapi_DsGetDomainControllerInfo * r )
2004-10-10 05:35:33 +04:00
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
2005-03-11 15:15:50 +03:00
drsuapi_DsAddEntry
2004-10-10 05:35:33 +04:00
*/
2005-03-11 15:15:50 +03:00
static WERROR drsuapi_DsAddEntry ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
struct drsuapi_DsAddEntry * r )
2004-10-10 05:35:33 +04:00
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_EXECUTE_KCC
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_EXECUTE_KCC ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct DRSUAPI_EXECUTE_KCC * r )
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
2004-12-07 15:20:28 +03:00
drsuapi_DsReplicaGetInfo
2004-10-10 05:35:33 +04:00
*/
2004-12-07 15:20:28 +03:00
static WERROR drsuapi_DsReplicaGetInfo ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
struct drsuapi_DsReplicaGetInfo * r )
2004-10-10 05:35:33 +04:00
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_ADD_SID_HISTORY
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_ADD_SID_HISTORY ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct DRSUAPI_ADD_SID_HISTORY * r )
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
2006-07-04 14:25:04 +04:00
drsuapi_DsGetMemberships2
2004-10-10 05:35:33 +04:00
*/
2006-07-04 14:25:04 +04:00
static WERROR drsuapi_DsGetMemberships2 ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
struct drsuapi_DsGetMemberships2 * r )
2004-10-10 05:35:33 +04:00
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_REPLICA_VERIFY_OBJECTS
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_REPLICA_VERIFY_OBJECTS ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct DRSUAPI_REPLICA_VERIFY_OBJECTS * r )
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_GET_OBJECT_EXISTENCE
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_GET_OBJECT_EXISTENCE ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
struct DRSUAPI_GET_OBJECT_EXISTENCE * r )
{
DCESRV_FAULT ( DCERPC_FAULT_OP_RNG_ERROR ) ;
}
/*
DRSUAPI_QUERY_SITES_BY_COST
*/
2004-10-15 15:08:14 +04:00
static WERROR DRSUAPI_QUERY_SITES_BY_COST ( struct dcesrv_call_state * dce_call , TALLOC_CTX * mem_ctx ,
2004-10-10 05:35:33 +04:00
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"