X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FCache.java;h=28bab15feec6fa01417699105c77be1efd1c31db;hb=304e64fb34b32659be1bbfd39fb4e15b2f79586e;hp=8269f32c66d4813c9f92a5baf8a3c094fa717833;hpb=7664ccad29d55ad2355d72feeac23d8bdd49a2a7;p=jalview.git diff --git a/src/jalview/bin/Cache.java b/src/jalview/bin/Cache.java index 8269f32..28bab15 100755 --- a/src/jalview/bin/Cache.java +++ b/src/jalview/bin/Cache.java @@ -34,6 +34,7 @@ import java.net.PasswordAuthentication; import java.net.URL; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.Enumeration; @@ -51,15 +52,16 @@ import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.SimpleLayout; +import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI; import jalview.datamodel.PDBEntry; import jalview.gui.Preferences; import jalview.gui.UserDefinedColours; -import jalview.jbgui.GPreferences; import jalview.schemes.ColourSchemeLoader; import jalview.schemes.ColourSchemes; import jalview.schemes.UserColourScheme; import jalview.structure.StructureImportSettings; import jalview.urls.IdOrgSettings; +import jalview.util.ChannelProperties; import jalview.util.ColorUtils; import jalview.util.MessageManager; import jalview.util.Platform; @@ -181,8 +183,8 @@ import jalview.ws.sifts.SiftsSettings; * when shading by annotation *
  • ANNOTATIONCOLOUR_MAX (red) Shade used for maximum value of annotation * when shading by annotation
  • - *
  • www.jalview.org (http://www.jalview.org) a property enabling all HTTP - * requests to be redirected to a mirror of http://www.jalview.org
  • + *
  • www.jalview.org (https://www.jalview.org) a property enabling all HTTP + * requests to be redirected to a mirror of https://www.jalview.org
  • *
  • FIGURE_AUTOIDWIDTH (false) Expand the left hand column of an exported * alignment figure to accommodate even the longest sequence ID or annotation * label.
  • @@ -219,8 +221,26 @@ import jalview.ws.sifts.SiftsSettings; * @author $author$ * @version $Revision$ */ -public class Cache +public class Cache implements ApplicationSingletonI { + + private Cache() + { + // private singleton + } + + /** + * In Java, this will be a static field instance, which will be + * application-specific; in JavaScript it will be an applet-specific instance + * tied to the applet's ThreadGroup. + * + * @return + */ + public static Cache getInstance() + { + return (Cache) ApplicationSingletonProvider.getInstance(Cache.class); + } + /** * property giving log4j level for CASTOR loggers */ @@ -239,10 +259,8 @@ public class Cache /** * Sifts settings */ - public static final String DEFAULT_SIFTS_DOWNLOAD_DIR = System - .getProperty("user.home") + File.separatorChar - + ".sifts_downloads" + File.separatorChar; - + public static final String DEFAULT_SIFTS_DOWNLOAD_DIR = Platform.getUserPath(".sifts_downloads/"); + private final static String DEFAULT_CACHE_THRESHOLD_IN_DAYS = "2"; private final static String DEFAULT_FAIL_SAFE_PID_THRESHOLD = "30"; @@ -250,8 +268,7 @@ public class Cache /** * Identifiers.org download settings */ - private static final String ID_ORG_FILE = System.getProperty("user.home") - + File.separatorChar + ".identifiers.org.ids.json"; + private static final String ID_ORG_FILE = Platform.getUserPath(".identifiers.org.ids.json"); /** * Allowed values are PDB or mmCIF @@ -299,7 +316,7 @@ public class Cache public static char[] proxyAuthPassword = null; /** Jalview Properties */ - public static Properties applicationProperties = new Properties() + private Properties applicationProperties = new Properties() { // override results in properties output in alphabetical order @Override @@ -309,6 +326,9 @@ public class Cache } }; + /* build Properties (not all saved to .jalview_properties) */ + public static Properties buildProperties = new Properties(); + /** Default file is ~/.jalview_properties */ static String propertiesFile; @@ -356,7 +376,8 @@ public class Cache // lcastor.addAppender(ap); // jalview.bin.Cache.log.addAppender(ap); // Tell the user that debug is enabled - jalview.bin.Cache.log.debug("Jalview Debugging Output Follows."); + jalview.bin.Cache.log.debug(ChannelProperties.getProperty("app_name") + + " Debugging Output Follows."); } catch (Exception ex) { System.err.println("Problems initializing the log4j system\n"); @@ -365,16 +386,31 @@ public class Cache } /** - * Loads properties from the given properties file. Any existing properties - * are first cleared. + * Loads properties from the given properties file. Any existing properties are + * first cleared. */ public static void loadProperties(String propsFile) { + + getInstance().loadPropertiesImpl(propsFile); + + } + + private void loadPropertiesImpl(String propsFile) + { + propertiesFile = propsFile; + String releasePropertiesFile = null; + boolean defaultProperties = false; if (propsFile == null && !propsAreReadOnly) { - propertiesFile = System.getProperty("user.home") + File.separatorChar - + ".jalview_properties"; + // TODO: @bsoares - for 2.12 testing: check test,develop,release props are located correctly + String channelPrefsFilename = ChannelProperties + .getProperty("preferences.filename"); + String releasePrefsFilename = ".jalview_properties"; + propertiesFile = Platform.getUserPath(channelPrefsFilename); + releasePropertiesFile = Platform.getUserPath(releasePrefsFilename); + defaultProperties = true; } else { @@ -394,20 +430,29 @@ public class Cache InputStream fis; try { + // props file provided as URL fis = new URL(propertiesFile).openStream(); System.out.println( "Loading jalview properties from : " + propertiesFile); System.out.println( "Disabling Jalview writing to user's local properties file."); propsAreReadOnly = true; - } catch (Exception ex) { fis = null; } if (fis == null) { - fis = new FileInputStream(propertiesFile); + String readPropertiesFile = propertiesFile; + // if we're using the usual properties file and the channel properties + // file doesn't exist, read .jalview_properties + // (but we'll still save to the channel properties file). + if (defaultProperties && (!new File(propertiesFile).exists()) + && (new File(releasePropertiesFile).exists())) + { + readPropertiesFile = releasePropertiesFile; + } + fis = new FileInputStream(readPropertiesFile); } applicationProperties.clear(); applicationProperties.load(fis); @@ -501,7 +546,7 @@ public class Cache DEFAULT_CACHE_THRESHOLD_IN_DAYS)); IdOrgSettings.setUrl(getDefault("ID_ORG_HOSTURL", - "http://www.jalview.org/services/identifiers")); + "https://www.jalview.org/services/identifiers")); IdOrgSettings.setDownloadLocation(ID_ORG_FILE); StructureImportSettings.setDefaultStructureFileFormat(jalview.bin.Cache @@ -525,9 +570,13 @@ public class Cache class VersionChecker extends Thread { + @Override public void run() { + String remoteBuildPropertiesUrl = Cache + .getAppbaseBuildProperties(); + String orgtimeout = System .getProperty("sun.net.client.defaultConnectTimeout"); if (orgtimeout == null) @@ -541,28 +590,19 @@ public class Cache { System.setProperty("sun.net.client.defaultConnectTimeout", "5000"); - java.net.URL url = new java.net.URL(Cache - .getDefault("www.jalview.org", "http://www.jalview.org") - + "/webstart/jalview.jnlp"); + java.net.URL url = new java.net.URL(remoteBuildPropertiesUrl); + BufferedReader in = new BufferedReader( new InputStreamReader(url.openStream())); - String line = null; - while ((line = in.readLine()) != null) - { - if (line.indexOf("jalview.version") == -1) - { - continue; - } - line = line.substring(line.indexOf("value=") + 7); - line = line.substring(0, line.lastIndexOf("\"")); - remoteVersion = line; - break; - } + Properties remoteBuildProperties = new Properties(); + remoteBuildProperties.load(in); + remoteVersion = remoteBuildProperties.getProperty("VERSION"); } catch (Exception ex) { - System.out.println( - "Non-fatal exception when checking version at www.jalview.org :"); + System.out + .println("Non-fatal exception when checking version at " + + remoteBuildPropertiesUrl + ":"); System.out.println(ex); remoteVersion = getProperty("VERSION"); } @@ -623,7 +663,7 @@ public class Cache return url; } - public static void loadBuildProperties(boolean reportVersion) + public void loadBuildProperties(boolean reportVersion) { String codeInstallation = getProperty("INSTALLATION"); boolean printVersion = codeInstallation == null; @@ -637,8 +677,23 @@ public class Cache String buildDetails = resolveResourceURLFor("/.build_properties"); URL localJarFileURL = new URL(buildDetails); InputStream in = localJarFileURL.openStream(); - applicationProperties.load(in); + buildProperties.load(in); in.close(); + if (buildProperties.getProperty("BUILD_DATE", null) != null) + { + applicationProperties.put("BUILD_DATE", + buildProperties.getProperty("BUILD_DATE")); + } + if (buildProperties.getProperty("INSTALLATION", null) != null) + { + applicationProperties.put("INSTALLATION", + buildProperties.getProperty("INSTALLATION")); + } + if (buildProperties.getProperty("VERSION", null) != null) + { + applicationProperties.put("VERSION", + buildProperties.getProperty("VERSION")); + } } catch (Exception ex) { System.out.println("Error reading build details: " + ex); @@ -661,12 +716,12 @@ public class Cache new BuildDetails(codeVersion, null, codeInstallation); if (printVersion && reportVersion) { - System.out.println( - "Jalview Version: " + codeVersion + codeInstallation); + System.out.println(ChannelProperties.getProperty("app_name") + + " Version: " + codeVersion + codeInstallation); } } - private static void deleteBuildProperties() + private void deleteBuildProperties() { applicationProperties.remove("LATEST_VERSION"); applicationProperties.remove("VERSION"); @@ -678,28 +733,27 @@ public class Cache } /** - * Gets Jalview application property of given key. Returns null if key not - * found + * Gets Jalview application property of given key. Returns null if key not found * * @param key - * Name of property + * Name of property * * @return Property value */ public static String getProperty(String key) { - String prop = applicationProperties.getProperty(key); - if (prop == null && Platform.isJS()) - { - prop = applicationProperties.getProperty(Platform.getUniqueAppletID() - + "_" + JS_PROPERTY_PREFIX + key); - } + String prop = getInstance().applicationProperties.getProperty(key); + // if (prop == null && Platform.isJS()) + // { + // prop = applicationProperties.getProperty(Platform.getUniqueAppletID() + // + "_" + JS_PROPERTY_PREFIX + key); + // } return prop; } /** - * These methods are used when checking if the saved preference is different - * to the default setting + * These methods are used when checking if the saved preference is different to + * the default setting */ public static boolean getDefault(String property, boolean def) @@ -732,8 +786,8 @@ public class Cache } /** - * Answers the value of the given property, or the supplied default value if - * the property is not set + * Answers the value of the given property, or the supplied default value if the + * property is not set */ public static String getDefault(String property, String def) { @@ -745,41 +799,56 @@ public class Cache * Stores property in the file "HOME_DIR/.jalview_properties" * * @param key - * Name of object + * Name of object * @param obj - * String value of property + * String value of property * * @return previous value of property (or null) */ public static Object setProperty(String key, String obj) { - Object oldValue = null; - try - { - oldValue = applicationProperties.setProperty(key, obj); - if (propertiesFile != null && !propsAreReadOnly) - { - FileOutputStream out = new FileOutputStream(propertiesFile); - applicationProperties.store(out, "---JalviewX Properties File---"); - out.close(); - } - } catch (Exception ex) - { - System.out.println( - "Error setting property: " + key + " " + obj + "\n" + ex); - } - return oldValue; + return getInstance().setPropertyImpl(key, obj, true); + } + + /** + * Removes the specified property from the jalview properties file + * + * @param key + */ + public static void removeProperty(String key) + { + getInstance().removePropertyImpl(key, true); + } + + /** + * Removes the named property for the running application, without saving the + * properties file + * + * BH noting that ColourMenuHelper calls this. If the intent is to save, then + * simply chanet that call to removeProperty(key). + * + * @param key + */ + public static void removePropertyNoSave(String key) + { + + getInstance(). + + removePropertyImpl(key, false); } /** - * remove the specified property from the jalview properties file + * Removes the named property, and optionally saves the current properties to + * file * - * @param string + * @param key + * @param andSave */ - public static void removeProperty(String string) + private void removePropertyImpl(String key, boolean andSave) { - applicationProperties.remove(string); - saveProperties(); + applicationProperties.remove(key); + if (andSave) + saveProperties(); } /** @@ -787,6 +856,15 @@ public class Cache */ public static void saveProperties() { + getInstance().savePropertiesImpl(); + } + + /** + * save the properties to the jalview properties path + */ + private void savePropertiesImpl() + + { if (!propsAreReadOnly) { try @@ -829,7 +907,8 @@ public class Cache lvclient.addAppender(log.getAppender("JalviewLogger")); // Tell the user that debug is enabled - lvclient.debug("Jalview Vamsas Client Debugging Output Follows."); + lvclient.debug(ChannelProperties.getProperty("app_name") + + " Vamsas Client Debugging Output Follows."); } } catch (Exception e) { @@ -868,7 +947,8 @@ public class Cache lgclient.addAppender(log.getAppender("JalviewLogger")); // Tell the user that debug is enabled - lgclient.debug("Jalview Groovy Client Debugging Output Follows."); + lgclient.debug(ChannelProperties.getProperty("app_name") + + " Groovy Client Debugging Output Follows."); } } catch (Error e) { @@ -930,7 +1010,7 @@ public class Cache .getConstructor(new Class[] { String.class, String.class, String.class }) .newInstance(new Object[] - { "Jalview Desktop", + { ChannelProperties.getProperty("app_name") + " Desktop", (vrs = jalview.bin.Cache.getProperty("VERSION") + "_" + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown")), @@ -1038,9 +1118,9 @@ public class Cache * @param property * @param colour */ - public static void setColourProperty(String property, Color colour) + public static void setColourPropertyNoSave(String property, Color colour) { - setProperty(property, jalview.util.Format.getHexString(colour)); + setPropertyNoSave(property, jalview.util.Format.getHexString(colour)); } /** @@ -1068,11 +1148,16 @@ public class Cache public static Date getDateProperty(String propertyName) { String val = getProperty(propertyName); + if (val != null) { try { - return date_format.parse(val); + if ((val = val.trim()).indexOf(",") < 0 && val.indexOf("-") >= 0 && val.indexOf(" ") == val.lastIndexOf(" ")) { + val = val.replace(" ",", ").replace('-',' '); + } + Date date = date_format.parse(val); + return date; } catch (Exception ex) { System.err.println("Invalid or corrupt date in property '" @@ -1121,11 +1206,11 @@ public class Cache } if (value == null || value.trim().length() < 1) { - Cache.applicationProperties.remove(propName); + getInstance().applicationProperties.remove(propName); } else { - Cache.applicationProperties.setProperty(propName, value); + getInstance().applicationProperties.setProperty(propName, value); } } @@ -1133,7 +1218,7 @@ public class Cache * Loads in user colour schemes from files. * * @param files - * a '|'-delimited list of file paths + * a '|'-delimited list of file paths */ public static void initUserColourSchemes(String files) { @@ -1175,7 +1260,7 @@ public class Cache } else { - applicationProperties + getInstance().applicationProperties .remove(UserDefinedColours.USER_DEFINED_COLOURS); } } @@ -1206,14 +1291,16 @@ public class Cache public static String getVersionDetailsForConsole() { StringBuilder sb = new StringBuilder(); - sb.append("Jalview Version: "); + sb.append(ChannelProperties.getProperty("app_name")) + .append(" Version: "); sb.append(jalview.bin.Cache.getDefault("VERSION", "TEST")); sb.append("\n"); - sb.append("Jalview Installation: "); + sb.append(ChannelProperties.getProperty("app_name")) + .append(" Installation: "); sb.append(jalview.bin.Cache.getDefault("INSTALLATION", "unknown")); sb.append("\n"); - sb.append("Build Date: "); - sb.append(jalview.bin.Cache.getDefault("BUILD_DATE", "unknown")); + sb.append("Build Date: " + + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown")); sb.append("\n"); sb.append("Java version: "); sb.append(System.getProperty("java.version")); @@ -1245,6 +1332,8 @@ public class Cache { appendIfNotNull(sb, "Getdown appdir: ", System.getProperty("getdownappdir"), "\n", null); + appendIfNotNull(sb, "Getdown appbase: ", + System.getProperty("getdownappbase"), "\n", null); appendIfNotNull(sb, "Java home: ", System.getProperty("java.home"), "\n", "unknown"); } @@ -1262,6 +1351,52 @@ public class Cache return jalview.bin.Cache.getDefault("INSTALLATION", "unknown"); } + /** + * + * For AppletParams and Preferences ok_actionPerformed and + * startupFileTextfield_mouseClicked + * + * Sets a property value for the running application, without saving it to the + * properties file + * + * @param key + * @param obj + */ + public static void setPropertyNoSave(String key, String obj) + { + getInstance().setPropertyImpl(key, obj, false); + } + + /** + * Sets a property value, and optionally also saves the current properties to + * file + * + * @param key + * @param obj + * @param andSave + * @return + */ + private Object setPropertyImpl( + String key, String obj, boolean andSave) + { + Object oldValue = null; + try + { + oldValue = applicationProperties.setProperty(key, obj); + if (andSave && !propsAreReadOnly && propertiesFile != null) + { + FileOutputStream out = new FileOutputStream(propertiesFile); + applicationProperties.store(out, "---JalviewX Properties File---"); + out.close(); + } + } catch (Exception ex) + { + System.out.println( + "Error setting property: " + key + " " + obj + "\n" + ex); + } + return oldValue; + } + public static String getStackTraceString(Throwable t) { StringWriter sw = new StringWriter(); @@ -1316,17 +1451,28 @@ public class Cache { String proxyType = Cache.getDefault("USE_PROXY", Cache.PROXYTYPE_SYSTEM); - if (proxyType.equals(Cache.PROXYTYPE_NONE)) + if (previousProxyType != null + && !proxyType.equals(Cache.PROXYTYPE_CUSTOM) // always apply + // customProxy + && proxyType.equals(previousProxyType)) { - if (!previousProxyType.equals(proxyType)) - Cache.log.info("Setting no proxy settings"); - Cache.setProxyProperties(null, null, null, null, null, null, null, - null, null); + // no change + return; } - else if (proxyType.equals(Cache.PROXYTYPE_CUSTOM)) + switch (proxyType) { + case Cache.PROXYTYPE_NONE: if (!previousProxyType.equals(proxyType)) - Cache.log.info("Setting custom proxy settings"); + { + Cache.log.info("Setting no proxy settings"); + Cache.setProxyProperties(null, null, null, null, null, null, null, + null, null); + } + break; + case Cache.PROXYTYPE_CUSTOM: + // always re-set a custom proxy -- it might have changed, particularly + // password + Cache.log.info("Setting custom proxy settings"); boolean proxyAuthSet = Cache.getDefault("PROXY_AUTH", false); Cache.setProxyProperties(Cache.getDefault("PROXY_SERVER", null), Cache.getDefault("PROXY_PORT", null), @@ -1338,11 +1484,9 @@ public class Cache proxyAuthSet ? Cache.getDefault("PROXY_AUTH_USERNAME", "") : null, proxyAuthSet ? Cache.proxyAuthPassword : null, "localhost"); - } - else // systemProxy should be selected and is sensible default anyway - { - if (!previousProxyType.equals(proxyType)) - Cache.log.info("Setting system proxy settings"); + break; + default: // system proxy settings by default + Cache.log.info("Setting system proxy settings"); Cache.resetProxyProperties(); } } @@ -1357,103 +1501,135 @@ public class Cache setOrClearSystemProperty("https.proxyHost", httpsHost); setOrClearSystemProperty("https.proxyPort", httpsPort); setOrClearSystemProperty("http.proxyUser", httpUser); - setOrClearSystemProperty("http.proxyPassword", httpPassword); setOrClearSystemProperty("https.proxyUser", httpsUser); - setOrClearSystemProperty("https.proxyPassword", httpsPassword); + // note: passwords for http.proxyPassword and https.proxyPassword are sent + // via the Authenticator, properties do not need to be set + // are we using a custom proxy (password prompt might be required)? boolean customProxySet = getDefault("USE_PROXY", PROXYTYPE_SYSTEM) .equals(PROXYTYPE_CUSTOM); + + /* + * A bug in Java means the AuthCache does not get reset, so once it has working credentials, + * it never asks for more, so changing the Authenticator has no effect (as getPasswordAuthentication() + * is not re-called). + * This could lead to password leak to a hostile proxy server, so I'm putting in a hack to clear + * the AuthCache. + * see https://www.generacodice.com/en/articolo/154918/Reset-the-Authenticator-credentials + * ... + * Turns out this is only accessible in Java 8, and not in Java 9 onwards, so commenting out + */ + /* + try + { + sun.net.www.protocol.http.AuthCacheValue + .setAuthCache(new sun.net.www.protocol.http.AuthCacheImpl()); + } catch (Throwable t) + { + Cache.error(t.getMessage()); + Cache.debug(getStackTraceString(t)); + } + */ + if (httpUser != null || httpsUser != null) { try { - Authenticator.setDefault(new Authenticator() + char[] displayHttpPw = new char[httpPassword == null ? 0 + : httpPassword.length]; + Arrays.fill(displayHttpPw, '*'); + Cache.debug("CACHE Proxy: setting new Authenticator with httpUser='" + + httpUser + "' httpPassword='" + displayHttpPw + "'"); + if (!Platform.isJS()) + /* * + * java.net.Authenticator not implemented in SwingJS yet + * + * @j2sIgnore + * + */ { - @Override - protected PasswordAuthentication getPasswordAuthentication() + Authenticator.setDefault(new Authenticator() { - Cache.debug( - "*** START PasswordAuthentication.getPasswordAuthentication()"); - Cache.debug("*** getRequestorType()=" + getRequestorType()); - if (getRequestorType() == RequestorType.PROXY) + @Override + protected PasswordAuthentication getPasswordAuthentication() { - String protocol = getRequestingProtocol(); - boolean needProxyPasswordSet = false; - Cache.debug("*** customProxySet = " + customProxySet); - Cache.debug("*** protocol = " + protocol); - Cache.debug("*** httpUser = " + httpUser); - Cache.debug( - "*** httpPassword = \"" + (httpPassword == null ? null - : new String(httpPassword)) + "\""); - Cache.debug("*** httpsUser = " + httpsUser); - Cache.debug("*** httpsPassword = \"" - + (httpsPassword == null ? null - : new String(httpsPassword)) - + "\""); - if (customProxySet && - // we have a username but no password for the scheme being - // requested - (protocol.equalsIgnoreCase("http") - && (httpUser != null && httpUser.length() > 0 - && (httpPassword == null - || httpPassword.length == 0))) - || (protocol.equalsIgnoreCase("https") - && (httpsUser != null - && httpsUser.length() > 0 - && (httpsPassword == null - || httpsPassword.length == 0)))) - { - // open Preferences -> Connections - String message = MessageManager - .getString("label.proxy_password_required"); - Cache.debug("***+ TRYING TO OPEN PREFERENCES"); - openPreferencesConnectionsForProxyPassword(message); - Cache.debug("***+ AFTER TRYING TO OPEN PREFERENCES"); - } - else + if (getRequestorType() == RequestorType.PROXY) { - Cache.debug("***+ TRYING TO GET PASSWORDAUTHENTICATION"); - try + String protocol = getRequestingProtocol(); + boolean needProxyPasswordSet = false; + if (customProxySet && + // we have a username but no password for the scheme being + // requested + (protocol.equalsIgnoreCase("http") + && (httpUser != null && httpUser.length() > 0 + && (httpPassword == null + || httpPassword.length == 0))) + || (protocol.equalsIgnoreCase("https") + && (httpsUser != null + && httpsUser.length() > 0 + && (httpsPassword == null + || httpsPassword.length == 0)))) + { + // open Preferences -> Connections + String message = MessageManager + .getString("label.proxy_password_required"); + Preferences.openPreferences( + Preferences.TabRef.CONNECTIONS_TAB, message); + Preferences.getInstance() + .proxyAuthPasswordCheckHighlight(true, true); + } + else { - if (protocol.equalsIgnoreCase("http") - && getRequestingHost().equalsIgnoreCase(httpHost) - && getRequestingPort() == Integer - .valueOf(httpPort)) + try { - Cache.debug("***+ RETURNING PasswordAuthentication(\"" - + httpUser + "\", \"" + new String(httpPassword) - + "\""); - return new PasswordAuthentication(httpUser, - httpPassword); - } - if (protocol.equalsIgnoreCase("https") - && getRequestingHost().equalsIgnoreCase(httpsHost) - && getRequestingPort() == Integer - .valueOf(httpsPort)) + if (protocol.equalsIgnoreCase("http") + && getRequestingHost() + .equalsIgnoreCase(httpHost) + && getRequestingPort() == Integer + .valueOf(httpPort)) + { + Cache.debug( + "AUTHENTICATOR returning PasswordAuthentication(\"" + + httpUser + "\", '" + + new String(displayHttpPw) + "')"); + return new PasswordAuthentication(httpUser, + httpPassword); + } + if (protocol.equalsIgnoreCase("https") + && getRequestingHost() + .equalsIgnoreCase(httpsHost) + && getRequestingPort() == Integer + .valueOf(httpsPort)) + { + char[] displayHttpsPw = new char[httpPassword.length]; + Arrays.fill(displayHttpsPw, '*'); + Cache.debug( + "AUTHENTICATOR returning PasswordAuthentication(\"" + + httpsUser + "\", '" + displayHttpsPw + + "'"); + return new PasswordAuthentication(httpsUser, + httpsPassword); + } + } catch (NumberFormatException e) { - Cache.debug("***+ RETURNING PasswordAuthentication(\"" - + httpsUser + "\", \"" + httpsPassword + "\""); - return new PasswordAuthentication(httpsUser, - httpsPassword); + Cache.error("Problem with proxy port values [http:" + + httpPort + ", https:" + httpsPort + "]"); } - } catch (NumberFormatException e) - { - Cache.error("Problem with proxy port values [http:" - + httpPort + ", https:" + httpsPort + "]"); + Cache.debug( + "AUTHENTICATOR after trying to get PasswordAuthentication"); } - Cache.debug( - "***+ AFTER TRYING TO GET PASSWORDAUTHENTICATION"); } + // non proxy request + Cache.debug("AUTHENTICATOR returning null"); + return null; } - // non proxy request - Cache.debug("***+ Returning null"); - return null; - } - }); + }); + } // end of j2sIgnore for java.net.Authenticator + // required to re-enable basic authentication (should be okay for a // local proxy) Cache.debug( - "***+ Setting jdk.http.auth.tunneling.disabledSchemes to ''"); + "AUTHENTICATOR setting property 'jdk.http.auth.tunneling.disabledSchemes' to \"\""); System.setProperty("jdk.http.auth.tunneling.disabledSchemes", ""); } catch (SecurityException e) { @@ -1465,27 +1641,28 @@ public class Cache { // reset the Authenticator to protect http.proxyUser and // http.proxyPassword Just In Case - Cache.debug("***+ Setting default Authenticator to null"); - Authenticator.setDefault(null); + /* as noted above, due to bug in java this doesn't work if the sun.net.www.protocol.http.AuthCache + * has working credentials. No workaround for Java 11. + */ + if (!Platform.isJS()) + /* * + * java.net.Authenticator not implemented in SwingJS yet + * + * @j2sIgnore + * + */ + { + Cache.debug("AUTHENTICATOR setting default Authenticator to null"); + Authenticator.setDefault(null); + } } // nonProxyHosts not currently configurable in Preferences - Cache.debug("***+ Setting http.nonProxyHosts property to \"" + Cache.debug("AUTHENTICATOR setting property 'http.nonProxyHosts' to \"" + nonProxyHosts + "\""); setOrClearSystemProperty("http.nonProxyHosts", nonProxyHosts); } - private static void openPreferencesConnectionsForProxyPassword( - String message) - { - // - Cache.info("Opening Preferences for proxy password"); - // Desktop.instance.preferences_actionPerformed(null); - Cache.debug("***+########## TRYING TO OPEN PREFERENCES: " + message); - Preferences p = new Preferences(GPreferences.CONNECTIONS_TAB, message); - p.grabFocus(); - } - public static void setOrClearSystemProperty(String key, char[] value) { setOrClearSystemProperty(key, @@ -1508,25 +1685,32 @@ public class Cache } } - public final static int DEBUG = 10; + public final static int TRACE = 10; - public final static int INFO = 20; + public final static int DEBUG = 20; - public final static int WARN = 30; + public final static int INFO = 30; - public final static int ERROR = 40; + public final static int WARN = 40; + + public final static int ERROR = 50; public static boolean println(int level, String message) { if (Cache.log == null) { - if (level >= ERROR) + if (level >= WARN) System.err.println(message); - else + else if (level >= INFO) System.out.println(message); + // not printing debug or trace messages return false; } - if (level >= WARN) + if (level >= ERROR) + { + Cache.log.error(message); + } + else if (level >= WARN) { Cache.log.warn(message); } @@ -1534,13 +1718,22 @@ public class Cache { Cache.log.info(message); } - else + else if (level >= DEBUG) { Cache.log.debug(message); } + else + { + Cache.log.trace(message); + } return true; } + public static void trace(String message) + { + println(TRACE, message); + } + public static void debug(String message) { println(DEBUG, message); @@ -1560,4 +1753,77 @@ public class Cache { println(ERROR, message); } + + /** + * Getdown appbase methods + */ + + private static final String releaseAppbase; + + private static String getdownAppbase; + + private static String getdownDistDir; + + static + { + if (!Platform.isJS()) + { + Float specversion = Float + .parseFloat(System.getProperty("java.specification.version")); + releaseAppbase = (specversion < 9) + ? "https://www.jalview.org/getdown/release/1.8" + : "https://www.jalview.org/getdown/release/11"; + } + else + { + // this value currenly made up, can be changed to URL that will be + // "https://www.jalview.org/jalview-js/swingjs/j2s/build_properties" + releaseAppbase = "https://www.jalview.org/jalview-js"; + getdownAppbase = releaseAppbase; + getdownDistDir = "/swingjs/j2s"; + } + } + + // look for properties (passed in by getdown) otherwise default to release + private static void setGetdownAppbase() + { + if (getdownAppbase != null) + { + return; + } + String appbase = System.getProperty("getdownappbase"); + String distDir = System.getProperty("getdowndistdir"); + if (appbase == null) + { + appbase = buildProperties.getProperty("GETDOWNAPPBASE"); + distDir = buildProperties.getProperty("GETDOWNAPPDISTDIR"); + } + if (appbase == null) + { + appbase = releaseAppbase; + distDir = "release"; + } + if (appbase.endsWith("/")) + { + appbase = appbase.substring(0, appbase.length() - 1); + } + if (distDir == null) + { + distDir = appbase.equals(releaseAppbase) ? "release" : "alt"; + } + getdownAppbase = appbase; + getdownDistDir = distDir; + } + + public static String getGetdownAppbase() + { + setGetdownAppbase(); + return getdownAppbase; + } + + public static String getAppbaseBuildProperties() + { + String appbase = getGetdownAppbase(); + return appbase + "/" + getdownDistDir + "/build_properties"; + } }