client hacks
[metze/samba/wip.git] / source3 / libsmb / cliconnect.c
index ea7ddfef7335fd15490461e98377ad7aa908c472..f311fe7dedef901b21a97a52e4b4e7fdabd03fe5 100644 (file)
@@ -72,18 +72,6 @@ static NTSTATUS smb_bytes_talloc_string(TALLOC_CTX *mem_ctx,
        return NT_STATUS_OK;
 }
 
-/**
- * Set the user session key for a connection
- * @param cli The cli structure to add it too
- * @param session_key The session key used.  (A copy of this is taken for the cli struct)
- *
- */
-
-static void cli_set_session_key (struct cli_state *cli, const DATA_BLOB session_key) 
-{
-       cli->user_session_key = data_blob(session_key.data, session_key.length);
-}
-
 /****************************************************************************
  Do an old lanman2 style session setup.
 ****************************************************************************/
@@ -1094,9 +1082,6 @@ static void cli_session_setup_nt1_done(struct tevent_req *subreq)
        if (state->session_key.data) {
                struct smbXcli_session *session = state->cli->smb1.session;
 
-               /* Have plaintext orginal */
-               cli_set_session_key(cli, state->session_key);
-
                status = smb1cli_session_set_session_key(session,
                                state->session_key);
                if (tevent_req_nterror(req, status)) {
@@ -1476,7 +1461,7 @@ static struct tevent_req *cli_session_setup_kerberos_send(
         * we have to acquire a ticket. To be fixed later :-)
         */
        rc = spnego_gen_krb5_negTokenInit(state, principal, 0, &state->negTokenTarg,
-                                    &state->session_key_krb5, 0, NULL);
+                                    &state->session_key_krb5, 0, NULL, NULL);
        if (rc) {
                DEBUG(1, ("cli_session_setup_kerberos: "
                          "spnego_gen_krb5_negTokenInit failed: %s\n",
@@ -1525,8 +1510,6 @@ static void cli_session_setup_kerberos_done(struct tevent_req *subreq)
                return;
        }
 
-       cli_set_session_key(state->cli, state->session_key_krb5);
-
        if (smbXcli_conn_protocol(state->cli->conn) >= PROTOCOL_SMB2_02) {
                struct smbXcli_session *session = state->cli->smb2.session;
                status = smb2cli_session_set_session_key(session,
@@ -1727,8 +1710,6 @@ static void cli_session_setup_ntlmssp_done(struct tevent_req *subreq)
                                return;
                        }
                }
-               cli_set_session_key(
-                       state->cli, state->ntlmssp_state->session_key);
 
                if (smbXcli_conn_protocol(state->cli->conn) >= PROTOCOL_SMB2_02) {
                        struct smbXcli_session *session = state->cli->smb2.session;
@@ -2067,7 +2048,9 @@ NTSTATUS cli_session_setup(struct cli_state *cli,
            (p=strchr_m(user2,*lp_winbind_separator()))) {
                *p = 0;
                user = p+1;
-               strupper_m(user2);
+               if (!strupper_m(user2)) {
+                       return NT_STATUS_INVALID_PARAMETER;
+               }
                workgroup = user2;
        }
 
@@ -2274,6 +2257,7 @@ struct tevent_req *cli_tcon_andx_create(TALLOC_CTX *mem_ctx,
        char *tmp = NULL;
        uint8_t *bytes;
        uint16_t sec_mode = smb1cli_conn_server_security_mode(cli->conn);
+       uint16_t tcon_flags = 0;
 
        *psmbreq = NULL;
 
@@ -2349,10 +2333,18 @@ struct tevent_req *cli_tcon_andx_create(TALLOC_CTX *mem_ctx,
                }
        }
 
+       tcon_flags |= TCONX_FLAG_EXTENDED_RESPONSE;
+{
+static int c = 0;
+if (c > 0) {
+       tcon_flags |= TCONX_FLAG_EXTENDED_SIGNATURES;
+}
+c++;
+}
        SCVAL(vwv+0, 0, 0xFF);
        SCVAL(vwv+0, 1, 0);
        SSVAL(vwv+1, 0, 0);
-       SSVAL(vwv+2, 0, TCONX_FLAG_EXTENDED_RESPONSE);
+       SSVAL(vwv+2, 0, tcon_flags);
        SSVAL(vwv+3, 0, passlen);
 
        if (passlen && pass) {
@@ -2447,6 +2439,7 @@ static void cli_tcon_andx_done(struct tevent_req *subreq)
        uint32_t num_bytes;
        uint8_t *bytes;
        NTSTATUS status;
+       uint16_t optional_support = 0;
 
        status = cli_smb_recv(subreq, state, &in, 0, &wct, &vwv,
                              &num_bytes, &bytes);
@@ -2490,7 +2483,15 @@ static void cli_tcon_andx_done(struct tevent_req *subreq)
        cli->dfsroot = false;
 
        if ((wct > 2) && (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_LANMAN2)) {
-               cli->dfsroot = ((SVAL(vwv+2, 0) & SMB_SHARE_IN_DFS) != 0);
+               optional_support = SVAL(vwv+2, 0);
+       }
+
+       if (optional_support & SMB_SHARE_IN_DFS) {
+               cli->dfsroot = true;
+       }
+
+       if (optional_support & SMB_EXTENDED_SIGNATURES) {
+               smb1cli_session_protect_session_key(cli->smb1.session);
        }
 
        cli_state_set_tid(cli, SVAL(inhdr, HDR_TID));