mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
79f6bcd5ae
secrets system, and not the old system from Samba3.
This allowed the code from auth_domain to be shared - we now only
lookup the secrets.ldb in lib/credentials.c.
In order to link the resultant binary, samdb_search() has been moved
from deep inside rpc_server into lib/gendb.c, along with the existing
gendb_search_v(). The vast majority of this patch is the simple
rename that followed,
(Depending on the whole SAMDB for just this function seemed pointless,
and brought in futher dependencies, such as smbencrypt.c).
Andrew Bartlett
(This used to be commit e13c671619
)
253 lines
6.5 KiB
C
253 lines
6.5 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"
|
|
|
|
|
|
/*
|
|
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);
|
|
if (!sam_ctx) {
|
|
return WERR_SERVER_UNAVAILABLE;
|
|
}
|
|
|
|
ret = gendb_search(sam_ctx, mem_ctx, NULL, &res, attrs,
|
|
"(&(objectClass=domainDNS)(!(objectClass=builtinDomain)))");
|
|
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_result_string(res[0], "name", NULL);
|
|
dns_domain = samdb_result_string(res[0], "dnsDomain", NULL);
|
|
forest = samdb_result_string(res[0], "dnsDomain", NULL);
|
|
|
|
flags |= DS_ROLE_PRIMARY_DOMAIN_GUID_PRESENT;
|
|
domain_guid = samdb_result_guid(res[0], "objectGUID");
|
|
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"
|