diff --git a/src/core/chat-commands.c b/src/core/chat-commands.c index 4b0b7b2a..385459ab 100644 --- a/src/core/chat-commands.c +++ b/src/core/chat-commands.c @@ -124,6 +124,8 @@ static SERVER_CONNECT_REC *get_server_connect(const char *data, int *plus_addr, conn->tls_verify = TRUE; if ((conn->tls_cert != NULL && conn->tls_cert[0] != '\0') || conn->tls_verify) conn->use_tls = TRUE; + if ((tmp = g_hash_table_lookup(optlist, "proxy")) != NULL) + conn->proxy = g_strdup(tmp); if (g_hash_table_lookup(optlist, "!") != NULL) conn->no_autojoin_channels = TRUE; @@ -148,6 +150,7 @@ static SERVER_CONNECT_REC *get_server_connect(const char *data, int *plus_addr, /* SYNTAX: CONNECT [-4 | -6] [-ssl] [-ssl_cert ] [-ssl_pkey ] [-ssl_pass ] [-ssl_verify] [-ssl_cafile ] [-ssl_capath ] [-ssl_ciphers ] + [-proxy ] [-!] [-noautosendcmd] [-network ] [-host ] [-rawlog ] @@ -255,6 +258,7 @@ static void sig_default_command_server(const char *data, SERVER_REC *server, /* SYNTAX: SERVER [-4 | -6] [-ssl] [-ssl_cert ] [-ssl_pkey ] [-ssl_pass ] [-ssl_verify] [-ssl_cafile ] [-ssl_capath ] [-ssl_ciphers ] + [-proxy ] [-!] [-noautosendcmd] [-network ] [-host ] [-rawlog ] @@ -494,7 +498,7 @@ void chat_commands_init(void) signal_add("default command server", (SIGNAL_FUNC) sig_default_command_server); signal_add("server sendmsg", (SIGNAL_FUNC) sig_server_sendmsg); - command_set_options("connect", "4 6 !! -network ssl +ssl_cert +ssl_pkey +ssl_pass ssl_verify +ssl_cafile +ssl_capath +ssl_ciphers +ssl_pinned_cert +ssl_pinned_pubkey tls +tls_cert +tls_pkey +tls_pass tls_verify +tls_cafile +tls_capath +tls_ciphers +tls_pinned_cert +tls_pinned_pubkey +host -rawlog noautosendcmd"); + command_set_options("connect", "4 6 !! -network ssl +ssl_cert +ssl_pkey +ssl_pass ssl_verify +ssl_cafile +ssl_capath +ssl_ciphers +ssl_pinned_cert +ssl_pinned_pubkey tls +tls_cert +tls_pkey +tls_pass tls_verify +tls_cafile +tls_capath +tls_ciphers +tls_pinned_cert +tls_pinned_pubkey +host +proxy -rawlog noautosendcmd"); command_set_options("msg", "channel nick"); } diff --git a/src/core/server-connect-rec.h b/src/core/server-connect-rec.h index 914087f1..f69f6a53 100644 --- a/src/core/server-connect-rec.h +++ b/src/core/server-connect-rec.h @@ -27,6 +27,8 @@ char *tls_ciphers; char *tls_pinned_cert; char *tls_pinned_pubkey; +char *proxy; + GIOChannel *connect_handle; /* connect using this handle */ /* when reconnecting, the old server status */ diff --git a/src/core/server-setup-rec.h b/src/core/server-setup-rec.h index dc3d7906..360c9759 100644 --- a/src/core/server-setup-rec.h +++ b/src/core/server-setup-rec.h @@ -20,6 +20,8 @@ char *tls_ciphers; char *tls_pinned_cert; char *tls_pinned_pubkey; +char *proxy; + char *own_host; /* address to use when connecting this server */ IPADDR *own_ip4, *own_ip6; /* resolved own_address if not NULL */ diff --git a/src/core/servers-reconnect.c b/src/core/servers-reconnect.c index 63d82adc..0cbffa45 100644 --- a/src/core/servers-reconnect.c +++ b/src/core/servers-reconnect.c @@ -196,6 +196,8 @@ server_connect_copy_skeleton(SERVER_CONNECT_REC *src, int connect_info) dest->tls_pinned_cert = g_strdup(src->tls_pinned_cert); dest->tls_pinned_pubkey = g_strdup(src->tls_pinned_pubkey); + dest->proxy = g_strdup(src->proxy); + return dest; } diff --git a/src/core/servers-setup.c b/src/core/servers-setup.c index 2f4ea059..4b636953 100644 --- a/src/core/servers-setup.c +++ b/src/core/servers-setup.c @@ -26,6 +26,7 @@ #include "chat-protocols.h" #include "chatnets.h" +#include "proxy.h" #include "servers.h" #include "servers-setup.h" @@ -173,6 +174,8 @@ static void server_setup_fill_server(SERVER_CONNECT_REC *conn, conn->tls_pinned_cert = g_strdup(sserver->tls_pinned_cert); if (conn->tls_pinned_pubkey == NULL && sserver->tls_pinned_pubkey != NULL && sserver->tls_pinned_pubkey[0] != '\0') conn->tls_pinned_pubkey = g_strdup(sserver->tls_pinned_pubkey); + if (conn->proxy == NULL && sserver->proxy != NULL && sserver->proxy[0] != '\0') + conn->proxy = g_strdup(sserver->proxy); server_setup_fill_reconn(conn, sserver); @@ -445,6 +448,7 @@ static SERVER_SETUP_REC *server_setup_read(CONFIG_NODE *node) rec->port = port; rec->autoconnect = config_node_get_bool(node, "autoconnect", FALSE); rec->own_host = g_strdup(config_node_get_str(node, "own_host", NULL)); + rec->proxy = g_strdup(config_node_get_str(node, "proxy", NULL)); signal_emit("server setup read", 2, rec, node); @@ -503,7 +507,7 @@ static void server_setup_save(SERVER_SETUP_REC *rec) iconfig_node_set_str(node, "tls_ciphers", rec->tls_ciphers); iconfig_node_set_str(node, "tls_pinned_cert", rec->tls_pinned_cert); iconfig_node_set_str(node, "tls_pinned_pubkey", rec->tls_pinned_pubkey); - + iconfig_node_set_str(node, "proxy", rec->proxy); iconfig_node_set_str(node, "own_host", rec->own_host); iconfig_node_set_str(node, "family", @@ -553,6 +557,7 @@ static void server_setup_destroy(SERVER_SETUP_REC *rec) g_free_not_null(rec->tls_ciphers); g_free_not_null(rec->tls_pinned_cert); g_free_not_null(rec->tls_pinned_pubkey); + g_free_not_null(rec->proxy); g_free(rec->address); g_free(rec); } diff --git a/src/core/session.c b/src/core/session.c index 34190c52..d7314a04 100644 --- a/src/core/session.c +++ b/src/core/session.c @@ -168,6 +168,8 @@ static void session_save_server(SERVER_REC *server, CONFIG_REC *config, config_node_set_str(config, node, "tls_pinned_cert", server->connrec->tls_pinned_cert); config_node_set_str(config, node, "tls_pinned_pubkey", server->connrec->tls_pinned_pubkey); + config_node_set_str(config, node, "proxy", server->connrec->proxy); + handle = g_io_channel_unix_get_fd(net_sendbuffer_handle(server->handle)); config_node_set_int(config, node, "handle", handle); diff --git a/src/fe-common/core/fe-server.c b/src/fe-common/core/fe-server.c index 37a176ac..d935b529 100644 --- a/src/fe-common/core/fe-server.c +++ b/src/fe-common/core/fe-server.c @@ -215,6 +215,10 @@ static void cmd_server_add_modify(const char *data, gboolean add) if ((rec->tls_cert != NULL && rec->tls_cert[0] != '\0') || rec->tls_verify == TRUE) rec->use_tls = TRUE; + value = g_hash_table_lookup(optlist, "proxy"); + if (value != NULL && *value != '\0') + rec->proxy = g_strdup(value); + if (g_hash_table_lookup(optlist, "auto")) rec->autoconnect = TRUE; if (g_hash_table_lookup(optlist, "noauto")) rec->autoconnect = FALSE; @@ -432,8 +436,8 @@ void fe_server_init(void) command_bind_first("server", NULL, (SIGNAL_FUNC) server_command); command_bind_first("disconnect", NULL, (SIGNAL_FUNC) server_command); - command_set_options("server add", "4 6 !! ssl +ssl_cert +ssl_pkey +ssl_pass ssl_verify +ssl_cafile +ssl_capath +ssl_ciphers +ssl_fingerprint tls +tls_cert +tls_pkey +tls_pass tls_verify +tls_cafile +tls_capath +tls_ciphers +tls_pinned_cert +tls_pinned_pubkey auto noauto -host -port noautosendcmd"); - command_set_options("server modify", "4 6 !! ssl +ssl_cert +ssl_pkey +ssl_pass ssl_verify +ssl_cafile +ssl_capath +ssl_ciphers +ssl_fingerprint tls +tls_cert +tls_pkey +tls_pass tls_verify +tls_cafile +tls_capath +tls_ciphers +tls_pinned_cert +tls_pinned_pubkey auto noauto -host -port noautosendcmd"); + command_set_options("server add", "4 6 !! ssl +ssl_cert +ssl_pkey +ssl_pass ssl_verify +ssl_cafile +ssl_capath +ssl_ciphers +ssl_fingerprint tls +tls_cert +tls_pkey +tls_pass tls_verify +tls_cafile +tls_capath +tls_ciphers +tls_pinned_cert +tls_pinned_pubkey +proxy auto noauto -host -port noautosendcmd"); + command_set_options("server modify", "4 6 !! ssl +ssl_cert +ssl_pkey +ssl_pass ssl_verify +ssl_cafile +ssl_capath +ssl_ciphers +ssl_fingerprint tls +tls_cert +tls_pkey +tls_pass tls_verify +tls_cafile +tls_capath +tls_ciphers +tls_pinned_cert +tls_pinned_pubkey +proxy auto noauto -host -port noautosendcmd"); signal_add("server looking", (SIGNAL_FUNC) sig_server_looking); signal_add("server connecting", (SIGNAL_FUNC) sig_server_connecting); diff --git a/src/fe-common/irc/fe-irc-server.c b/src/fe-common/irc/fe-irc-server.c index 017934d9..748aae38 100644 --- a/src/fe-common/irc/fe-irc-server.c +++ b/src/fe-common/irc/fe-irc-server.c @@ -54,6 +54,7 @@ const char *get_visible_target(IRC_SERVER_REC *server, const char *target) /* SYNTAX: SERVER ADD|MODIFY [-4 | -6] [-ssl] [-ssl_cert ] [-ssl_pkey ] [-ssl_pass ] [-ssl_verify] [-ssl_cafile ] [-ssl_capath ] [-ssl_ciphers ] + [-proxy ] [-auto | -noauto] [-network ] [-host ] [-cmdspeed ] [-cmdmax ] [-port ]
[ []] */ @@ -127,7 +128,6 @@ static void cmd_server_list(const char *data) g_string_append_printf(str, "tls_pinned_cert: %s, ", rec->tls_pinned_cert); if (rec->tls_pinned_pubkey) g_string_append_printf(str, "tls_pinned_pubkey: %s, ", rec->tls_pinned_pubkey); - } if (rec->max_cmds_at_once > 0) g_string_append_printf(str, "cmdmax: %d, ", rec->max_cmds_at_once); @@ -137,6 +137,8 @@ static void cmd_server_list(const char *data) g_string_append_printf(str, "querychans: %d, ", rec->max_query_chans); if (rec->own_host != NULL) g_string_append_printf(str, "host: %s, ", rec->own_host); + if (rec->proxy) + g_string_append_printf(str, "proxy: %s, ", rec->proxy); if (str->len > 1) g_string_truncate(str, str->len-2); printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, IRCTXT_SETUPSERVER_LINE,