1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-31 01:48:16 +03:00

s3/rpc_client: add rpccli_netlogon_interactive_logon()

This will be used in a subsequent commit.

Bug: https://bugzilla.samba.org/show_bug.cgi?id=13258

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
(cherry picked from commit be26a472ae082d612f9aec28c932d25e2317f9ba)
This commit is contained in:
Stefan Metzmacher 2018-02-09 16:15:18 +01:00
parent 6fac545188
commit 05b797206c
2 changed files with 127 additions and 0 deletions

View File

@ -701,3 +701,115 @@ NTSTATUS rpccli_netlogon_network_logon(
return NT_STATUS_OK;
}
NTSTATUS rpccli_netlogon_interactive_logon(
struct netlogon_creds_cli_context *creds_ctx,
struct dcerpc_binding_handle *binding_handle,
TALLOC_CTX *mem_ctx,
uint32_t logon_parameters,
const char *username,
const char *domain,
const char *workstation,
DATA_BLOB lm_hash,
DATA_BLOB nt_hash,
enum netr_LogonInfoClass logon_type,
uint8_t *authoritative,
uint32_t *flags,
uint16_t *_validation_level,
union netr_Validation **_validation)
{
TALLOC_CTX *frame = talloc_stackframe();
NTSTATUS status;
const char *workstation_name_slash;
union netr_LogonLevel *logon = NULL;
struct netr_PasswordInfo *password_info = NULL;
uint16_t validation_level = 0;
union netr_Validation *validation = NULL;
struct netr_ChallengeResponse lm;
struct netr_ChallengeResponse nt;
*_validation = NULL;
ZERO_STRUCT(lm);
ZERO_STRUCT(nt);
switch (logon_type) {
case NetlogonInteractiveInformation:
case NetlogonInteractiveTransitiveInformation:
break;
default:
DEBUG(0, ("switch value %d not supported\n",
logon_type));
TALLOC_FREE(frame);
return NT_STATUS_INVALID_INFO_CLASS;
}
logon = talloc_zero(mem_ctx, union netr_LogonLevel);
if (logon == NULL) {
TALLOC_FREE(frame);
return NT_STATUS_NO_MEMORY;
}
password_info = talloc_zero(logon, struct netr_PasswordInfo);
if (password_info == NULL) {
TALLOC_FREE(frame);
return NT_STATUS_NO_MEMORY;
}
if (workstation[0] != '\\' && workstation[1] != '\\') {
workstation_name_slash = talloc_asprintf(frame, "\\\\%s", workstation);
} else {
workstation_name_slash = workstation;
}
if (workstation_name_slash == NULL) {
TALLOC_FREE(frame);
return NT_STATUS_NO_MEMORY;
}
/* Initialise input parameters */
password_info->identity_info.domain_name.string = domain;
password_info->identity_info.parameter_control = logon_parameters;
password_info->identity_info.logon_id_low = 0xdead;
password_info->identity_info.logon_id_high = 0xbeef;
password_info->identity_info.account_name.string = username;
password_info->identity_info.workstation.string = workstation_name_slash;
if (nt_hash.length != sizeof(password_info->ntpassword.hash)) {
TALLOC_FREE(frame);
return NT_STATUS_INVALID_PARAMETER;
}
memcpy(password_info->ntpassword.hash, nt_hash.data, nt_hash.length);
if (lm_hash.length != 0) {
if (lm_hash.length != sizeof(password_info->lmpassword.hash)) {
TALLOC_FREE(frame);
return NT_STATUS_INVALID_PARAMETER;
}
memcpy(password_info->lmpassword.hash, lm_hash.data, lm_hash.length);
}
logon->password = password_info;
/* Marshall data and send request */
status = netlogon_creds_cli_LogonSamLogon(creds_ctx,
binding_handle,
logon_type,
logon,
mem_ctx,
&validation_level,
&validation,
authoritative,
flags);
if (!NT_STATUS_IS_OK(status)) {
TALLOC_FREE(frame);
return status;
}
*_validation_level = validation_level;
*_validation = validation;
TALLOC_FREE(frame);
return NT_STATUS_OK;
}

View File

@ -89,5 +89,20 @@ NTSTATUS rpccli_netlogon_network_logon(
uint32_t *flags,
uint16_t *_validation_level,
union netr_Validation **_validation);
NTSTATUS rpccli_netlogon_interactive_logon(
struct netlogon_creds_cli_context *creds_ctx,
struct dcerpc_binding_handle *binding_handle,
TALLOC_CTX *mem_ctx,
uint32_t logon_parameters,
const char *username,
const char *domain,
const char *workstation,
DATA_BLOB lm_hash,
DATA_BLOB nt_hash,
enum netr_LogonInfoClass logon_type,
uint8_t *authoritative,
uint32_t *flags,
uint16_t *_validation_level,
union netr_Validation **_validation);
#endif /* _RPC_CLIENT_CLI_NETLOGON_H_ */