diff options
Diffstat (limited to 'source4/libcli/smb2/connect.c')
-rw-r--r-- | source4/libcli/smb2/connect.c | 90 |
1 files changed, 20 insertions, 70 deletions
diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 2e837287f5..0d97691a44 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -29,6 +29,7 @@ #include "libcli/composite/composite.h" #include "libcli/resolve/resolve.h" #include "param/param.h" +#include "../libcli/smb/smbXcli_base.h" struct smb2_connect_state { struct tevent_context *ev; @@ -40,7 +41,7 @@ struct smb2_connect_state { const char *socket_options; struct gensec_settings *gensec_settings; struct smbcli_options options; - struct smb2_negprot negprot; + struct smb2_transport *transport; struct smb2_tree_connect tcon; struct smb2_session *session; struct smb2_tree *tree; @@ -132,7 +133,7 @@ static void smb2_connect_resolve_done(struct composite_context *creq) creq->async.private_data = req; } -static void smb2_connect_negprot_done(struct smb2_request *smb2req); +static void smb2_connect_negprot_done(struct tevent_req *subreq); static void smb2_connect_socket_done(struct composite_context *creq) { @@ -143,103 +144,52 @@ static void smb2_connect_socket_done(struct composite_context *creq) tevent_req_data(req, struct smb2_connect_state); struct smbcli_socket *sock; - struct smb2_transport *transport; - struct smb2_request *smb2req; + struct tevent_req *subreq; NTSTATUS status; - uint16_t dialects[3] = { - SMB2_DIALECT_REVISION_000, - SMB2_DIALECT_REVISION_202, - SMB2_DIALECT_REVISION_210 - }; + uint32_t timeout_msec; status = smbcli_sock_connect_recv(creq, state, &sock); if (tevent_req_nterror(req, status)) { return; } - transport = smb2_transport_init(sock, state, &state->options); - if (tevent_req_nomem(transport, req)) { + state->transport = smb2_transport_init(sock, state, &state->options); + if (tevent_req_nomem(state->transport, req)) { return; } - ZERO_STRUCT(state->negprot); - state->negprot.in.dialect_count = ARRAY_SIZE(dialects); - switch (transport->options.signing) { - case SMB_SIGNING_OFF: - state->negprot.in.security_mode = 0; - break; - case SMB_SIGNING_DEFAULT: - case SMB_SIGNING_IF_REQUIRED: - state->negprot.in.security_mode = SMB2_NEGOTIATE_SIGNING_ENABLED; - break; - case SMB_SIGNING_REQUIRED: - state->negprot.in.security_mode = - SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED; - break; - } - state->negprot.in.capabilities = 0; - unix_to_nt_time(&state->negprot.in.start_time, time(NULL)); - state->negprot.in.dialects = dialects; + timeout_msec = state->transport->options.request_timeout * 1000; - smb2req = smb2_negprot_send(transport, &state->negprot); - if (tevent_req_nomem(smb2req, req)) { + subreq = smbXcli_negprot_send(state, state->ev, + state->transport->conn, timeout_msec, + PROTOCOL_SMB2_02, PROTOCOL_SMB2_22); + if (tevent_req_nomem(subreq, req)) { return; } - smb2req->async.fn = smb2_connect_negprot_done; - smb2req->async.private_data = req; + tevent_req_set_callback(subreq, smb2_connect_negprot_done, req); } static void smb2_connect_session_done(struct tevent_req *subreq); -static void smb2_connect_negprot_done(struct smb2_request *smb2req) +static void smb2_connect_negprot_done(struct tevent_req *subreq) { struct tevent_req *req = - talloc_get_type_abort(smb2req->async.private_data, + tevent_req_callback_data(subreq, struct tevent_req); struct smb2_connect_state *state = tevent_req_data(req, struct smb2_connect_state); - struct smb2_transport *transport = smb2req->transport; - struct tevent_req *subreq; + struct smb2_transport *transport = state->transport; NTSTATUS status; - status = smb2_negprot_recv(smb2req, state, &state->negprot); + status = smbXcli_negprot_recv(subreq); + TALLOC_FREE(subreq); if (tevent_req_nterror(req, status)) { return; } - transport->negotiate.secblob = state->negprot.out.secblob; - talloc_steal(transport, transport->negotiate.secblob.data); - transport->negotiate.system_time = state->negprot.out.system_time; - transport->negotiate.server_start_time = state->negprot.out.server_start_time; - transport->negotiate.security_mode = state->negprot.out.security_mode; - transport->negotiate.dialect_revision = state->negprot.out.dialect_revision; - - switch (transport->options.signing) { - case SMB_SIGNING_OFF: - if (transport->negotiate.security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) { - tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED); - return; - } - transport->signing_required = false; - break; - case SMB_SIGNING_DEFAULT: - case SMB_SIGNING_IF_REQUIRED: - if (transport->negotiate.security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) { - transport->signing_required = true; - } else { - transport->signing_required = false; - } - break; - case SMB_SIGNING_REQUIRED: - if (transport->negotiate.security_mode & SMB2_NEGOTIATE_SIGNING_ENABLED) { - transport->signing_required = true; - } else { - tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED); - return; - } - break; - } + /* This is a hack... */ + smb2cli_conn_set_max_credits(transport->conn, 30); state->session = smb2_session_init(transport, state->gensec_settings, state, true); if (tevent_req_nomem(state->session, req)) { |