diff options
author | Stefan Metzmacher <metze@samba.org> | 2011-09-16 17:26:22 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2011-11-24 19:02:31 +0100 |
commit | 7e7bca41885ca876a0074d7d026eb99b0fc5e8db (patch) | |
tree | 9684e269717cb958f835f9e8b7c36045bec58443 | |
parent | 4435dad827db89356ecb6f1096a2b781f29970e5 (diff) | |
download | samba-7e7bca41885ca876a0074d7d026eb99b0fc5e8db.tar.gz samba-7e7bca41885ca876a0074d7d026eb99b0fc5e8db.tar.bz2 samba-7e7bca41885ca876a0074d7d026eb99b0fc5e8db.zip |
s3:smb2cli: implement smb2cli_negprot() on top of smbXcli_negprot()
metze
-rw-r--r-- | source3/include/client.h | 12 | ||||
-rw-r--r-- | source3/libsmb/smb2cli.h | 4 | ||||
-rw-r--r-- | source3/libsmb/smb2cli_negprot.c | 162 |
3 files changed, 15 insertions, 163 deletions
diff --git a/source3/include/client.h b/source3/include/client.h index cbe79134f0..faac1b9043 100644 --- a/source3/include/client.h +++ b/source3/include/client.h @@ -167,18 +167,6 @@ struct cli_state { uint32_t tid; uint64_t uid; - /* SMB2 negprot */ - uint16_t security_mode; - uint16_t dialect_revision; - struct GUID server_guid; - uint32_t server_capabilities; - uint32_t max_transact_size; - uint32_t max_read_size; - uint32_t max_write_size; - struct timespec system_time; - struct timespec server_start_time; - DATA_BLOB gss_blob; - /* SMB2 tcon */ uint8_t share_type; uint32_t share_flags; 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); } |