mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-09 07:13:43 -05:00
Allow new_connection to take an optional Seat. (NFC)
This is working towards allowing the subsidiary SSH connection in an SshProxy to share the main user-facing Seat, so as to be able to pass through interactive prompts. This is more difficult than the similar change with LogPolicy, because Seats are stateful. In particular, the trust-sigil status will need to be controlled by the SshProxy until it's ready to pass over control to the main SSH (or whatever) connection. To make this work, I've introduced a thing called a TempSeat, which is (yet) another Seat implementation. When a backend hands its Seat to new_connection(), it does it in a way that allows new_connection() to borrow it completely, and replace it in the main backend structure with a TempSeat, which acts as a temporary placeholder. If the main backend tries to do things like changing trust status or sending output, the TempSeat will buffer them; later on, when the connection is established, TempSeat will replay the changes into the real Seat. So, in each backend, I've made the following changes: - pass &foo->seat to new_connection, which may overwrite it with a TempSeat. - if it has done so (which we can tell via the is_tempseat() query function), then we have to free the TempSeat and reinstate our main Seat. The signal that we can do so is the PLUGLOG_CONNECT_SUCCESS notification, which indicates that SshProxy has finished all its connection setup work. - we also have to remember to free the TempSeat if our backend is disposed of without that having happened (e.g. because the connection _doesn't_ succeed). - in backends which have no local auth phase to worry about, ensure we don't call seat_set_trust_status on the main Seat _before_ it gets potentially replaced with a TempSeat. Moved some calls of seat_set_trust_status to just after new_connection(), so that now the initial trust status setup will go into the TempSeat (if appropriate) and be buffered until that seat is relinquished. In all other uses of new_connection, where we don't have a Seat available at all, we just pass NULL. This is NFC, because neither new_connection() nor any of its delegates will _actually_ do this replacement yet. We're just setting up the framework to enable it to do so in the next commit.
This commit is contained in:
19
network.h
19
network.h
@ -121,11 +121,28 @@ struct PlugVtable {
|
||||
* host proxy). If you don't have one, all proxy types are required to
|
||||
* be able to manage without (and will just degrade their logging
|
||||
* control).
|
||||
*
|
||||
* If calling this from a backend with a Seat, you can also give it a
|
||||
* pointer to your 'Seat *'. In that situation, it might replace the
|
||||
* 'Seat *' with a temporary seat of its own, and give the real Seat
|
||||
* to the proxy system so that it can ask for passwords (and, in the
|
||||
* case of SSH proxying, other prompts like host key checks). If that
|
||||
* happens, then the resulting 'temp seat' is the backend's property,
|
||||
* and it will have to remember to free it when cleaning up, or after
|
||||
* flushing it back into the real seat when the network connection
|
||||
* attempt completes.
|
||||
*
|
||||
* You can free your TempSeat and resume using the real Seat when one
|
||||
* of two things happens: either your Plug's closing() method is
|
||||
* called (indicating failure to connect), or its log() method is
|
||||
* called with PLUGLOG_CONNECT_SUCCESS. In the latter case, you'll
|
||||
* probably want to flush the TempSeat's contents into the real Seat,
|
||||
* of course.
|
||||
*/
|
||||
Socket *new_connection(SockAddr *addr, const char *hostname,
|
||||
int port, bool privport,
|
||||
bool oobinline, bool nodelay, bool keepalive,
|
||||
Plug *plug, Conf *conf, LogPolicy *lp);
|
||||
Plug *plug, Conf *conf, LogPolicy *lp, Seat **seat);
|
||||
Socket *new_listener(const char *srcaddr, int port, Plug *plug,
|
||||
bool local_host_only, Conf *conf, int addressfamily);
|
||||
SockAddr *name_lookup(const char *host, int port, char **canonicalname,
|
||||
|
Reference in New Issue
Block a user