summaryrefslogtreecommitdiff
path: root/source4/libcli
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2018-07-18 23:52:30 +0200
committerKarolin Seeger <kseeger@samba.org>2018-08-13 12:56:34 +0200
commit3212bc7694cf8f683f436f129289671122cbf92f (patch)
tree828aa238f7323a5773202a09f12ab9efdd18e3e4 /source4/libcli
parent2fd61b0e8645a832aeb963b8f437f279f7eaa735 (diff)
downloadsamba-3212bc7694cf8f683f436f129289671122cbf92f.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> (cherry picked from commit ca000d8901e6acb8a7c59d26d4f75c9d92bafece)
Diffstat (limited to 'source4/libcli')
-rw-r--r--source4/libcli/smb2/connect.c32
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,