From eb1a0c3a8d49e3e3fc4b094272a2bb1538ab5a89 Mon Sep 17 00:00:00 2001 From: Jim Robinson <933148+jrobinso@users.noreply.github.com> Date: Tue, 12 Sep 2023 16:09:28 -0700 Subject: [PATCH] OAuth refactoring (#1390) * Defer initializing default Google oAuth until needed. * Support multiple oAuth configurations as an array in oauth-config.json. e.g. an Azure and Amazon config --- .gitignore | 1 + examples/oauth/oauth-config-amazon.json | 11 +-- examples/oauth/oauth-config-google.json | 10 +- examples/oauth/oauth-config-microsoft.json | 12 +-- .../org/broad/igv/oauth/OAuthProvider.java | 42 ++------- .../org/broad/igv/oauth/OAuthURLForm.java | 60 ++++++++++++ .../java/org/broad/igv/oauth/OAuthUtils.java | 92 ++++++++++++------- .../org/broad/igv/prefs/IGVPreferences.java | 15 ++- src/main/java/org/broad/igv/ui/IGV.java | 8 -- .../java/org/broad/igv/ui/IGVMenuBar.java | 66 +++++++------ .../java/org/broad/igv/ui/UIConstants.java | 2 +- .../igv/ui/action/LoadFromURLMenuAction.java | 12 --- .../java/org/broad/igv/util/HttpUtils.java | 4 +- 13 files changed, 199 insertions(+), 136 deletions(-) create mode 100644 src/main/java/org/broad/igv/oauth/OAuthURLForm.java diff --git a/.gitignore b/.gitignore index 4c11921a08..fc6433d38e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ out/ /test/batch/snapshots/ /src/main/java/org/broad/igv/sam/mods/BMScale.java /src/main/java/org/broad/igv/sam/mods/BMScale.form +/ignore/ diff --git a/examples/oauth/oauth-config-amazon.json b/examples/oauth/oauth-config-amazon.json index da133eb5d6..410cd9022c 100644 --- a/examples/oauth/oauth-config-amazon.json +++ b/examples/oauth/oauth-config-amazon.json @@ -1,16 +1,15 @@ { - "client_id": "3f4ujenfmr77tg12idlkebpkoh", - "client_secret": "en1q6638m4dogrr6erhrmitim67sjilc6htjnfmf6ljk2q3j9og", + "apiKey": "", + "project_id": "igv", "auth_provider": "Amazon", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "aws_region": "ap-southeast-2", "scope": "email%20openid%20profile", - "redirect_uris": [ - "http://localhost:60151/oauthCallback" - ], + "client_id": "3f4ujenfmr77tg12iofbebpkoh", + "client_secret": "en1q6638m4dogrr6erhosetim67sjilc6htjnfmf6ljk2q3j9og", "authorization_endpoint": "https://igv-demo.auth.ap-southeast-2.amazoncognito.com/login", "token_endpoint": "https://igv-demo.auth.ap-southeast-2.amazoncognito.com/token", "aws_cognito_fed_pool_id": "ap-southeast-2:15b7bf93-18ca-40d5-99e9-38b4eb69363e", "aws_cognito_pool_id": "ap-southeast-2_IYMvlZzmv", "aws_cognito_role_arn": "arn:aws:iam::YOUR_AWS_ACCOUNT:role/YOUR_Cognito_igvAuth_Role" -} +} \ No newline at end of file diff --git a/examples/oauth/oauth-config-google.json b/examples/oauth/oauth-config-google.json index b7974dc5f3..565db6e9e8 100644 --- a/examples/oauth/oauth-config-google.json +++ b/examples/oauth/oauth-config-google.json @@ -1,11 +1,7 @@ { - "client_id": "661332306814-gb4r480jnb6rres3iv8a5f48dms5ququu.apps.googleusercontent.com", - "client_secret": "MFqdc7apizmtb8n08Ze810V6", + "client_id": "YOUR_CLIENT_ID", + "client_secret": "YOUR_CLIENT_SECRET", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "redirect_uris": [ - "http://localhost:60151/oauthCallback" - ], - "hosts": ["www.googleapis.com", "storage.cloud.google.com", "storage.googleapis.com"] + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs" } \ No newline at end of file diff --git a/examples/oauth/oauth-config-microsoft.json b/examples/oauth/oauth-config-microsoft.json index 6b2189b259..0e2d5e121a 100644 --- a/examples/oauth/oauth-config-microsoft.json +++ b/examples/oauth/oauth-config-microsoft.json @@ -1,11 +1,11 @@ { - "client_id": "hbq82djj-qwer-7iub-j7zq-7i8nv72n48nq", - "client_secret": "cVAX64fXRikCLmtAow/cktrAtaHz/tmB3WHKhnbXN2Gq", - "authorization_endpoint": "https://login.microsoftonline.com/77nwe2q2-e53r-uq2p-7vdh-9z7px83zmtiv/oauth2/authorize", - "token_endpoint": "https://login.microsoftonline.com/77nwe2q2-e53r-wk32-7vdh-9z7px83zmtiv/oauth2/token", + "client_id": "YOUR_CLIENT_ID", + "client_secret": "YOUR_CLIENT_SECRET", + "authorization_endpoint": "https://login.microsoftonline.com/.../oauth2/authorize", + "token_endpoint": "https://login.microsoftonline.com/.../oauth2/token", "hosts": ["prod_host.mayo.edu", "dev_host.mayo.edu", "int_host.mayo.edu"], - "auth_provider": "Mayo Clinic", - "app_id_uri": "https://orgtools.onmicrosoft.com/6q9qk3mr-pu78-eu73-vx5a-nqw2aqidutm9", + "auth_provider": "YOUR PROVIDER", + "app_id_uri": "https://orgtools.onmicrosoft.com/...", "scope": "openid" } diff --git a/src/main/java/org/broad/igv/oauth/OAuthProvider.java b/src/main/java/org/broad/igv/oauth/OAuthProvider.java index be12784ed9..50b36d43f9 100644 --- a/src/main/java/org/broad/igv/oauth/OAuthProvider.java +++ b/src/main/java/org/broad/igv/oauth/OAuthProvider.java @@ -10,6 +10,7 @@ import org.broad.igv.batch.CommandListener; import org.broad.igv.event.IGVEventBus; import org.broad.igv.prefs.PreferencesManager; +import org.broad.igv.ui.IGV; import org.broad.igv.ui.util.MessageUtils; import org.broad.igv.util.AmazonUtils; import org.broad.igv.util.GoogleUtils; @@ -19,10 +20,7 @@ import java.awt.*; import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLDecoder; +import java.net.*; import java.time.Duration; import java.util.*; import java.util.prefs.Preferences; @@ -32,15 +30,12 @@ public class OAuthProvider { private static Logger log = LogManager.getLogger(OAuthProvider.class); private String authProvider = ""; - private String appIdURI = null; + private String appIdURI; public static String findString = null; public static String replaceString = null; - private static final String REFRESH_TOKEN_KEY = "oauth_refresh_token"; - private String state; // "RFC6749: An opaque value used by the client to maintain state" - private String portNumber = PreferencesManager.getPreferences().getPortNumber(); - private String redirectURI = "http%3A%2F%2Flocalhost%3A" + portNumber + "%2FoauthCallback"; + private String redirectURI; private String clientId; private String clientSecret; private String authEndpoint; @@ -54,13 +49,10 @@ public class OAuthProvider { private String currentUserID; private String currentUserEmail; private JsonObject response; - private JsonObject config; public OAuthProvider(JsonObject obj) throws IOException { - config = obj; - state = UUID.randomUUID().toString(); // "RFC6749: An opaque value used by the client to maintain state" // For backward compatibility @@ -84,6 +76,9 @@ public OAuthProvider(JsonObject obj) throws IOException { "authorization_endpoint/auth_uri or token_endpoint/token_uri"); } + String portNumber = PreferencesManager.getPreferences().getPortNumber(); + redirectURI = "http://localhost:" + portNumber + "/oauthCallback";; + // Optional or custom attributes, fail on runtime, depending on identity provider configuration clientSecret = obj.has("client_secret") ? obj.get("client_secret").getAsString() : null; setAuthProvider(obj.has("auth_provider") ? obj.get("auth_provider").getAsString() : authProvider); @@ -119,10 +114,6 @@ public OAuthProvider(JsonObject obj) throws IOException { String gsScope = "https://www.googleapis.com/auth/devstorage.read_only"; String emailScope = "https://www.googleapis.com/auth/userinfo.email"; scope = gsScope + "%20" + emailScope; - - } - if (authProvider == null) { - authProvider = "Google"; } } } @@ -131,14 +122,6 @@ public String getState() { return state; } - public String[] getHosts() { - return hosts; - } - - public void setHosts(String[] hosts) { - this.hosts = hosts; - } - /** * Send request to authorization provider to start the oauth 2.0 * authorization process. If the listener is up, wait for a callback @@ -168,7 +151,7 @@ public void openAuthorizationPage() throws IOException, URISyntaxException { } else { url = authEndpoint + "?state=" + state + - "&redirect_uri=" + redirectURI + + "&redirect_uri=" + URLEncoder.encode(redirectURI, "utf-8") + "&client_id=" + clientId + "&response_type=code"; @@ -185,7 +168,7 @@ public void openAuthorizationPage() throws IOException, URISyntaxException { if (desktop.isSupported(Desktop.Action.BROWSE)) { desktop.browse(new URI(url)); } else { - MessageUtils.showMessage("Copy this authorization URL into your web browser: " + url); + OAuthURLForm.open(IGV.getInstance().getMainFrame(), url); } } } @@ -201,7 +184,7 @@ public void setAuthorizationCode(String authorizationCode) throws IOException { if (clientSecret != null) { params.put("client_secret", clientSecret); } - params.put("redirect_uri", URLDecoder.decode(redirectURI, "utf-8")); + params.put("redirect_uri", redirectURI); params.put("grant_type", "authorization_code"); // set the resource if it necessary for the auth provider dwm08 @@ -446,7 +429,6 @@ public boolean appliesToUrl(URL url) { } } } - if (this.isGoogle()) { return GoogleUtils.isGoogleURL(url.toExternalForm()); } @@ -465,10 +447,6 @@ public void setResponse(JsonObject res) { response = res; } - public String getAuthProvider() { - return authProvider; - } - public void setAuthProvider(String authProvider) { this.authProvider = authProvider; } diff --git a/src/main/java/org/broad/igv/oauth/OAuthURLForm.java b/src/main/java/org/broad/igv/oauth/OAuthURLForm.java new file mode 100644 index 0000000000..494e85b99e --- /dev/null +++ b/src/main/java/org/broad/igv/oauth/OAuthURLForm.java @@ -0,0 +1,60 @@ +package org.broad.igv.oauth; + +import javax.swing.*; +import java.awt.*; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class OAuthURLForm extends JDialog { + + private static JPanel getPanel(String url) { + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panel.setMinimumSize(new Dimension(400, 300)); + panel.setPreferredSize(new Dimension(400, 300)); + //this.add(panel); + + JPanel headerPanel = new JPanel(); + headerPanel.setLayout(new FlowLayout()); + JLabel label = new JLabel("Copy this authorization URL to your web browser"); + headerPanel.add(label); + + Button copyButton = new Button("Copy"); + copyButton.addActionListener(e -> { + StringSelection selection = new StringSelection(url); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + clipboard.setContents(selection, selection); + }); + headerPanel.add(copyButton); + panel.add(headerPanel); + + JTextArea textArea = new JTextArea(url); + textArea.setMargin(new Insets(10, 10, 10, 10)); + textArea.setLineWrap(true); + panel.add(textArea); + + panel.setAlignmentX(Component.LEFT_ALIGNMENT); + + return panel; + } + + public static void open(Frame owner, String url) { + + JPanel panel = getPanel(url); + JOptionPane.showMessageDialog(owner, + panel, + "OAuth Authorization URL", + JOptionPane.PLAIN_MESSAGE); + + } + + + public static void main(String[] args) { + + open(null, "https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/layout/BoxLayoutDemoProject/src/layout/BoxLayoutDemo.java"); + } +} + + diff --git a/src/main/java/org/broad/igv/oauth/OAuthUtils.java b/src/main/java/org/broad/igv/oauth/OAuthUtils.java index 12a1f03e5f..4ee4439cef 100644 --- a/src/main/java/org/broad/igv/oauth/OAuthUtils.java +++ b/src/main/java/org/broad/igv/oauth/OAuthUtils.java @@ -25,12 +25,13 @@ package org.broad.igv.oauth; -import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.broad.igv.logging.*; import org.broad.igv.DirectoryManager; import org.broad.igv.prefs.PreferencesManager; +import org.broad.igv.ui.IGVMenuBar; import org.broad.igv.util.AmazonUtils; import org.broad.igv.util.GoogleUtils; import org.broad.igv.util.HttpUtils; @@ -39,11 +40,9 @@ import java.io.*; import java.net.URL; import java.net.URLConnection; -import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; /** @@ -59,7 +58,7 @@ public class OAuthUtils { static OAuthProvider awsProvider; - static OAuthProvider defaultProvider; + static OAuthProvider googleProvider; static Map providerCache; @@ -89,8 +88,14 @@ public OAuthProvider getAWSProvider() { return awsProvider; } - public OAuthProvider getDefaultProvider() { - return defaultProvider; + public OAuthProvider getGooleProvider() throws IOException { + if (googleProvider == null) { + loadDefaultOauthProperties(); + if (IGVMenuBar.getInstance() != null) { + IGVMenuBar.getInstance().enableGoogleMenu(true); + } + } + return googleProvider; } private void fetchOauthProperties() throws IOException { @@ -117,14 +122,19 @@ private void fetchOauthProperties() throws IOException { log.error(e); } } + } - // Default (Google) provider - if (defaultProvider == null) { - String propString = loadAsString(PROPERTIES_URL); - defaultProvider = parseProviderJson(propString); - if (defaultProvider.getAuthProvider() == null || defaultProvider.getAuthProvider().isEmpty()) { - defaultProvider.setAuthProvider("Google"); - } + /** + * Load the default (Google) oAuth properties + * + * @throws IOException + */ + public void loadDefaultOauthProperties() throws IOException { + if (googleProvider == null) { + String json = loadAsString(PROPERTIES_URL); + JsonParser parser = new JsonParser(); + JsonObject obj = parser.parse(json).getAsJsonObject(); + googleProvider = parseProviderObject(obj); } } @@ -135,7 +145,7 @@ private void fetchOauthProperties() throws IOException { * @throws IOException */ public void updateOauthProvider(String provisioningURL) throws IOException { - if(provisioningURL != null && provisioningURL.trim().length() > 0) { + if (provisioningURL != null && provisioningURL.trim().length() > 0) { String json = loadAsString(provisioningURL); parseProviderJson(json); } @@ -143,7 +153,7 @@ public void updateOauthProvider(String provisioningURL) throws IOException { private String loadAsString(String urlOrPath) throws IOException { - if(HttpUtils.isRemoteURL(urlOrPath)) { + if (HttpUtils.isRemoteURL(urlOrPath)) { urlOrPath = HttpUtils.mapURL(urlOrPath); } InputStream is = null; @@ -163,54 +173,70 @@ private String loadAsString(String urlOrPath) throws IOException { /** * Parse Oauth provider configuration and update state *

- * TODO -- refactor to remove side effects. * * @param json * @throws IOException */ - private OAuthProvider parseProviderJson(String json) throws IOException { + private void parseProviderJson(String json) throws IOException { JsonParser parser = new JsonParser(); - JsonObject obj = parser.parse(json).getAsJsonObject(); + JsonElement element = parser.parse(json); + if (element.isJsonArray()) { + Iterator iter = element.getAsJsonArray().iterator(); + while (iter.hasNext()) { + parseProviderObject(iter.next().getAsJsonObject()); + } + } else { + parseProviderObject(element.getAsJsonObject()); + } + + } + + private OAuthProvider parseProviderObject(JsonObject obj) throws IOException { OAuthProvider p = new OAuthProvider(obj); providerCache.put(p.getState(), p); - if (obj.has("auth_provider") && obj.get("auth_provider").getAsString().equals("Amazon")) { + if ((obj.has("auth_provider") + && obj.get("auth_provider").getAsString().equals("Amazon")) || + obj.has("aws_region")) { awsProvider = p; AmazonUtils.setCognitoConfig(obj); - } - if (p.isGoogle()) { - defaultProvider = p; + } else if (p.isGoogle()) { + googleProvider = p; + googleProvider.setAuthProvider("Google"); } return p; } + /** + * Called during authorization flow from CommandListener + * @param state + * @return + * @throws IOException + */ public OAuthProvider getProviderForState(String state) throws IOException { if (providerCache.containsKey(state)) { return providerCache.get(state); } else { // This should never happen, perhaps an error should be thrown. log.warn("No oAuth provider found for callback"); - return defaultProvider; + return null; } } - public OAuthProvider getProviderForURL(URL url) { + public OAuthProvider getProviderForURL(URL url) throws IOException { for (OAuthProvider provider : providerCache.values()) { if (provider.appliesToUrl(url)) { + if(provider.isGoogle()) { + IGVMenuBar.getInstance().enableGoogleMenu(true); + } return provider; } } - - // With a properly configured IGV we should never get here - if (GoogleUtils.isGoogleURL(url.toExternalForm()) && defaultProvider.isGoogle()) { - return defaultProvider; - } else { - return null; - } + return null; } /** * Open an input stream for reading a local or remote file. - + * * @param urlOrPath -- either an http URL or path to a local file. Can be gzipped * @return * @throws IOException diff --git a/src/main/java/org/broad/igv/prefs/IGVPreferences.java b/src/main/java/org/broad/igv/prefs/IGVPreferences.java index 82733cbf17..61bf5db497 100644 --- a/src/main/java/org/broad/igv/prefs/IGVPreferences.java +++ b/src/main/java/org/broad/igv/prefs/IGVPreferences.java @@ -44,6 +44,7 @@ import org.broad.igv.sam.mods.BaseModificationColors; import org.broad.igv.track.TrackType; import org.broad.igv.ui.IGV; +import org.broad.igv.ui.IGVMenuBar; import org.broad.igv.ui.UIConstants; import org.broad.igv.ui.color.ColorUtilities; import org.broad.igv.ui.color.PaletteColorTable; @@ -51,6 +52,7 @@ import java.awt.*; import java.io.File; +import java.io.IOException; import java.io.PrintWriter; import java.util.*; @@ -306,16 +308,25 @@ public void putAll(Map updatedPrefs) { checkForCommandListenerChanges(updatedPrefs); checkForAttributePanelChanges(updatedPrefs); checkForCircViewChanges(updatedPrefs); + checkForGoogleMenuChange(updatedPrefs); IGVEventBus.getInstance().post(new PreferencesChangeEvent()); + } + + private void checkForGoogleMenuChange(Map updatedPreferenceMap) { + if(updatedPreferenceMap.containsKey(ENABLE_GOOGLE_MENU) && IGV.hasInstance()) { + try { + IGVMenuBar.getInstance().enableGoogleMenu(getAsBoolean(ENABLE_GOOGLE_MENU)); + } catch (IOException e) { + log.error("Error enabling/disabling Google menu", e); + } + } } private void checkForAlignmentChanges(Map updatedPreferenceMap) { if (IGV.hasInstance()) { - final IGV igv = IGV.getInstance(); - boolean reloadSAM = false; for (String key : SAM_RELOAD_KEYS) { if (updatedPreferenceMap.containsKey(key)) { diff --git a/src/main/java/org/broad/igv/ui/IGV.java b/src/main/java/org/broad/igv/ui/IGV.java index 0517ef27b8..f9a9ac31f6 100644 --- a/src/main/java/org/broad/igv/ui/IGV.java +++ b/src/main/java/org/broad/igv/ui/IGV.java @@ -1161,10 +1161,6 @@ public void removeDataPanel(String name) { contentPane.getMainPanel().removeDataPanel(name); } - public void layoutMainPanel() { - contentPane.getMainPanel().doLayout(); - } - public MainPanel getMainPanel() { return contentPane.getMainPanel(); } @@ -1173,10 +1169,6 @@ public LinkedList getRecentSessionList() { return recentSessionList; } - public void setRecentSessionList(LinkedList recentSessionList) { - this.recentSessionList = recentSessionList; - } - public IGVContentPane getContentPane() { return contentPane; } diff --git a/src/main/java/org/broad/igv/ui/IGVMenuBar.java b/src/main/java/org/broad/igv/ui/IGVMenuBar.java index e380d833a0..1eaeef9c75 100644 --- a/src/main/java/org/broad/igv/ui/IGVMenuBar.java +++ b/src/main/java/org/broad/igv/ui/IGVMenuBar.java @@ -180,14 +180,19 @@ private List createMenus() { //extrasMenu.setVisible(false); menus.add(extrasMenu); - try { - googleMenu = createGoogleMenu(); - if (googleMenu != null) { - googleMenu.setVisible(PreferencesManager.getPreferences().getAsBoolean(ENABLE_GOOGLE_MENU)); - menus.add(googleMenu); + // Create a placehold Google menu. If not explicitly enabled it will remain invisible until triggered + // by loading a protected Google resource + googleMenu = new JMenu("Google"); + menus.add(googleMenu); + boolean enabled = PreferencesManager.getPreferences().getAsBoolean(ENABLE_GOOGLE_MENU); + googleMenu.setVisible(enabled); + + if (enabled) { + try { + enableGoogleMenu(enabled); + } catch (IOException e) { + log.error("Error creating google menu: " + e.getMessage()); } - } catch (IOException e) { - log.error("Error creating google menu: " + e.getMessage()); } try { @@ -1020,14 +1025,28 @@ public void menuCanceled(MenuEvent e) { return menu; } - private JMenu createGoogleMenu() throws IOException { + /** + * The Google menu is enabled dynamically to defer loading of oAuth properties until needed. + * * + * @return + * @throws IOException + */ + public void enableGoogleMenu(boolean enable) throws IOException { + + if(!enable) { + googleMenu.setVisible(false); + return; + } else if (googleMenu.isVisible()) { + // Already visible. + return; + } - // Dynamically name menu - dwm08 - final OAuthProvider oauth = OAuthUtils.getInstance().getDefaultProvider(); - if (oauth != null) { - JMenu menu = new JMenu("Google"); + googleMenu.setVisible(true); + final OAuthProvider oauth = OAuthUtils.getInstance().getGooleProvider(); + + if (oauth != null) { boolean isLoggedIn = oauth.isLoggedIn(); @@ -1042,7 +1061,7 @@ private JMenu createGoogleMenu() throws IOException { }); login.setEnabled(!isLoggedIn); - menu.add(login); + googleMenu.add(login); final JMenuItem logout = new JMenuItem("Logout "); @@ -1051,19 +1070,18 @@ private JMenu createGoogleMenu() throws IOException { GoogleUtils.setProjectID(null); }); logout.setEnabled(isLoggedIn); - menu.add(logout); + googleMenu.add(logout); final JMenuItem projectID = new JMenuItem("Enter Project ID ..."); projectID.addActionListener(e -> GoogleUtils.enterGoogleProjectID()); - menu.add(projectID); + googleMenu.add(projectID); - menu.addMenuListener(new MenuListener() { + googleMenu.addMenuListener(new MenuListener() { @Override public void menuSelected(MenuEvent e) { - OAuthProvider oAuthProvider = OAuthUtils.getInstance().getDefaultProvider(); - boolean loggedIn = oAuthProvider.isLoggedIn(); - if (loggedIn && oAuthProvider.getCurrentUserName() != null) { - login.setText(oAuthProvider.getCurrentUserName()); + boolean loggedIn = oauth.isLoggedIn(); + if (loggedIn && oauth.getCurrentUserName() != null) { + login.setText(oauth.getCurrentUserName()); } else { login.setText("Login ..."); } @@ -1082,9 +1100,6 @@ public void menuCanceled(MenuEvent e) { } }); - return menu; - } else { - return null; } } @@ -1156,11 +1171,6 @@ static void destroyInstance() { instance = null; } - public void enableGoogleMenu(boolean aBoolean) { - if (googleMenu != null) { - googleMenu.setVisible(aBoolean); - } - } @Override public void receiveEvent(final Object event) { diff --git a/src/main/java/org/broad/igv/ui/UIConstants.java b/src/main/java/org/broad/igv/ui/UIConstants.java index 24259a9622..fbefdddd00 100644 --- a/src/main/java/org/broad/igv/ui/UIConstants.java +++ b/src/main/java/org/broad/igv/ui/UIConstants.java @@ -91,7 +91,7 @@ public class UIConstants { final public static String OVERWRITE_SESSION_MESSAGE = "Opening a session will unload all current data. " + "
Are you sure you wish to continue?"; final public static String CANNOT_ACCESS_SERVER_GENOME_LIST = "The Genome server is currently inaccessible."; - final public static int NUMBER_OF_RECENT_SESSIONS_TO_LIST = 3; + final public static int NUMBER_OF_RECENT_SESSIONS_TO_LIST = 10; final public static String DEFAULT_SESSION_FILE = "igv_session" + Globals.SESSION_FILE_EXTENSION; static final public String SERVER_BASE_URL = "http://www.broadinstitute.org/"; static final public Color LIGHT_YELLOW = new Color(255, 244, 201); diff --git a/src/main/java/org/broad/igv/ui/action/LoadFromURLMenuAction.java b/src/main/java/org/broad/igv/ui/action/LoadFromURLMenuAction.java index 6dac928b86..9c8473c975 100644 --- a/src/main/java/org/broad/igv/ui/action/LoadFromURLMenuAction.java +++ b/src/main/java/org/broad/igv/ui/action/LoadFromURLMenuAction.java @@ -142,24 +142,12 @@ private void checkURLs(String[] urls) { for (String url : urls) { if (url.startsWith("s3://")) { checkAWSAccessbility(url); - } else if (GoogleUtils.isGoogleURL(url)) { - enableGoogleMenu(); } else if (url.startsWith("ftp://")) { MessageUtils.showMessage("FTP protocol is not supported"); } } } - - private void enableGoogleMenu() { - - if (!PreferencesManager.getPreferences().getAsBoolean(Constants.ENABLE_GOOGLE_MENU)) { - PreferencesManager.getPreferences().put(Constants.ENABLE_GOOGLE_MENU, true); - IGVMenuBar.getInstance().enableGoogleMenu(true); - } - } - - private void checkAWSAccessbility(String url) { try { // If AWS support is active, check if objects are in accessible tiers via Load URL menu... diff --git a/src/main/java/org/broad/igv/util/HttpUtils.java b/src/main/java/org/broad/igv/util/HttpUtils.java index aebc9d8e65..78410909f1 100644 --- a/src/main/java/org/broad/igv/util/HttpUtils.java +++ b/src/main/java/org/broad/igv/util/HttpUtils.java @@ -57,7 +57,6 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; import static org.broad.igv.prefs.Constants.*; import static org.broad.igv.util.stream.SeekableServiceStream.WEBSERVICE_URL; @@ -854,6 +853,9 @@ else if (code >= 400) { throw new FileNotFoundException(message); } else if (code == 401) { OAuthProvider provider = OAuthUtils.getInstance().getProviderForURL(url); + if(provider == null && GoogleUtils.isGoogleURL(url.toExternalForm())) { + provider = OAuthUtils.getInstance().getGooleProvider(); + } if (provider != null && retries == 0) { if (!provider.isLoggedIn()) { provider.checkLogin();