1
0
mirror of https://github.com/tmate-io/tmate-ssh-server.git synced 2020-11-18 19:53:51 -08:00

reconnection wip

This commit is contained in:
Nicolas Viennot 2016-03-26 19:00:48 -04:00
parent 75c1caa708
commit c181b35615
7 changed files with 40 additions and 3 deletions

6
proc.c
View File

@ -225,6 +225,12 @@ proc_loop(struct tmuxproc *tp, int (*loopcb)(void))
do do
event_loop(EVLOOP_ONCE); event_loop(EVLOOP_ONCE);
while (!tp->exit && (loopcb == NULL || !loopcb ())); while (!tp->exit && (loopcb == NULL || !loopcb ()));
#ifdef TMATE_SLAVE
/* flush data on sockets */
event_loop(EVLOOP_ONCE | EVLOOP_NONBLOCK);
#endif
log_debug("%s loop exit", tp->name); log_debug("%s loop exit", tp->name);
} }

View File

@ -368,6 +368,18 @@ static void tmate_fin(__unused struct tmate_session *session,
request_server_termination(); request_server_termination();
} }
static void tmate_reconnect(__unused struct tmate_session *session,
__unused struct tmate_unpacker *uk)
{
/* Used by the proxy */
}
static void tmate_snapshot(__unused struct tmate_session *session,
__unused struct tmate_unpacker *uk)
{
/* TODO copy info back */
}
void tmate_dispatch_daemon_message(struct tmate_session *session, void tmate_dispatch_daemon_message(struct tmate_session *session,
struct tmate_unpacker *uk) struct tmate_unpacker *uk)
{ {
@ -384,6 +396,8 @@ void tmate_dispatch_daemon_message(struct tmate_session *session,
dispatch(TMATE_OUT_WRITE_COPY_MODE, tmate_write_copy_mode); dispatch(TMATE_OUT_WRITE_COPY_MODE, tmate_write_copy_mode);
dispatch(TMATE_OUT_FIN, tmate_fin); dispatch(TMATE_OUT_FIN, tmate_fin);
dispatch(TMATE_OUT_READY, tmate_ready); dispatch(TMATE_OUT_READY, tmate_ready);
dispatch(TMATE_OUT_RECONNECT, tmate_reconnect);
dispatch(TMATE_OUT_SNAPSHOT, tmate_snapshot);
default: tmate_fatal("Bad message type: %d", cmd); default: tmate_fatal("Bad message type: %d", cmd);
} }
} }

View File

@ -33,6 +33,7 @@ enum tmate_control_in_msg_types {
TMATE_CTL_PANE_KEYS, TMATE_CTL_PANE_KEYS,
TMATE_CTL_RESIZE, TMATE_CTL_RESIZE,
TMATE_CTL_EXEC_RESPONSE, TMATE_CTL_EXEC_RESPONSE,
TMATE_CTL_RENAME_SESSION,
}; };
/* /*
@ -41,6 +42,7 @@ enum tmate_control_in_msg_types {
[TMATE_CTL_PANE_KEYS, int: pane_id, string: keys] [TMATE_CTL_PANE_KEYS, int: pane_id, string: keys]
[TMATE_CTL_RESIZE, int: sx, int: sy] // sx == -1: no clients [TMATE_CTL_RESIZE, int: sx, int: sy] // sx == -1: no clients
[TMATE_CTL_EXEC_RESPONSE, int: exit_code, string: message] [TMATE_CTL_EXEC_RESPONSE, int: exit_code, string: message]
[TMATE_CTL_RENAME_SESSION, string: stoken, string: stoken_ro]
*/ */
enum tmate_daemon_out_msg_types { enum tmate_daemon_out_msg_types {
@ -54,6 +56,8 @@ enum tmate_daemon_out_msg_types {
TMATE_OUT_WRITE_COPY_MODE, TMATE_OUT_WRITE_COPY_MODE,
TMATE_OUT_FIN, TMATE_OUT_FIN,
TMATE_OUT_READY, TMATE_OUT_READY,
TMATE_OUT_RECONNECT,
TMATE_OUT_SNAPSHOT,
}; };
/* /*

View File

@ -158,6 +158,18 @@ static void ctl_ssh_exec_response(struct tmate_session *session,
free(message); free(message);
} }
static void ctl_rename_session(struct tmate_session *session,
struct tmate_unpacker *uk)
{
char *stoken = unpack_string(uk);
char *stoken_ro = unpack_string(uk);
set_session_token(session, stoken);
free(stoken);
free(stoken_ro);
}
static void tmate_dispatch_proxy_message(struct tmate_session *session, static void tmate_dispatch_proxy_message(struct tmate_session *session,
struct tmate_unpacker *uk) struct tmate_unpacker *uk)
{ {
@ -169,6 +181,7 @@ static void tmate_dispatch_proxy_message(struct tmate_session *session,
dispatch(TMATE_CTL_PANE_KEYS, ctl_pane_keys); dispatch(TMATE_CTL_PANE_KEYS, ctl_pane_keys);
dispatch(TMATE_CTL_RESIZE, ctl_resize); dispatch(TMATE_CTL_RESIZE, ctl_resize);
dispatch(TMATE_CTL_EXEC_RESPONSE, ctl_ssh_exec_response); dispatch(TMATE_CTL_EXEC_RESPONSE, ctl_ssh_exec_response);
dispatch(TMATE_CTL_RENAME_SESSION, ctl_rename_session);
default: tmate_warn("Bad proxy message type: %d", cmd); default: tmate_warn("Bad proxy message type: %d", cmd);
} }
} }

View File

@ -215,8 +215,8 @@ static char *get_random_token(void)
return token; return token;
} }
static void set_session_token(struct tmate_session *session, void set_session_token(struct tmate_session *session,
const char *token) const char *token)
{ {
char *path; char *path;
session->session_token = xstrdup(token); session->session_token = xstrdup(token);

View File

@ -116,7 +116,6 @@ static int auth_pubkey_cb(__unused ssh_session session,
switch (signature_state) { switch (signature_state) {
case SSH_PUBLICKEY_STATE_VALID: case SSH_PUBLICKEY_STATE_VALID:
client->username = xstrdup(user); client->username = xstrdup(user);
if (ssh_pki_export_pubkey_base64(pubkey, &client->pubkey) != SSH_OK) if (ssh_pki_export_pubkey_base64(pubkey, &client->pubkey) != SSH_OK)
tmate_fatal("error getting public key"); tmate_fatal("error getting public key");
return SSH_AUTH_SUCCESS; return SSH_AUTH_SUCCESS;

View File

@ -251,6 +251,7 @@ extern void tmate_get_random_bytes(void *buffer, ssize_t len);
extern long tmate_get_random_long(void); extern long tmate_get_random_long(void);
extern void request_server_termination(void); extern void request_server_termination(void);
extern void tmate_spawn_slave(struct tmate_session *session); extern void tmate_spawn_slave(struct tmate_session *session);
extern void set_session_token(struct tmate_session *session, const char *token);
/* tmate-proxy.c */ /* tmate-proxy.c */