mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 17:38:00 +00:00
New plug_closing error type for 'user abort'.
This is generated when setup of a network connection is cancelled by deliberate user action, namely, pressing ^C or ^D or the like at a get_userpass_input prompt presented during proxy setup. It's handled just like normal socket setup errors, except that it omits the call to seat_connection_fatal, on the grounds that in this one case of connection-setup failure, the user doesn't need to be _informed_ that the connection failed - they already know, because they failed it themself on purpose.
This commit is contained in:
parent
0fe41294e6
commit
2ae338b407
13
network.h
13
network.h
@ -55,6 +55,7 @@ typedef enum PlugCloseType {
|
||||
PLUGCLOSE_NORMAL,
|
||||
PLUGCLOSE_ERROR,
|
||||
PLUGCLOSE_BROKEN_PIPE,
|
||||
PLUGCLOSE_USER_ABORT,
|
||||
} PlugCloseType;
|
||||
|
||||
struct PlugVtable {
|
||||
@ -112,6 +113,16 @@ struct PlugVtable {
|
||||
* distinguishes the particular error condition signalled by
|
||||
* EPIPE / ERROR_BROKEN_PIPE, which ssh/sharing.c needs to
|
||||
* recognise and handle specially in one situation.
|
||||
*
|
||||
* - PLUGCLOSE_USER_ABORT means that the close has happened as a
|
||||
* result of some kind of deliberate user action (e.g. hitting
|
||||
* ^C at a password prompt presented by a proxy socket setup
|
||||
* phase). This can be used to suppress interactive error
|
||||
* messages sent to the user (such as dialog boxes), on the
|
||||
* grounds that the user already knows. However, 'error_msg'
|
||||
* will still contain some appropriate text, so that
|
||||
* non-interactive error reporting (e.g. event logs) can still
|
||||
* record why the connection terminated.
|
||||
*/
|
||||
void (*closing)(Plug *p, PlugCloseType type, const char *error_msg);
|
||||
|
||||
@ -242,6 +253,8 @@ static inline void plug_closing_normal(Plug *p)
|
||||
{ p->vt->closing(p, PLUGCLOSE_NORMAL, NULL); }
|
||||
static inline void plug_closing_error(Plug *p, const char *msg)
|
||||
{ p->vt->closing(p, PLUGCLOSE_ERROR, msg); }
|
||||
static inline void plug_closing_user_abort(Plug *p)
|
||||
{ p->vt->closing(p, PLUGCLOSE_USER_ABORT, "User aborted connection setup"); }
|
||||
static inline void plug_receive(Plug *p, int urg, const char *data, size_t len)
|
||||
{ p->vt->receive(p, urg, data, len); }
|
||||
static inline void plug_sent (Plug *p, size_t bufsize)
|
||||
|
@ -79,7 +79,8 @@ static void raw_closing(Plug *plug, PlugCloseType type, const char *error_msg)
|
||||
seat_notify_remote_disconnect(raw->seat);
|
||||
}
|
||||
logevent(raw->logctx, error_msg);
|
||||
seat_connection_fatal(raw->seat, "%s", error_msg);
|
||||
if (type != PLUGCLOSE_USER_ABORT)
|
||||
seat_connection_fatal(raw->seat, "%s", error_msg);
|
||||
} else {
|
||||
/* Otherwise, the remote side closed the connection normally. */
|
||||
if (!raw->sent_console_eof && seat_eof(raw->seat)) {
|
||||
|
@ -107,7 +107,8 @@ static void rlogin_closing(Plug *plug, PlugCloseType type,
|
||||
if (type != PLUGCLOSE_NORMAL) {
|
||||
/* A socket error has occurred. */
|
||||
logevent(rlogin->logctx, error_msg);
|
||||
seat_connection_fatal(rlogin->seat, "%s", error_msg);
|
||||
if (type != PLUGCLOSE_USER_ABORT)
|
||||
seat_connection_fatal(rlogin->seat, "%s", error_msg);
|
||||
}
|
||||
/* Otherwise, the remote side closed the connection normally. */
|
||||
}
|
||||
|
@ -594,7 +594,8 @@ static void supdup_closing(Plug *plug, PlugCloseType type,
|
||||
}
|
||||
if (type != PLUGCLOSE_NORMAL) {
|
||||
logevent(supdup->logctx, error_msg);
|
||||
seat_connection_fatal(supdup->seat, "%s", error_msg);
|
||||
if (type != PLUGCLOSE_USER_ABORT)
|
||||
seat_connection_fatal(supdup->seat, "%s", error_msg);
|
||||
}
|
||||
/* Otherwise, the remote side closed the connection normally. */
|
||||
}
|
||||
|
@ -656,7 +656,8 @@ static void telnet_closing(Plug *plug, PlugCloseType type,
|
||||
}
|
||||
if (type != PLUGCLOSE_NORMAL) {
|
||||
logevent(telnet->logctx, error_msg);
|
||||
seat_connection_fatal(telnet->seat, "%s", error_msg);
|
||||
if (type != PLUGCLOSE_USER_ABORT)
|
||||
seat_connection_fatal(telnet->seat, "%s", error_msg);
|
||||
}
|
||||
/* Otherwise, the remote side closed the connection normally. */
|
||||
}
|
||||
|
@ -13,18 +13,6 @@
|
||||
|
||||
const bool ssh_proxy_supported = true;
|
||||
|
||||
/*
|
||||
* TODO for future work:
|
||||
*
|
||||
* If the user manually aborts the attempt to make the proxy SSH
|
||||
* connection (e.g. by hitting ^C at a userpass prompt, or refusing to
|
||||
* accept the proxy server's host key), then I think it would be nicer
|
||||
* if we didn't give a connection_fatal error box. If I've aborted the
|
||||
* connection deliberately, I don't need to be told it happened, and
|
||||
* I'd rather not have the UI annoyance of clicking away an extra
|
||||
* error dialog.
|
||||
*/
|
||||
|
||||
typedef struct SshProxy {
|
||||
char *errmsg;
|
||||
Conf *conf;
|
||||
@ -318,6 +306,8 @@ static void sshproxy_send_close(SshProxy *sp)
|
||||
|
||||
if (sp->errmsg)
|
||||
plug_closing_error(sp->plug, sp->errmsg);
|
||||
else if (!sp->conn_established && backend_exitcode(sp->backend) == 0)
|
||||
plug_closing_user_abort(sp->plug);
|
||||
else
|
||||
plug_closing_normal(sp->plug);
|
||||
}
|
||||
|
@ -606,7 +606,9 @@ static void ssh_socket_log(Plug *plug, PlugLogType type, SockAddr *addr,
|
||||
static void ssh_closing(Plug *plug, PlugCloseType type, const char *error_msg)
|
||||
{
|
||||
Ssh *ssh = container_of(plug, Ssh, plug);
|
||||
if (type != PLUGCLOSE_NORMAL) {
|
||||
if (type == PLUGCLOSE_USER_ABORT) {
|
||||
ssh_user_close(ssh, "%s", error_msg);
|
||||
} else if (type != PLUGCLOSE_NORMAL) {
|
||||
ssh_remote_error(ssh, "%s", error_msg);
|
||||
} else if (ssh->bpp) {
|
||||
ssh->bpp->input_eof = true;
|
||||
|
Loading…
Reference in New Issue
Block a user