s3:smb2cli: implement smb2cli_negprot() on top of smbXcli_negprot()
authorStefan Metzmacher <metze@samba.org>
Fri, 16 Sep 2011 15:26:22 +0000 (17:26 +0200)
committerStefan Metzmacher <metze@samba.org>
Thu, 24 Nov 2011 18:02:31 +0000 (19:02 +0100)
metze

source3/include/client.h
source3/libsmb/smb2cli.h
source3/libsmb/smb2cli_negprot.c

index cbe79134f00f4ecb39d62233a6dbd8df0b441512..faac1b90439045133ec0361e7853904c16c8c3ed 100644 (file)
@@ -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;
index faf73678def9cccede884ecc077c62a43e15e9a8..048932d2f8eb67fec03583d5f6d8453abb05f874 100644 (file)
 #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,
index dec6c4c99807d661c46e199333a2f386e0b9f3ad..ebf61ec9802c9447121c4da71f56233e4f724549 100644 (file)
 
 #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);
 }