s3:libsmb: change the connect banner to "Server=[%s] Protocol=[%s]"
[metze/samba/wip.git] / source3 / libsmb / clidfs.c
index 0dfb8b336064595490561b7be2b5630dde651055..2e9107866cbe953e97a9e2bdba368b50efea2646 100644 (file)
@@ -133,8 +133,10 @@ NTSTATUS cli_cm_force_encryption(struct cli_state *c,
 
 static NTSTATUS do_connect(TALLOC_CTX *ctx,
                                        const char *server,
+                                       const struct sockaddr_storage *dest_ss,
                                        const char *share,
                                        const struct user_auth_info *auth_info,
+                                       bool show_sessetup,
                                        bool force_encrypt,
                                        int max_protocol,
                                        int port,
@@ -191,14 +193,18 @@ static NTSTATUS do_connect(TALLOC_CTX *ctx,
        }
 
        status = cli_connect_nb(
-               server, NULL, port, name_type, NULL,
+               server, dest_ss, port, name_type, NULL,
                signing_state,
                flags, &c);
 
        if (!NT_STATUS_IS_OK(status)) {
-               d_printf("Connection to %s failed (Error %s)\n",
-                               server,
-                               nt_errstr(status));
+               if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
+                       DBG_ERR("NetBIOS support disabled, unable to connect");
+               }
+
+               DBG_WARNING("Connection to %s failed (Error %s)\n",
+                           server,
+                           nt_errstr(status));
                return status;
        }
 
@@ -255,6 +261,18 @@ static NTSTATUS do_connect(TALLOC_CTX *ctx,
                return status;
        }
 
+       if ( show_sessetup ) {
+               const char *server_name = NULL;
+               enum protocol_types protocol;
+               const char *protocol_name = NULL;
+
+               server_name = smbXcli_conn_remote_name(c->conn);
+               protocol = smbXcli_conn_protocol(c->conn);
+               protocol_name = smb_protocol_types_string(protocol);
+
+               DEBUG(0,("Server=[%s] Protocol=[%s]\n",
+                        server_name, protocol_name));
+       }
        DEBUG(4,(" session setup ok\n"));
 
        /* here's the fun part....to support 'msdfs proxy' shares
@@ -267,8 +285,8 @@ static NTSTATUS do_connect(TALLOC_CTX *ctx,
                                &newserver, &newshare,
                                force_encrypt, creds)) {
                cli_shutdown(c);
-               return do_connect(ctx, newserver,
-                               newshare, auth_info,
+               return do_connect(ctx, newserver, NULL,
+                               newshare, auth_info, false,
                                force_encrypt, max_protocol,
                                port, name_type, pcli);
        }
@@ -321,6 +339,7 @@ static void cli_set_mntpoint(struct cli_state *cli, const char *mnt)
 static NTSTATUS cli_cm_connect(TALLOC_CTX *ctx,
                               struct cli_state *referring_cli,
                               const char *server,
+                              const struct sockaddr_storage *dest_ss,
                               const char *share,
                               const struct user_auth_info *auth_info,
                               bool force_encrypt,
@@ -332,9 +351,9 @@ static NTSTATUS cli_cm_connect(TALLOC_CTX *ctx,
        struct cli_state *cli;
        NTSTATUS status;
 
-       status = do_connect(ctx, server, share,
+       status = do_connect(ctx, server, dest_ss, share,
                                auth_info,
-                               force_encrypt, max_protocol,
+                               show_hdr, force_encrypt, max_protocol,
                                port, name_type, &cli);
 
        if (!NT_STATUS_IS_OK(status)) {
@@ -408,6 +427,7 @@ static struct cli_state *cli_cm_find(struct cli_state *cli,
 NTSTATUS cli_cm_open(TALLOC_CTX *ctx,
                                struct cli_state *referring_cli,
                                const char *server,
+                               const struct sockaddr_storage *dest_ss,
                                const char *share,
                                const struct user_auth_info *auth_info,
                                bool force_encrypt,
@@ -437,6 +457,7 @@ NTSTATUS cli_cm_open(TALLOC_CTX *ctx,
        status = cli_cm_connect(ctx,
                                referring_cli,
                                server,
+                               dest_ss,
                                share,
                                auth_info,
                                force_encrypt,
@@ -904,6 +925,8 @@ NTSTATUS cli_resolve_path(TALLOC_CTX *ctx,
        SMB_STRUCT_STAT sbuf;
        uint32_t attributes;
        NTSTATUS status;
+       struct cli_credentials *dfs_creds = NULL;
+       bool force_encryption = true;
        struct smbXcli_tcon *root_tcon = NULL;
        struct smbXcli_tcon *target_tcon = NULL;
        struct cli_dfs_path_split *dfs_refs = NULL;
@@ -916,8 +939,10 @@ NTSTATUS cli_resolve_path(TALLOC_CTX *ctx,
 
        if (smbXcli_conn_protocol(rootcli->conn) >= PROTOCOL_SMB2_02) {
                root_tcon = rootcli->smb2.tcon;
+               force_encryption = smb2cli_tcon_is_encryption_on(root_tcon);
        } else {
                root_tcon = rootcli->smb1.tcon;
+               force_encryption = smb1cli_conn_encryption_on(rootcli->conn);
        }
 
        /*
@@ -982,20 +1007,30 @@ NTSTATUS cli_resolve_path(TALLOC_CTX *ctx,
 
        /* Check for the referral. */
 
-       status = cli_cm_open(ctx,
-                            rootcli,
-                            smbXcli_conn_remote_name(rootcli->conn),
-                            "IPC$",
-                            dfs_auth_info,
-                            cli_state_is_encryption_on(rootcli),
-                            smbXcli_conn_protocol(rootcli->conn),
-                            0,
-                            0x20,
-                            &cli_ipc);
+       cli_ipc = cli_state_dup(ctx, rootcli);
+       if (cli_ipc == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       dfs_creds = get_cmdline_auth_info_creds(auth_info);
+
+       status = cli_tree_connect_creds(cli_ipc, "IPC$", "IPC", dfs_creds);
        if (!NT_STATUS_IS_OK(status)) {
+               d_printf("tree connect failed: %s\n", nt_errstr(status));
+               cli_shutdown(cli_ipc);
                return status;
        }
 
+       if (force_encrypt) {
+               status = cli_cm_force_encryption_creds(cli_ipc,
+                                                      dfs_creds,
+                                                      "IPC$");
+               if (!NT_STATUS_IS_OK(status)) {
+                       cli_shutdown(cli_ipc);
+                       return status;
+               }
+       }
+
        status = cli_dfs_get_referral(ctx, cli_ipc, dfs_path, &refs,
                                      &num_refs, &consumed);
        if (!NT_STATUS_IS_OK(status)) {
@@ -1042,6 +1077,7 @@ NTSTATUS cli_resolve_path(TALLOC_CTX *ctx,
                /* Connect to the target server & share */
                status = cli_cm_connect(ctx, rootcli,
                                dfs_refs[count].server,
+                               NULL,
                                dfs_refs[count].share,
                                dfs_auth_info,
                                cli_state_is_encryption_on(rootcli),