diff --git a/src/main/java/org/sagebionetworks/web/client/GWTWrapper.java b/src/main/java/org/sagebionetworks/web/client/GWTWrapper.java index 073f067f3d..b29b393af5 100644 --- a/src/main/java/org/sagebionetworks/web/client/GWTWrapper.java +++ b/src/main/java/org/sagebionetworks/web/client/GWTWrapper.java @@ -29,6 +29,8 @@ public interface GWTWrapper { String getHostPrefix(); + String getHostName(); + String getCurrentURL(); DateTimeFormat getDateTimeFormat(PredefinedFormat format); diff --git a/src/main/java/org/sagebionetworks/web/client/GWTWrapperImpl.java b/src/main/java/org/sagebionetworks/web/client/GWTWrapperImpl.java index bb392e2fbf..ad77c12dcb 100644 --- a/src/main/java/org/sagebionetworks/web/client/GWTWrapperImpl.java +++ b/src/main/java/org/sagebionetworks/web/client/GWTWrapperImpl.java @@ -90,6 +90,11 @@ public String getCurrentURL() { return Window.Location.getHref(); } + @Override + public String getHostName() { + return Window.Location.getHostName(); + } + @Override public DateTimeFormat getDateTimeFormat(PredefinedFormat format) { return DateTimeFormat.getFormat(format); diff --git a/src/main/java/org/sagebionetworks/web/client/GlobalApplicationStateImpl.java b/src/main/java/org/sagebionetworks/web/client/GlobalApplicationStateImpl.java index ef5b2bfc3b..cec872674b 100644 --- a/src/main/java/org/sagebionetworks/web/client/GlobalApplicationStateImpl.java +++ b/src/main/java/org/sagebionetworks/web/client/GlobalApplicationStateImpl.java @@ -32,6 +32,7 @@ import org.sagebionetworks.web.client.jsinterop.SRC; import org.sagebionetworks.web.client.mvp.AppActivityMapper; import org.sagebionetworks.web.client.mvp.AppPlaceHistoryMapper; +import org.sagebionetworks.web.client.place.LoginPlace; import org.sagebionetworks.web.client.utils.Callback; import org.sagebionetworks.web.client.utils.CallbackP; import org.sagebionetworks.web.client.widget.footer.VersionState; @@ -62,6 +63,7 @@ public class GlobalApplicationStateImpl implements GlobalApplicationState { private CallbackP fileListCallback; private SynapseProperties synapseProperties; private PortalGinInjector ginInjector; + private final OneSageUtils oneSageUtils; boolean isDragDropInitialized = false; boolean isToastContainerInitialized = false; @@ -106,7 +108,8 @@ public GlobalApplicationStateImpl( SynapseJavascriptClient jsClient, SynapseProperties synapseProperties, SessionStorage sessionStorage, - PortalGinInjector ginInjector + PortalGinInjector ginInjector, + OneSageUtils oneSageUtils ) { this.cookieProvider = cookieProvider; this.eventBus = eventBus; @@ -123,6 +126,7 @@ public GlobalApplicationStateImpl( this.synapseProperties = synapseProperties; this.sessionStorage = sessionStorage; this.ginInjector = ginInjector; + this.oneSageUtils = oneSageUtils; initUncaughtExceptionHandler(); } @@ -618,13 +622,21 @@ public void gotoLoginPage() { Date twoHoursFromNow = new Date(); twoHoursFromNow.setTime(twoHoursFromNow.getTime() + (2 * 60 * 60 * 1000)); + String returnUrl = gwt.getCurrentURL(); + String lastPlacePath = sessionStorage.getItem( + GlobalApplicationStateImpl.LAST_PLACE + ); + if (getCurrentPlace() instanceof LoginPlace && lastPlacePath != null) { + // if at the LoginPlace, redirect to the current last place after login + returnUrl = gwt.getHostPageBaseURL() + lastPlacePath; + } cookieProvider.setCookie( ONESAGE_REDIRECT_COOKIE_KEY, - gwt.getCurrentURL(), + returnUrl, twoHoursFromNow ); // SWC-6533: Sending all to One Sage for login - gwt.assignThisWindowWith(OneSageUtils.getOneSageURL()); + gwt.assignThisWindowWith(oneSageUtils.getOneSageURL()); } @Override diff --git a/src/main/java/org/sagebionetworks/web/client/OneSageUtils.java b/src/main/java/org/sagebionetworks/web/client/OneSageUtils.java index 7f1bf4d2de..a89cf32035 100644 --- a/src/main/java/org/sagebionetworks/web/client/OneSageUtils.java +++ b/src/main/java/org/sagebionetworks/web/client/OneSageUtils.java @@ -1,62 +1,16 @@ package org.sagebionetworks.web.client; -import static org.sagebionetworks.web.shared.WebConstants.ONESAGE_ACCOUNT_SETTINGS_PATH; +public interface OneSageUtils { + String getAppIdForOneSage(); -import com.google.gwt.user.client.Window; -import org.sagebionetworks.web.shared.WebConstants; - -public class OneSageUtils { - - private static String getHostForOneSage() { - // SWC-6533: We do not want to stack hop for Prod and Staging - switch (Window.Location.getHostName().toLowerCase()) { - case "staging.synapse.org": - return "https://staging.accounts.synapse.org"; - case "portal-dev.dev.sagebase.org": - return "https://accounts-dev.dev.sagebase.org"; - case "localhost": - case "127.0.0.1": - return "http://" + Window.Location.getHostName() + ":3000"; - default: - return "https://accounts.synapse.org"; - } - } - - public static String getAppIdForOneSage() { - switch (Window.Location.getHostName().toLowerCase()) { - case "staging.synapse.org": - return "staging.synapse.org"; - case "portal-dev.dev.sagebase.org": - return "dev.synapse.org"; - case "localhost": - case "127.0.0.1": - return "localhost"; - default: - return "synapse.org"; - } - } - - public static String getOneSageURL() { - return getOneSageURL("/"); - } + String getOneSageURL(); /** * Based on the current hostname, generate a URL pointing to an instance of OneSage with an appropriate appId search param. * @param path * @return a String representation of the OneSage URL */ - public static String getOneSageURL(String path) { - return ( - getHostForOneSage() + - path + - "?" + - WebConstants.ONESAGE_SYNAPSE_APPID_QUERY_PARAM_KEY + - "=" + - getAppIdForOneSage() - ); - } + String getOneSageURL(String path); - public static String getAccountSettingsURL() { - return getOneSageURL(ONESAGE_ACCOUNT_SETTINGS_PATH); - } + String getAccountSettingsURL(); } diff --git a/src/main/java/org/sagebionetworks/web/client/OneSageUtilsImpl.java b/src/main/java/org/sagebionetworks/web/client/OneSageUtilsImpl.java new file mode 100644 index 0000000000..7a7900acbd --- /dev/null +++ b/src/main/java/org/sagebionetworks/web/client/OneSageUtilsImpl.java @@ -0,0 +1,70 @@ +package org.sagebionetworks.web.client; + +import static org.sagebionetworks.web.shared.WebConstants.ONESAGE_ACCOUNT_SETTINGS_PATH; + +import com.google.gwt.user.client.Window; +import com.google.inject.Inject; +import org.sagebionetworks.web.shared.WebConstants; + +public class OneSageUtilsImpl implements OneSageUtils { + + private final GWTWrapper gwtWrapper; + + @Inject + public OneSageUtilsImpl(GWTWrapper gwtWrapper) { + this.gwtWrapper = gwtWrapper; + } + + private String getHostForOneSage() { + // SWC-6533: We do not want to stack hop for Prod and Staging + switch (gwtWrapper.getHostName().toLowerCase()) { + case "staging.synapse.org": + return "https://staging.accounts.synapse.org"; + case "portal-dev.dev.sagebase.org": + return "https://accounts-dev.dev.sagebase.org"; + case "localhost": + case "127.0.0.1": + return "http://" + Window.Location.getHostName() + ":3000"; + default: + return "https://accounts.synapse.org"; + } + } + + public String getAppIdForOneSage() { + switch (gwtWrapper.getHostName().toLowerCase()) { + case "staging.synapse.org": + return "staging.synapse.org"; + case "portal-dev.dev.sagebase.org": + return "dev.synapse.org"; + case "localhost": + case "127.0.0.1": + return "localhost"; + default: + return "synapse.org"; + } + } + + public String getOneSageURL() { + return getOneSageURL("/"); + } + + /** + * Based on the current hostname, generate a URL pointing to an instance of OneSage with an appropriate appId search param. + * @param path + * @return a String representation of the OneSage URL + */ + public String getOneSageURL(String path) { + return ( + getHostForOneSage() + + path + + "?" + + WebConstants.ONESAGE_SYNAPSE_APPID_QUERY_PARAM_KEY + + "=" + + getAppIdForOneSage() + ); + } + + public String getAccountSettingsURL() { + return getOneSageURL(ONESAGE_ACCOUNT_SETTINGS_PATH); + } +} diff --git a/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java b/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java index 8c56e89b37..a0af82410e 100644 --- a/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java +++ b/src/main/java/org/sagebionetworks/web/client/PortalGinModule.java @@ -983,5 +983,6 @@ protected void configure() { bind(FeatureFlagConfig.class).in(Singleton.class); bind(EntityTypeIcon.class).to(EntityTypeIconImpl.class); + bind(OneSageUtils.class).to(OneSageUtilsImpl.class); } } diff --git a/src/main/java/org/sagebionetworks/web/client/context/SynapseReactClientFullContextPropsProviderImpl.java b/src/main/java/org/sagebionetworks/web/client/context/SynapseReactClientFullContextPropsProviderImpl.java index 1d8d9a3c5a..cd8501b7e7 100644 --- a/src/main/java/org/sagebionetworks/web/client/context/SynapseReactClientFullContextPropsProviderImpl.java +++ b/src/main/java/org/sagebionetworks/web/client/context/SynapseReactClientFullContextPropsProviderImpl.java @@ -3,6 +3,7 @@ import javax.inject.Inject; import org.sagebionetworks.web.client.DisplayUtils; import org.sagebionetworks.web.client.GlobalApplicationState; +import org.sagebionetworks.web.client.OneSageUtils; import org.sagebionetworks.web.client.cookie.CookieProvider; import org.sagebionetworks.web.client.jsinterop.SynapseContextJsObject; import org.sagebionetworks.web.client.jsinterop.SynapseReactClientFullContextProviderProps; @@ -14,22 +15,25 @@ public class SynapseReactClientFullContextPropsProviderImpl implements SynapseReactClientFullContextPropsProvider { - private AuthenticationController authController; - private GlobalApplicationState globalApplicationState; - private CookieProvider cookies; - private QueryClientProvider queryClientProvider; + private final AuthenticationController authController; + private final GlobalApplicationState globalApplicationState; + private final CookieProvider cookies; + private final QueryClientProvider queryClientProvider; + private final OneSageUtils oneSageUtils; @Inject SynapseReactClientFullContextPropsProviderImpl( final AuthenticationController authController, final GlobalApplicationState globalApplicationState, final CookieProvider cookies, - final QueryClientProvider queryClientProvider + final QueryClientProvider queryClientProvider, + final OneSageUtils oneSageUtils ) { this.authController = authController; this.globalApplicationState = globalApplicationState; this.cookies = cookies; this.queryClientProvider = queryClientProvider; + this.oneSageUtils = oneSageUtils; } @Override @@ -38,7 +42,8 @@ public SynapseReactClientFullContextProviderProps getJsInteropContextProps() { SynapseContextJsObject.create( authController.getCurrentUserAccessToken(), DisplayUtils.isInTestWebsite(cookies), - globalApplicationState.isShowingUTCTime() + globalApplicationState.isShowingUTCTime(), + oneSageUtils.getAppIdForOneSage() ), queryClientProvider.getQueryClient() ); diff --git a/src/main/java/org/sagebionetworks/web/client/jsinterop/React.java b/src/main/java/org/sagebionetworks/web/client/jsinterop/React.java index 4b0b005f8f..83db27ded7 100644 --- a/src/main/java/org/sagebionetworks/web/client/jsinterop/React.java +++ b/src/main/java/org/sagebionetworks/web/client/jsinterop/React.java @@ -38,7 +38,7 @@ > ReactElement createElement( ) { SynapseReactClientFullContextProviderProps emptyContext = SynapseReactClientFullContextProviderProps.create( - SynapseContextJsObject.create(null, false, false), + SynapseContextJsObject.create(null, false, false, "synapse.org"), null ); return createElementWithSynapseContext(componentType, props, emptyContext); diff --git a/src/main/java/org/sagebionetworks/web/client/jsinterop/SynapseContextJsObject.java b/src/main/java/org/sagebionetworks/web/client/jsinterop/SynapseContextJsObject.java index 2b67c253ad..8beec0be37 100644 --- a/src/main/java/org/sagebionetworks/web/client/jsinterop/SynapseContextJsObject.java +++ b/src/main/java/org/sagebionetworks/web/client/jsinterop/SynapseContextJsObject.java @@ -1,7 +1,5 @@ package org.sagebionetworks.web.client.jsinterop; -import static org.sagebionetworks.web.client.OneSageUtils.getAppIdForOneSage; - import jsinterop.annotations.JsNullable; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; @@ -23,14 +21,15 @@ public class SynapseContextJsObject { public static SynapseContextJsObject create( String accessToken, boolean isInExperimentalMode, - boolean utcTime + boolean utcTime, + String appId ) { SynapseContextJsObject context = new SynapseContextJsObject(); context.accessToken = accessToken; context.isInExperimentalMode = isInExperimentalMode; context.utcTime = utcTime; context.downloadCartPageUrl = "/DownloadCart:0"; - context.appId = getAppIdForOneSage(); + context.appId = appId; context.withErrorBoundary = true; return context; } diff --git a/src/main/java/org/sagebionetworks/web/client/presenter/PersonalAccessTokensPresenter.java b/src/main/java/org/sagebionetworks/web/client/presenter/PersonalAccessTokensPresenter.java index a5eef3330c..650f9dc515 100644 --- a/src/main/java/org/sagebionetworks/web/client/presenter/PersonalAccessTokensPresenter.java +++ b/src/main/java/org/sagebionetworks/web/client/presenter/PersonalAccessTokensPresenter.java @@ -14,13 +14,16 @@ public class PersonalAccessTokensPresenter extends AbstractActivity implements Presenter { - private GlobalApplicationState globalApplicationState; + private final GlobalApplicationState globalApplicationState; + private final OneSageUtils oneSageUtils; @Inject public PersonalAccessTokensPresenter( - GlobalApplicationState globalApplicationState + GlobalApplicationState globalApplicationState, + OneSageUtils oneSageUtils ) { this.globalApplicationState = globalApplicationState; + this.oneSageUtils = oneSageUtils; } @Override @@ -29,7 +32,7 @@ public void setPlace(PersonalAccessTokenPlace place) {} @Override public void start(AcceptsOneWidget panel, EventBus eventBus) { Window.Location.replace( - OneSageUtils.getOneSageURL("/authenticated/personalaccesstokens") + oneSageUtils.getOneSageURL("/authenticated/personalaccesstokens") ); } diff --git a/src/main/java/org/sagebionetworks/web/client/presenter/ProfilePresenter.java b/src/main/java/org/sagebionetworks/web/client/presenter/ProfilePresenter.java index 4c5251a1a5..84285a4104 100644 --- a/src/main/java/org/sagebionetworks/web/client/presenter/ProfilePresenter.java +++ b/src/main/java/org/sagebionetworks/web/client/presenter/ProfilePresenter.java @@ -101,6 +101,7 @@ public class ProfilePresenter public PromptForValuesModalView promptDialog; public SynapseJavascriptClient jsClient; + private final OneSageUtils oneSageUtils; @Inject public ProfilePresenter( @@ -111,7 +112,8 @@ public ProfilePresenter( TeamListWidget myTeamsWidget, OpenTeamInvitationsWidget openInvitesWidget, PortalGinInjector ginInjector, - SynapseJavascriptClient jsClient + SynapseJavascriptClient jsClient, + OneSageUtils oneSageUtils ) { this.view = view; this.authenticationController = authenticationController; @@ -121,6 +123,7 @@ public ProfilePresenter( this.myTeamsWidget = myTeamsWidget; this.openInvitesWidget = openInvitesWidget; this.jsClient = jsClient; + this.oneSageUtils = oneSageUtils; profileSynAlert = ginInjector.getSynapseAlertWidget(); projectSynAlert = ginInjector.getSynapseAlertWidget(); teamSynAlert = ginInjector.getSynapseAlertWidget(); @@ -857,7 +860,7 @@ private void showView(Profile place) { updateProfileView(place.getUserId()); } else { if (Profile.EDIT_PROFILE_TOKEN.equals(token)) { - Window.Location.replace(OneSageUtils.getAccountSettingsURL()); + Window.Location.replace(oneSageUtils.getAccountSettingsURL()); } else { // if this is a number, then treat it as a a user id try { @@ -956,7 +959,7 @@ private void refreshData(ProfileArea tab) { refreshTeams(); break; case SETTINGS: - Window.Location.replace(OneSageUtils.getAccountSettingsURL()); + Window.Location.replace(oneSageUtils.getAccountSettingsURL()); break; case CHALLENGES: refreshChallenges(); diff --git a/src/main/java/org/sagebionetworks/web/client/presenter/TwoFactorAuthPresenter.java b/src/main/java/org/sagebionetworks/web/client/presenter/TwoFactorAuthPresenter.java index c6ecf0c3b5..002563ff5b 100644 --- a/src/main/java/org/sagebionetworks/web/client/presenter/TwoFactorAuthPresenter.java +++ b/src/main/java/org/sagebionetworks/web/client/presenter/TwoFactorAuthPresenter.java @@ -12,12 +12,16 @@ public class TwoFactorAuthPresenter extends AbstractActivity implements Presenter { + private final OneSageUtils oneSageUtils; + @Inject - public TwoFactorAuthPresenter() {} + public TwoFactorAuthPresenter(OneSageUtils oneSageUtils) { + this.oneSageUtils = oneSageUtils; + } @Override public void start(AcceptsOneWidget panel, EventBus eventBus) { - Window.Location.replace(OneSageUtils.getAccountSettingsURL()); + Window.Location.replace(oneSageUtils.getAccountSettingsURL()); } @Override diff --git a/src/main/java/org/sagebionetworks/web/client/presenter/users/PasswordResetPresenter.java b/src/main/java/org/sagebionetworks/web/client/presenter/users/PasswordResetPresenter.java index 2b81e42085..414b3c28f4 100644 --- a/src/main/java/org/sagebionetworks/web/client/presenter/users/PasswordResetPresenter.java +++ b/src/main/java/org/sagebionetworks/web/client/presenter/users/PasswordResetPresenter.java @@ -13,15 +13,16 @@ public class PasswordResetPresenter extends AbstractActivity implements Presenter { - private static final String ONE_SAGE_RESET_PASSWORD_URL = - OneSageUtils.getOneSageURL("/resetPassword"); + private final OneSageUtils oneSageUtils; @Inject - public PasswordResetPresenter() {} + public PasswordResetPresenter(OneSageUtils oneSageUtils) { + this.oneSageUtils = oneSageUtils; + } @Override public void start(AcceptsOneWidget acceptsOneWidget, EventBus eventBus) { - Window.Location.replace(ONE_SAGE_RESET_PASSWORD_URL); + Window.Location.replace(oneSageUtils.getOneSageURL("/resetPassword")); } @Override diff --git a/src/main/java/org/sagebionetworks/web/client/presenter/users/RegisterAccountPresenter.java b/src/main/java/org/sagebionetworks/web/client/presenter/users/RegisterAccountPresenter.java index fc3edd14d0..c35c6031d5 100644 --- a/src/main/java/org/sagebionetworks/web/client/presenter/users/RegisterAccountPresenter.java +++ b/src/main/java/org/sagebionetworks/web/client/presenter/users/RegisterAccountPresenter.java @@ -13,8 +13,12 @@ public class RegisterAccountPresenter extends AbstractActivity implements Presenter { + private final OneSageUtils oneSageUtils; + @Inject - public RegisterAccountPresenter() {} + public RegisterAccountPresenter(OneSageUtils oneSageUtils) { + this.oneSageUtils = oneSageUtils; + } @Override public void start(AcceptsOneWidget panel, EventBus eventBus) {} @@ -26,7 +30,7 @@ public void setPlace(RegisterAccount place) { ); String email = place.getParam(RegisterAccount.EMAIL_QUERY_PARAM); StringBuilder targetUrl = new StringBuilder(); - targetUrl.append(OneSageUtils.getOneSageURL("/register1")); + targetUrl.append(oneSageUtils.getOneSageURL("/register1")); if (emailInvitationToken != null) { targetUrl.append("&signedToken=" + emailInvitationToken); diff --git a/src/main/java/org/sagebionetworks/web/client/widget/QuarantinedEmailModal.java b/src/main/java/org/sagebionetworks/web/client/widget/QuarantinedEmailModal.java index a7a4609f9b..e8b2a8d93f 100644 --- a/src/main/java/org/sagebionetworks/web/client/widget/QuarantinedEmailModal.java +++ b/src/main/java/org/sagebionetworks/web/client/widget/QuarantinedEmailModal.java @@ -25,11 +25,12 @@ public interface Binder extends UiBinder {} public QuarantinedEmailModal( Binder binder, AuthenticationController authController, - GlobalApplicationState globalAppState + GlobalApplicationState globalAppState, + OneSageUtils oneSageUtils ) { widget = (Modal) binder.createAndBindUi(this); accountSettingsLink.addClickHandler(event -> { - Window.open(OneSageUtils.getAccountSettingsURL(), "_blank", ""); + Window.open(oneSageUtils.getAccountSettingsURL(), "_blank", ""); widget.hide(); }); } diff --git a/src/main/java/org/sagebionetworks/web/client/widget/profile/UserProfileWidgetViewImpl.java b/src/main/java/org/sagebionetworks/web/client/widget/profile/UserProfileWidgetViewImpl.java index 54bc20d169..fc505fd6d1 100755 --- a/src/main/java/org/sagebionetworks/web/client/widget/profile/UserProfileWidgetViewImpl.java +++ b/src/main/java/org/sagebionetworks/web/client/widget/profile/UserProfileWidgetViewImpl.java @@ -132,7 +132,8 @@ public UserProfileWidgetViewImpl( SynapseJSNIUtils jsniUtils, SynapseReactClientFullContextPropsProvider propsProvider, CookieProvider cookies, - SynapseJavascriptClient jsClient + SynapseJavascriptClient jsClient, + OneSageUtils oneSageUtils ) { this.jsniUtils = jsniUtils; this.propsProvider = propsProvider; @@ -140,11 +141,11 @@ public UserProfileWidgetViewImpl( this.jsClient = jsClient; widget = binder.createAndBindUi(this); editProfileButton.addClickHandler(event -> { - Window.open(OneSageUtils.getAccountSettingsURL(), "_blank", ""); + Window.open(oneSageUtils.getAccountSettingsURL(), "_blank", ""); }); linkRenderer.getElement().setAttribute("rel", "noreferrer noopener"); changePasswordLink.setHref( - OneSageUtils.getAccountSettingsURL() + "#ChangePassword" + oneSageUtils.getAccountSettingsURL() + "#ChangePassword" ); } diff --git a/src/test/java/org/sagebionetworks/web/unitclient/GlobalApplicationStateImplTest.java b/src/test/java/org/sagebionetworks/web/unitclient/GlobalApplicationStateImplTest.java index 354f050ec3..8eeb7a787d 100644 --- a/src/test/java/org/sagebionetworks/web/unitclient/GlobalApplicationStateImplTest.java +++ b/src/test/java/org/sagebionetworks/web/unitclient/GlobalApplicationStateImplTest.java @@ -14,7 +14,9 @@ import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.sagebionetworks.web.client.GlobalApplicationStateImpl.LAST_PLACE; import static org.sagebionetworks.web.client.GlobalApplicationStateImpl.isIgnoredErrorMessage; +import static org.sagebionetworks.web.client.cookie.CookieKeys.ONESAGE_REDIRECT_COOKIE_KEY; import static org.sagebionetworks.web.shared.WebConstants.REPO_SERVICE_URL_KEY; import com.google.gwt.event.shared.EventBus; @@ -37,6 +39,7 @@ import org.sagebionetworks.web.client.GWTWrapper; import org.sagebionetworks.web.client.GlobalApplicationStateImpl; import org.sagebionetworks.web.client.GlobalApplicationStateView; +import org.sagebionetworks.web.client.OneSageUtils; import org.sagebionetworks.web.client.PlaceChanger; import org.sagebionetworks.web.client.PortalGinInjector; import org.sagebionetworks.web.client.StackConfigServiceAsync; @@ -50,6 +53,7 @@ import org.sagebionetworks.web.client.mvp.AppActivityMapper; import org.sagebionetworks.web.client.mvp.AppPlaceHistoryMapper; import org.sagebionetworks.web.client.place.Home; +import org.sagebionetworks.web.client.place.LoginPlace; import org.sagebionetworks.web.client.place.Synapse; import org.sagebionetworks.web.client.utils.Callback; import org.sagebionetworks.web.client.widget.footer.VersionState; @@ -108,6 +112,9 @@ public class GlobalApplicationStateImplTest { @Mock SessionStorage mockSessionStorage; + @Mock + OneSageUtils mockOneSageUtils; + @Captor ArgumentCaptor placeCaptor; @@ -136,7 +143,8 @@ public void before() { mockJsClient, mockSynapseProperties, mockSessionStorage, - mockGinInjector + mockGinInjector, + mockOneSageUtils ); when(mockGinInjector.getHeader()).thenReturn(mockHeader); globalApplicationState.setPlaceController(mockPlaceController); @@ -572,4 +580,50 @@ public void testHandleRelativePathNotAGWTPlace() { assertFalse(isHandled); verify(mockPlaceController, never()).goTo(any(Place.class)); } + + @Test + public void testGoToLoginPage() { + when(mockGWT.getHostPageBaseURL()) + .thenReturn("https://staging.synapse.org/"); + when(mockSessionStorage.getItem(LAST_PLACE)).thenReturn(null); + when(mockGWT.getCurrentURL()) + .thenReturn("https://staging.synapse.org/Synapse:syn1234"); + when(mockOneSageUtils.getOneSageURL()) + .thenReturn("https://accounts.synapse.org/"); + + globalApplicationState.gotoLoginPage(); + + // The cookie should match the current place + verify(mockCookieProvider) + .setCookie( + eq(ONESAGE_REDIRECT_COOKIE_KEY), + eq("https://staging.synapse.org/Synapse:syn1234"), + any(Date.class) + ); + + verify(mockGWT).assignThisWindowWith("https://accounts.synapse.org/"); + } + + @Test + public void testGoToLoginPageFromLoginPlace() { + when(mockGWT.getHostPageBaseURL()).thenReturn("https://synapse.org/"); + when(mockSessionStorage.getItem(LAST_PLACE)).thenReturn("Synapse:syn4321"); + when(mockGWT.getCurrentHistoryToken()).thenReturn("LoginPlace:0"); + when(mockAppPlaceHistoryMapper.getPlace("LoginPlace:0")) + .thenReturn(new LoginPlace("0")); + when(mockOneSageUtils.getOneSageURL()) + .thenReturn("https://accounts.synapse.org/"); + + globalApplicationState.gotoLoginPage(); + + // The cookie should match the last place + verify(mockCookieProvider) + .setCookie( + eq(ONESAGE_REDIRECT_COOKIE_KEY), + eq("https://synapse.org/Synapse:syn4321"), + any(Date.class) + ); + + verify(mockGWT).assignThisWindowWith("https://accounts.synapse.org/"); + } } diff --git a/src/test/java/org/sagebionetworks/web/unitclient/presenter/GWTStub.java b/src/test/java/org/sagebionetworks/web/unitclient/presenter/GWTStub.java index ccd3d71e9a..e0cb2f9b17 100644 --- a/src/test/java/org/sagebionetworks/web/unitclient/presenter/GWTStub.java +++ b/src/test/java/org/sagebionetworks/web/unitclient/presenter/GWTStub.java @@ -60,6 +60,11 @@ public String getHostPrefix() { return null; } + @Override + public String getHostName() { + return null; + } + @Override public String getCurrentURL() { return null; diff --git a/src/test/java/org/sagebionetworks/web/unitclient/presenter/PasswordResetPresenterTest.java b/src/test/java/org/sagebionetworks/web/unitclient/presenter/PasswordResetPresenterTest.java index 0efe6643ff..0c7e7bb094 100644 --- a/src/test/java/org/sagebionetworks/web/unitclient/presenter/PasswordResetPresenterTest.java +++ b/src/test/java/org/sagebionetworks/web/unitclient/presenter/PasswordResetPresenterTest.java @@ -11,6 +11,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.sagebionetworks.web.client.ClientProperties; +import org.sagebionetworks.web.client.OneSageUtils; import org.sagebionetworks.web.client.place.users.PasswordReset; import org.sagebionetworks.web.client.presenter.users.PasswordResetPresenter; @@ -22,9 +23,12 @@ public class PasswordResetPresenterTest { @Mock PasswordReset place; + @Mock + OneSageUtils oneSageUtils; + @Before public void setup() { - presenter = new PasswordResetPresenter(); + presenter = new PasswordResetPresenter(oneSageUtils); when(place.toToken()).thenReturn(ClientProperties.DEFAULT_PLACE_TOKEN); } diff --git a/src/test/java/org/sagebionetworks/web/unitclient/presenter/ProfilePresenterTest.java b/src/test/java/org/sagebionetworks/web/unitclient/presenter/ProfilePresenterTest.java index 8ea3e92ff7..7d5d8e3503 100644 --- a/src/test/java/org/sagebionetworks/web/unitclient/presenter/ProfilePresenterTest.java +++ b/src/test/java/org/sagebionetworks/web/unitclient/presenter/ProfilePresenterTest.java @@ -154,6 +154,9 @@ public class ProfilePresenterTest { @Mock ProjectHeaderList mockProjectHeaderList; + @Mock + OneSageUtils mockOneSageUtils; + List myTeams; List teamIds; public static final String NEXT_PAGE_TOKEN = "19282"; @@ -171,7 +174,8 @@ public void setup() throws JSONObjectAdapterException { mockTeamListWidget, mockTeamInviteWidget, mockInjector, - mockSynapseJavascriptClient + mockSynapseJavascriptClient, + mockOneSageUtils ); verify(mockView).setPresenter(profilePresenter); when(mockGlobalApplicationState.getPlaceChanger())