From e70ee5b59306ea37dd0c72603c61b33b1555def9 Mon Sep 17 00:00:00 2001 From: Björn Hagemeister Date: Tue, 11 Nov 2014 14:40:18 +0100 Subject: Added proxy java classes. --- .../java/com/btr/proxy/search/ProxySearch.java | 258 ++++++ .../com/btr/proxy/search/ProxySearchStrategy.java | 22 + .../browser/firefox/FirefoxProfileSource.java | 23 + .../firefox/FirefoxProxySearchStrategy.java | 267 +++++++ .../browser/firefox/FirefoxSettingParser.java | 79 ++ .../browser/firefox/LinuxFirefoxProfileSource.java | 46 ++ .../browser/firefox/WinFirefoxProfileSource.java | 71 ++ .../search/browser/ie/IELocalByPassFilter.java | 28 + .../search/browser/ie/IEProxySearchStrategy.java | 213 +++++ .../search/desktop/DesktopProxySearchStrategy.java | 69 ++ .../desktop/gnome/GnomeProxySearchStrategy.java | 353 +++++++++ .../desktop/gnome/ProxySchemasGSettingsAccess.java | 60 ++ .../search/desktop/kde/KdeProxySearchStrategy.java | 198 +++++ .../search/desktop/kde/KdeSettingsParser.java | 132 ++++ .../search/desktop/osx/OsxProxySearchStrategy.java | 325 ++++++++ .../btr/proxy/search/desktop/win/DLLManager.java | 171 ++++ .../proxy/search/desktop/win/Win32IESettings.java | 68 ++ .../proxy/search/desktop/win/Win32ProxyUtils.java | 88 +++ .../search/desktop/win/WinProxySearchStrategy.java | 52 ++ .../proxy/search/env/EnvProxySearchStrategy.java | 130 +++ .../proxy/search/java/JavaProxySearchStrategy.java | 133 ++++ .../proxy/search/wpad/WpadProxySearchStrategy.java | 234 ++++++ .../wpad/WpadProxySearchStrategyWithDHPC.java | 315 ++++++++ .../btr/proxy/search/wpad/dhcp/DHCPMessage.java | 880 +++++++++++++++++++++ .../btr/proxy/search/wpad/dhcp/DHCPOptions.java | 235 ++++++ .../com/btr/proxy/search/wpad/dhcp/DHCPSocket.java | 107 +++ .../btr/proxy/selector/direct/NoProxySelector.java | 70 ++ .../proxy/selector/fixed/FixedProxySelector.java | 69 ++ .../proxy/selector/fixed/FixedSocksSelector.java | 27 + .../proxy/selector/misc/BufferedProxySelector.java | 126 +++ .../selector/misc/ProtocolDispatchSelector.java | 115 +++ .../selector/misc/ProxyListFallbackSelector.java | 150 ++++ .../proxy/selector/pac/JavaxPacScriptParser.java | 147 ++++ .../btr/proxy/selector/pac/PacProxySelector.java | 184 +++++ .../btr/proxy/selector/pac/PacScriptMethods.java | 656 +++++++++++++++ .../btr/proxy/selector/pac/PacScriptParser.java | 29 + .../btr/proxy/selector/pac/PacScriptSource.java | 31 + .../selector/pac/ProxyEvaluationException.java | 51 ++ .../proxy/selector/pac/RhinoPacScriptParser.java | 318 ++++++++ .../btr/proxy/selector/pac/ScriptAvailability.java | 46 ++ .../com/btr/proxy/selector/pac/ScriptMethods.java | 256 ++++++ .../btr/proxy/selector/pac/UrlPacScriptSource.java | 270 +++++++ .../selector/whitelist/DefaultWhiteListParser.java | 78 ++ .../proxy/selector/whitelist/HostnameFilter.java | 93 +++ .../selector/whitelist/IPv4WithSubnetChecker.java | 29 + .../proxy/selector/whitelist/IpRangeFilter.java | 83 ++ .../whitelist/ProxyBypassListSelector.java | 84 ++ .../whitelist/UseProxyWhiteListSelector.java | 74 ++ .../proxy/selector/whitelist/WhiteListParser.java | 24 + src/main/java/com/btr/proxy/test/ProxyTester.java | 176 +++++ .../java/com/btr/proxy/util/EmptyXMLResolver.java | 26 + src/main/java/com/btr/proxy/util/Logger.java | 87 ++ src/main/java/com/btr/proxy/util/PListParser.java | 544 +++++++++++++ src/main/java/com/btr/proxy/util/PlatformUtil.java | 114 +++ .../java/com/btr/proxy/util/ProxyException.java | 50 ++ src/main/java/com/btr/proxy/util/ProxyUtil.java | 84 ++ src/main/java/com/btr/proxy/util/UriFilter.java | 21 + src/main/resources/lib/gsettings-amd64.so | Bin 0 -> 11979 bytes src/main/resources/lib/gsettings-x86.so | Bin 0 -> 11822 bytes src/main/resources/lib/proxy_util_amd64.dll | Bin 0 -> 40448 bytes src/main/resources/lib/proxy_util_ia64.dll | Bin 0 -> 91136 bytes src/main/resources/lib/proxy_util_w32.dll | Bin 0 -> 43520 bytes src/test/java/com/btr/proxy/Examples.java | 47 ++ src/test/java/com/btr/proxy/TestUtil.java | 61 ++ .../com/btr/proxy/search/browser/FirefoxTest.java | 144 ++++ .../java/com/btr/proxy/search/browser/IeTest.java | 59 ++ .../search/desktop/DesktopProxySearchTest.java | 45 ++ .../proxy/search/desktop/win/DLLManagerTest.java | 78 ++ .../proxy/search/gnome/GnomeProxySearchTest.java | 117 +++ .../btr/proxy/search/java/JavaProxySearchTest.java | 137 ++++ .../btr/proxy/search/kde/KdeProxySearchTest.java | 177 +++++ .../btr/proxy/selector/fixed/FixedProxyTest.java | 56 ++ .../proxy/selector/java/JavaProxySelectorTest.java | 28 + .../proxy/selector/misc/ProtocolDispatchTest.java | 87 ++ .../misc/ProxyListFallbackSelectorTest.java | 94 +++ .../selector/pac/JavaxPacScriptParserTest.java | 119 +++ .../btr/proxy/selector/pac/PacPerProtocolTest.java | 47 ++ .../btr/proxy/selector/pac/PacProxyDebugging.java | 103 +++ .../proxy/selector/pac/PacProxySelectorTest.java | 133 ++++ .../proxy/selector/pac/PacScriptMethodsTest.java | 165 ++++ .../selector/pac/RhinoPacScriptParserTest.java | 114 +++ .../proxy/selector/pac/UrlPacScriptSourceTest.java | 34 + .../btr/proxy/selector/whitelist/NoProxyTest.java | 108 +++ .../java/com/btr/proxy/util/PListParserTest.java | 101 +++ .../java/com/btr/proxy/util/ProxyUtilTest.java | 78 ++ .../java/com/btr/proxy/util/UriFilterTest.java | 122 +++ .../.mozilla/firefox/9f1uyzzu.default/prefs.js | 76 ++ .../.mozilla/firefox/9f1uyzzu.default/prefs.js | 77 ++ .../.mozilla/firefox/9f1uyzzu.default/prefs.js | 76 ++ .../.mozilla/firefox/9f1uyzzu.default/prefs.js | 77 ++ .../.gconf/system/http_proxy/%gconf.xml | 23 + .../gnome_manual/.gconf/system/proxy/%gconf.xml | 36 + .../gnome_none/.gconf/system/http_proxy/%gconf.xml | 21 + .../.gconf/system/http_proxy/%gconf.xml | 26 + .../.gconf/system/proxy/%gconf.xml | 39 + .../.gconf/system/http_proxy/%gconf.xml | 26 + .../.gconf/system/proxy/%gconf.xml | 36 + .../data/kde_env/.kde/share/config/kioslaverc | 17 + .../data/kde_manual/.kde/share/config/kioslaverc | 17 + .../data/kde_none/.kde/share/config/kioslaverc | 17 + .../kde_pac_script/.kde/share/config/kioslaverc | 17 + .../kde_white_list/.kde/share/config/kioslaverc | 17 + src/test/resources/data/osx/osx_all.plist | 144 ++++ src/test/resources/data/osx/osx_manual.plist | 144 ++++ src/test/resources/data/osx/osx_pac.plist | 144 ++++ src/test/resources/data/pac/test1.pac | 4 + src/test/resources/data/pac/test2.pac | 10 + src/test/resources/data/pac/testDateRange.pac | 11 + src/test/resources/data/pac/testLocalIP.pac | 4 + src/test/resources/data/pac/testMultiProxy.pac | 4 + src/test/resources/data/pac/testTimeRange.pac | 11 + src/test/resources/data/pac/testWeekDay.pac | 10 + src/test/resources/data/win/proxy_util_amd64.dll | 0 src/test/resources/data/win/proxy_util_ia64.dll | 0 src/test/resources/data/win/proxy_util_w32.dll | 0 src/test/resources/data/wpad/wpad.pac | 4 + 116 files changed, 12011 insertions(+) create mode 100644 src/main/java/com/btr/proxy/search/ProxySearch.java create mode 100644 src/main/java/com/btr/proxy/search/ProxySearchStrategy.java create mode 100644 src/main/java/com/btr/proxy/search/browser/firefox/FirefoxProfileSource.java create mode 100644 src/main/java/com/btr/proxy/search/browser/firefox/FirefoxProxySearchStrategy.java create mode 100644 src/main/java/com/btr/proxy/search/browser/firefox/FirefoxSettingParser.java create mode 100644 src/main/java/com/btr/proxy/search/browser/firefox/LinuxFirefoxProfileSource.java create mode 100644 src/main/java/com/btr/proxy/search/browser/firefox/WinFirefoxProfileSource.java create mode 100644 src/main/java/com/btr/proxy/search/browser/ie/IELocalByPassFilter.java create mode 100644 src/main/java/com/btr/proxy/search/browser/ie/IEProxySearchStrategy.java create mode 100644 src/main/java/com/btr/proxy/search/desktop/DesktopProxySearchStrategy.java create mode 100644 src/main/java/com/btr/proxy/search/desktop/gnome/GnomeProxySearchStrategy.java create mode 100644 src/main/java/com/btr/proxy/search/desktop/gnome/ProxySchemasGSettingsAccess.java create mode 100644 src/main/java/com/btr/proxy/search/desktop/kde/KdeProxySearchStrategy.java create mode 100644 src/main/java/com/btr/proxy/search/desktop/kde/KdeSettingsParser.java create mode 100644 src/main/java/com/btr/proxy/search/desktop/osx/OsxProxySearchStrategy.java create mode 100644 src/main/java/com/btr/proxy/search/desktop/win/DLLManager.java create mode 100644 src/main/java/com/btr/proxy/search/desktop/win/Win32IESettings.java create mode 100644 src/main/java/com/btr/proxy/search/desktop/win/Win32ProxyUtils.java create mode 100644 src/main/java/com/btr/proxy/search/desktop/win/WinProxySearchStrategy.java create mode 100644 src/main/java/com/btr/proxy/search/env/EnvProxySearchStrategy.java create mode 100644 src/main/java/com/btr/proxy/search/java/JavaProxySearchStrategy.java create mode 100644 src/main/java/com/btr/proxy/search/wpad/WpadProxySearchStrategy.java create mode 100644 src/main/java/com/btr/proxy/search/wpad/WpadProxySearchStrategyWithDHPC.java create mode 100644 src/main/java/com/btr/proxy/search/wpad/dhcp/DHCPMessage.java create mode 100644 src/main/java/com/btr/proxy/search/wpad/dhcp/DHCPOptions.java create mode 100644 src/main/java/com/btr/proxy/search/wpad/dhcp/DHCPSocket.java create mode 100644 src/main/java/com/btr/proxy/selector/direct/NoProxySelector.java create mode 100644 src/main/java/com/btr/proxy/selector/fixed/FixedProxySelector.java create mode 100644 src/main/java/com/btr/proxy/selector/fixed/FixedSocksSelector.java create mode 100644 src/main/java/com/btr/proxy/selector/misc/BufferedProxySelector.java create mode 100644 src/main/java/com/btr/proxy/selector/misc/ProtocolDispatchSelector.java create mode 100644 src/main/java/com/btr/proxy/selector/misc/ProxyListFallbackSelector.java create mode 100644 src/main/java/com/btr/proxy/selector/pac/JavaxPacScriptParser.java create mode 100644 src/main/java/com/btr/proxy/selector/pac/PacProxySelector.java create mode 100644 src/main/java/com/btr/proxy/selector/pac/PacScriptMethods.java create mode 100644 src/main/java/com/btr/proxy/selector/pac/PacScriptParser.java create mode 100644 src/main/java/com/btr/proxy/selector/pac/PacScriptSource.java create mode 100644 src/main/java/com/btr/proxy/selector/pac/ProxyEvaluationException.java create mode 100644 src/main/java/com/btr/proxy/selector/pac/RhinoPacScriptParser.java create mode 100644 src/main/java/com/btr/proxy/selector/pac/ScriptAvailability.java create mode 100644 src/main/java/com/btr/proxy/selector/pac/ScriptMethods.java create mode 100644 src/main/java/com/btr/proxy/selector/pac/UrlPacScriptSource.java create mode 100644 src/main/java/com/btr/proxy/selector/whitelist/DefaultWhiteListParser.java create mode 100644 src/main/java/com/btr/proxy/selector/whitelist/HostnameFilter.java create mode 100644 src/main/java/com/btr/proxy/selector/whitelist/IPv4WithSubnetChecker.java create mode 100644 src/main/java/com/btr/proxy/selector/whitelist/IpRangeFilter.java create mode 100644 src/main/java/com/btr/proxy/selector/whitelist/ProxyBypassListSelector.java create mode 100644 src/main/java/com/btr/proxy/selector/whitelist/UseProxyWhiteListSelector.java create mode 100644 src/main/java/com/btr/proxy/selector/whitelist/WhiteListParser.java create mode 100644 src/main/java/com/btr/proxy/test/ProxyTester.java create mode 100644 src/main/java/com/btr/proxy/util/EmptyXMLResolver.java create mode 100644 src/main/java/com/btr/proxy/util/Logger.java create mode 100644 src/main/java/com/btr/proxy/util/PListParser.java create mode 100644 src/main/java/com/btr/proxy/util/PlatformUtil.java create mode 100644 src/main/java/com/btr/proxy/util/ProxyException.java create mode 100644 src/main/java/com/btr/proxy/util/ProxyUtil.java create mode 100644 src/main/java/com/btr/proxy/util/UriFilter.java create mode 100644 src/main/resources/lib/gsettings-amd64.so create mode 100644 src/main/resources/lib/gsettings-x86.so create mode 100644 src/main/resources/lib/proxy_util_amd64.dll create mode 100644 src/main/resources/lib/proxy_util_ia64.dll create mode 100644 src/main/resources/lib/proxy_util_w32.dll create mode 100644 src/test/java/com/btr/proxy/Examples.java create mode 100644 src/test/java/com/btr/proxy/TestUtil.java create mode 100644 src/test/java/com/btr/proxy/search/browser/FirefoxTest.java create mode 100644 src/test/java/com/btr/proxy/search/browser/IeTest.java create mode 100644 src/test/java/com/btr/proxy/search/desktop/DesktopProxySearchTest.java create mode 100644 src/test/java/com/btr/proxy/search/desktop/win/DLLManagerTest.java create mode 100644 src/test/java/com/btr/proxy/search/gnome/GnomeProxySearchTest.java create mode 100644 src/test/java/com/btr/proxy/search/java/JavaProxySearchTest.java create mode 100644 src/test/java/com/btr/proxy/search/kde/KdeProxySearchTest.java create mode 100644 src/test/java/com/btr/proxy/selector/fixed/FixedProxyTest.java create mode 100644 src/test/java/com/btr/proxy/selector/java/JavaProxySelectorTest.java create mode 100644 src/test/java/com/btr/proxy/selector/misc/ProtocolDispatchTest.java create mode 100644 src/test/java/com/btr/proxy/selector/misc/ProxyListFallbackSelectorTest.java create mode 100644 src/test/java/com/btr/proxy/selector/pac/JavaxPacScriptParserTest.java create mode 100644 src/test/java/com/btr/proxy/selector/pac/PacPerProtocolTest.java create mode 100644 src/test/java/com/btr/proxy/selector/pac/PacProxyDebugging.java create mode 100644 src/test/java/com/btr/proxy/selector/pac/PacProxySelectorTest.java create mode 100644 src/test/java/com/btr/proxy/selector/pac/PacScriptMethodsTest.java create mode 100644 src/test/java/com/btr/proxy/selector/pac/RhinoPacScriptParserTest.java create mode 100644 src/test/java/com/btr/proxy/selector/pac/UrlPacScriptSourceTest.java create mode 100644 src/test/java/com/btr/proxy/selector/whitelist/NoProxyTest.java create mode 100644 src/test/java/com/btr/proxy/util/PListParserTest.java create mode 100644 src/test/java/com/btr/proxy/util/ProxyUtilTest.java create mode 100644 src/test/java/com/btr/proxy/util/UriFilterTest.java create mode 100644 src/test/resources/data/ff3_manual/.mozilla/firefox/9f1uyzzu.default/prefs.js create mode 100644 src/test/resources/data/ff3_none/.mozilla/firefox/9f1uyzzu.default/prefs.js create mode 100644 src/test/resources/data/ff3_pac_script/.mozilla/firefox/9f1uyzzu.default/prefs.js create mode 100644 src/test/resources/data/ff3_white_list/.mozilla/firefox/9f1uyzzu.default/prefs.js create mode 100755 src/test/resources/data/gnome_manual/.gconf/system/http_proxy/%gconf.xml create mode 100755 src/test/resources/data/gnome_manual/.gconf/system/proxy/%gconf.xml create mode 100755 src/test/resources/data/gnome_none/.gconf/system/http_proxy/%gconf.xml create mode 100755 src/test/resources/data/gnome_pac_script/.gconf/system/http_proxy/%gconf.xml create mode 100755 src/test/resources/data/gnome_pac_script/.gconf/system/proxy/%gconf.xml create mode 100755 src/test/resources/data/gnome_white_list/.gconf/system/http_proxy/%gconf.xml create mode 100755 src/test/resources/data/gnome_white_list/.gconf/system/proxy/%gconf.xml create mode 100644 src/test/resources/data/kde_env/.kde/share/config/kioslaverc create mode 100644 src/test/resources/data/kde_manual/.kde/share/config/kioslaverc create mode 100644 src/test/resources/data/kde_none/.kde/share/config/kioslaverc create mode 100644 src/test/resources/data/kde_pac_script/.kde/share/config/kioslaverc create mode 100644 src/test/resources/data/kde_white_list/.kde/share/config/kioslaverc create mode 100644 src/test/resources/data/osx/osx_all.plist create mode 100644 src/test/resources/data/osx/osx_manual.plist create mode 100644 src/test/resources/data/osx/osx_pac.plist create mode 100644 src/test/resources/data/pac/test1.pac create mode 100644 src/test/resources/data/pac/test2.pac create mode 100644 src/test/resources/data/pac/testDateRange.pac create mode 100644 src/test/resources/data/pac/testLocalIP.pac create mode 100644 src/test/resources/data/pac/testMultiProxy.pac create mode 100644 src/test/resources/data/pac/testTimeRange.pac create mode 100644 src/test/resources/data/pac/testWeekDay.pac create mode 100644 src/test/resources/data/win/proxy_util_amd64.dll create mode 100644 src/test/resources/data/win/proxy_util_ia64.dll create mode 100644 src/test/resources/data/win/proxy_util_w32.dll create mode 100644 src/test/resources/data/wpad/wpad.pac (limited to 'src') diff --git a/src/main/java/com/btr/proxy/search/ProxySearch.java b/src/main/java/com/btr/proxy/search/ProxySearch.java new file mode 100644 index 0000000..19db95f --- /dev/null +++ b/src/main/java/com/btr/proxy/search/ProxySearch.java @@ -0,0 +1,258 @@ +package com.btr.proxy.search; + +import java.awt.GraphicsEnvironment; +import java.net.ProxySelector; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; + +import com.btr.proxy.search.browser.firefox.FirefoxProxySearchStrategy; +import com.btr.proxy.search.browser.ie.IEProxySearchStrategy; +import com.btr.proxy.search.desktop.DesktopProxySearchStrategy; +import com.btr.proxy.search.desktop.gnome.GnomeProxySearchStrategy; +import com.btr.proxy.search.desktop.kde.KdeProxySearchStrategy; +import com.btr.proxy.search.desktop.win.WinProxySearchStrategy; +import com.btr.proxy.search.env.EnvProxySearchStrategy; +import com.btr.proxy.search.java.JavaProxySearchStrategy; +import com.btr.proxy.selector.misc.BufferedProxySelector; +import com.btr.proxy.selector.misc.ProxyListFallbackSelector; +import com.btr.proxy.selector.pac.PacProxySelector; +import com.btr.proxy.util.Logger; +import com.btr.proxy.util.PlatformUtil; +import com.btr.proxy.util.ProxyException; +import com.btr.proxy.util.Logger.LogBackEnd; +import com.btr.proxy.util.Logger.LogLevel; + +/***************************************************************************** + * Main class to setup and initialize the proxy detection system.
+ * This class can be used to select a proxy discovery strategy.
+ * Implements the "Builder" pattern.
+ * Use addStrategy to add one or more search strategies.
+ * If you are done call the getProxySelector method.
+ * Then the strategies are asked one after the other for a ProxySelector until + * an valid selector is found.
+ *

+ * Invoke the static getDefaultProxySearch method to use a default search strategy. + *

+ * @author Bernd Rosstauscher (proxyvole@rosstauscher.de) Copyright 2009 + ****************************************************************************/ + +public class ProxySearch implements ProxySearchStrategy { + + private static final int DEFAULT_PAC_CACHE_SIZE = 20; + + private static final long DEFAULT_PAC_CACHE_TTL = 1000*60*10; // 10 Minutes + + private List strategies; + private int pacCacheSize; + private long pacCacheTTL; + + /***************************************************************************** + * Types of proxy detection supported by the builder. + ****************************************************************************/ + + public enum Strategy { + /// Use the platform settings. + OS_DEFAULT, + /// Use the settings of the platforms default browser. + BROWSER, + /// Use Firefox settings + FIREFOX, + /// Use InternetExplorer settings + IE, + /// Use environment variables for proxy settings. + ENV_VAR, + /// Use windows default proxy settings. + WIN, + /// Use KDE desktop default proxy settings. + KDE, + /// Use KDE desktop default proxy settings. + GNOME, + /// Use Java Networking system properties + JAVA + } + + /************************************************************************* + * Constructor + ************************************************************************/ + + public ProxySearch() { + super(); + this.strategies = new ArrayList(); + this.pacCacheSize = DEFAULT_PAC_CACHE_SIZE; + this.pacCacheTTL = DEFAULT_PAC_CACHE_TTL; + } + + /************************************************************************* + * Sets up a ProxySearch that uses a default search strategy suitable for + * every platform. + * @return a ProxySearch initialized with default settings. + ************************************************************************/ + + public static ProxySearch getDefaultProxySearch() { + ProxySearch s = new ProxySearch(); + + // Test if we are a server or a client. + boolean headless = GraphicsEnvironment.isHeadless(); + + if (headless) { + s.addStrategy(Strategy.JAVA); + s.addStrategy(Strategy.OS_DEFAULT); + s.addStrategy(Strategy.ENV_VAR); + } else { + s.addStrategy(Strategy.JAVA); + s.addStrategy(Strategy.BROWSER); + s.addStrategy(Strategy.OS_DEFAULT); + s.addStrategy(Strategy.ENV_VAR); + } + Logger.log(ProxySearch.class, LogLevel.TRACE, "Using default search priority: {0}", s); + + return s; + } + + /************************************************************************* + * Adds an search strategy to the list of proxy searches strategies. + * @param strategy the search strategy to add. + ************************************************************************/ + + public void addStrategy(Strategy strategy) { + switch (strategy) { + case OS_DEFAULT: + this.strategies.add(new DesktopProxySearchStrategy()); + break; + case BROWSER: + this.strategies.add(getDefaultBrowserStrategy()); + break; + case FIREFOX: + this.strategies.add(new FirefoxProxySearchStrategy()); + break; + case IE: + this.strategies.add(new IEProxySearchStrategy()); + break; + case ENV_VAR: + this.strategies.add(new EnvProxySearchStrategy()); + break; + case WIN: + this.strategies.add(new WinProxySearchStrategy()); + break; + case KDE: + this.strategies.add(new KdeProxySearchStrategy()); + break; + case GNOME: + this.strategies.add(new GnomeProxySearchStrategy()); + break; + case JAVA: + this.strategies.add(new JavaProxySearchStrategy()); + break; + default: + throw new IllegalArgumentException("Unknown strategy code!"); + } + } + + /************************************************************************* + * Sets the cache size of the PAC proxy selector cache. + * This defines the number of URLs that are cached together with the PAC + * script result. This improves performance because for URLs that are + * in the cache the script is not executed again. + * You have to set this before you add any strategies that may create a + * PAC script proxy selector. + * @param size of the cache. Set it to 0 to disable caching. + * @param ttl is the time to live of the cache entries as amount of milliseconds. + ************************************************************************/ + + public void setPacCacheSettings(int size, long ttl) { + this.pacCacheSize = size; + this.pacCacheTTL = ttl; + } + + /************************************************************************* + * Gets the search strategy for the platforms default browser. + * @return a ProxySearchStrategy, null if no supported browser was found. + ************************************************************************/ + + private ProxySearchStrategy getDefaultBrowserStrategy() { + switch (PlatformUtil.getDefaultBrowser()) { + case IE: + return new IEProxySearchStrategy(); + case FIREFOX: + return new FirefoxProxySearchStrategy(); + } + return null; + } + + /************************************************************************* + * Gets the proxy selector that will use the configured search order. + * @return a ProxySelector, null if none was found for the current + * builder configuration. + ************************************************************************/ + + public ProxySelector getProxySelector() { + Logger.log(getClass(), LogLevel.TRACE, "Executing search strategies to find proxy selector"); + for (ProxySearchStrategy strat : this.strategies) { + try { + ProxySelector selector = strat.getProxySelector(); + if (selector != null) { + selector = installBufferingAndFallbackBehaviour(selector); + return selector; + } + } catch (ProxyException e) { + Logger.log(getClass(), LogLevel.DEBUG, "Strategy {0} failed trying next one.", e); + // Ignore and try next strategy. + } + } + + return null; + } + + /************************************************************************* + * If it is PAC and we have caching enabled set it here. + * @param selector + * @return + ************************************************************************/ + + private ProxySelector installBufferingAndFallbackBehaviour(ProxySelector selector) { + if (selector instanceof PacProxySelector) { + if (this.pacCacheSize > 0) { + selector = new BufferedProxySelector(this.pacCacheSize, this.pacCacheTTL, selector); + } + selector = new ProxyListFallbackSelector(selector); + } + return selector; + } + + /************************************************************************* + * toString + * @see java.lang.Object#toString() + ************************************************************************/ + @Override + public String toString() { + StringBuilder sb = new StringBuilder("Proxy search: "); + for (ProxySearchStrategy strat : this.strategies) { + sb.append(strat); + sb.append(" "); + } + return sb.toString(); + } + + /************************************************************************* + * For testing only. Will print the logging & proxy information to the console. + * @param args the command line arguments. + ************************************************************************/ + + public static void main(String[] args) { + ProxySearch ps = ProxySearch.getDefaultProxySearch(); + Logger.setBackend(new LogBackEnd() { + + public void log(Class clazz, LogLevel loglevel, String msg, + Object... params) { + System.out.println(MessageFormat.format(msg, params)); + } + + public boolean isLogginEnabled(LogLevel logLevel) { + return true; + } + }); + ps.getProxySelector(); + } + +} diff --git a/src/main/java/com/btr/proxy/search/ProxySearchStrategy.java b/src/main/java/com/btr/proxy/search/ProxySearchStrategy.java new file mode 100644 index 0000000..6f14c28 --- /dev/null +++ b/src/main/java/com/btr/proxy/search/ProxySearchStrategy.java @@ -0,0 +1,22 @@ +package com.btr.proxy.search; + +import java.net.ProxySelector; + +import com.btr.proxy.util.ProxyException; + +/***************************************************************************** + * Interface for a proxy search strategy. + * + * @author Bernd Rosstauscher (proxyvole@rosstauscher.de) Copyright 2009 + ****************************************************************************/ + +public interface ProxySearchStrategy { + + /************************************************************************* + * Gets the a ProxySelector found by applying the search strategy. + * @return a ProxySelector, null if none is found. + ************************************************************************/ + + public ProxySelector getProxySelector() throws ProxyException; + +} diff --git a/src/main/java/com/btr/proxy/search/browser/firefox/FirefoxProfileSource.java b/src/main/java/com/btr/proxy/search/browser/firefox/FirefoxProfileSource.java new file mode 100644 index 0000000..8517074 --- /dev/null +++ b/src/main/java/com/btr/proxy/search/browser/firefox/FirefoxProfileSource.java @@ -0,0 +1,23 @@ +package com.btr.proxy.search.browser.firefox; + +import java.io.File; +import java.io.IOException; + +/***************************************************************************** + * A profile source for Firefox profiles. + * + * @author Bernd Rosstauscher (proxyvole@rosstauscher.de) Copyright 2009 + ****************************************************************************/ + +interface FirefoxProfileSource { + + /************************************************************************* + * Gets a profile folder found on the current system. + * If multiple profile folders are available the "default" profile is chosen. + * @return a profile folder. + * @throws IOException on error. + ************************************************************************/ + + public File getProfileFolder() throws IOException; + +} diff --git a/src/main/java/com/btr/proxy/search/browser/firefox/FirefoxProxySearchStrategy.java b/src/main/java/com/btr/proxy/search/browser/firefox/FirefoxProxySearchStrategy.java new file mode 100644 index 0000000..30c3be1 --- /dev/null +++ b/src/main/java/com/btr/proxy/search/browser/firefox/FirefoxProxySearchStrategy.java @@ -0,0 +1,267 @@ +package com.btr.proxy.search.browser.firefox; + +import java.io.IOException; +import java.net.ProxySelector; +import java.util.Properties; + +import com.btr.proxy.search.ProxySearchStrategy; +import com.btr.proxy.search.desktop.DesktopProxySearchStrategy; +import com.btr.proxy.search.wpad.WpadProxySearchStrategy; +import com.btr.proxy.selector.direct.NoProxySelector; +import com.btr.proxy.selector.fixed.FixedProxySelector; +import com.btr.proxy.selector.fixed.FixedSocksSelector; +import com.btr.proxy.selector.misc.ProtocolDispatchSelector; +import com.btr.proxy.selector.whitelist.ProxyBypassListSelector; +import com.btr.proxy.util.Logger; +import com.btr.proxy.util.Logger.LogLevel; +import com.btr.proxy.util.PlatformUtil; +import com.btr.proxy.util.PlatformUtil.Platform; +import com.btr.proxy.util.ProxyException; +import com.btr.proxy.util.ProxyUtil; + +/***************************************************************************** + * Loads the Firefox3 proxy settings from the users Firefox3 settings. + * This will load the file prefs.js that is located in the + *

+ * .mozilla/firefox/(profile)/ folder. + *

+ * + * See Mozilla_Networking_Preferences + * for an explanation of the proxy settings. + *

+ * The following settings are extracted from + * this file: + *

+ * Some generic settings:
+ * + * Host names and ports per protocol are stored in the following settings: + *