1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-07 00:58:40 +03:00

s4:libcli: allow passing an already negotiated connection to smb_composite_connect()

It will just do the session setup and tree connect steps.

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 2b68f9b8b0dd944fa89b9e0037886ddd4fb4e5f9)
This commit is contained in:
Stefan Metzmacher 2018-07-18 15:34:55 +02:00 committed by Karolin Seeger
parent 71a1355172
commit f9b685e9a5
4 changed files with 41 additions and 10 deletions

View File

@ -207,6 +207,7 @@ NTSTATUS smbcli_tree_full_connection(TALLOC_CTX *parent_ctx,
io.in.called_name = strupper_talloc(tmp_ctx, dest_host);
io.in.service = service;
io.in.service_type = service_type;
io.in.existing_conn = NULL;
io.in.credentials = credentials;
io.in.gensec_settings = gensec_settings;
io.in.fallback_to_anonymous = false;

View File

@ -228,18 +228,10 @@ static NTSTATUS connect_session_setup(struct composite_context *c,
return NT_STATUS_OK;
}
/*
a negprot request has completed
*/
static NTSTATUS connect_negprot(struct composite_context *c,
struct smb_composite_connect *io)
static NTSTATUS connect_send_session(struct composite_context *c,
struct smb_composite_connect *io)
{
struct connect_state *state = talloc_get_type(c->private_data, struct connect_state);
NTSTATUS status;
status = smb_raw_negotiate_recv(state->subreq);
TALLOC_FREE(state->subreq);
NT_STATUS_NOT_OK_RETURN(status);
/* next step is a session setup */
state->session = smbcli_session_init(state->transport, state, true, io->in.session_options);
@ -281,6 +273,22 @@ static NTSTATUS connect_negprot(struct composite_context *c,
return NT_STATUS_OK;
}
/*
a negprot request has completed
*/
static NTSTATUS connect_negprot(struct composite_context *c,
struct smb_composite_connect *io)
{
struct connect_state *state = talloc_get_type(c->private_data, struct connect_state);
NTSTATUS status;
status = smb_raw_negotiate_recv(state->subreq);
TALLOC_FREE(state->subreq);
NT_STATUS_NOT_OK_RETURN(status);
return connect_send_session(c, io);
}
/*
setup a negprot send
*/
@ -432,6 +440,26 @@ struct composite_context *smb_composite_connect_send(struct smb_composite_connec
nbt_choose_called_name(state, &state->called,
io->in.called_name, NBT_NAME_SERVER);
if (io->in.existing_conn != NULL) {
NTSTATUS status;
status = smbcli_transport_raw_init(state,
c->event_ctx,
&io->in.existing_conn,
&io->in.options,
&state->transport);
if (!NT_STATUS_IS_OK(status)) {
goto failed;
}
status = connect_send_session(c, io);
if (!NT_STATUS_IS_OK(status)) {
goto failed;
}
return c;
}
state->creq = smbcli_sock_connect_send(state,
NULL,
io->in.dest_ports,

View File

@ -118,6 +118,7 @@ struct smb_composite_connect {
const char *called_name;
const char *service;
const char *service_type;
struct smbXcli_conn *existing_conn; /* optional */
struct cli_credentials *credentials;
bool fallback_to_anonymous;
const char *workgroup;

View File

@ -296,6 +296,7 @@ static NTSTATUS cvfs_connect(struct ntvfs_module_context *ntvfs,
io.in.dest_ports = lpcfg_smb_ports(ntvfs->ctx->lp_ctx);
io.in.socket_options = lpcfg_socket_options(ntvfs->ctx->lp_ctx);
io.in.called_name = host;
io.in.existing_conn = NULL;
io.in.credentials = credentials;
io.in.fallback_to_anonymous = false;
io.in.workgroup = lpcfg_workgroup(ntvfs->ctx->lp_ctx);