diff options
Diffstat (limited to 'src/main/java/com/btr/proxy/search/desktop/kde/KdeProxySearchStrategy.java')
-rw-r--r-- | src/main/java/com/btr/proxy/search/desktop/kde/KdeProxySearchStrategy.java | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/src/main/java/com/btr/proxy/search/desktop/kde/KdeProxySearchStrategy.java b/src/main/java/com/btr/proxy/search/desktop/kde/KdeProxySearchStrategy.java new file mode 100644 index 0000000..e05d72e --- /dev/null +++ b/src/main/java/com/btr/proxy/search/desktop/kde/KdeProxySearchStrategy.java @@ -0,0 +1,198 @@ +package com.btr.proxy.search.desktop.kde; + +import java.io.IOException; +import java.net.ProxySelector; +import java.util.Properties; + +import com.btr.proxy.search.ProxySearchStrategy; +import com.btr.proxy.search.env.EnvProxySearchStrategy; +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.misc.ProtocolDispatchSelector; +import com.btr.proxy.selector.pac.PacProxySelector; +import com.btr.proxy.selector.pac.UrlPacScriptSource; +import com.btr.proxy.selector.whitelist.ProxyBypassListSelector; +import com.btr.proxy.selector.whitelist.UseProxyWhiteListSelector; +import com.btr.proxy.util.Logger; +import com.btr.proxy.util.Logger.LogLevel; +import com.btr.proxy.util.ProxyException; +import com.btr.proxy.util.ProxyUtil; + +/***************************************************************************** + * Loads the KDE4 proxy settings from the KDE <i>kioslaverc</i> file. + * This will load properties from the file + * <p> + * <i>.kde/share/config/kioslaverc</i> + * </P> + * starting from the current users home directory. + * <p> + * The following settings are extracted from the section "[Proxy Settings]": + * </p> + * <ul> + * <li><i>AuthMode</i> -> 0 = no auth., 1 = use login.</li> + * <li><i>ProxyType</i> -> 0 = direct 1 = use fixed settings, 2 = use PAC, 3 = automatic (WPAD) , 4 = Use environment variables?</li> + * <li><i>Proxy Config</i> Script -> URL to PAC file</li> + * <li><i>ftpProxy</i> -> Fixed ftp proxy address e.g. http://www.ftp-proxy.com:8080</li> + * <li><i>httpProxy</i> -> Fixed http proxy e.g http://www.http-proxy.com:8080</li> + * <li><i>httpsProxy</i> -> Fixed https proxy e.g http://www.https-proxy.com:8080</li> + * <li><i>NoProxyFor</i> -> Proxy white list</li> + * <li><i>ReversedException</i> -> false = use NoProxyFor, true = revert meaning of the NoProxyFor list</li> + * </ul> + * + * + * @author Bernd Rosstauscher (proxyvole@rosstauscher.de) Copyright 2009 + ****************************************************************************/ + +public class KdeProxySearchStrategy implements ProxySearchStrategy { + + private KdeSettingsParser settingsParser; + + /************************************************************************* + * ProxySelector using the given parser. + * @see java.net.ProxySelector#ProxySelector() + ************************************************************************/ + + public KdeProxySearchStrategy() { + this(new KdeSettingsParser()); + } + + /************************************************************************* + * ProxySelector + * @see java.net.ProxySelector#ProxySelector() + ************************************************************************/ + + public KdeProxySearchStrategy(KdeSettingsParser settingsParser) { + super(); + this.settingsParser = settingsParser; + } + + /************************************************************************* + * Loads the proxy settings and initializes a proxy selector for the firefox + * proxy settings. + * @return a configured ProxySelector, null if none is found. + * @throws ProxyException on file reading error. + ************************************************************************/ + + public ProxySelector getProxySelector() throws ProxyException { + + Logger.log(getClass(), LogLevel.TRACE, "Detecting Kde proxy settings"); + + Properties settings = readSettings(); + if (settings == null) { + return null; + } + + ProxySelector result = null; + int type = Integer.parseInt(settings.getProperty("ProxyType", "-1")); + switch (type) { + case 0: // Use no proxy + Logger.log(getClass(), LogLevel.TRACE, "Kde uses no proxy"); + result = NoProxySelector.getInstance(); + break; + case 1: // Fixed settings + Logger.log(getClass(), LogLevel.TRACE, "Kde uses manual proxy settings"); + result = setupFixedProxySelector(settings); + break; + case 2: // PAC Script + String pacScriptUrl = settings.getProperty("Proxy Config Script", ""); + Logger.log(getClass(), LogLevel.TRACE, "Kde uses autodetect script {0}", pacScriptUrl); + result = ProxyUtil.buildPacSelectorForUrl(pacScriptUrl); + break; + case 3: // WPAD + Logger.log(getClass(), LogLevel.TRACE, "Kde uses WPAD to detect the proxy"); + result = new WpadProxySearchStrategy().getProxySelector(); + break; + case 4: // Use environment variables + Logger.log(getClass(), LogLevel.TRACE, "Kde reads proxy from environment"); + result = setupEnvVarSelector(settings); + break; + default: + break; + } + + return result; + } + + /************************************************************************* + * Reads the settings and stores them in a properties map. + * @return the parsed settings. + * @throws ProxyException + ************************************************************************/ + + private Properties readSettings() throws ProxyException { + try { + return this.settingsParser.parseSettings(); + } catch (IOException e) { + Logger.log(getClass(), LogLevel.ERROR, "Can't parse settings.", e); + throw new ProxyException(e); + } + } + + /************************************************************************* + * Builds an environment variable selector. + * @param settings the settings to read from. + * @return the ProxySelector using environment variables. + ************************************************************************/ + + private ProxySelector setupEnvVarSelector(Properties settings) { + ProxySelector result; + result = new EnvProxySearchStrategy( + settings.getProperty("httpProxy"), + settings.getProperty("httpsProxy"), + settings.getProperty("ftpProxy"), + settings.getProperty("NoProxyFor") + ).getProxySelector(); + return result; + } + + /************************************************************************* + * Parse the fixed proxy settings and build an ProxySelector for this a + * chained configuration. + * @param settings the proxy settings to evaluate. + ************************************************************************/ + + private ProxySelector setupFixedProxySelector(Properties settings) { + String proxyVar = settings.getProperty("httpProxy", null); + FixedProxySelector httpPS = ProxyUtil.parseProxySettings(proxyVar); + if (httpPS == null) { + Logger.log(getClass(), LogLevel.TRACE, "Kde http proxy is {0}", proxyVar); + return null; + } + + ProtocolDispatchSelector ps = new ProtocolDispatchSelector(); + ps.setSelector("http", httpPS); + + proxyVar = settings.getProperty("httpsProxy", null); + FixedProxySelector httpsPS = ProxyUtil.parseProxySettings(proxyVar); + if (httpsPS != null) { + Logger.log(getClass(), LogLevel.TRACE, "Kde https proxy is {0}", proxyVar); + ps.setSelector("https", httpsPS); + } + + proxyVar = settings.getProperty("ftpProxy", null); + FixedProxySelector ftpPS = ProxyUtil.parseProxySettings(proxyVar); + if (ftpPS != null) { + Logger.log(getClass(), LogLevel.TRACE, "Kde ftp proxy is {0}", proxyVar); + ps.setSelector("ftp", ftpPS); + } + + // Wrap in white list filter. + String noProxyList = settings.getProperty("NoProxyFor", null); + if (noProxyList != null && noProxyList.trim().length() > 0) { + boolean reverse = "true".equals(settings.getProperty("ReversedException", "false")); + if (reverse) { + Logger.log(getClass(), LogLevel.TRACE, "Kde proxy blacklist is {0}", noProxyList); + return new UseProxyWhiteListSelector(noProxyList, ps); + } else { + Logger.log(getClass(), LogLevel.TRACE, "Kde proxy whitelist is {0}", noProxyList); + return new ProxyBypassListSelector(noProxyList, ps); + } + } + + return ps; + } + + + +} |