Jump to: navigation, search


Revision as of 14:19, 14 February 2007 by Pmoogk.ca.ibm.com (Talk | contribs)


CVS Requirements


ProxyInfo[] infos = ProxyInfo.getProxiesFor(String hostName);
if (info == null) {
    // Attempt a direct connection.
    // we only support HTTP and SOCKS4
} else if (info.getType() == ProxyInfo.HTTP) {
} else if (info.getType() == Proxy.SOCKS5) {


Update Requirements


WTP Requirements



Here are discussions on various aspects of this feature

Access to Proxy info




Setting System Properties



  2. don't specify Lazy-start in the bundle manifest (I'm not sure about this but I'll find out)
  3. use the Workbench IStartup hook

It seems a bit wierd to force every client the uses Java I/O to have to also make call to the Proxy plug-in to enable JVM properties. However, bundles in the Platform are not typically loaded during startup except extension points or dependencies. I think it will be difficult to get approval to have the proxy bundle start automatically so we may have to settle for point 4, at least for 3.3.

[YMNK]I have questions about setting System Property "socksProxyHost"

  • If "socksProxyHost" is enabled, will "http.proxyHost" and "https.proxyHost" be ignored?
  • It seems there is not a property like "socksNonProxyHosts".
    Will TCP connections to "localhost" be also proxied? From a CVS standpoint, to support "pserverssh2", it will use ssh2's local port-forwarding and it requires direct accesses to "localhost".



It would appear that the Java Authenticator API does not provide the ability to differentiate between a prompt caused by a lack of credentials vs. a prompt caused by a failed authentication. Because of this, it is difficult to cache credentials either through a preference page or by remembering what was returned when the Authenticator was invoked. WTP does cache in their authenticator and in the situation where the credentials have changed or the user enter incorrect credential information Eclipse would need to be restarted to flush this cached data. This is not behavior we are willing to put in the Platform.

Because of this, we have the following conflict between the requirements of CVS/SSH2 and Update/WTP.

  • WTP and Update depend on the use of the java.net.Authenticator which doesn't really support pre-specification or caching of passwords (i.e. it is better to prompt more often then it is to force the user to restart if they enter the wrong password).

[PM]Given the issues with regard to caching credentials, we (WTP) could live without this functionality. The important issue for WTP is that some form of Authenticator be present. If the Authenticator that Update uses was put into the new Eclipse internet plugin I'm sure that this would be fine.

  • CVS (and SSH2) depend on the JSch proxy classes which need the user name and password up front (i.e JSch proxy support works with Java 1.4).

[PM] WTP also requires username and password specified up front for proxies, so there shouldn't be a conflict here.

What this means is that we need a preference page that includes the username and password (at least for http and socks) so that CVS and SSH2 proxy support can be used. The user would then expect these passwords to be used when using the Java proxy support as well. I guess we could solve this with an Authenticator that used the provided user name and password for the proxies and prompted for other connections. This would give a unified experience across WTP, CVS, SSH2 and Update but would have the failing that, if proxy authentication failed, the user would not be prompted to authenticate but instead would have to somehow know to go to the preference page and reenter the authentication information (although one assumes that they entered it in the first place so it may be acceptable).

The above described solution is not ideal but may be the best we can do given the limitations of the two proxy APIs we are using. However, any time prompt backs are involved, I consider the feature to be non-trivial (i.e. there always seem to be unforeseen problems that occur). Given that we are late in the cycle, I would be more comfortable with a solution that did not involve the Platform providing the Authenticator in 3.3. Hence my proposal was for an API that addressed the multiple preference page issue with the least amount of risk and while it doesn't make things much better for clients, doesn't make it any worse than it already is. Once 3.3 ships, we could get an early start on get the Authenticator story right.

Anyway, anything we do for this feature in 3.3 requires PMC approval. I will seek their input on the following possibilities (if you think I missed a possible solution, let me know):

  1. The Platform provides only the preference page settings and it is up to clients to set the JVM properties and the authenticator as they do today.
  2. The Platform provides the preference page and settings and a means for clients to indicate that that the Authenticator should be set and the JVM properties should be set and kept up-to-date. The Authenticator would just prompt when a password is required (as the Update Authenticator does).
  3. Same as 2 but the Authenticator uses the user name and password from the preference page when proxy connections are attempted.

[PM] Option 2 would be fine for WTP.

Another issue with the Authenticator is that it must be registered at startup and must be provided by a UI plug-in. Either we would need to designate the UI plug-in as early startup or we would need API at the UI level that clients would need to call to indicate that they desire to have an Authenticator registered.

[PM] WTP can live without the JVM System properties and the Authenticator being set at startup. Yes, a client API to indicate that the JVM system properties should be set and the Autheticator should be registered would be fine.

Preference Page

Another issue to consider is the design of the preference page for modifying proxy settings. Here are some questions I have about what is in the latest patch:

  1. There is a single field for non-proxied hosts but each protocol (i.e. http and https) in the Core plug-in has its own preference for this (expect for socks which may be a problem for CVS as indicated by the question by YMNK above). It does not appear that the single list is used by the Core plug-in. Will a single list be adequate or do we need to have separate lists for each protocol? I would assume that we only need a single list but I would like confirmation on this.
    [PM]I agree that having a non proxy list for each protocol would be nice to have, but I don't think we have the time to implement this in the first release. The core plugin has been implemented so that it can handle a separate non proxy hosts list for each protocol. However, the UI only allows the user to specify one non proxy host list. This list is passed to all three protocols registered in the core. From a WTP perspective I think this should be adequate. With regards to YMNK's question, if both protocols are set the client would have the choice of which one to use. The code list at the beginning of this document does this. It has a preference towards the http protocol which should be fine.
  2. There are other fields in the preference page (use same protocol, user name and password) that do not appear to be pushed down into the Core settings. My assumption is that the preference page was put in the patch as a proof of concept for those fields without actually hooking them up. Please let me know if I am mistaken.
    [PM] I intended the "use same protocol" check box to be just a UI short cut so that the user would not have to specify this information many times. Therefore, the state of this check box is not passed to the core plugin. However, the user id and password should be passed to the core plugins. If it isn't then this is bug.
  3. From the Core level data structures, it would appear that each protocol requires it's own authentication information but the current layout of the preference page does not support this. Perhaps we need a separate tab (or preference page) for each proxy type. I understand that the desire was to look like Firefox but I think Firefox can get away with this because they have a cleaner prompting story.
    [PM]I agree that it would be preferable to have user id and password specifiable per protocol. If you think that we can do a design and implemenation of this in a week or so then lets go for it. However, the practical side of me says that we should stick to the bare minimum and leave this to the next release.
  4. One things Firefox does have is a toggle to differentiate Socks4 from Socks5. This may be useful to have from a CVS standpoint since the two proxy types are different in JSch. Can anyone comment on whether Socks4 is used often. If not, we probably don't need to differentiate (I should note that the java.net Socks proxy support covers both Socks4 and Socks5 so this is only an issue of JSch).
    [PM] My understanding of SOCKS4 and SOCKS5 is that SOCKS4 does not have authentication, but SOCKS5 does. Therefore, a client getting the ProxyData could differentiate which one to use based on whether a user id and password were specified or not. If this data was specified SOCKS5 would be used if not SOCKS4 would be used. Therefore, I don't think we need to ask the user for this information. I think in the initial release of this code we should leave this out and if it becomes a problem in the future then add it later.
  5. I also noticed that Firefox does not differentiate HTTP and HTTPS proxy types but the patch does. In practice, do clients ever have both types of proxies or is this separation done in the patch simply because there are two different sets of properties in the JVM. Do we need to have both the HTTP and HTTPS fields (or is the HTTPS proxy in the patch equivalent to the SSL proxy in Firefox)?