ntvfs: Remove unused and untested SMB1 -> SMB2 proxy module
[bbaumbach/samba-autobuild/.git] / source4 / libcli / cliconnect.c
index 96946da7fec91cdd8640096252fdb7b5a169d1fa..58118b086aaddf4228e9859ffcf9c28388d0a8ac 100644 (file)
 #include "includes.h"
 #include "libcli/libcli.h"
 #include "libcli/raw/libcliraw.h"
+#include "libcli/raw/raw_proto.h"
 #include "libcli/auth/libcli_auth.h"
 #include "libcli/smb_composite/smb_composite.h"
-#include "param/param.h"
+#include "libcli/smb/smbXcli_base.h"
 
 /*
   wrapper around smbcli_sock_connect()
 */
-BOOL smbcli_socket_connect(struct smbcli_state *cli, const char *server)
+bool smbcli_socket_connect(struct smbcli_state *cli, const char *server, 
+                          const char **ports, 
+                          struct tevent_context *ev_ctx,
+                          struct resolve_context *resolve_ctx,
+                          struct smbcli_options *options,
+                          const char *socket_options,
+                          struct nbt_name *calling,
+                          struct nbt_name *called)
 {
-       struct smbcli_socket *sock;
-
-       sock = smbcli_sock_connect_byname(server, 0, NULL, NULL);
+       NTSTATUS status;
 
-       if (sock == NULL) return False;
-       
-       cli->transport = smbcli_transport_init(sock, cli, True);
-       if (!cli->transport) {
-               return False;
+       cli->options = *options;
+
+       status = smbcli_sock_connect(cli,
+                                    NULL, /* host_addr */
+                                    ports,
+                                    server,
+                                    resolve_ctx,
+                                    ev_ctx,
+                                    socket_options,
+                                    calling,
+                                    called,
+                                    &cli->sock);
+       if (!NT_STATUS_IS_OK(status)) {
+               return false;
        }
 
-       return True;
-}
-
-/* wrapper around smbcli_transport_connect() */
-BOOL smbcli_transport_establish(struct smbcli_state *cli, 
-                               struct nbt_name *calling,
-                               struct nbt_name *called)
-{
-       return smbcli_transport_connect(cli->transport, calling, called);
+       return true;
 }
 
 /* wrapper around smb_raw_negotiate() */
-NTSTATUS smbcli_negprot(struct smbcli_state *cli)
+NTSTATUS smbcli_negprot(struct smbcli_state *cli, bool unicode, int maxprotocol)
 {
-       return smb_raw_negotiate(cli->transport, 
-                                lp_cli_maxprotocol(global_loadparm));
+       if (unicode) {
+               cli->options.unicode = 1;
+       } else {
+               cli->options.unicode = 0;
+       }
+
+       cli->transport = smbcli_transport_init(cli->sock, cli,
+                                              true, &cli->options);
+       cli->sock = NULL;
+       if (!cli->transport) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       return smb_raw_negotiate(cli->transport, unicode, PROTOCOL_CORE, maxprotocol);
 }
 
 /* wrapper around smb_raw_sesssetup() */
 NTSTATUS smbcli_session_setup(struct smbcli_state *cli, 
-                             struct cli_credentials *credentials)
+                             struct cli_credentials *credentials,
+                             const char *workgroup,
+                             struct smbcli_session_options options,
+                             struct gensec_settings *gensec_settings)
 {
        struct smb_composite_sesssetup setup;
        NTSTATUS status;
 
-       cli->session = smbcli_session_init(cli->transport, cli, True);
+       cli->session = smbcli_session_init(cli->transport, cli, true,
+                                          options);
        if (!cli->session) return NT_STATUS_UNSUCCESSFUL;
 
        setup.in.sesskey = cli->transport->negotiate.sesskey;
        setup.in.capabilities = cli->transport->negotiate.capabilities;
        setup.in.credentials = credentials;
-       setup.in.workgroup = lp_workgroup(global_loadparm);
+       setup.in.workgroup = workgroup;
+       setup.in.gensec_settings = gensec_settings;
 
        status = smb_composite_sesssetup(cli->session, &setup);
 
@@ -91,7 +115,7 @@ NTSTATUS smbcli_tconX(struct smbcli_state *cli, const char *sharename,
        TALLOC_CTX *mem_ctx;
        NTSTATUS status;
 
-       cli->tree = smbcli_tree_init(cli->session, cli, True);
+       cli->tree = smbcli_tree_init(cli->session, cli, true);
        if (!cli->tree) return NT_STATUS_UNSUCCESSFUL;
 
        mem_ctx = talloc_init("tcon");
@@ -101,7 +125,8 @@ NTSTATUS smbcli_tconX(struct smbcli_state *cli, const char *sharename,
 
        /* setup a tree connect */
        tcon.generic.level = RAW_TCON_TCONX;
-       tcon.tconx.in.flags = 0;
+       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) {
@@ -117,9 +142,16 @@ NTSTATUS smbcli_tconX(struct smbcli_state *cli, const char *sharename,
        tcon.tconx.in.device = devtype;
        
        status = smb_raw_tcon(cli->tree, mem_ctx, &tcon);
-
+       if (!NT_STATUS_IS_OK(status)) {
+               goto out;
+       }
        cli->tree->tid = tcon.tconx.out.tid;
 
+       if (tcon.tconx.out.options & SMB_EXTENDED_SIGNATURES) {
+               smb1cli_session_protect_session_key(cli->tree->session->smbXcli);
+       }
+
+out:
        talloc_free(mem_ctx);
 
        return status;
@@ -132,10 +164,16 @@ NTSTATUS smbcli_tconX(struct smbcli_state *cli, const char *sharename,
 NTSTATUS smbcli_full_connection(TALLOC_CTX *parent_ctx,
                                struct smbcli_state **ret_cli, 
                                const char *host,
+                               const char **ports,
                                const char *sharename,
                                const char *devtype,
+                               const char *socket_options,
                                struct cli_credentials *credentials,
-                               struct event_context *ev)
+                               struct resolve_context *resolve_ctx,
+                               struct tevent_context *ev,
+                               struct smbcli_options *options,
+                               struct smbcli_session_options *session_options,
+                               struct gensec_settings *gensec_settings)
 {
        struct smbcli_tree *tree;
        NTSTATUS status;
@@ -143,8 +181,13 @@ NTSTATUS smbcli_full_connection(TALLOC_CTX *parent_ctx,
        *ret_cli = NULL;
 
        status = smbcli_tree_full_connection(parent_ctx,
-                                            &tree, host, 0, sharename, devtype,
-                                            credentials, ev);
+                                            &tree, host, ports, 
+                                            sharename, devtype,
+                                                socket_options,
+                                            credentials, resolve_ctx, ev,
+                                            options,
+                                            session_options,
+                                                gensec_settings);
        if (!NT_STATUS_IS_OK(status)) {
                goto done;
        }
@@ -212,13 +255,13 @@ bool smbcli_parse_unc(const char *unc_name, TALLOC_CTX *mem_ctx,
 {
        char *p;
 
-       *hostname = *sharename = NULL;
-
        if (strncmp(unc_name, "\\\\", 2) &&
            strncmp(unc_name, "//", 2)) {
-               return False;
+               return false;
        }
 
+       *hostname = *sharename = NULL;
+
        *hostname = talloc_strdup(mem_ctx, &unc_name[2]);
        p = terminate_path_at_separator(*hostname);
 
@@ -228,13 +271,13 @@ bool smbcli_parse_unc(const char *unc_name, TALLOC_CTX *mem_ctx,
        }
 
        if (*hostname && *sharename) {
-               return True;
+               return true;
        }
 
        talloc_free(*hostname);
        talloc_free(*sharename);
        *hostname = *sharename = NULL;
-       return False;
+       return false;
 }