1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-08 08:58:00 +00:00

Permit protocol selection in file transfer tools.

PSCP and PSFTP can only work over a protocol enough like SSH to be
able to run subsystems (or at the very least a remote command, for
old-style PSCP). Historically we've implemented this restriction by
having them not support any protocol-selection command-line options at
all, and hardwiring them to instantiating ssh_backend.

This commit regularises them to be more like the rest of the tools.
You can select a protocol using the appropriate command-line option,
provided it's a protocol in those tools' backends[] array. And the
setup code will find the BackendVtable to instantiate by the usual
method of calling backend_vt_from_proto.

Currently, this makes essentially no difference: those tools link in
be_ssh.c, which means the only supported backend is SSH. So the effect
is that now -ssh is an accepted option with no effect, instead of
being rejected. But it opens the way to add other protocols that are
SSH-like enough to run file transfer over.
This commit is contained in:
Simon Tatham 2020-02-22 15:29:45 +00:00
parent 1f399bec58
commit 91c2e6b4d5
4 changed files with 21 additions and 13 deletions

View File

@ -1,8 +1,7 @@
/*
* Linking module for programs that are restricted to only using SSH
* (pscp and psftp). These do not support selection of backend, but
* must still have a backends[] array mentioning SSH because
* settings.c will want to consult it during session load.
* Linking module for programs that are restricted to only using
* SSH-type protocols (pscp and psftp). These still have a choice of
* two actual backends, because they can also speak PROT_SSHCONN.
*/
#include <stdio.h>
@ -12,5 +11,6 @@ const int be_default_protocol = PROT_SSH;
const struct BackendVtable *const backends[] = {
&ssh_backend,
&sshconn_backend,
NULL
};

View File

@ -408,7 +408,7 @@ int cmdline_process_param(const char *p, char *value,
for (size_t i = 0; backends[i]; i++) {
if (p[0] == '-' && !strcmp(p+1, backends[i]->id)) {
RETURN(1);
UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK);
UNAVAILABLE_IN(TOOLTYPE_NONNETWORK);
SAVEABLE(0);
set_protocol(conf, backends[i]->protocol);
if (backends[i]->default_port)

12
pscp.c
View File

@ -322,10 +322,12 @@ static void do_cmd(char *host, char *user, char *cmd)
}
/*
* Force use of SSH. (If they got the protocol wrong we assume the
* port is useless too.)
* Force protocol to SSH if the user has somehow contrived to
* select one we don't support (e.g. by loading an inappropriate
* saved session). In that situation we assume the port number is
* useless too.)
*/
if (conf_get_int(conf, CONF_protocol) != PROT_SSH) {
if (!backend_vt_from_proto(conf_get_int(conf, CONF_protocol))) {
conf_set_int(conf, CONF_protocol, PROT_SSH);
conf_set_int(conf, CONF_port, 22);
}
@ -449,7 +451,9 @@ static void do_cmd(char *host, char *user, char *cmd)
platform_psftp_pre_conn_setup(console_cli_logpolicy);
err = backend_init(&ssh_backend, pscp_seat, &backend, logctx, conf,
err = backend_init(backend_vt_from_proto(
conf_get_int(conf, CONF_protocol)),
pscp_seat, &backend, logctx, conf,
conf_get_str(conf, CONF_host),
conf_get_int(conf, CONF_port),
&realhost, 0,

12
psftp.c
View File

@ -2593,10 +2593,12 @@ static int psftp_connect(char *userhost, char *user, int portnumber)
}
/*
* Force use of SSH. (If they got the protocol wrong we assume the
* port is useless too.)
* Force protocol to SSH if the user has somehow contrived to
* select one we don't support (e.g. by loading an inappropriate
* saved session). In that situation we assume the port number is
* useless too.)
*/
if (conf_get_int(conf, CONF_protocol) != PROT_SSH) {
if (!backend_vt_from_proto(conf_get_int(conf, CONF_protocol))) {
conf_set_int(conf, CONF_protocol, PROT_SSH);
conf_set_int(conf, CONF_port, 22);
}
@ -2713,7 +2715,9 @@ static int psftp_connect(char *userhost, char *user, int portnumber)
platform_psftp_pre_conn_setup(console_cli_logpolicy);
err = backend_init(&ssh_backend, psftp_seat, &backend, psftp_logctx, conf,
err = backend_init(backend_vt_from_proto(
conf_get_int(conf, CONF_protocol)),
psftp_seat, &backend, psftp_logctx, conf,
conf_get_str(conf, CONF_host),
conf_get_int(conf, CONF_port),
&realhost, 0,