1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-09 03:03:12 +02:00

Add support for more than one proxy, with proxy selection for each IRC server (task #6859)

This commit is contained in:
Sebastien Helleu
2008-11-23 23:04:52 +01:00
parent 09bed16dbd
commit 2e52e54a3a
52 changed files with 2498 additions and 704 deletions
+228 -3
View File
@@ -37,8 +37,9 @@
#include "wee-hook.h"
#include "wee-input.h"
#include "wee-log.h"
#include "wee-upgrade.h"
#include "wee-proxy.h"
#include "wee-string.h"
#include "wee-upgrade.h"
#include "wee-utf8.h"
#include "wee-list.h"
#include "../gui/gui-bar.h"
@@ -150,7 +151,6 @@ command_bar (void *data, struct t_gui_buffer *buffer,
/* make C compiler happy */
(void) data;
(void) buffer;
/* list of bars */
if ((argc == 1)
@@ -2217,6 +2217,201 @@ command_plugin (void *data, struct t_gui_buffer *buffer,
return WEECHAT_RC_OK;
}
/*
* command_proxy_list: list proxies
*/
void
command_proxy_list ()
{
struct t_proxy *ptr_proxy;
if (weechat_proxies)
{
gui_chat_printf (NULL, "");
gui_chat_printf (NULL, _("List of proxies:"));
for (ptr_proxy = weechat_proxies; ptr_proxy;
ptr_proxy = ptr_proxy->next_proxy)
{
gui_chat_printf (NULL,
_(" %s%s%s: %s, %s/%d (%s), username: %s, "
"password: %s"),
GUI_COLOR(GUI_COLOR_CHAT_BUFFER),
ptr_proxy->name,
GUI_COLOR(GUI_COLOR_CHAT),
proxy_type_string[CONFIG_INTEGER(ptr_proxy->type)],
CONFIG_STRING(ptr_proxy->address),
CONFIG_INTEGER(ptr_proxy->port),
(CONFIG_INTEGER(ptr_proxy->ipv6)) ? "IPv6" : "IPv4",
(CONFIG_STRING(ptr_proxy->username) &&
CONFIG_STRING(ptr_proxy->username)[0]) ?
CONFIG_STRING(ptr_proxy->username) : _("(none)"),
(CONFIG_STRING(ptr_proxy->password) &&
CONFIG_STRING(ptr_proxy->password)[0]) ?
CONFIG_STRING(ptr_proxy->password) : _("(none)"));
}
}
else
gui_chat_printf (NULL, _("No proxy defined"));
}
/*
* command_proxy: manage proxies
*/
int
command_proxy (void *data, struct t_gui_buffer *buffer,
int argc, char **argv, char **argv_eol)
{
int type;
long number;
char *error;
struct t_proxy *ptr_proxy;
/* make C compiler happy */
(void) data;
(void) buffer;
/* list of bars */
if ((argc == 1)
|| ((argc == 2) && (string_strcasecmp (argv[1], "list") == 0)))
{
command_proxy_list ();
return WEECHAT_RC_OK;
}
/* add a new proxy */
if (string_strcasecmp (argv[1], "add") == 0)
{
if (argc < 6)
{
gui_chat_printf (NULL,
_("%sError: missing arguments for \"%s\" "
"command"),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
"proxy");
return WEECHAT_RC_ERROR;
}
type = proxy_search_type (argv[3]);
if (type < 0)
{
gui_chat_printf (NULL,
_("%sError: wrong type \"%s\" for proxy "
"\"%s\""),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
argv[3], argv[2]);
return WEECHAT_RC_ERROR;
}
error = NULL;
number = strtol (argv[5], &error, 10);
if (error && !error[0])
{
/* create proxy */
if (proxy_new (argv[2], argv[3], "off", argv[4], argv[5],
(argc >= 7) ? argv[6] : NULL,
(argc >= 8) ? argv_eol[7] : NULL))
{
gui_chat_printf (NULL, _("Proxy \"%s\" created"),
argv[2]);
}
else
{
gui_chat_printf (NULL, _("%sError: failed to create proxy "
"\"%s\""),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
argv[2]);
}
}
else
{
gui_chat_printf (NULL,
_("%sError: wrong port \"%s\" for proxy "
"\"%s\""),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
argv[5], argv[2]);
return WEECHAT_RC_ERROR;
}
return WEECHAT_RC_OK;
}
/* delete a proxy */
if (string_strcasecmp (argv[1], "del") == 0)
{
if (argc < 3)
{
gui_chat_printf (NULL,
_("%sError: missing arguments for \"%s\" "
"command"),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
"proxy");
return WEECHAT_RC_ERROR;
}
if (string_strcasecmp (argv[2], "-all") == 0)
{
proxy_free_all ();
gui_chat_printf (NULL, _("All proxies have been deleted"));
}
else
{
ptr_proxy = proxy_search (argv[2]);
if (!ptr_proxy)
{
gui_chat_printf (NULL,
_("%sError: unknown proxy \"%s\""),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
argv[2]);
return WEECHAT_RC_ERROR;
}
proxy_free (ptr_proxy);
gui_chat_printf (NULL, _("Proxy deleted"));
}
return WEECHAT_RC_OK;
}
/* set a proxy property */
if (string_strcasecmp (argv[1], "set") == 0)
{
if (argc < 5)
{
gui_chat_printf (NULL,
_("%sError: missing arguments for \"%s\" "
"command"),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
"proxy");
return WEECHAT_RC_ERROR;
}
ptr_proxy = proxy_search (argv[2]);
if (!ptr_proxy)
{
gui_chat_printf (NULL,
_("%sError: unknown proxy \"%s\""),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
argv[2]);
return WEECHAT_RC_ERROR;
}
if (!proxy_set (ptr_proxy, argv[3], argv_eol[4]))
{
gui_chat_printf (NULL,
_("%sError: unable to set option \"%s\" for "
"proxy \"%s\""),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
argv[3], argv[2]);
return WEECHAT_RC_ERROR;
}
return WEECHAT_RC_OK;
}
gui_chat_printf (NULL,
_("%sError: unknown option for \"%s\" "
"command"),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
"proxy");
return WEECHAT_RC_ERROR;
}
/*
* command_quit: quit WeeChat
*/
@@ -3119,7 +3314,7 @@ command_init ()
"separator item1,item2,...] | [default] | "
"[del barname|-all] | [set barname option value] | "
"[hide|show barname] | [scroll barname buffer "
"scroll_value] | [list] | [listitems]"),
"scroll_value] | [list] | [listfull] | [listitems]"),
N_(" add: add a new bar\n"
" barname: name of bar (must be unique)\n"
" type: root: outside windows),\n"
@@ -3339,6 +3534,36 @@ command_init ()
"Without argument, this command lists loaded plugins."),
"list|listfull|load|autoload|reload|unload %f|%p",
&command_plugin, NULL);
hook_command (NULL, "proxy",
N_("manage proxies"),
N_("[add proxyname type address port [username "
"[password]]] | [del proxyname|-all] | [set "
"proxyname option value] | [list]"),
N_(" add: add a new proxy\n"
" proxyname: name of proxy (must be unique)\n"
" type: http, socks4 or socks5\n"
" address: IP or hostname\n"
" port: port\n"
" username: username (optional)\n"
" password: password (optional)\n"
" del: delete a proxy (or all proxies with -all)\n"
" set: set a value for a proxy property\n"
" option: option to change (for options list, look "
"at /set weechat.proxy.<proxyname>.*)\n"
" value: new value for option\n"
" list: list all proxies\n\n"
"Examples:\n"
" create a http proxy, running on local host, port 8888:\n"
" /proxy add local http 127.0.0.1 8888\n"
" create a http proxy using IPv6 protocol:\n"
" /proxy add local http 127.0.0.1 8888\n"
" /proxy set local ipv6 on\n"
" create a socks5 proxy with username/password:\n"
" /proxy add myproxy socks5 sample.host.org 3128 myuser mypass\n"
" delete a proxy:\n"
" /proxy del myproxy"),
"add|del|set|list %y name|type|ipv6|address|port|username|password",
&command_proxy, NULL);
hook_command (NULL, "quit",
N_("quit WeeChat"),
"", "",