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. [PATCH] src/proxy.c: modify the proxy_lookup () supporting
non-browser schemes (Atul Anand)
----------------------------------------------------------------------
Message: 1
Date: Mon, 15 Aug 2016 00:23:04 +0530
From: Atul Anand <[email protected]>
To: [email protected]
Subject: [PATCH] src/proxy.c: modify the proxy_lookup () supporting
non-browser schemes
Message-ID: <[email protected]>
Content-Type: text/plain; charset=UTF-8
As discussed, the proxy lookup for browser and non browser schemes should
be handled in an order as follows:
A request for a "browser" protocol would match the following configs
order of preference (if they exist):
? Matching "Domains", BrowserOnly==TRUE
? Matching "Domains", BrowserOnly==FALSE
? Domains==NULL, BrowserOnly==TRUE
? Domains==NULL, BrowserOnly==FALSE
A request for a non-browser protocol would match the following:
? Matching "Domains", BrowserOnly==FALSE
? Domains==NULL, BrowserOnly==FALSE (except if a config exists with
Matching "Domains", BrowserOnly==TRUE, in which case we need to
return NULL).
---
doc/manager-api.txt | 5 ++
src/manager.c | 11 +++-
src/pacrunner.h | 2 +-
src/proxy.c | 116 ++++++++++++++++++++++++++++++++++++-----
unit/suite/manual_basic.test | 5 ++
unit/suite/manual_exclude.test | 2 +
unit/suite/pac_basic.test | 2 +
unit/suite/pac_direct.test | 2 +
unit/suite/proxy_domain.test | 5 ++
unit/suite/stub.test | 3 ++
unit/test-pacrunner.c | 39 ++++++++++----
11 files changed, 164 insertions(+), 28 deletions(-)
diff --git a/doc/manager-api.txt b/doc/manager-api.txt
index 9e6209d..de304c0 100644
--- a/doc/manager-api.txt
+++ b/doc/manager-api.txt
@@ -60,6 +60,11 @@ Methods object CreateProxyConfiguration(dict
settings)
Interface name like "wlan0" etc. to provide
consistent results for myIpAddress function.
+ boolean BrowserOnly [optional]
+
+ If this value is set, proxy configuration will
+ be used for only browser schemes.
+
array{string} Domains [optional]
Domain names and IP range for which this proxy
diff --git a/src/manager.c b/src/manager.c
index 5a8b4fd..06e399a 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -142,6 +142,7 @@ static DBusMessage *create_proxy_config(DBusConnection
*conn,
const char *url = NULL, *script = NULL;
char **servers = NULL, **excludes = NULL;
char **domains = NULL, **nameservers = NULL;
+ gboolean browser_only = FALSE;
sender = dbus_message_get_sender(msg);
@@ -199,13 +200,18 @@ static DBusMessage *create_proxy_config(DBusConnection
*conn,
nameservers = extract_string_array(&list);
}
break;
+ case DBUS_TYPE_BOOLEAN:
+ if (g_str_equal(key, "BrowserOnly"))
+ dbus_message_iter_get_basic(&value,
&browser_only);
+
+ break;
}
dbus_message_iter_next(&array);
}
DBG("sender %s method %s interface %s", sender, method, interface);
- DBG("url %s script %p", url, script);
+ DBG("browser-only %u url %s script %p", browser_only, url, script);
if (!method) {
reply = g_dbus_create_error(msg,
@@ -226,7 +232,8 @@ static DBusMessage *create_proxy_config(DBusConnection
*conn,
nameservers = NULL;
- if (pacrunner_proxy_set_domains(config->proxy, domains) < 0)
+ if (pacrunner_proxy_set_domains(config->proxy, domains,
+ browser_only) < 0)
pacrunner_error("Failed to set proxy domains");
if (g_str_equal(method, "direct")) {
diff --git a/src/pacrunner.h b/src/pacrunner.h
index 87c51da..e31d7ef 100644
--- a/src/pacrunner.h
+++ b/src/pacrunner.h
@@ -64,7 +64,7 @@ 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);
+ char **domains, gboolean browser_only);
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 db49c58..934fb7a 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -40,6 +40,7 @@ struct pacrunner_proxy {
char *script;
GList **servers;
GList **excludes;
+ gboolean browser_only;
GList *domains;
void *jsctx;
};
@@ -159,13 +160,40 @@ const char *pacrunner_proxy_get_script(struct
pacrunner_proxy *proxy)
return proxy->script;
}
-int pacrunner_proxy_set_domains(struct pacrunner_proxy *proxy, char **domains)
+static gboolean check_browser_protocol(const char *url)
+{
+ static const char *browser_schemes[] = {
+ "http://",
+ "https://",
+ "ftp://",
+ "socks://",
+ "socks4://",
+ "socks5://",
+ "nntp://",
+ "nntps://",
+ };
+ guint i;
+
+ for(i = 0; i < G_N_ELEMENTS(browser_schemes); i++) {
+ if(strncmp(browser_schemes[i], url, strlen(browser_schemes[i]))
+ == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+int pacrunner_proxy_set_domains(struct pacrunner_proxy *proxy, char **domains,
+ gboolean browser_only)
{
int len;
char *slash, **domain;
char ip[INET6_ADDRSTRLEN + 1];
- DBG("proxy %p domains %p", proxy, domains);
+ DBG("proxy %p domains %p browser-only %u", proxy,
+ domains, browser_only);
+
+ proxy->browser_only = browser_only;
if (!proxy)
return -EINVAL;
@@ -479,13 +507,17 @@ static int compare_host_in_domain(const char *host,
struct proxy_domain *match)
char *pacrunner_proxy_lookup(const char *url, const char *host)
{
GList *l, *list;
+ gboolean browser_request, remember = FALSE;
struct in_addr ip4_addr;
struct in6_addr ip6_addr;
- struct pacrunner_proxy *selected_proxy = NULL, *default_proxy = NULL;
+ struct pacrunner_proxy *selected_proxy = NULL;
+ struct pacrunner_proxy *default_browser = NULL, *default_all = NULL;
int protocol = 0;
DBG("url %s host %s", url, host);
+ browser_request = check_browser_protocol(url);
+
pthread_mutex_lock(&proxy_mutex);
while (proxy_updating)
pthread_cond_wait(&proxy_cond, &proxy_mutex);
@@ -516,8 +548,11 @@ char *pacrunner_proxy_lookup(const char *url, const char
*host)
struct pacrunner_proxy *proxy = list->data;
if (!proxy->domains) {
- if (!default_proxy)
- default_proxy = proxy;
+ if (proxy->browser_only && !default_browser)
+ default_browser = proxy;
+ else if (!proxy->browser_only && !default_all)
+ default_all = proxy;
+
continue;
}
@@ -531,27 +566,71 @@ char *pacrunner_proxy_lookup(const char *url, const char
*host)
case 4:
if (compare_legacy_ip_in_net(&ip4_addr,
data) == 0) {
- selected_proxy = proxy;
DBG("match proxy %p Legacy IP range %s",
proxy, data->domain);
- goto found;
+ if (browser_request) {
+ if (proxy->browser_only) {
+ selected_proxy = proxy;
+ goto matches;
+ } else if (!selected_proxy)
+ selected_proxy = proxy;
+ }
+ else {
+ if (!proxy->browser_only) {
+ selected_proxy = proxy;
+ goto matches;
+ } else {
+ /*
+ * Remember that domain
+ * matched config exist
+ * ed with browser_only
+ * TRUE.(We shouldn't
+ * fallback default_all)
+ */
+ remember = TRUE;
+ }
+ }
}
break;
case 6:
if (compare_ipv6_in_net(&ip6_addr,
data) == 0) {
- selected_proxy = proxy;
DBG("match proxy %p IPv6 range %s",
proxy, data->domain);
- goto found;
+ if (browser_request) {
+ if (proxy->browser_only) {
+ selected_proxy = proxy;
+ goto matches;
+ } else if (!selected_proxy)
+ selected_proxy = proxy;
+ }
+ else {
+ if (!proxy->browser_only) {
+ selected_proxy = proxy;
+ goto matches;
+ } else
+ remember = TRUE;
+ }
}
break;
default:
if (compare_host_in_domain(host, data) == 0) {
- selected_proxy = proxy;
DBG("match proxy %p DNS domain %s",
proxy, data->domain);
- goto found;
+ if (browser_request) {
+ if (proxy->browser_only) {
+ selected_proxy = proxy;
+ goto matches;
+ } else if (!selected_proxy)
+ selected_proxy = proxy;
+ }
+ else {
+ if (!proxy->browser_only) {
+ selected_proxy = proxy;
+ goto matches;
+ } else
+ remember = TRUE;
+ }
}
break;
}
@@ -559,11 +638,20 @@ char *pacrunner_proxy_lookup(const char *url, const char
*host)
}
if (!selected_proxy) {
- DBG("default proxy %p", default_proxy);
- selected_proxy = default_proxy;
+ if (browser_request) {
+ DBG("default proxy browser %p all %p",
+ default_browser, default_all);
+ if (default_browser)
+ selected_proxy = default_browser;
+ else
+ selected_proxy = default_all;
+ } else if (!browser_request && !remember) {
+ DBG("default proxy all %p", default_all);
+ selected_proxy = default_all;
+ }
}
-found:
+matches:
pthread_mutex_unlock(&proxy_mutex);
if (!selected_proxy)
diff --git a/unit/suite/manual_basic.test b/unit/suite/manual_basic.test
index 4406d9c..bfe1ff3 100644
--- a/unit/suite/manual_basic.test
+++ b/unit/suite/manual_basic.test
@@ -10,6 +10,9 @@ socks4://sockproxy.internal.com
[excludes]
+[browseronly]
+FALSE
+
[domains]
[config]
@@ -24,3 +27,5 @@ https://bar.net/?property=true bar.net
PROXY secproxy.internal.com; PROXY proxy.internal.com; SOCKS4
sockproxy.internal.com
socks4://sockaccess.external.net:8888/sock_script sockaccess.external.net
SOCKS4 sockproxy.internal.com; PROXY proxy.internal.com; PROXY
secproxy.internal.com
+smtp://mail.client.com/drafts mail.client.com
+PROXY proxy.internal.com; PROXY secproxy.internal.com; SOCKS4
sockproxy.internal.com
diff --git a/unit/suite/manual_exclude.test b/unit/suite/manual_exclude.test
index 211ae16..841505a 100644
--- a/unit/suite/manual_exclude.test
+++ b/unit/suite/manual_exclude.test
@@ -15,6 +15,8 @@ ftp://
*net
tri*
+[browser_only]
+
[domains]
[config]
diff --git a/unit/suite/pac_basic.test b/unit/suite/pac_basic.test
index c63757e..4217b6c 100644
--- a/unit/suite/pac_basic.test
+++ b/unit/suite/pac_basic.test
@@ -17,6 +17,8 @@ function FindProxyForURL(url, host)
[excludes]
+[browseronly]
+
[domains]
[config]
diff --git a/unit/suite/pac_direct.test b/unit/suite/pac_direct.test
index b820abc..9b93214 100644
--- a/unit/suite/pac_direct.test
+++ b/unit/suite/pac_direct.test
@@ -11,6 +11,8 @@ function FindProxyForURL(url, host)
[excludes]
+[browseronly]
+
[domains]
[config]
diff --git a/unit/suite/proxy_domain.test b/unit/suite/proxy_domain.test
index 8c2c5e4..1cf84d1 100644
--- a/unit/suite/proxy_domain.test
+++ b/unit/suite/proxy_domain.test
@@ -8,6 +8,9 @@ http://proxy.suite.com
[excludes]
+[browseronly]
+TRUE
+
[domains]
suite.com
test.suite.com
@@ -35,3 +38,5 @@ 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
+imap://mail.google.com/id=inbox mail.google.com
+DIRECT
diff --git a/unit/suite/stub.test b/unit/suite/stub.test
index cde0aeb..2b1238f 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
+[browseronly]
+# Specifies if this configuration is for browser only schemes.
+
[domains]
# List of domains are here
diff --git a/unit/test-pacrunner.c b/unit/test-pacrunner.c
index 0c4ac69..ccdeca5 100644
--- a/unit/test-pacrunner.c
+++ b/unit/test-pacrunner.c
@@ -38,14 +38,15 @@
#include "pacrunner.h"
enum test_suite_part {
- SUITE_TITLE = 0,
- SUITE_PAC = 1,
- SUITE_SERVERS = 2,
- SUITE_EXCLUDES = 3,
- SUITE_DOMAINS = 4,
- SUITE_CONFIG = 5,
- SUITE_TESTS = 6,
- SUITE_NOTHING = 7,
+ SUITE_TITLE = 0,
+ SUITE_PAC = 1,
+ SUITE_SERVERS = 2,
+ SUITE_EXCLUDES = 3,
+ SUITE_BROWSER_ONLY = 4,
+ SUITE_DOMAINS = 5,
+ SUITE_CONFIG = 6,
+ SUITE_TESTS = 7,
+ SUITE_NOTHING = 8,
};
enum cu_test_mode {
@@ -59,6 +60,7 @@ struct pacrunner_test_suite {
gchar *pac;
gchar **servers;
gchar **excludes;
+ gboolean browser_only;
gchar **domains;
bool config_result;
@@ -145,6 +147,9 @@ static void print_test_suite(struct pacrunner_test_suite
*suite)
} else
printf("(none)\n");
+ printf("\nBrowser Only: %s\n",
+ suite->browser_only ? "TRUE" : "FALSE");
+
printf("\nDomains:\n");
if (suite->domains) {
for (line = suite->domains; *line; line++)
@@ -250,6 +255,13 @@ static struct pacrunner_test_suite *read_test_suite(const
char *path)
suite->excludes = array;
break;
+ case SUITE_BROWSER_ONLY:
+ if (strncmp(*line, "TRUE", 4) == 0)
+ suite->browser_only = TRUE;
+ else
+ suite->browser_only = FALSE;
+
+ break;
case SUITE_DOMAINS:
array = _g_strappendv(suite->domains, *line);
if (!array)
@@ -291,6 +303,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, "[browseronly]", 13) == 0)
+ part = SUITE_BROWSER_ONLY;
else if (strncmp(*line, "[domains]", 9) == 0)
part = SUITE_DOMAINS;
else if (strncmp(*line, "[config]", 8) == 0)
@@ -363,7 +377,8 @@ static void test_proxy_domain(void)
{
int val = 0;
- if (pacrunner_proxy_set_domains(proxy, test_suite->domains) != 0)
+ if (pacrunner_proxy_set_domains(proxy, test_suite->domains,
+ test_suite->browser_only) != 0)
val = -1;
proxy2 = pacrunner_proxy_create("eth1");
@@ -381,7 +396,8 @@ static void test_proxy_domain(void)
if (pacrunner_proxy_set_manual(proxy2, servers, NULL) != 0)
val = -1;
- if (pacrunner_proxy_set_domains(proxy2, domains) != 0)
+ if (pacrunner_proxy_set_domains(proxy2, domains,
+ test_suite->browser_only) != 0)
val = -1;
}
@@ -400,7 +416,8 @@ static void test_proxy_domain(void)
if (pacrunner_proxy_set_manual(proxy3, servers, NULL) != 0)
val = -1;
- if (pacrunner_proxy_set_domains(proxy3, domains) != 0)
+ if (pacrunner_proxy_set_domains(proxy3, domains,
+ test_suite->browser_only) != 0)
val = -1;
}
--
2.5.5
------------------------------
Subject: Digest Footer
_______________________________________________
connman mailing list
[email protected]
https://lists.01.org/mailman/listinfo/connman
------------------------------
End of connman Digest, Vol 10, Issue 11
***************************************