From 7e7bca41885ca876a0074d7d026eb99b0fc5e8db Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 16 Sep 2011 17:26:22 +0200 Subject: s3:smb2cli: implement smb2cli_negprot() on top of smbXcli_negprot() metze --- source3/libsmb/smb2cli.h | 4 - source3/libsmb/smb2cli_negprot.c | 162 ++++----------------------------------- 2 files changed, 15 insertions(+), 151 deletions(-) (limited to 'source3/libsmb') diff --git a/source3/libsmb/smb2cli.h b/source3/libsmb/smb2cli.h index faf73678de..048932d2f8 100644 --- a/source3/libsmb/smb2cli.h +++ b/source3/libsmb/smb2cli.h @@ -20,10 +20,6 @@ #ifndef __SMB2CLI_H__ #define __SMB2CLI_H__ -struct tevent_req *smb2cli_negprot_send(TALLOC_CTX *mem_ctx, - struct tevent_context *ev, - struct cli_state *cli); -NTSTATUS smb2cli_negprot_recv(struct tevent_req *req); NTSTATUS smb2cli_negprot(struct cli_state *cli); struct tevent_req *smb2cli_sesssetup_ntlmssp_send(TALLOC_CTX *mem_ctx, diff --git a/source3/libsmb/smb2cli_negprot.c b/source3/libsmb/smb2cli_negprot.c index dec6c4c998..ebf61ec980 100644 --- a/source3/libsmb/smb2cli_negprot.c +++ b/source3/libsmb/smb2cli_negprot.c @@ -19,156 +19,24 @@ #include "includes.h" #include "client.h" -#include "async_smb.h" -#include "smb2cli_base.h" +#include "../libcli/smb/smbXcli_base.h" #include "smb2cli.h" -#include "libsmb/proto.h" -#include "librpc/ndr/libndr.h" -#include "lib/util/tevent_ntstatus.h" - -struct smb2cli_negprot_state { - struct cli_state *cli; - uint8_t fixed[36]; - uint8_t dyn[4]; -}; - -static void smb2cli_negprot_done(struct tevent_req *subreq); - -struct tevent_req *smb2cli_negprot_send(TALLOC_CTX *mem_ctx, - struct tevent_context *ev, - struct cli_state *cli) -{ - struct tevent_req *req, *subreq; - struct smb2cli_negprot_state *state; - uint8_t *buf; - - req = tevent_req_create(mem_ctx, &state, - struct smb2cli_negprot_state); - if (req == NULL) { - return NULL; - } - state->cli = cli; - - buf = state->fixed; - SSVAL(buf, 0, 36); - SSVAL(buf, 2, 2); /* DialectCount */ - if (client_is_signing_mandatory(cli)) { - SSVAL(buf, 4, SMB2_NEGOTIATE_SIGNING_REQUIRED); - } else { - SSVAL(buf, 4, SMB2_NEGOTIATE_SIGNING_ENABLED); - } - SSVAL(buf, 6, 0); /* Reserved */ - SSVAL(buf, 8, 0); /* Capabilities */ - memset(buf+12, 0, 16); /* ClientGuid */ - SBVAL(buf, 28, 0); /* ClientStartTime */ - - buf = state->dyn; - SSVAL(buf, 0, 0x202); /* SMB2.002 */ - SSVAL(buf, 2, 0x210); /* SMB2.1 */ - - subreq = smb2cli_req_send(state, ev, cli, SMB2_OP_NEGPROT, - 0, 0, /* flags */ - cli->timeout, - cli->smb2.pid, - 0, 0, /* tid, uid */ - state->fixed, sizeof(state->fixed), - state->dyn, sizeof(state->dyn)); - if (tevent_req_nomem(subreq, req)) { - return tevent_req_post(req, ev); - } - tevent_req_set_callback(subreq, smb2cli_negprot_done, req); - return req; -} - -static void smb2cli_negprot_done(struct tevent_req *subreq) -{ - struct tevent_req *req = - tevent_req_callback_data(subreq, - struct tevent_req); - struct smb2cli_negprot_state *state = - tevent_req_data(req, - struct smb2cli_negprot_state); - struct cli_state *cli = state->cli; - size_t security_offset, security_length; - DATA_BLOB blob; - NTSTATUS status; - struct iovec *iov; - uint8_t *body; - static const struct smb2cli_req_expected_response expected[] = { - { - .status = NT_STATUS_OK, - .body_size = 0x41 - } - }; - - status = smb2cli_req_recv(subreq, talloc_tos(), &iov, - expected, ARRAY_SIZE(expected)); - if (!NT_STATUS_IS_OK(status)) { - TALLOC_FREE(subreq); - tevent_req_nterror(req, status); - return; - } - body = (uint8_t *)iov[1].iov_base; - - cli->smb2.security_mode = SVAL(body, 2); - cli->smb2.dialect_revision = SVAL(body, 4); - - blob = data_blob_const(body + 8, 16); - GUID_from_data_blob(&blob, &cli->smb2.server_guid); - - cli->smb2.server_capabilities = IVAL(body, 24); - cli->smb2.max_transact_size = IVAL(body, 28); - cli->smb2.max_read_size = IVAL(body, 32); - cli->smb2.max_write_size = IVAL(body, 36); - cli->smb2.system_time = interpret_long_date((char *)body + 40); - cli->smb2.server_start_time = interpret_long_date((char *)body + 48); - - security_offset = SVAL(body, 56); - security_length = SVAL(body, 58); - - if ((security_offset != SMB2_HDR_BODY + iov[1].iov_len) || - (security_length > iov[2].iov_len)) { - tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE); - return; - } - cli->smb2.gss_blob = data_blob(iov[1].iov_base, security_length); - - tevent_req_done(req); -} - -NTSTATUS smb2cli_negprot_recv(struct tevent_req *req) -{ - return tevent_req_simple_recv_ntstatus(req); -} NTSTATUS smb2cli_negprot(struct cli_state *cli) { - 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_negprot_send(frame, ev, cli); - if (req == NULL) { - goto fail; - } - if (!tevent_req_poll_ntstatus(req, ev, &status)) { - goto fail; - } - status = smb2cli_negprot_recv(req); - fail: - TALLOC_FREE(frame); - return status; + if (cli->smb2.conn == NULL) { + cli->smb2.conn = smbXcli_conn_create(cli, + cli->conn.fd, + cli->conn.remote_name, + 0, /* signing state */ + 0, /* smb1_capabilities */ + NULL); /* client guid */ + if (cli->smb2.conn == NULL) { + return NT_STATUS_NO_MEMORY; + } + } + + return smbXcli_negprot(cli->smb2.conn, cli->timeout, + PROTOCOL_SMB2_02, PROTOCOL_SMB2_02); } -- cgit