TODO use cli_state_dup
authorStefan Metzmacher <metze@samba.org>
Wed, 21 Jun 2017 13:41:33 +0000 (15:41 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 18 Feb 2019 11:47:34 +0000 (12:47 +0100)
source3/libsmb/clidfs.c

index d49c48859fff9dae90d081b2cd1e83bed0a71ac2..187847fed176a55a01fbf604c7ba121c1e2a9092 100644 (file)
@@ -918,6 +918,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;
@@ -930,8 +932,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);
        }
 
        /*
@@ -996,20 +1000,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)) {