summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2011-09-16 17:26:22 +0200
committerStefan Metzmacher <metze@samba.org>2011-11-24 19:02:31 +0100
commit7e7bca41885ca876a0074d7d026eb99b0fc5e8db (patch)
tree9684e269717cb958f835f9e8b7c36045bec58443
parent4435dad827db89356ecb6f1096a2b781f29970e5 (diff)
downloadsamba-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.h12
-rw-r--r--source3/libsmb/smb2cli.h4
-rw-r--r--source3/libsmb/smb2cli_negprot.c162
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);
}