1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-10 01:18:15 +03:00

s4:libcli: add fallback_to_anonymous to smb2_connect_send()

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13308

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Alexander Bokovoy <ab@samba.org>
This commit is contained in:
Stefan Metzmacher 2018-07-18 23:52:30 +02:00 committed by Alexander Bokovoy
parent f20e607c15
commit ca000d8901
2 changed files with 33 additions and 0 deletions

View File

@ -35,6 +35,7 @@
struct smb2_connect_state {
struct tevent_context *ev;
struct cli_credentials *credentials;
bool fallback_to_anonymous;
uint64_t previous_session_id;
struct resolve_context *resolve_ctx;
const char *host;
@ -64,6 +65,7 @@ struct tevent_req *smb2_connect_send(TALLOC_CTX *mem_ctx,
const char *share,
struct resolve_context *resolve_ctx,
struct cli_credentials *credentials,
bool fallback_to_anonymous,
struct smbXcli_conn **existing_conn,
uint64_t previous_session_id,
const struct smbcli_options *options,
@ -83,6 +85,7 @@ struct tevent_req *smb2_connect_send(TALLOC_CTX *mem_ctx,
state->ev = ev;
state->credentials = credentials;
state->fallback_to_anonymous = fallback_to_anonymous;
state->previous_session_id = previous_session_id;
state->options = *options;
state->host = host;
@ -240,6 +243,34 @@ static void smb2_connect_session_done(struct tevent_req *subreq)
status = smb2_session_setup_spnego_recv(subreq);
TALLOC_FREE(subreq);
if (!NT_STATUS_IS_OK(status) &&
!cli_credentials_is_anonymous(state->credentials) &&
state->fallback_to_anonymous) {
struct cli_credentials *anon_creds = NULL;
/*
* The transport was moved to session,
* we need to revert that before removing
* the old broken session.
*/
state->transport = talloc_move(state, &state->session->transport);
TALLOC_FREE(state->session);
anon_creds = cli_credentials_init_anon(state);
if (tevent_req_nomem(anon_creds, req)) {
return;
}
cli_credentials_set_workstation(anon_creds,
cli_credentials_get_workstation(state->credentials),
CRED_SPECIFIED);
/*
* retry with anonymous credentials
*/
state->credentials = anon_creds;
smb2_connect_session_start(req);
return;
}
if (tevent_req_nterror(req, status)) {
return;
}
@ -331,6 +362,7 @@ NTSTATUS smb2_connect_ext(TALLOC_CTX *mem_ctx,
share,
resolve_ctx,
credentials,
false, /* fallback_to_anonymous */
NULL, /* existing_conn */
previous_session_id,
options,

View File

@ -301,6 +301,7 @@ static struct composite_context *dcerpc_pipe_connect_ncacn_np_smb2_send(
"IPC$",
s->io.resolve_ctx,
s->io.creds,
false, /* fallback_to_anonymous */
NULL, /* existing_conn */
0, /* previous_session_id */
&options,