Avoid direct use of libproxy
Since hexchat already depends on GLib, it's better to use GProxyResolver instead. This might use libproxy, or not, as appropriate. P.S. This removes a memory safety issue because proxy_list is allocated using malloc(), not g_malloc(), and therefore using g_strfreev() is incorrect. The proper way to free the proxy list returned by libproxy is to use px_proxy_factory_free_proxies() (but nobody does that because it was added in libproxy 0.4.16, which is somewhat recent).
This commit is contained in:
parent
869a8d7ab3
commit
25440a07c3
@ -33,7 +33,6 @@ config_h.set10('ENABLE_NLS', true)
|
|||||||
|
|
||||||
# Optional features
|
# Optional features
|
||||||
config_h.set('USE_OPENSSL', get_option('with-ssl'))
|
config_h.set('USE_OPENSSL', get_option('with-ssl'))
|
||||||
config_h.set('USE_LIBPROXY', get_option('with-libproxy'))
|
|
||||||
config_h.set('USE_LIBCANBERRA', get_option('with-libcanberra'))
|
config_h.set('USE_LIBCANBERRA', get_option('with-libcanberra'))
|
||||||
config_h.set('USE_DBUS', get_option('with-dbus'))
|
config_h.set('USE_DBUS', get_option('with-dbus'))
|
||||||
config_h.set('USE_PLUGIN', get_option('with-plugin'))
|
config_h.set('USE_PLUGIN', get_option('with-plugin'))
|
||||||
|
@ -13,9 +13,6 @@ option('with-plugin', type: 'boolean',
|
|||||||
option('with-dbus', type: 'boolean',
|
option('with-dbus', type: 'boolean',
|
||||||
description: 'Support used for single-instance and scripting interface, Unix only'
|
description: 'Support used for single-instance and scripting interface, Unix only'
|
||||||
)
|
)
|
||||||
option('with-libproxy', type: 'boolean',
|
|
||||||
description: 'Support for getting proxy information, Unix only'
|
|
||||||
)
|
|
||||||
option('with-libnotify', type: 'boolean',
|
option('with-libnotify', type: 'boolean',
|
||||||
description: 'Support for freedesktop notifications, Unix only'
|
description: 'Support for freedesktop notifications, Unix only'
|
||||||
)
|
)
|
||||||
|
@ -57,10 +57,6 @@
|
|||||||
#include <glib-object.h> /* for g_type_init() */
|
#include <glib-object.h> /* for g_type_init() */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_LIBPROXY
|
|
||||||
#include <proxy.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GSList *popup_list = 0;
|
GSList *popup_list = 0;
|
||||||
GSList *button_list = 0;
|
GSList *button_list = 0;
|
||||||
GSList *dlgbutton_list = 0;
|
GSList *dlgbutton_list = 0;
|
||||||
@ -111,10 +107,6 @@ struct session *current_tab;
|
|||||||
struct session *current_sess = 0;
|
struct session *current_sess = 0;
|
||||||
struct hexchatprefs prefs;
|
struct hexchatprefs prefs;
|
||||||
|
|
||||||
#ifdef USE_LIBPROXY
|
|
||||||
pxProxyFactory *libproxy_factory;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update the priority queue of the "interesting sessions"
|
* Update the priority queue of the "interesting sessions"
|
||||||
* (sess_list_by_lastact).
|
* (sess_list_by_lastact).
|
||||||
@ -1102,10 +1094,6 @@ main (int argc, char *argv[])
|
|||||||
hexchat_remote ();
|
hexchat_remote ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_LIBPROXY
|
|
||||||
libproxy_factory = px_proxy_factory_new ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
coinit_result = CoInitializeEx (NULL, COINIT_APARTMENTTHREADED);
|
coinit_result = CoInitializeEx (NULL, COINIT_APARTMENTTHREADED);
|
||||||
if (SUCCEEDED (coinit_result))
|
if (SUCCEEDED (coinit_result))
|
||||||
@ -1148,10 +1136,6 @@ main (int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_LIBPROXY
|
|
||||||
px_proxy_factory_free (libproxy_factory);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
WSACleanup ();
|
WSACleanup ();
|
||||||
#endif
|
#endif
|
||||||
|
@ -77,10 +77,6 @@ if get_option('with-ssl')
|
|||||||
common_deps += libssl_dep
|
common_deps += libssl_dep
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if get_option('with-libproxy')
|
|
||||||
common_deps += dependency('libproxy-1.0')
|
|
||||||
endif
|
|
||||||
|
|
||||||
if get_option('with-libcanberra')
|
if get_option('with-libcanberra')
|
||||||
common_deps += dependency('libcanberra', version: '>= 0.22')
|
common_deps += dependency('libcanberra', version: '>= 0.22')
|
||||||
endif
|
endif
|
||||||
|
@ -61,10 +61,6 @@
|
|||||||
#include "ssl.h"
|
#include "ssl.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_LIBPROXY
|
|
||||||
#include <proxy.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_OPENSSL
|
#ifdef USE_OPENSSL
|
||||||
/* local variables */
|
/* local variables */
|
||||||
static struct session *g_sess = NULL;
|
static struct session *g_sess = NULL;
|
||||||
@ -78,9 +74,15 @@ static void server_disconnect (session * sess, int sendquit, int err);
|
|||||||
static int server_cleanup (server * serv);
|
static int server_cleanup (server * serv);
|
||||||
static void server_connect (server *serv, char *hostname, int port, int no_login);
|
static void server_connect (server *serv, char *hostname, int port, int no_login);
|
||||||
|
|
||||||
#ifdef USE_LIBPROXY
|
static void
|
||||||
extern pxProxyFactory *libproxy_factory;
|
write_error (char *message, GError **error)
|
||||||
#endif
|
{
|
||||||
|
if (error == NULL || *error == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
g_printerr ("%s: %s\n", message, (*error)->message);
|
||||||
|
g_clear_error (error);
|
||||||
|
}
|
||||||
|
|
||||||
/* actually send to the socket. This might do a character translation or
|
/* actually send to the socket. This might do a character translation or
|
||||||
send via SSL. server/dcc both use this function. */
|
send via SSL. server/dcc both use this function. */
|
||||||
@ -1392,14 +1394,16 @@ server_child (server * serv)
|
|||||||
|
|
||||||
if (!serv->dont_use_proxy) /* blocked in serverlist? */
|
if (!serv->dont_use_proxy) /* blocked in serverlist? */
|
||||||
{
|
{
|
||||||
#ifdef USE_LIBPROXY
|
|
||||||
if (prefs.hex_net_proxy_type == 5)
|
if (prefs.hex_net_proxy_type == 5)
|
||||||
{
|
{
|
||||||
char **proxy_list;
|
char **proxy_list;
|
||||||
char *url, *proxy;
|
char *url, *proxy;
|
||||||
|
GProxyResolver *resolver;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
resolver = g_proxy_resolver_get_default ();
|
||||||
url = g_strdup_printf ("irc://%s:%d", hostname, port);
|
url = g_strdup_printf ("irc://%s:%d", hostname, port);
|
||||||
proxy_list = px_proxy_factory_get_proxies (libproxy_factory, url);
|
proxy_list = g_proxy_resolver_lookup (resolver, url, NULL, &error);
|
||||||
|
|
||||||
if (proxy_list) {
|
if (proxy_list) {
|
||||||
/* can use only one */
|
/* can use only one */
|
||||||
@ -1412,6 +1416,8 @@ server_child (server * serv)
|
|||||||
proxy_type = 3;
|
proxy_type = 3;
|
||||||
else if (!strncmp (proxy, "socks", 5))
|
else if (!strncmp (proxy, "socks", 5))
|
||||||
proxy_type = 2;
|
proxy_type = 2;
|
||||||
|
} else {
|
||||||
|
write_error ("Failed to lookup proxy", &error);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (proxy_type) {
|
if (proxy_type) {
|
||||||
@ -1426,7 +1432,7 @@ server_child (server * serv)
|
|||||||
g_strfreev (proxy_list);
|
g_strfreev (proxy_list);
|
||||||
g_free (url);
|
g_free (url);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if (prefs.hex_net_proxy_host[0] &&
|
if (prefs.hex_net_proxy_host[0] &&
|
||||||
prefs.hex_net_proxy_type > 0 &&
|
prefs.hex_net_proxy_type > 0 &&
|
||||||
prefs.hex_net_proxy_use != 2) /* proxy is NOT dcc-only */
|
prefs.hex_net_proxy_use != 2) /* proxy is NOT dcc-only */
|
||||||
|
@ -614,9 +614,7 @@ static const char *const proxytypes[] =
|
|||||||
N_("SOCKS4"),
|
N_("SOCKS4"),
|
||||||
N_("SOCKS5"),
|
N_("SOCKS5"),
|
||||||
N_("HTTP"),
|
N_("HTTP"),
|
||||||
#ifdef USE_LIBPROXY
|
|
||||||
N_("Auto"),
|
N_("Auto"),
|
||||||
#endif
|
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user