mirror of
https://github.com/samba-team/samba.git
synced 2025-03-09 08:58:35 +03:00
authenticated session down into LDB. This associates a session info structure with the open LDB, allowing a future ldb_ntacl module to allow/deny operations on that basis. Along the way, I cleaned up a few things, and added new helper functions to assist. In particular the LSA pipe uses simpler queries for some of the setup. In ldap_server, I have removed the 'ldasrv:hacked' module, which hasn't been worked on (other than making it continue to compile) since January, and I think the features of this module are being put into ldb anyway. I have also changed the partitions in ldap_server to be initialised after the connection, with the private pointer used to associate the ldb with the incoming session. Andrew Bartlett (This used to be commit fd7203789a2c0929eecea8125b57b833a67fed71)
254 lines
6.6 KiB
C
254 lines
6.6 KiB
C
/*
|
|
Unix SMB/CIFS implementation.
|
|
|
|
endpoint server for the dssetup pipe
|
|
|
|
Copyright (C) Andrew Tridgell 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/dcerpc_server.h"
|
|
#include "librpc/gen_ndr/ndr_samr.h"
|
|
#include "librpc/gen_ndr/ndr_dssetup.h"
|
|
#include "rpc_server/common/common.h"
|
|
#include "ldb/include/ldb.h"
|
|
/*
|
|
dssetup_DsRoleGetPrimaryDomainInformation
|
|
*/
|
|
static WERROR dssetup_DsRoleGetPrimaryDomainInformation(struct dcesrv_call_state *dce_call,
|
|
TALLOC_CTX *mem_ctx,
|
|
struct dssetup_DsRoleGetPrimaryDomainInformation *r)
|
|
{
|
|
union dssetup_DsRoleInfo *info;
|
|
|
|
info = talloc(mem_ctx, union dssetup_DsRoleInfo);
|
|
W_ERROR_HAVE_NO_MEMORY(info);
|
|
|
|
switch (r->in.level) {
|
|
case DS_ROLE_BASIC_INFORMATION:
|
|
{
|
|
void *sam_ctx;
|
|
const char * const attrs[] = { "dnsDomain", "nTMixedDomain", "objectGUID", "name", NULL };
|
|
int ret;
|
|
struct ldb_message **res;
|
|
enum dssetup_DsRole role = DS_ROLE_STANDALONE_SERVER;
|
|
uint32_t flags = 0;
|
|
const char *domain = NULL;
|
|
const char *dns_domain = NULL;
|
|
const char *forest = NULL;
|
|
struct GUID domain_guid;
|
|
|
|
ZERO_STRUCT(domain_guid);
|
|
|
|
switch (lp_server_role()) {
|
|
case ROLE_STANDALONE:
|
|
role = DS_ROLE_STANDALONE_SERVER;
|
|
break;
|
|
case ROLE_DOMAIN_MEMBER:
|
|
role = DS_ROLE_MEMBER_SERVER;
|
|
break;
|
|
case ROLE_DOMAIN_BDC:
|
|
role = DS_ROLE_BACKUP_DC;
|
|
break;
|
|
case ROLE_DOMAIN_PDC:
|
|
role = DS_ROLE_PRIMARY_DC;
|
|
break;
|
|
}
|
|
|
|
switch (lp_server_role()) {
|
|
case ROLE_STANDALONE:
|
|
domain = talloc_strdup(mem_ctx, lp_workgroup());
|
|
W_ERROR_HAVE_NO_MEMORY(domain);
|
|
break;
|
|
case ROLE_DOMAIN_MEMBER:
|
|
domain = talloc_strdup(mem_ctx, lp_workgroup());
|
|
W_ERROR_HAVE_NO_MEMORY(domain);
|
|
/* TODO: what is with dns_domain and forest and guid? */
|
|
break;
|
|
case ROLE_DOMAIN_BDC:
|
|
case ROLE_DOMAIN_PDC:
|
|
sam_ctx = samdb_connect(mem_ctx, dce_call->conn->auth_state.session_info);
|
|
if (!sam_ctx) {
|
|
return WERR_SERVER_UNAVAILABLE;
|
|
}
|
|
|
|
ret = gendb_search_dn(sam_ctx, mem_ctx, samdb_base_dn(mem_ctx), &res, attrs);
|
|
if (ret != 1) {
|
|
return WERR_SERVER_UNAVAILABLE;
|
|
}
|
|
|
|
flags = DS_ROLE_PRIMARY_DS_RUNNING;
|
|
|
|
if (samdb_result_uint(res[0], "nTMixedDomain", 0) == 1) {
|
|
flags |= DS_ROLE_PRIMARY_DS_MIXED_MODE;
|
|
}
|
|
|
|
domain = samdb_search_string(sam_ctx, mem_ctx, NULL, "nETBIOSName",
|
|
"(&(objectclass=crossRef)(ncName=%s))",
|
|
ldb_dn_linearize(mem_ctx, samdb_base_dn(mem_ctx)));
|
|
|
|
dns_domain = samdb_result_string(res[0], "dnsDomain", NULL);
|
|
forest = samdb_result_string(res[0], "dnsDomain", NULL);
|
|
|
|
domain_guid = samdb_result_guid(res[0], "objectGUID");
|
|
flags |= DS_ROLE_PRIMARY_DOMAIN_GUID_PRESENT;
|
|
break;
|
|
}
|
|
|
|
info->basic.role = role;
|
|
info->basic.flags = flags;
|
|
info->basic.domain = domain;
|
|
info->basic.dns_domain = dns_domain;
|
|
info->basic.forest = forest;
|
|
info->basic.domain_guid = domain_guid;
|
|
|
|
r->out.info = info;
|
|
return WERR_OK;
|
|
}
|
|
case DS_ROLE_UPGRADE_STATUS:
|
|
{
|
|
info->upgrade.upgrading = DS_ROLE_NOT_UPGRADING;
|
|
info->upgrade.previous_role = DS_ROLE_PREVIOUS_UNKNOWN;
|
|
|
|
r->out.info = info;
|
|
return WERR_OK;
|
|
}
|
|
case DS_ROLE_OP_STATUS:
|
|
{
|
|
info->opstatus.status = DS_ROLE_OP_IDLE;
|
|
|
|
r->out.info = info;
|
|
return WERR_OK;
|
|
}
|
|
default:
|
|
return WERR_INVALID_PARAM;
|
|
}
|
|
|
|
return WERR_INVALID_PARAM;
|
|
}
|
|
|
|
|
|
/*****************************************
|
|
NOTE! The remaining calls below were
|
|
removed in w2k3, so the DCESRV_FAULT()
|
|
replies are the correct implementation. Do
|
|
not try and fill these in with anything else
|
|
******************************************/
|
|
|
|
/*
|
|
dssetup_DsRoleDnsNameToFlatName
|
|
*/
|
|
static WERROR dssetup_DsRoleDnsNameToFlatName(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct dssetup_DsRoleDnsNameToFlatName *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
dssetup_DsRoleDcAsDc
|
|
*/
|
|
static WERROR dssetup_DsRoleDcAsDc(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct dssetup_DsRoleDcAsDc *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
dssetup_DsRoleDcAsReplica
|
|
*/
|
|
static WERROR dssetup_DsRoleDcAsReplica(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct dssetup_DsRoleDcAsReplica *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
dssetup_DsRoleDemoteDc
|
|
*/
|
|
static WERROR dssetup_DsRoleDemoteDc(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct dssetup_DsRoleDemoteDc *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
dssetup_DsRoleGetDcOperationProgress
|
|
*/
|
|
static WERROR dssetup_DsRoleGetDcOperationProgress(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct dssetup_DsRoleGetDcOperationProgress *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
dssetup_DsRoleGetDcOperationResults
|
|
*/
|
|
static WERROR dssetup_DsRoleGetDcOperationResults(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct dssetup_DsRoleGetDcOperationResults *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
dssetup_DsRoleCancel
|
|
*/
|
|
static WERROR dssetup_DsRoleCancel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct dssetup_DsRoleCancel *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
dssetup_DsRoleServerSaveStateForUpgrade
|
|
*/
|
|
static WERROR dssetup_DsRoleServerSaveStateForUpgrade(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct dssetup_DsRoleServerSaveStateForUpgrade *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
dssetup_DsRoleUpgradeDownlevelServer
|
|
*/
|
|
static WERROR dssetup_DsRoleUpgradeDownlevelServer(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct dssetup_DsRoleUpgradeDownlevelServer *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
dssetup_DsRoleAbortDownlevelServerUpgrade
|
|
*/
|
|
static WERROR dssetup_DsRoleAbortDownlevelServerUpgrade(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
|
|
struct dssetup_DsRoleAbortDownlevelServerUpgrade *r)
|
|
{
|
|
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
|
|
}
|
|
|
|
|
|
/* include the generated boilerplate */
|
|
#include "librpc/gen_ndr/ndr_dssetup_s.c"
|