#include "session.h"
#include "smbd/smbd.h"
#include "auth.h"
+#include "krb5_env.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_RPC_SRV
}
for (i=num_users=0; i<num_sessions; i++) {
- if (!session_list[i].username
- || !session_list[i].remote_machine) {
+ if (session_list[i].username[0] == '\0' ||
+ session_list[i].remote_machine[0] == '\0') {
continue;
}
p = strpbrk(session_list[i].remote_machine, "./");
}
info100->platform_id = PLATFORM_ID_NT; /* unknown */
- info100->version_major = lp_major_announce_version();
- info100->version_minor = lp_minor_announce_version();
+ info100->version_major = SAMBA_MAJOR_NBT_ANNOUNCE_VERSION;
+ info100->version_minor = SAMBA_MINOR_NBT_ANNOUNCE_VERSION;
info100->server_name = talloc_asprintf_strupper_m(
info100, "%s", lp_netbios_name());
}
info101->platform_id = PLATFORM_ID_NT; /* unknown */
- info101->version_major = lp_major_announce_version();
- info101->version_minor = lp_minor_announce_version();
+ info101->version_major = SAMBA_MAJOR_NBT_ANNOUNCE_VERSION;
+ info101->version_minor = SAMBA_MINOR_NBT_ANNOUNCE_VERSION;
info101->server_name = talloc_asprintf_strupper_m(
info101, "%s", lp_netbios_name());
}
info102->platform_id = PLATFORM_ID_NT; /* unknown */
- info102->version_major = lp_major_announce_version();
- info102->version_minor = lp_minor_announce_version();
+ info102->version_major = SAMBA_MAJOR_NBT_ANNOUNCE_VERSION;
+ info102->version_minor = SAMBA_MINOR_NBT_ANNOUNCE_VERSION;
info102->server_name = talloc_asprintf_strupper_m(
info102, "%s", lp_netbios_name());
struct wkssvc_NetWkstaSetInfo *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
pwd_server = "";
- if ((pwd_tmp = talloc_strdup(ctr1->user1, lp_passwordserver()))) {
+ if ((pwd_tmp = talloc_strdup(ctr1->user1, lp_password_server()))) {
/* The configured password server is a full DNS name but
* for the logon server we need to return just the first
* component (machine name) of it in upper-case */
}
r->out.info->level = r->in.info->level;
*r->out.entries_read = r->out.info->ctr.user0->entries_read;
- *r->out.resume_handle = 0;
+ if (r->out.resume_handle != NULL) {
+ *r->out.resume_handle = 0;
+ }
break;
case 1:
r->out.info->ctr.user1 = create_enum_users1(p->mem_ctx);
}
r->out.info->level = r->in.info->level;
*r->out.entries_read = r->out.info->ctr.user1->entries_read;
- *r->out.resume_handle = 0;
+ if (r->out.resume_handle != NULL) {
+ *r->out.resume_handle = 0;
+ }
break;
default:
return WERR_UNKNOWN_LEVEL;
struct wkssvc_NetrWkstaUserGetInfo *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrWkstaUserSetInfo *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetWkstaTransportEnum *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrWkstaTransportAdd *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrWkstaTransportDel *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrUseAdd *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrUseGetInfo *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrUseDel *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrUseEnum *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrMessageBufferSend *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrWorkstationStatisticsGet *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrLogonDomainNameAdd *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrLogonDomainNameDel *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrJoinDomain *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrUnjoinDomain *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrRenameMachineInDomain *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrValidateName *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrGetJoinInformation *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrGetJoinableOus *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
char *admin_account = NULL;
WERROR werr;
struct security_token *token = p->session_info->security_token;
+ NTSTATUS status;
+ DATA_BLOB session_key;
+ bool ok;
if (!r->in.domain_name) {
return WERR_INVALID_PARAM;
return WERR_NOT_SUPPORTED;
}
+ status = session_extract_session_key(p->session_info,
+ &session_key,
+ KEY_USE_16BYTES);
+ if(!NT_STATUS_IS_OK(status)) {
+ DEBUG(5,("_wkssvc_NetrJoinDomain2: no session key %s\n",
+ nt_errstr(status)));
+ return WERR_NO_USER_SESSION_KEY;
+ }
+
werr = decode_wkssvc_join_password_buffer(
p->mem_ctx, r->in.encrypted_password,
- &p->session_info->session_key, &cleartext_pwd);
+ &session_key, &cleartext_pwd);
if (!W_ERROR_IS_OK(werr)) {
return werr;
}
- split_domain_user(p->mem_ctx,
- r->in.admin_account,
- &admin_domain,
- &admin_account);
+ ok = split_domain_user(p->mem_ctx,
+ r->in.admin_account,
+ &admin_domain,
+ &admin_account);
+ if (!ok) {
+ return WERR_NOMEM;
+ }
werr = libnet_init_JoinCtx(p->mem_ctx, &j);
if (!W_ERROR_IS_OK(werr)) {
j->in.msg_ctx = p->msg_ctx;
become_root();
+ setenv(KRB5_ENV_CCNAME, "MEMORY:_wkssvc_NetrJoinDomain2", 1);
werr = libnet_Join(p->mem_ctx, j);
+ unsetenv(KRB5_ENV_CCNAME);
unbecome_root();
if (!W_ERROR_IS_OK(werr)) {
char *admin_account = NULL;
WERROR werr;
struct security_token *token = p->session_info->security_token;
+ NTSTATUS status;
+ DATA_BLOB session_key;
+ bool ok;
if (!r->in.account || !r->in.encrypted_password) {
return WERR_INVALID_PARAM;
return WERR_ACCESS_DENIED;
}
+ status = session_extract_session_key(p->session_info,
+ &session_key,
+ KEY_USE_16BYTES);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(5,("_wkssvc_NetrUnjoinDomain2: no session key %s\n",
+ nt_errstr(status)));
+ return WERR_NO_USER_SESSION_KEY;
+ }
+
werr = decode_wkssvc_join_password_buffer(
p->mem_ctx, r->in.encrypted_password,
- &p->session_info->session_key, &cleartext_pwd);
+ &session_key, &cleartext_pwd);
if (!W_ERROR_IS_OK(werr)) {
return werr;
}
- split_domain_user(p->mem_ctx,
- r->in.account,
- &admin_domain,
- &admin_account);
+ ok = split_domain_user(p->mem_ctx,
+ r->in.account,
+ &admin_domain,
+ &admin_account);
+ if (!ok) {
+ return WERR_NOMEM;
+ }
werr = libnet_init_UnjoinCtx(p->mem_ctx, &u);
if (!W_ERROR_IS_OK(werr)) {
u->in.msg_ctx = p->msg_ctx;
become_root();
+ setenv(KRB5_ENV_CCNAME, "MEMORY:_wkssvc_NetrUnjoinDomain2", 1);
werr = libnet_Unjoin(p->mem_ctx, u);
+ unsetenv(KRB5_ENV_CCNAME);
unbecome_root();
if (!W_ERROR_IS_OK(werr)) {
struct wkssvc_NetrRenameMachineInDomain2 *r)
{
/* for now just return not supported */
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrValidateName2 *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrGetJoinableOus2 *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrAddAlternateComputerName *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrRemoveAlternateComputerName *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrSetPrimaryComputername *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}
struct wkssvc_NetrEnumerateComputerNames *r)
{
/* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
return WERR_NOT_SUPPORTED;
}