Send connman mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
https://lists.01.org/mailman/listinfo/connman
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of connman digest..."
Today's Topics:
1. Re: [PATCH] PacRunner:Domains are looked up to match the host
(Tomasz Bursztyka)
----------------------------------------------------------------------
Message: 1
Date: Mon, 13 Jun 2016 09:19:58 +0200
From: Tomasz Bursztyka <[email protected]>
To: Atul Anand <[email protected]>, David Woodhouse
<[email protected]>
Cc: [email protected]
Subject: Re: [PATCH] PacRunner:Domains are looked up to match the host
Message-ID: <[email protected]>
Content-Type: text/plain; charset="utf-8"; Format="flowed"
Hi Atul,
Very minor style comments. Rest looks fine to me.
> There was one white space error.
> Now patch applies cleanly with `git am
> 0001-Pacrunner-Domains-are-looked-up-to-match-host-of-URL.patch` on
> upstream master.
>
> Thanks,
> Atul Anand
>
> On 6/10/16, Atul Anand<[email protected]> wrote:
>> >Looks ok now? char limit has been considered.
>> >
>
> 0001-Pacrunner-Domains-are-looked-up-to-match-host-of-URL.patch
>
>
> From 3b95acdf4d55104d7e7405c9ba39cdbe3e14f575 Mon Sep 17 00:00:00 2001
> From: Atul Anand<[email protected]>
> Date: Sat, 11 Jun 2016 11:10:05 +0530
> Subject: [PATCH] [Pacrunner]: Domains are looked up to match host of URL.
>
> Pacrunner now scan stored domains to match the host of URL.
> In this way the most appropriate proxy config is selected
> to answer the proxy query.
> ---
> doc/manager-api.txt | 3 +-
> src/manager.c | 7 +-
> src/pacrunner.h | 2 +
> src/proxy.c | 198
> +++++++++++++++++++++++++++++++++++++++--
> unit/suite/manual_basic.test | 2 +
> unit/suite/manual_exclude.test | 2 +
> unit/suite/pac_basic.test | 2 +
> unit/suite/pac_direct.test | 2 +
> unit/suite/proxy_domain.test | 37 ++++++++
> unit/suite/stub.test | 3 +
> unit/test-pacrunner.c | 85 +++++++++++++++++-
> 11 files changed, 326 insertions(+), 17 deletions(-)
> create mode 100644 unit/suite/proxy_domain.test
>
> diff --git a/doc/manager-api.txt b/doc/manager-api.txt
> index ab2f6b9..622fffa 100644
> --- a/doc/manager-api.txt
> +++ b/doc/manager-api.txt
> @@ -62,7 +62,8 @@ Methods object CreateProxyConfiguration(dict
> settings)
>
> array{string} Domains [optional]
>
> - Domain names for which the URL is valid.
> + Domain names and IP ranges for which this proxy
> + configuration shall be valid.
>
> array{string} Nameservers [optional]
>
> diff --git a/src/manager.c b/src/manager.c
> index 1676466..5a8b4fd 100644
> --- a/src/manager.c
> +++ b/src/manager.c
> @@ -35,7 +35,6 @@ struct proxy_config {
> DBusConnection *conn;
> guint watch;
>
> - char **domains;
> char **nameservers;
>
> struct pacrunner_proxy *proxy;
> @@ -58,7 +57,6 @@ static void destroy_config(gpointer data)
> if (config->watch > 0)
> g_dbus_remove_watch(config->conn, config->watch);
>
> - g_strfreev(config->domains);
> g_strfreev(config->nameservers);
>
> g_free(config->sender);
> @@ -224,12 +222,13 @@ static DBusMessage *create_proxy_config(DBusConnection
> *conn,
> goto done;
> }
>
> - config->domains = domains;
> config->nameservers = nameservers;
>
> - domains = NULL;
> nameservers = NULL;
>
> + if (pacrunner_proxy_set_domains(config->proxy, domains) < 0)
> + pacrunner_error("Failed to set proxy domains");
> +
> if (g_str_equal(method, "direct")) {
> if (pacrunner_proxy_set_direct(config->proxy) < 0)
> pacrunner_error("Failed to set direct proxy");
> diff --git a/src/pacrunner.h b/src/pacrunner.h
> index 6731d7c..db534cf 100644
> --- a/src/pacrunner.h
> +++ b/src/pacrunner.h
> @@ -63,6 +63,8 @@ void pacrunner_proxy_unref(struct pacrunner_proxy *proxy);
> const char *pacrunner_proxy_get_interface(struct pacrunner_proxy *proxy);
> const char *pacrunner_proxy_get_script(struct pacrunner_proxy *proxy);
>
> +int pacrunner_proxy_set_domains(struct pacrunner_proxy *proxy,
> + char **domains);
> int pacrunner_proxy_set_direct(struct pacrunner_proxy *proxy);
> int pacrunner_proxy_set_manual(struct pacrunner_proxy *proxy,
> char **servers, char **excludes);
> diff --git a/src/proxy.c b/src/proxy.c
> index 8bb03af..cdfe2d2 100644
> --- a/src/proxy.c
> +++ b/src/proxy.c
> @@ -23,6 +23,9 @@
> #include <config.h>
> #endif
>
> +#include <string.h>
> +#include <stdlib.h>
> +#include <arpa/inet.h>
> #include <errno.h>
> #include <pthread.h>
>
> @@ -37,6 +40,17 @@ struct pacrunner_proxy {
> char *script;
> GList **servers;
> GList **excludes;
> + GList *domains;
> +};
> +
> +struct proxy_domain {
> + char *domain;
> + int proto;
> + union {
> + struct in_addr ip4;
> + struct in6_addr ip6;
> + } addr;
> + int mask;
> };
>
> static GList *proxy_list = NULL;
> @@ -77,6 +91,14 @@ struct pacrunner_proxy *pacrunner_proxy_ref(struct
> pacrunner_proxy *proxy)
> return proxy;
> }
>
> +static void proxy_domain_destroy(struct proxy_domain *domain)
> +{
> + g_return_if_fail(domain != NULL);
> +
> + g_free(domain->domain);
> + g_free(domain);
> +}
> +
> static void reset_proxy(struct pacrunner_proxy *proxy)
> {
> DBG("proxy %p", proxy);
> @@ -92,6 +114,11 @@ static void reset_proxy(struct pacrunner_proxy *proxy)
>
> __pacrunner_manual_destroy_excludes(proxy->excludes);
> proxy->excludes = NULL;
> +
> + if (proxy->domains)
> + g_list_free_full(proxy->domains,
> + (GDestroyNotify) proxy_domain_destroy);
You need the {} above. When it's 1 line in the if statement, it's fine
to remove the {}, otherwise put them.
> + proxy->domains = NULL;
> }
>
> void pacrunner_proxy_unref(struct pacrunner_proxy *proxy)
> @@ -130,6 +157,66 @@ const char *pacrunner_proxy_get_script(struct
> pacrunner_proxy *proxy)
> return proxy->script;
> }
>
> +int pacrunner_proxy_set_domains(struct pacrunner_proxy *proxy, char
> **domains)
> +{
> + int len;
> + char *slash, **domain;
> + char ip[INET6_ADDRSTRLEN + 1];
> +
> + DBG("proxy %p domains %p", proxy, domains);
> +
> + if (!proxy)
> + return -EINVAL;
> +
> + if (!domains)
> + return -EINVAL;
> +
> + for (domain = (char **)domains; *domain; domain++) {
> + struct proxy_domain *data;
add an empty line
> + data = g_malloc0(sizeof(struct proxy_domain));
> + g_return_val_if_fail(data != NULL, -EINVAL);
> +
> + slash = strchr(*domain, '/');
> + if (!slash) {
> + data->domain = g_strdup(*domain);
> + data->proto = 0;
> +
> + proxy->domains = g_list_append(proxy->domains, data);
> + continue;
> + }
> +
> +
> + len = slash - *domain;
> + if (len > INET6_ADDRSTRLEN)
> + return -EINVAL;
same here
> + strncpy(ip, *domain, len);
> + ip[len] = '\0';
> +
> + if (inet_pton(AF_INET, ip, &(data->addr.ip4)) == 1) {
> + data->domain = NULL;
> + data->proto = 4;
same here
> + errno = 0;
> + data->mask = strtol(slash + 1, NULL, 10);
> + if (errno || data->mask > 32)
> + return -EINVAL;
> +
> + proxy->domains = g_list_append(proxy->domains, data);
> + } else if (inet_pton(AF_INET6, ip, &(data->addr.ip6)) == 1) {
> + data->domain = NULL;
> + data->proto = 6;
same here
> + errno = 0;
> + data->mask = strtol(slash + 1, NULL, 10);
> + if (errno || data->mask > 128)
> + return -EINVAL;
> +
> + proxy->domains = g_list_append(proxy->domains, data);
> + } else
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> static int set_method(struct pacrunner_proxy *proxy,
> enum pacrunner_proxy_method method)
> {
> @@ -324,10 +411,55 @@ int pacrunner_proxy_disable(struct pacrunner_proxy
> *proxy)
> return 0;
> }
>
> +static int compare_legacy_ip_in_net(struct in_addr *host,
> + struct proxy_domain *match)
> +{
> + if (ntohl(host->s_addr ^ match->addr.ip4.s_addr) >> (32 - match->mask))
> + return -1;
> +
> + return 0;
> +}
> +
> +static int compare_ipv6_in_net(struct in6_addr *host,
> + struct proxy_domain *match)
> +{
> + int i, shift;
> +
> + for (i = 0; i < (match->mask)/8; i++)
> + if (host->s6_addr[i] != match->addr.ip6.s6_addr[i])
> + return -1;
> +
> + if ((match->mask) % 8) {
> + /* 1-7 bits left to compare */
> + shift = 8 - (match->mask - (i*8));
> + if ((host->s6_addr[i] >> shift) !=
> + (match->addr.ip6.s6_addr[i] >> shift))
> + return -1;
indentation issue here about the 5 lines above? (maybe it's my email client)
(and add an empty line before the if() )
> + }
> +
> + return 0;
> +}
> +
> +static int compare_host_in_domain(const char *host, struct proxy_domain
> *match)
> +{
> + if (g_str_has_suffix(host, match->domain)) {
> + size_t hlen = strlen(host);
> + size_t dlen = strlen(match->domain);
> +
> + if (hlen == dlen || host[hlen - dlen -1] == '.')
> + return 0;
> + }
> +
> + return -1;
> +}
> +
> char *pacrunner_proxy_lookup(const char *url, const char *host)
> {
> - GList *list;
> - struct pacrunner_proxy *selected_proxy = NULL;
> + GList *l, *list;
> + struct in_addr ip4_addr;
> + struct in6_addr ip6_addr;
> + struct pacrunner_proxy *selected_proxy = NULL, *default_proxy = NULL;
> + int protocol = 0;
>
> DBG("url %s host %s", url, host);
>
> @@ -340,17 +472,67 @@ char *pacrunner_proxy_lookup(const char *url, const
> char *host)
> return NULL;
> }
>
> + if (inet_pton(AF_INET, host, &ip4_addr) == 1) {
> + protocol = 4;
> + } else if (inet_pton(AF_INET6, host, &ip6_addr) == 1) {
> + protocol = 6;
> + } else if (host[0] == '[') {
> + char ip[INET6_ADDRSTRLEN + 1];
> + int len = strlen(host);
> +
> + if (len < INET6_ADDRSTRLEN + 2 && host[len - 1] == ']') {
> + strncpy(ip, host + 1, len - 2);
> + ip[len - 2] = '\0';
> +
> + if (inet_pton(AF_INET6, ip, &ip6_addr) == 1)
> + protocol = 6;
> + }
> + }
> +
> for (list = g_list_first(proxy_list); list; list = g_list_next(list)) {
> struct pacrunner_proxy *proxy = list->data;
>
> - if (proxy->method == PACRUNNER_PROXY_METHOD_MANUAL ||
> - proxy->method == PACRUNNER_PROXY_METHOD_AUTO) {
> - selected_proxy = proxy;
> - break;
> - } else if (proxy->method == PACRUNNER_PROXY_METHOD_DIRECT)
> - selected_proxy = proxy;
> + if (!proxy->domains) {
> + if (!default_proxy)
> + default_proxy = proxy;
> + continue;
> + }
> +
> + for (l = g_list_first(proxy->domains); l; l = g_list_next(l)) {
> + struct proxy_domain *data = l->data;
> +
> + if (data->proto != protocol)
> + continue;
> +
> + switch(protocol) {
> + case 4:
> + if (compare_legacy_ip_in_net(&ip4_addr,
> + data) == 0) {
> + selected_proxy = proxy;
> + goto found;
> + }
> + break;
> + case 6:
> + if (compare_ipv6_in_net(&ip6_addr,
> + data) == 0) {
> + selected_proxy = proxy;
> + goto found;
> + }
> + break;
> + default:
> + if (compare_host_in_domain(host, data) == 0) {
> + selected_proxy = proxy;
> + goto found;
> + }
> + break;
> + }
> + }
> }
>
> + if (!selected_proxy)
> + selected_proxy = default_proxy;
> +
> +found:
> pthread_mutex_unlock(&proxy_mutex);
>
> if (!selected_proxy)
> diff --git a/unit/suite/manual_basic.test b/unit/suite/manual_basic.test
> index a5ec3a1..4406d9c 100644
> --- a/unit/suite/manual_basic.test
> +++ b/unit/suite/manual_basic.test
> @@ -10,6 +10,8 @@ socks4://sockproxy.internal.com
>
> [excludes]
>
> +[domains]
> +
> [config]
> VALID
>
> diff --git a/unit/suite/manual_exclude.test b/unit/suite/manual_exclude.test
> index c155743..211ae16 100644
> --- a/unit/suite/manual_exclude.test
> +++ b/unit/suite/manual_exclude.test
> @@ -15,6 +15,8 @@ftp://
> *net
> tri*
>
> +[domains]
> +
> [config]
> VALID
>
> diff --git a/unit/suite/pac_basic.test b/unit/suite/pac_basic.test
> index 58af200..c63757e 100644
> --- a/unit/suite/pac_basic.test
> +++ b/unit/suite/pac_basic.test
> @@ -17,6 +17,8 @@ function FindProxyForURL(url, host)
>
> [excludes]
>
> +[domains]
> +
> [config]
> VALID
>
> diff --git a/unit/suite/pac_direct.test b/unit/suite/pac_direct.test
> index 3164872..b820abc 100644
> --- a/unit/suite/pac_direct.test
> +++ b/unit/suite/pac_direct.test
> @@ -11,6 +11,8 @@ function FindProxyForURL(url, host)
>
> [excludes]
>
> +[domains]
> +
> [config]
> VALID
>
> diff --git a/unit/suite/proxy_domain.test b/unit/suite/proxy_domain.test
> new file mode 100644
> index 0000000..8c2c5e4
> --- /dev/null
> +++ b/unit/suite/proxy_domain.test
> @@ -0,0 +1,37 @@
> +[title]
> +Proxy Domain lookup
> +
> +[pac]
> +
> +[servers]
> +http://proxy.suite.com
> +
> +[excludes]
> +
> +[domains]
> +suite.com
> +test.suite.com
> +172.132.231.6/24
> +
> +[config]
> +VALID
> +
> +[tests]
> +http://foo.suite.com foo.suite.com
> +PROXY proxy.suite.com
> +http://172.132.231.101/search=?true 172.132.231.101
> +PROXY proxy.suite.com
> +http://111.121.131.141/page1 111.121.131.141
> +DIRECT
> +http://notintel.com notintel.com
> +DIRECT
> +http://intel.com intel.com
> +PROXY proxy2.com; PROXY secproxy2.com
> +https://bar.domain2.com bar.domain2.com
> +PROXY secproxy2.com; PROXY proxy2.com
> +http://192.168.4.4/index.html 192.168.4.4
> +PROXY proxy2.com; PROXY secproxy2.com
> +socks4://baz.domain3.com/xyz baz.domain3.com
> +SOCKS4 sockproxy3.com; PROXY proxy3.com
> +http://[fe80:96db:12ce::43ef]/ip6.mp4 [fe80:96db:12ce::43ef]
> +PROXY proxy3.com; SOCKS4 sockproxy3.com
> diff --git a/unit/suite/stub.test b/unit/suite/stub.test
> index 12a0426..cde0aeb 100644
> --- a/unit/suite/stub.test
> +++ b/unit/suite/stub.test
> @@ -11,6 +11,9 @@ Stub suite file
> [excludes]
> # If so, optional exlusion rules can be written here
>
> +[domains]
> +# List of domains are here
> +
> [config]
> # Result of the configuration: VALID or INVALID
>
> diff --git a/unit/test-pacrunner.c b/unit/test-pacrunner.c
> index f234a35..a28eedf 100644
> --- a/unit/test-pacrunner.c
> +++ b/unit/test-pacrunner.c
> @@ -42,9 +42,10 @@ enum test_suite_part {
> SUITE_PAC = 1,
> SUITE_SERVERS = 2,
> SUITE_EXCLUDES = 3,
> - SUITE_CONFIG = 4,
> - SUITE_TESTS = 5,
> - SUITE_NOTHING = 6,
> + SUITE_DOMAINS = 4,
> + SUITE_CONFIG = 5,
> + SUITE_TESTS = 6,
> + SUITE_NOTHING = 7,
> };
>
> enum cu_test_mode {
> @@ -58,6 +59,7 @@ struct pacrunner_test_suite {
> gchar *pac;
> gchar **servers;
> gchar **excludes;
> + gchar **domains;
>
> bool config_result;
>
> @@ -67,7 +69,7 @@ struct pacrunner_test_suite {
> static struct pacrunner_test_suite *test_suite;
> static bool verbose = false;
>
> -static struct pacrunner_proxy *proxy;
> +static struct pacrunner_proxy *proxy, *proxy2 = NULL, *proxy3 = NULL;
> static bool test_config;
>
> static void free_pacrunner_test_suite(struct pacrunner_test_suite *suite)
> @@ -79,6 +81,7 @@ static void free_pacrunner_test_suite(struct
> pacrunner_test_suite *suite)
> g_free(suite->pac);
> g_strfreev(suite->servers);
> g_strfreev(suite->excludes);
> + g_strfreev(suite->domains);
> g_strfreev(suite->tests);
>
> g_free(suite);
> @@ -142,6 +145,13 @@ static void print_test_suite(struct pacrunner_test_suite
> *suite)
> } else
> printf("(none)\n");
>
> + printf("\nDomains:\n");
> + if (suite->domains) {
> + for (line = suite->domains; *line; line++)
> + printf("%s\n", *line);
> + } else
> + printf("(none)\n");
> +
> printf("\nConfig result: %s\n",
> suite->config_result ? "Valid" : "Invalid");
>
> @@ -240,6 +250,15 @@ static struct pacrunner_test_suite
> *read_test_suite(const char *path)
> suite->excludes = array;
>
> break;
> + case SUITE_DOMAINS:
> + array = _g_strappendv(suite->domains, *line);
> + if (!array)
> + goto error;
> +
> + g_free(suite->domains);
> + suite->domains = array;
> +
> + break;
> case SUITE_CONFIG:
> if (strncmp(*line, "VALID", 5) == 0)
> suite->config_result = true;
> @@ -272,6 +291,8 @@ static struct pacrunner_test_suite *read_test_suite(const
> char *path)
> part = SUITE_SERVERS;
> else if (strncmp(*line, "[excludes]", 10) == 0)
> part = SUITE_EXCLUDES;
> + else if (strncmp(*line, "[domains]", 9) == 0)
> + part = SUITE_DOMAINS;
> else if (strncmp(*line, "[config]", 8) == 0)
> part = SUITE_CONFIG;
> else if (strncmp(*line, "[tests]", 7) == 0)
> @@ -338,6 +359,53 @@ static void test_manual_config(void)
> CU_ASSERT_TRUE(test_suite->config_result == test_config);
> }
>
> +static void test_proxy_domain(void)
> +{
> + int val = 0;
> + if (pacrunner_proxy_set_domains(proxy, test_suite->domains) != 0)
> + val = -1;
> +
> + proxy2 = pacrunner_proxy_create("eth1");
> + if (proxy2) {
> + char *servers[] = {
> + "http://proxy2.com",
> + "https://secproxy2.com",
> + NULL};
> + char *domains[] = {
> + "intel.com",
> + "domain2.com",
> + "192.168.4.0/16",
> + NULL};
> +
> + if (pacrunner_proxy_set_manual(proxy2, servers, NULL) != 0)
> + val = -1;
> +
> + if (pacrunner_proxy_set_domains(proxy2, domains) != 0)
> + val = -1;
> + }
> +
> + proxy3 = pacrunner_proxy_create("wl0");
> + if (proxy3) {
> + char *servers[] = {
> + "http://proxy3.com",
> + "socks4://sockproxy3.com",
> + NULL};
> + char *domains[] = {
> + "redhat.com",
> + "domain3.com",
> + "fe80:96db::/32",
> + NULL};
> +
> + if (pacrunner_proxy_set_manual(proxy3, servers, NULL) != 0)
> + val = -1;
> +
> + if (pacrunner_proxy_set_domains(proxy3, domains) != 0)
> + val = -1;
> + }
> +
> + CU_ASSERT_TRUE(val == 0);
> +}
> +
> static void test_proxy_requests(void)
> {
> gchar **test_strings;
> @@ -430,12 +498,21 @@ static void run_test_suite(const char *test_file_path,
> enum cu_test_mode mode)
> CU_add_test(cu_suite, "Manual config test",
> test_manual_config);
>
> + if (test_suite->domains)
> + CU_add_test(cu_suite, "Proxy domain test",
> + test_proxy_domain);
> +
> if (test_suite->config_result && test_suite->tests)
> CU_add_test(cu_suite, "Proxy requests test",
> test_proxy_requests);
>
> test_config = false;
>
> + if (test_suite->domains) {
> + pacrunner_proxy_unref(proxy2);
> + pacrunner_proxy_unref(proxy3);
> + }
> +
> switch (mode) {
> case CU_MODE_BASIC:
> CU_basic_set_mode(CU_BRM_VERBOSE);
> -- 2.5.5
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.01.org/pipermail/connman/attachments/20160613/2f52a257/attachment.html>
------------------------------
Subject: Digest Footer
_______________________________________________
connman mailing list
[email protected]
https://lists.01.org/mailman/listinfo/connman
------------------------------
End of connman Digest, Vol 8, Issue 15
**************************************