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;
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);
}
/*
/* 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)) {