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
***************************************

Reply via email to