s4:libcli: add support for SMB_EXTENDED_SIGNATURES during SMBtconX
authorStefan Metzmacher <metze@samba.org>
Thu, 2 Aug 2012 06:51:13 +0000 (08:51 +0200)
committerStefan Metzmacher <metze@samba.org>
Sat, 4 Aug 2012 07:10:22 +0000 (09:10 +0200)
metze

source4/libcli/cliconnect.c
source4/libcli/smb_composite/connect.c
source4/libcli/util/clilsa.c

index d680a7e121aea3248d9411ac298a66a6b7796be5..17151923d5b0d967b18819143f981b43773c88a5 100644 (file)
@@ -26,6 +26,7 @@
 #include "libcli/raw/raw_proto.h"
 #include "libcli/auth/libcli_auth.h"
 #include "libcli/smb_composite/smb_composite.h"
+#include "libcli/smb/smbXcli_base.h"
 
 /*
   wrapper around smbcli_sock_connect()
@@ -125,6 +126,7 @@ NTSTATUS smbcli_tconX(struct smbcli_state *cli, const char *sharename,
        /* setup a tree connect */
        tcon.generic.level = RAW_TCON_TCONX;
        tcon.tconx.in.flags = TCONX_FLAG_EXTENDED_RESPONSE;
+       tcon.tconx.in.flags |= TCONX_FLAG_EXTENDED_SIGNATURES;
        if (cli->transport->negotiate.sec_mode & NEGOTIATE_SECURITY_USER_LEVEL) {
                tcon.tconx.in.password = data_blob(NULL, 0);
        } else if (cli->transport->negotiate.sec_mode & NEGOTIATE_SECURITY_CHALLENGE_RESPONSE) {
@@ -143,6 +145,10 @@ NTSTATUS smbcli_tconX(struct smbcli_state *cli, const char *sharename,
 
        cli->tree->tid = tcon.tconx.out.tid;
 
+       if (tcon.tconx.out.options & SMB_EXTENDED_SIGNATURES) {
+               smb1cli_session_protect_session_key(cli->tree->session->smbXcli);
+       }
+
        talloc_free(mem_ctx);
 
        return status;
index 3453ec94cf52a8aeefc5cc6d44a12424d975dc0c..14b53e5d402c862645ee46b6a4dfde0837fb35dc 100644 (file)
@@ -31,6 +31,7 @@
 #include "librpc/gen_ndr/ndr_nbt.h"
 #include "param/param.h"
 #include "lib/util/util_net.h"
+#include "libcli/smb/smbXcli_base.h"
 
 /* the stages of this call */
 enum connect_stage {CONNECT_SOCKET, 
@@ -72,6 +73,10 @@ static NTSTATUS connect_tcon(struct composite_context *c,
        status = smb_raw_tcon_recv(state->req, c, state->io_tcon);
        NT_STATUS_NOT_OK_RETURN(status);
 
+       if (state->io_tcon->tconx.out.options & SMB_EXTENDED_SIGNATURES) {
+               smb1cli_session_protect_session_key(io->out.tree->session->smbXcli);
+       }
+
        io->out.tree->tid = state->io_tcon->tconx.out.tid;
        if (state->io_tcon->tconx.out.dev_type) {
                io->out.tree->device = talloc_strdup(io->out.tree, 
@@ -196,6 +201,7 @@ static NTSTATUS connect_session_setup(struct composite_context *c,
        /* connect to a share using a tree connect */
        state->io_tcon->generic.level = RAW_TCON_TCONX;
        state->io_tcon->tconx.in.flags = TCONX_FLAG_EXTENDED_RESPONSE;
+       state->io_tcon->tconx.in.flags |= TCONX_FLAG_EXTENDED_SIGNATURES;
        state->io_tcon->tconx.in.password = data_blob(NULL, 0); 
        
        state->io_tcon->tconx.in.path = talloc_asprintf(state->io_tcon, 
index 2720a50c833ed7bfe7758ade3c749e2d2d7a7855..812f953ce853f26b7598dd4ee0dd780185c6cb98 100644 (file)
@@ -32,6 +32,7 @@
 #include "librpc/gen_ndr/ndr_lsa.h"
 #include "librpc/gen_ndr/ndr_lsa_c.h"
 #include "libcli/util/clilsa.h"
+#include "libcli/smb/smbXcli_base.h"
 
 struct smblsa_state {
        struct dcerpc_pipe *pipe;
@@ -69,6 +70,7 @@ static NTSTATUS smblsa_connect(struct smbcli_state *cli)
        /* connect to IPC$ */
        tcon.generic.level = RAW_TCON_TCONX;
        tcon.tconx.in.flags = TCONX_FLAG_EXTENDED_RESPONSE;
+       tcon.tconx.in.flags |= TCONX_FLAG_EXTENDED_SIGNATURES;
        tcon.tconx.in.password = data_blob(NULL, 0);
        tcon.tconx.in.path = "ipc$";
        tcon.tconx.in.device = "IPC";   
@@ -79,6 +81,10 @@ static NTSTATUS smblsa_connect(struct smbcli_state *cli)
        }
        lsa->ipc_tree->tid = tcon.tconx.out.tid;
 
+       if (tcon.tconx.out.options & SMB_EXTENDED_SIGNATURES) {
+               smb1cli_session_protect_session_key(cli->session->smbXcli);
+       }
+
        lsa->pipe = dcerpc_pipe_init(lsa, cli->transport->ev);
        if (lsa->pipe == NULL) {
                talloc_free(lsa);