From 5196493c9e599b741417b119b48188ba0d646a37 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 27 Aug 2013 14:36:24 +0200 Subject: [PATCH] s3:rpc_client: add rpccli_netlogon_network_logon() Signed-off-by: Stefan Metzmacher Reviewed-by: Andrew Bartlett --- source3/rpc_client/cli_netlogon.c | 103 ++++++++++++++++++++++++++++++ source3/rpc_client/cli_netlogon.h | 14 ++++ 2 files changed, 117 insertions(+) diff --git a/source3/rpc_client/cli_netlogon.c b/source3/rpc_client/cli_netlogon.c index 253d0608517..e335423dde9 100644 --- a/source3/rpc_client/cli_netlogon.c +++ b/source3/rpc_client/cli_netlogon.c @@ -524,6 +524,109 @@ NTSTATUS rpccli_netlogon_sam_network_logon(struct rpc_pipe_client *cli, return NT_STATUS_OK; } +NTSTATUS rpccli_netlogon_network_logon(struct netlogon_creds_cli_context *creds, + struct dcerpc_binding_handle *binding_handle, + TALLOC_CTX *mem_ctx, + uint32_t logon_parameters, + const char *username, + const char *domain, + const char *workstation, + const uint8 chal[8], + DATA_BLOB lm_response, + DATA_BLOB nt_response, + uint8_t *authoritative, + uint32_t *flags, + struct netr_SamInfo3 **info3) +{ + NTSTATUS status; + const char *workstation_name_slash; + union netr_LogonLevel *logon = NULL; + struct netr_NetworkInfo *network_info; + uint16_t validation_level = 0; + union netr_Validation *validation = NULL; + uint8_t _authoritative = 0; + uint32_t _flags = 0; + struct netr_ChallengeResponse lm; + struct netr_ChallengeResponse nt; + + *info3 = NULL; + + if (authoritative == NULL) { + authoritative = &_authoritative; + } + if (flags == NULL) { + flags = &_flags; + } + + ZERO_STRUCT(lm); + ZERO_STRUCT(nt); + + logon = talloc_zero(mem_ctx, union netr_LogonLevel); + if (!logon) { + return NT_STATUS_NO_MEMORY; + } + + network_info = talloc_zero(mem_ctx, struct netr_NetworkInfo); + if (!network_info) { + return NT_STATUS_NO_MEMORY; + } + + if (workstation[0] != '\\' && workstation[1] != '\\') { + workstation_name_slash = talloc_asprintf(mem_ctx, "\\\\%s", workstation); + } else { + workstation_name_slash = workstation; + } + + if (!workstation_name_slash) { + DEBUG(0, ("talloc_asprintf failed!\n")); + return NT_STATUS_NO_MEMORY; + } + + /* Initialise input parameters */ + + lm.data = lm_response.data; + lm.length = lm_response.length; + nt.data = nt_response.data; + nt.length = nt_response.length; + + network_info->identity_info.domain_name.string = domain; + network_info->identity_info.parameter_control = logon_parameters; + network_info->identity_info.logon_id_low = 0xdead; + network_info->identity_info.logon_id_high = 0xbeef; + network_info->identity_info.account_name.string = username; + network_info->identity_info.workstation.string = workstation_name_slash; + + memcpy(network_info->challenge, chal, 8); + network_info->nt = nt; + network_info->lm = lm; + + logon->network = network_info; + + /* Marshall data and send request */ + + status = netlogon_creds_cli_LogonSamLogon(creds, + binding_handle, + NetlogonNetworkInformation, + logon, + mem_ctx, + &validation_level, + &validation, + authoritative, + flags); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + status = map_validation_to_info3(mem_ctx, + validation_level, validation, + info3); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + return NT_STATUS_OK; +} + /********************************************************* Change the domain password on the PDC. diff --git a/source3/rpc_client/cli_netlogon.h b/source3/rpc_client/cli_netlogon.h index f10e5c7c4db..54ed7ae5bf1 100644 --- a/source3/rpc_client/cli_netlogon.h +++ b/source3/rpc_client/cli_netlogon.h @@ -26,6 +26,7 @@ struct cli_state; struct messaging_context; struct netlogon_creds_cli_context; +struct dcerpc_binding_handle; /* The following definitions come from rpc_client/cli_netlogon.c */ @@ -71,6 +72,19 @@ NTSTATUS rpccli_netlogon_sam_network_logon(struct rpc_pipe_client *cli, DATA_BLOB lm_response, DATA_BLOB nt_response, struct netr_SamInfo3 **info3); +NTSTATUS rpccli_netlogon_network_logon(struct netlogon_creds_cli_context *creds, + struct dcerpc_binding_handle *binding_handle, + TALLOC_CTX *mem_ctx, + uint32_t logon_parameters, + const char *username, + const char *domain, + const char *workstation, + const uint8 chal[8], + DATA_BLOB lm_response, + DATA_BLOB nt_response, + uint8_t *authoritative, + uint32_t *flags, + struct netr_SamInfo3 **info3); NTSTATUS rpccli_netlogon_set_trust_password(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, const char *account_name, -- 2.34.1