/hg/icedtea-web: integrate basic proxy configuration support
omajid at icedtea.classpath.org
omajid at icedtea.classpath.org
Tue Nov 23 07:07:27 PST 2010
changeset dd77da50a226 in /hg/icedtea-web
details: http://icedtea.classpath.org/hg/icedtea-web?cmd=changeset;node=dd77da50a226
author: Omair Majid <omajid at redhat.com>
date: Tue Nov 23 10:05:06 2010 -0500
integrate basic proxy configuration support
2010-11-23 Omair Majid <omajid at redhat.com>
*
netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java:
Add KEY_PROXY_TYPE, KEY_PROXY_SAME, KEY_PROXY_AUTO_CONFIG_URL,
KEY_PROXY_BYPASS_LIST, KEY_PROXY_BYPASS_LOCAL, KEY_PROXY_HTTP_HOST,
KEY_PROXY_HTTP_PORT, KEY_PROXY_HTTPS_HOST, KEY_PROXY_HTTPS_PORT,
KEY_PROXY_FTP_HOST, KEY_PROXY_FTP_PORT, KEY_PROXY_SOCKS4_HOST,
KEY_PROXY_SOCKS4_PORT, and KEY_PROXY_OVERRIDE_HOSTS.
(loadDefaultProperties): Use the new constants.
* netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java: New
class. (JNLPProxySelector): New method.
(parseConfiguration): New method. Initializes this object by
querying the configuration. (getHost): New method.
(getPort): New method. (connectFailed): New method.
(select): New method. Returns a list of appropriate proxies to use
for a given uri. (inBypassList): New method. Return true if the
host in the URI should be bypassed for proxy purposes.
(isLocalHost): New method. (getFromConfiguration): New method.
Finds a proxy based on configuration. (getFromPAC): New
method. (getFromBrowser): New method.
* netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java (initialize):
Install proxy selector and authenticator.
* plugin/icedteanp/java/sun/applet/PluginMain.java (init): Do not
install authenticator. (CustomAuthenticator): Moved to...
* netx/net/sourceforge/jnlp/security/JNLPAuthenticator.java: Here.
* plugin/icedteanp/java/sun/applet/PasswordAuthenticationDialog.java
Moved to...
* netx/net/sourceforge/jnlp/security
/PasswordAuthenticationDialog.java: Here.
* plugin/icedteanp/java/sun/applet/PluginProxySelector.java: Extend
JNLPProxySelector. (select): Renamed to... (getFromBrowser):
New method.
diffstat:
9 files changed, 755 insertions(+), 296 deletions(-)
ChangeLog | 41 +
netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java | 53 -
netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java | 360 ++++++++++
netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java | 7
netx/net/sourceforge/jnlp/security/JNLPAuthenticator.java | 61 +
netx/net/sourceforge/jnlp/security/PasswordAuthenticationDialog.java | 247 ++++++
plugin/icedteanp/java/sun/applet/PasswordAuthenticationDialog.java | 241 ------
plugin/icedteanp/java/sun/applet/PluginMain.java | 24
plugin/icedteanp/java/sun/applet/PluginProxySelector.java | 17
diffs (truncated from 1178 to 500 lines):
diff -r 5a9f55d67b50 -r dd77da50a226 ChangeLog
--- a/ChangeLog Fri Nov 19 10:35:27 2010 -0500
+++ b/ChangeLog Tue Nov 23 10:05:06 2010 -0500
@@ -1,3 +1,44 @@ 2010-11-19 Omair Majid <omajid at redhat.
+2010-11-23 Omair Majid <omajid at redhat.com>
+
+ * netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java:
+ Add KEY_PROXY_TYPE, KEY_PROXY_SAME, KEY_PROXY_AUTO_CONFIG_URL,
+ KEY_PROXY_BYPASS_LIST, KEY_PROXY_BYPASS_LOCAL, KEY_PROXY_HTTP_HOST,
+ KEY_PROXY_HTTP_PORT, KEY_PROXY_HTTPS_HOST, KEY_PROXY_HTTPS_PORT,
+ KEY_PROXY_FTP_HOST, KEY_PROXY_FTP_PORT, KEY_PROXY_SOCKS4_HOST,
+ KEY_PROXY_SOCKS4_PORT, and KEY_PROXY_OVERRIDE_HOSTS.
+ (loadDefaultProperties): Use the new constants.
+ * netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java: New
+ class.
+ (JNLPProxySelector): New method.
+ (parseConfiguration): New method. Initializes this object by
+ querying the configuration.
+ (getHost): New method.
+ (getPort): New method.
+ (connectFailed): New method.
+ (select): New method. Returns a list of appropriate proxies to use
+ for a given uri.
+ (inBypassList): New method. Return true if the host in the URI
+ should be bypassed for proxy purposes.
+ (isLocalHost): New method.
+ (getFromConfiguration): New method. Finds a proxy based on
+ configuration.
+ (getFromPAC): New method.
+ (getFromBrowser): New method.
+ * netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java
+ (initialize): Install proxy selector and authenticator.
+ * plugin/icedteanp/java/sun/applet/PluginMain.java
+ (init): Do not install authenticator.
+ (CustomAuthenticator): Moved to...
+ * netx/net/sourceforge/jnlp/security/JNLPAuthenticator.java: Here.
+ * plugin/icedteanp/java/sun/applet/PasswordAuthenticationDialog.java
+ Moved to...
+ * netx/net/sourceforge/jnlp/security
+ /PasswordAuthenticationDialog.java: Here.
+ * plugin/icedteanp/java/sun/applet/PluginProxySelector.java: Extend
+ JNLPProxySelector.
+ (select): Renamed to...
+ (getFromBrowser): New method.
+
2010-11-19 Omair Majid <omajid at redhat.com>
* Makefile.am (EXTRA_DIST): Replace javaws.desktop with
diff -r 5a9f55d67b50 -r dd77da50a226 netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java
--- a/netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java Fri Nov 19 10:35:27 2010 -0500
+++ b/netx/net/sourceforge/jnlp/runtime/DeploymentConfiguration.java Tue Nov 23 10:05:06 2010 -0500
@@ -120,13 +120,6 @@ public final class DeploymentConfigurati
public static final String CONSOLE_SHOW = "SHOW";
public static final String CONSOLE_DISABLE = "DISABLE";
- /* FIXME these should be moved into the proxy class */
- public static final int PROXY_TYPE_UNKNOWN = -1;
- public static final int PROXY_TYPE_NONE = 0;
- public static final int PROXY_TYPE_MANUAL = 1;
- public static final int PROXY_TYPE_AUTO = 2;
- public static final int PROXY_TYPE_BROWSER = 3;
-
public static final String KEY_USER_CACHE_DIR = "deployment.user.cachedir";
public static final String KEY_USER_PERSISTENCE_CACHE_DIR = "deployment.user.pcachedir";
public static final String KEY_SYSTEM_CACHE_DIR = "deployment.system.cachedir";
@@ -170,6 +163,24 @@ public final class DeploymentConfigurati
/** Boolean. Only install the custom authenticator if true */
public static final String KEY_SECURITY_INSTALL_AUTHENTICATOR = "deployment.security.authenticator";
+
+ /*
+ * Networking
+ */
+ public static final String KEY_PROXY_TYPE = "deployment.proxy.type";
+ public static final String KEY_PROXY_SAME = "deployment.proxy.same";
+ public static final String KEY_PROXY_AUTO_CONFIG_URL = "deployment.proxy.auto.config.url";
+ public static final String KEY_PROXY_BYPASS_LIST = "deployment.proxy.bypass.list";
+ public static final String KEY_PROXY_BYPASS_LOCAL = "deployment.proxy.bypass.local";
+ public static final String KEY_PROXY_HTTP_HOST = "deployment.proxy.http.host";
+ public static final String KEY_PROXY_HTTP_PORT = "deployment.proxy.http.port";
+ public static final String KEY_PROXY_HTTPS_HOST = "deployment.proxy.https.host";
+ public static final String KEY_PROXY_HTTPS_PORT = "deployment.proxy.https.port";
+ public static final String KEY_PROXY_FTP_HOST = "deployment.proxy.ftp.host";
+ public static final String KEY_PROXY_FTP_PORT = "deployment.proxy.ftp.port";
+ public static final String KEY_PROXY_SOCKS4_HOST = "deployment.proxy.socks.host";
+ public static final String KEY_PROXY_SOCKS4_PORT = "deployment.proxy.socks.port";
+ public static final String KEY_PROXY_OVERRIDE_HOSTS = "deployment.proxy.override.hosts";
/*
* Tracing and Logging
@@ -380,20 +391,20 @@ public final class DeploymentConfigurati
{ KEY_SECURITY_PROMPT_USER_FOR_JNLP, String.valueOf(true) },
{ KEY_SECURITY_INSTALL_AUTHENTICATOR, String.valueOf(true) },
/* networking */
- { "deployment.proxy.type", String.valueOf(PROXY_TYPE_BROWSER) },
- { "deployment.proxy.same", String.valueOf(false) },
- { "deployment.proxy.auto.config.url", null },
- { "deployment.proxy.bypass.list", null },
- { "deployment.proxy.bypass.local", null },
- { "deployment.proxy.http.host", null },
- { "deployment.proxy.http.port", null },
- { "deployment.proxy.https.host", null },
- { "deployment.proxy.https.port", null },
- { "deployment.proxy.ftp.host", null },
- { "deployment.proxy.ftp.port", null },
- { "deployment.proxy.socks.host", null },
- { "deployment.proxy.socks.port", null },
- { "deployment.proxy.override.hosts", null },
+ { KEY_PROXY_TYPE, String.valueOf(JNLPProxySelector.PROXY_TYPE_BROWSER) },
+ { KEY_PROXY_SAME, String.valueOf(false) },
+ { KEY_PROXY_AUTO_CONFIG_URL, null },
+ { KEY_PROXY_BYPASS_LIST, null },
+ { KEY_PROXY_BYPASS_LOCAL, null },
+ { KEY_PROXY_HTTP_HOST, null },
+ { KEY_PROXY_HTTP_PORT, null },
+ { KEY_PROXY_HTTPS_HOST, null },
+ { KEY_PROXY_HTTPS_PORT, null },
+ { KEY_PROXY_FTP_HOST, null },
+ { KEY_PROXY_FTP_PORT, null },
+ { KEY_PROXY_SOCKS4_HOST, null },
+ { KEY_PROXY_SOCKS4_PORT, null },
+ { KEY_PROXY_OVERRIDE_HOSTS, null },
/* cache and optional package repository */
{ "deployment.cache.max.size", String.valueOf("-1") },
{ "deployment.cache.jarcompression", String.valueOf(0) },
diff -r 5a9f55d67b50 -r dd77da50a226 netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/netx/net/sourceforge/jnlp/runtime/JNLPProxySelector.java Tue Nov 23 10:05:06 2010 -0500
@@ -0,0 +1,360 @@
+// Copyright (C) 2010 Red Hat, Inc.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+package net.sourceforge.jnlp.runtime;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.MalformedURLException;
+import java.net.Proxy;
+import java.net.ProxySelector;
+import java.net.SocketAddress;
+import java.net.URI;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.net.Proxy.Type;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.StringTokenizer;
+
+/**
+ * A ProxySelector specific to JNLPs. This proxy uses the deployment
+ * configuration to determine what to do.
+ *
+ * @see java.net.ProxySelector
+ */
+public class JNLPProxySelector extends ProxySelector {
+
+ public static final int PROXY_TYPE_UNKNOWN = -1;
+ public static final int PROXY_TYPE_NONE = 0;
+ public static final int PROXY_TYPE_MANUAL = 1;
+ public static final int PROXY_TYPE_AUTO = 2;
+ public static final int PROXY_TYPE_BROWSER = 3;
+
+ /** The default port to use as a fallback. Currently squid's default port */
+ public static final int FALLBACK_PROXY_PORT = 3128;
+
+ /** The proxy type. See PROXY_TYPE_* constants */
+ private int proxyType = PROXY_TYPE_UNKNOWN;
+
+ /** the URL to the PAC file */
+ private URL autoConfigUrl = null;
+
+ /** a list of URLs that should be bypassed for proxy purposes */
+ private List<String> bypassList = null;
+
+ /** whether localhost should be bypassed for proxy purposes */
+ private boolean bypassLocal = false;
+
+ /**
+ * whether the http proxy should be used for https and ftp protocols as well
+ */
+ private boolean sameProxy = false;
+
+ private String proxyHttpHost;
+ private int proxyHttpPort;
+ private String proxyHttpsHost;
+ private int proxyHttpsPort;
+ private String proxyFtpHost;
+ private int proxyFtpPort;
+ private String proxySocks4Host;
+ private int proxySocks4Port;
+
+ // FIXME what is this? where should it be used?
+ private String overrideHosts = null;
+
+ /**
+ * Creates a new JNLPProxySelector.
+ */
+ public JNLPProxySelector() {
+ parseConfiguration();
+ }
+
+ /**
+ * Initialize this ProxySelector by reading the configuration
+ */
+ private void parseConfiguration() {
+ DeploymentConfiguration config = JNLPRuntime.getConfiguration();
+
+ proxyType = Integer.valueOf(config.getProperty(DeploymentConfiguration.KEY_PROXY_TYPE));
+
+ String autoConfigString = config
+ .getProperty(DeploymentConfiguration.KEY_PROXY_AUTO_CONFIG_URL);
+ if (autoConfigString != null) {
+ try {
+ autoConfigUrl = new URL(autoConfigString);
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ bypassList = new ArrayList<String>();
+ String proxyBypass = config.getProperty(DeploymentConfiguration.KEY_PROXY_BYPASS_LIST);
+ if (proxyBypass != null) {
+ StringTokenizer tokenizer = new StringTokenizer(proxyBypass, ",");
+ while (tokenizer.hasMoreTokens()) {
+ String host = tokenizer.nextToken();
+ if (host != null && host.trim().length() != 0) {
+ bypassList.add(host);
+ }
+ }
+ }
+
+ bypassLocal = Boolean.valueOf(config
+ .getProperty(DeploymentConfiguration.KEY_PROXY_BYPASS_LOCAL));
+
+ sameProxy = Boolean.valueOf(config.getProperty(DeploymentConfiguration.KEY_PROXY_SAME));
+
+ proxyHttpHost = getHost(config, DeploymentConfiguration.KEY_PROXY_HTTP_HOST);
+ proxyHttpPort = getPort(config, DeploymentConfiguration.KEY_PROXY_HTTP_PORT);
+
+ proxyHttpsHost = getHost(config, DeploymentConfiguration.KEY_PROXY_HTTPS_HOST);
+ proxyHttpsPort = getPort(config, DeploymentConfiguration.KEY_PROXY_HTTPS_PORT);
+
+ proxyFtpHost = getHost(config, DeploymentConfiguration.KEY_PROXY_FTP_HOST);
+ proxyFtpPort = getPort(config, DeploymentConfiguration.KEY_PROXY_FTP_PORT);
+
+ proxySocks4Host = getHost(config, DeploymentConfiguration.KEY_PROXY_SOCKS4_HOST);
+ proxySocks4Port = getPort(config, DeploymentConfiguration.KEY_PROXY_SOCKS4_PORT);
+
+ overrideHosts = config.getProperty(DeploymentConfiguration.KEY_PROXY_OVERRIDE_HOSTS);
+ }
+
+ /**
+ * Uses the given key to get a host from the configuraion
+ */
+ private String getHost(DeploymentConfiguration config, String key) {
+ String proxyHost = config.getProperty(key);
+ if (proxyHost != null) {
+ proxyHost = proxyHost.trim();
+ }
+ return proxyHost;
+ }
+
+ /**
+ * Uses the given key to get a port from the configuration
+ */
+ private int getPort(DeploymentConfiguration config, String key) {
+ int proxyPort = FALLBACK_PROXY_PORT;
+ String port;
+ port = config.getProperty(key);
+ if (port != null && port.trim().length() != 0) {
+ try {
+ proxyPort = Integer.valueOf(port);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ }
+ return proxyPort;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
+ ioe.printStackTrace();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public List<Proxy> select(URI uri) {
+ if (JNLPRuntime.isDebug()) {
+ System.out.println("Selecting proxy for: " + uri);
+ }
+
+ if (inBypassList(uri)) {
+ List<Proxy> proxies = Arrays.asList(new Proxy[] { Proxy.NO_PROXY });
+ if (JNLPRuntime.isDebug()) {
+ System.out.println("Selected proxies: " + Arrays.toString(proxies.toArray()));
+ }
+ return proxies;
+ }
+
+ List<Proxy> proxies = new ArrayList<Proxy>();
+
+ switch (proxyType) {
+ case PROXY_TYPE_MANUAL:
+ proxies.addAll(getFromConfiguration(uri));
+ break;
+ case PROXY_TYPE_AUTO:
+ proxies.addAll(getFromPAC(uri));
+ break;
+ case PROXY_TYPE_BROWSER:
+ proxies.addAll(getFromBrowser(uri));
+ break;
+ case PROXY_TYPE_UNKNOWN:
+ // fall through
+ case PROXY_TYPE_NONE:
+ // fall through
+ default:
+ proxies.add(Proxy.NO_PROXY);
+ break;
+ }
+
+ if (JNLPRuntime.isDebug()) {
+ System.out.println("Selected proxies: " + Arrays.toString(proxies.toArray()));
+ }
+ return proxies;
+ }
+
+ /**
+ * Returns true if the uri should be bypassed for proxy purposes
+ */
+ private boolean inBypassList(URI uri) {
+ try {
+ String scheme = uri.getScheme();
+ /* scheme can be http/https/ftp/socket */
+
+ if (scheme.equals("http") || scheme.equals("https") || scheme.equals("ftp")) {
+ URL url = uri.toURL();
+ if (bypassLocal && isLocalHost(url.getHost())) {
+ return true;
+ }
+
+ if (bypassList.contains(url.getHost())) {
+ return true;
+ }
+ } else if (scheme.equals("socket")) {
+ String host = uri.getSchemeSpecificPart().split(":")[0];
+
+ if (bypassLocal && isLocalHost(host)) {
+ return true;
+ }
+
+ if (bypassList.contains(host)) {
+ return true;
+ }
+ }
+ } catch (MalformedURLException e) {
+ return false;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns true if the host is the hostname or the IP address of the
+ * localhost
+ */
+ private boolean isLocalHost(String host) {
+
+ try {
+ if (InetAddress.getByName(host).isLoopbackAddress()) {
+ return true;
+ }
+ } catch (UnknownHostException e1) {
+ // continue
+ }
+
+ try {
+ if (host.equals(InetAddress.getLocalHost().getHostName())) {
+ return true;
+ }
+ } catch (UnknownHostException e) {
+ // continue
+ }
+
+ try {
+ if (host.equals(InetAddress.getLocalHost().getHostAddress())) {
+ return true;
+ }
+ } catch (UnknownHostException e) {
+ // continue
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns a list of proxies by using the information in the deployment
+ * configuration
+ *
+ * @param uri
+ * @return a List of Proxy objects
+ */
+ private List<Proxy> getFromConfiguration(URI uri) {
+ List<Proxy> proxies = new ArrayList<Proxy>();
+
+ String scheme = uri.getScheme();
+
+ if (sameProxy) {
+ SocketAddress sa = new InetSocketAddress(proxyHttpHost, proxyHttpPort);
+ Proxy proxy;
+ if (scheme.equals("socket")) {
+ proxy = new Proxy(Type.SOCKS, sa);
+ } else {
+ proxy = new Proxy(Type.HTTP, sa);
+ }
+ proxies.add(proxy);
+ } else if (scheme.equals("http")) {
+ SocketAddress sa = new InetSocketAddress(proxyHttpHost, proxyHttpPort);
+ proxies.add(new Proxy(Type.HTTP, sa));
+ } else if (scheme.equals("https")) {
+ SocketAddress sa = new InetSocketAddress(proxyHttpsHost, proxyHttpsPort);
+ proxies.add(new Proxy(Type.HTTP, sa));
+ } else if (scheme.equals("ftp")) {
+ SocketAddress sa = new InetSocketAddress(proxyFtpHost, proxyFtpPort);
+ proxies.add(new Proxy(Type.HTTP, sa));
+ } else if (scheme.equals("socket")) {
+ SocketAddress sa = new InetSocketAddress(proxySocks4Host, proxySocks4Port);
+ proxies.add(new Proxy(Type.SOCKS, sa));
+ } else {
+ proxies.add(Proxy.NO_PROXY);
+ }
+
+ return proxies;
+ }
+
+ /**
+ * Returns a list of proxies by using the Proxy Auto Config (PAC) file. See
+ * http://en.wikipedia.org/wiki/Proxy_auto-config#The_PAC_file for more
+ * information.
+ *
+ * @return a List of valid Proxy objects
+ */
+ private List<Proxy> getFromPAC(URI uri) {
+ if (autoConfigUrl == null) {
+ return Arrays.asList(new Proxy[] { Proxy.NO_PROXY });
+ }
+ // TODO implement this by reading and using the PAC file
+ if (JNLPRuntime.isDebug()) {
+ System.err.println("WARNING: Using a Proxy Auto Config file is not implemented yet");
+ }
+
+ return Arrays.asList(new Proxy[] { Proxy.NO_PROXY });
+ }
+
+ /**
+ * Returns a list of proxies by querying the browser
+ *
+ * @param uri the uri to get proxies for
+ * @return a list of proxies
+ */
+ protected List<Proxy> getFromBrowser(URI uri) {
+ // TODO implement this by parsing mozilla config
+ if (JNLPRuntime.isDebug()) {
+ System.err.println("WARNING: Using proxy settings from the browser is not implemented yet");
+ }
+
+ return Arrays.asList(new Proxy[] { Proxy.NO_PROXY });
+ }
+
+}
diff -r 5a9f55d67b50 -r dd77da50a226 netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java
--- a/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java Fri Nov 19 10:35:27 2010 -0500
+++ b/netx/net/sourceforge/jnlp/runtime/JNLPRuntime.java Tue Nov 23 10:05:06 2010 -0500
@@ -18,6 +18,8 @@ package net.sourceforge.jnlp.runtime;
package net.sourceforge.jnlp.runtime;
import java.io.*;
+import java.net.Authenticator;
+import java.net.ProxySelector;
import java.nio.channels.FileLock;
import java.awt.*;
More information about the distro-pkg-dev
mailing list