diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/libsmb/smb2cli.h | 10 | ||||
-rw-r--r-- | source3/libsmb/smb2cli_session.c | 203 |
2 files changed, 0 insertions, 213 deletions
diff --git a/source3/libsmb/smb2cli.h b/source3/libsmb/smb2cli.h index a022c86d5b..65e2f71aa7 100644 --- a/source3/libsmb/smb2cli.h +++ b/source3/libsmb/smb2cli.h @@ -39,16 +39,6 @@ NTSTATUS smb2cli_session_setup_recv(struct tevent_req *req, struct iovec **recv_iov, DATA_BLOB *out_security_buffer); -struct tevent_req *smb2cli_sesssetup_ntlmssp_send(TALLOC_CTX *mem_ctx, - struct tevent_context *ev, - struct cli_state *cli, - const char *user, - const char *domain, - const char *pass); -NTSTATUS smb2cli_sesssetup_ntlmssp_recv(struct tevent_req *req); -NTSTATUS smb2cli_sesssetup_ntlmssp(struct cli_state *cli, const char *user, - const char *domain, const char *pass); - struct tevent_req *smb2cli_logoff_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct cli_state *cli); diff --git a/source3/libsmb/smb2cli_session.c b/source3/libsmb/smb2cli_session.c index 85c536f5bc..e060f316ef 100644 --- a/source3/libsmb/smb2cli_session.c +++ b/source3/libsmb/smb2cli_session.c @@ -240,209 +240,6 @@ NTSTATUS smb2cli_session_setup_recv(struct tevent_req *req, return status; } -struct smb2cli_sesssetup_ntlmssp_state { - struct tevent_context *ev; - struct cli_state *cli; - struct ntlmssp_state *ntlmssp; - struct iovec iov[2]; - uint8_t fixed[24]; - DATA_BLOB msg; - int turn; -}; - -static void smb2cli_sesssetup_ntlmssp_done(struct tevent_req *subreq); - -struct tevent_req *smb2cli_sesssetup_ntlmssp_send(TALLOC_CTX *mem_ctx, - struct tevent_context *ev, - struct cli_state *cli, - const char *user, - const char *domain, - const char *pass) -{ - struct tevent_req *req, *subreq; - struct smb2cli_sesssetup_ntlmssp_state *state; - NTSTATUS status; - DATA_BLOB blob_out; - const char *OIDs_ntlm[] = {OID_NTLMSSP, NULL}; - - req = tevent_req_create(mem_ctx, &state, - struct smb2cli_sesssetup_ntlmssp_state); - if (req == NULL) { - return NULL; - } - state->ev = ev; - state->cli = cli; - - status = ntlmssp_client_start(state, - lp_netbios_name(), - lp_workgroup(), - lp_client_ntlmv2_auth(), - &state->ntlmssp); - if (!NT_STATUS_IS_OK(status)) { - goto post_status; - } - ntlmssp_want_feature(state->ntlmssp, - NTLMSSP_FEATURE_SESSION_KEY); - status = ntlmssp_set_username(state->ntlmssp, user); - if (!NT_STATUS_IS_OK(status)) { - goto post_status; - } - status = ntlmssp_set_domain(state->ntlmssp, domain); - if (!NT_STATUS_IS_OK(status)) { - goto post_status; - } - status = ntlmssp_set_password(state->ntlmssp, pass); - if (!NT_STATUS_IS_OK(status)) { - goto post_status; - } - - status = ntlmssp_update(state->ntlmssp, data_blob_null, &blob_out); - if (!NT_STATUS_IS_OK(status) - && !NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) { - goto post_status; - } - - blob_out = spnego_gen_negTokenInit(state, OIDs_ntlm, &blob_out, NULL); - state->turn = 1; - - state->cli->smb2.session = smbXcli_session_create(cli, cli->conn); - if (tevent_req_nomem(state->cli->smb2.session, req)) { - return tevent_req_post(req, ev); - } - - subreq = smb2cli_session_setup_send(state, state->ev, - state->cli->conn, - state->cli->timeout, - state->cli->smb2.session, - 0, /* in_flags */ - SMB2_CAP_DFS, /* in_capabilities */ - 0, /* in_channel */ - NULL, /* in_previous_session */ - &blob_out); - if (tevent_req_nomem(subreq, req)) { - return tevent_req_post(req, ev); - } - tevent_req_set_callback(subreq, smb2cli_sesssetup_ntlmssp_done, req); - return req; -post_status: - tevent_req_nterror(req, status); - return tevent_req_post(req, ev); -} - -static void smb2cli_sesssetup_ntlmssp_done(struct tevent_req *subreq) -{ - struct tevent_req *req = - tevent_req_callback_data(subreq, - struct tevent_req); - struct smb2cli_sesssetup_ntlmssp_state *state = - tevent_req_data(req, - struct smb2cli_sesssetup_ntlmssp_state); - NTSTATUS status; - DATA_BLOB blob, blob_in, blob_out, spnego_blob; - bool ret; - struct iovec *recv_iov; - - status = smb2cli_session_setup_recv(subreq, state, &recv_iov, &blob); - TALLOC_FREE(subreq); - if (!NT_STATUS_IS_OK(status) - && !NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) { - tevent_req_nterror(req, status); - return; - } - - if (NT_STATUS_IS_OK(status)) { - status = smb2cli_session_update_session_key(state->cli->smb2.session, - state->ntlmssp->session_key, - recv_iov); - if (tevent_req_nterror(req, status)) { - return; - } - - tevent_req_done(req); - return; - } - - if (state->turn == 1) { - DATA_BLOB tmp_blob = data_blob_null; - ret = spnego_parse_challenge(state, blob, &blob_in, &tmp_blob); - data_blob_free(&tmp_blob); - } else { - ret = spnego_parse_auth_response(state, blob, status, - OID_NTLMSSP, &blob_in); - } - TALLOC_FREE(subreq); - if (!ret) { - tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE); - return; - } - - status = ntlmssp_update(state->ntlmssp, blob_in, &blob_out); - data_blob_free(&blob_in); - state->turn += 1; - - if (!NT_STATUS_IS_OK(status)) { - tevent_req_nterror(req, status); - return; - } - - spnego_blob = spnego_gen_auth(state, blob_out); - TALLOC_FREE(subreq); - if (tevent_req_nomem(spnego_blob.data, req)) { - return; - } - - subreq = smb2cli_session_setup_send(state, state->ev, - state->cli->conn, - state->cli->timeout, - state->cli->smb2.session, - 0, /* in_flags */ - SMB2_CAP_DFS, /* in_capabilities */ - 0, /* in_channel */ - NULL, /* in_previous_session */ - &spnego_blob); - if (tevent_req_nomem(subreq, req)) { - return; - } - tevent_req_set_callback(subreq, smb2cli_sesssetup_ntlmssp_done, req); -} - -NTSTATUS smb2cli_sesssetup_ntlmssp_recv(struct tevent_req *req) -{ - return tevent_req_simple_recv_ntstatus(req); -} - -NTSTATUS smb2cli_sesssetup_ntlmssp(struct cli_state *cli, const char *user, - const char *domain, const char *pass) -{ - TALLOC_CTX *frame = talloc_stackframe(); - struct event_context *ev; - struct tevent_req *req; - NTSTATUS status = NT_STATUS_NO_MEMORY; - - if (cli_has_async_calls(cli)) { - /* - * Can't use sync call while an async call is in flight - */ - status = NT_STATUS_INVALID_PARAMETER; - goto fail; - } - ev = event_context_init(frame); - if (ev == NULL) { - goto fail; - } - req = smb2cli_sesssetup_ntlmssp_send(frame, ev, cli, user, domain, pass); - if (req == NULL) { - goto fail; - } - if (!tevent_req_poll_ntstatus(req, ev, &status)) { - goto fail; - } - status = smb2cli_sesssetup_ntlmssp_recv(req); - fail: - TALLOC_FREE(frame); - return status; -} - struct smb2cli_logoff_state { uint8_t fixed[4]; }; |