diff options
author | Stefan Metzmacher <metze@samba.org> | 2018-07-18 23:52:30 +0200 |
---|---|---|
committer | Alexander Bokovoy <ab@samba.org> | 2018-07-24 06:55:23 +0200 |
commit | ca000d8901e6acb8a7c59d26d4f75c9d92bafece (patch) | |
tree | ec95af18d92597c780f67aa9417c67e5c318d339 /source4/libcli/smb2 | |
parent | f20e607c15b4c8ae56ade5d7e68d832542a2cd5e (diff) | |
download | samba-ca000d8901e6acb8a7c59d26d4f75c9d92bafece.tar.gz |
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>
Diffstat (limited to 'source4/libcli/smb2')
-rw-r--r-- | source4/libcli/smb2/connect.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 2dee5021869..e4cbf8c5c41 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -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, |