Allow users to specify their own tmate servers

Options:
- tmate-server-host
- tmate-server-port
- tmate-server-dsa-fingerprint
- tmate-server-rsa-fingerprint
- tmate-server-ecdsa-fingerprint
This commit is contained in:
Nicolas Viennot 2013-10-04 17:36:46 -04:00
parent bb5634ce20
commit 0d182e707e
6 changed files with 61 additions and 48 deletions

View File

@ -25,10 +25,6 @@ CFLAGS += -Wno-unused-parameter -Wno-unused-variable
CFLAGS += -Ilibssh/include/ -Imsgpack/src
CFLAGS += -rdynamic # for stack traces
if IS_DEVENV
CFLAGS += -DDEVENV
endif
# Set flags for gcc. gcc4 whines abouts silly stuff so it needs slightly
# different flags.
if IS_GCC

View File

@ -40,13 +40,6 @@ AC_CHECK_HEADERS(
]
)
AC_ARG_ENABLE(
devenv,
AC_HELP_STRING(--enable-devenv, "dev env (localhost, port 2200, no auth checks)"),
found_devenv=$enable_devenv
)
AM_CONDITIONAL(IS_DEVENV, test "x$found_devenv" = xyes)
# Is this a debug build?
#found_debug=yes
AC_ARG_ENABLE(

View File

@ -169,18 +169,6 @@ const struct options_table_entry session_options_table[] = {
.default_num = 750
},
{ .name = "tmate-display-time",
.type = OPTIONS_TABLE_NUMBER,
.minimum = 1,
.maximum = INT_MAX,
.default_num = 30000
},
{ .name = "tmate-identity",
.type = OPTIONS_TABLE_STRING,
.default_str = ""
},
{ .name = "history-limit",
.type = OPTIONS_TABLE_NUMBER,
.minimum = 0,
@ -463,6 +451,46 @@ const struct options_table_entry session_options_table[] = {
.default_str = " -_@"
},
{ .name = "tmate-display-time",
.type = OPTIONS_TABLE_NUMBER,
.minimum = 1,
.maximum = INT_MAX,
.default_num = 30000
},
{ .name = "tmate-identity",
.type = OPTIONS_TABLE_STRING,
.default_str = ""
},
{ .name = "tmate-server-host",
.type = OPTIONS_TABLE_STRING,
.default_str = "master.tmate.io"
},
{ .name = "tmate-server-port",
.type = OPTIONS_TABLE_NUMBER,
.minimum = 1,
.maximum = 65535,
.default_num = 22
},
{ .name = "tmate-server-dsa-fingerprint",
.type = OPTIONS_TABLE_STRING,
.default_str = "f5:26:31:c3:8a:78:6e:5c:77:74:0f:41:5b:5f:21:88"
},
{ .name = "tmate-server-rsa-fingerprint",
.type = OPTIONS_TABLE_STRING,
.default_str = "af:2d:81:c1:fe:49:70:2d:7f:09:a9:d7:4b:32:e3:be"
},
{ .name = "tmate-server-ecdsa-fingerprint",
.type = OPTIONS_TABLE_STRING,
.default_str = "c7:a1:51:36:d2:bb:35:4b:0a:1a:c0:43:97:74:ea:42"
},
{ .name = NULL }
};

View File

@ -29,10 +29,11 @@ static void dns_cb(int errcode, struct evutil_addrinfo *addr, void *ptr)
struct tmate_ssh_client *client;
struct evutil_addrinfo *ai;
struct timeval tv;
const char *host = ptr;
if (errcode) {
tmate_status_message("%s lookup failure. Retrying in %d seconds (%s)",
TMATE_HOST, TMATE_DNS_RETRY_TIMEOUT,
host, TMATE_DNS_RETRY_TIMEOUT,
evutil_gai_strerror(errcode));
tv.tv_sec = TMATE_DNS_RETRY_TIMEOUT;
@ -44,7 +45,7 @@ static void dns_cb(int errcode, struct evutil_addrinfo *addr, void *ptr)
return;
}
tmate_status_message("Connecting to %s...", TMATE_HOST);
tmate_status_message("Connecting to %s...", host);
for (ai = addr; ai; ai = ai->ai_next) {
char buf[128];
@ -79,6 +80,7 @@ static void dns_cb(int errcode, struct evutil_addrinfo *addr, void *ptr)
static void lookup_and_connect(void)
{
struct evutil_addrinfo hints;
const char *tmate_server_host;
if (!ev_dnsbase)
ev_dnsbase = evdns_base_new(ev_base, 1);
@ -91,9 +93,11 @@ static void lookup_and_connect(void)
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
tmate_info("Looking up %s...", TMATE_HOST);
(void)evdns_getaddrinfo(ev_dnsbase, TMATE_HOST, NULL,
&hints, dns_cb, NULL);
tmate_server_host = options_get_string(&global_s_options,
"tmate-server-host");
tmate_info("Looking up %s...", tmate_server_host);
(void)evdns_getaddrinfo(ev_dnsbase, tmate_server_host, NULL,
&hints, dns_cb, tmate_server_host);
}
void tmate_session_init(void)

View File

@ -168,10 +168,11 @@ static void on_session_event(struct tmate_ssh_client *client)
unsigned char *hash;
ssize_t hash_len;
char *hash_str;
char *server_hash_str;
int match;
int verbosity = SSH_LOG_NOLOG + debug_level;
int port = TMATE_PORT;
int port = options_get_number(&global_s_options, "tmate-server-port");
ssh_session session = client->session;
ssh_channel channel = client->channel;
@ -241,24 +242,26 @@ static void on_session_event(struct tmate_ssh_client *client)
if (ssh_get_publickey(session, &pubkey) < 0)
tmate_fatal("ssh_get_publickey");
#ifdef DEVENV
match = 1;
#else
key_type = ssh_key_type(pubkey);
switch (key_type) {
case SSH_KEYTYPE_DSS:
match = !strcmp(hash_str, TMATE_HOST_DSA_KEY);
server_hash_str = options_get_string(&global_s_options,
"tmate-server-dsa-fingerprint");
break;
case SSH_KEYTYPE_RSA:
match = !strcmp(hash_str, TMATE_HOST_RSA_KEY);
server_hash_str = options_get_string(&global_s_options,
"tmate-server-rsa-fingerprint");
break;
case SSH_KEYTYPE_ECDSA:
match = !strcmp(hash_str, TMATE_HOST_ECDSA_KEY);
server_hash_str = options_get_string(&global_s_options,
"tmate-server-ecdsa-fingerprint");
break;
default:
match = 0;
server_hash_str = "";
}
#endif
match = !strcmp(hash_str, server_hash_str);
ssh_key_free(pubkey);
ssh_clean_pubkey_hash(&hash);

11
tmate.h
View File

@ -72,17 +72,6 @@ extern void tmate_decoder_commit(struct tmate_decoder *decoder, size_t len);
/* tmate-ssh-client.c */
#ifdef DEVENV
#define TMATE_HOST "localhost"
#define TMATE_PORT 2200
#else
#define TMATE_HOST "master.tmate.io"
#define TMATE_PORT 22
#define TMATE_HOST_DSA_KEY "f5:26:31:c3:8a:78:6e:5c:77:74:0f:41:5b:5f:21:88"
#define TMATE_HOST_RSA_KEY "af:2d:81:c1:fe:49:70:2d:7f:09:a9:d7:4b:32:e3:be"
#define TMATE_HOST_ECDSA_KEY "c7:a1:51:36:d2:bb:35:4b:0a:1a:c0:43:97:74:ea:42"
#endif
enum tmate_ssh_client_state_types {
SSH_NONE,
SSH_INIT,