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,
}
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;
}
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
&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);
}
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,
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)) {
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,
status = cli_cm_connect(ctx,
referring_cli,
server,
+ dest_ss,
share,
auth_info,
force_encrypt,
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)) {
/* 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),