Skip to content

Commit

Permalink
Merge pull request #5539 from jay-hodgson/SWC-6533
Browse files Browse the repository at this point in the history
  • Loading branch information
jay-hodgson authored Oct 16, 2024
2 parents cc7925b + e8548af commit b2ed00d
Show file tree
Hide file tree
Showing 11 changed files with 75 additions and 270 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,5 @@ public interface GWTWrapper {
boolean isValidJSONArray(String json);

JSONValue parseJSONStrict(String json);
String getOneSageURL();
}
32 changes: 32 additions & 0 deletions src/main/java/org/sagebionetworks/web/client/GWTWrapperImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import com.google.gwt.user.datepicker.client.CalendarUtil;
import com.google.gwt.xhr.client.XMLHttpRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.sagebionetworks.web.client.utils.Callback;

public class GWTWrapperImpl implements GWTWrapper {
Expand Down Expand Up @@ -241,6 +243,36 @@ public String getFriendlySize(double size, boolean abbreviatedUnits) {
return DisplayUtils.getFriendlySize(size, abbreviatedUnits);
}

private static Map<String, String> hostName2OneSageSite = new HashMap<>();

static {
hostName2OneSageSite.put(
"staging.synapse.org",
"https://staging.accounts.synapse.org/?appId=staging.synapse.org"
);
hostName2OneSageSite.put(
"portal-dev.dev.sagebase.org",
"https://accounts-dev.dev.sagebase.org/?appId=dev.synapse.org"
);
hostName2OneSageSite.put(
"localhost",
"http://localhost:3000/?appId=localhost"
);
hostName2OneSageSite.put(
"127.0.0.1",
"http://127.0.0.1:3000/?appId=localhost"
);
}

@Override
public String getOneSageURL() {
String hostName = Window.Location.getHostName().toLowerCase();
return hostName2OneSageSite.getOrDefault(
hostName,
"https://accounts.synapse.org/?appId=synapse.org"
);
}

@Override
public DateTimeFormat getFormat(String formatPattern) {
return DateTimeFormat.getFormat(formatPattern);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,4 +132,5 @@ public void setAppPlaceHistoryMapper(
boolean isShowingVersionAlert();

boolean handleRelativePathClick(String href);
void gotoLoginPage();
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.sagebionetworks.web.client;

import static org.sagebionetworks.web.client.ServiceEntryPointUtils.fixServiceEntryPoint;
import static org.sagebionetworks.web.client.cookie.CookieKeys.ONESAGE_REDIRECT_COOKIE_KEY;
import static org.sagebionetworks.web.client.cookie.CookieKeys.SHOW_DATETIME_IN_UTC;
import static org.sagebionetworks.web.shared.WebConstants.REPO_SERVICE_URL_KEY;

Expand Down Expand Up @@ -31,7 +32,6 @@
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;
Expand Down Expand Up @@ -583,7 +583,7 @@ public void onPreviewNativeEvent(NativePreviewEvent event) {
}
try {
if (isSRCSignInClass) {
getPlaceChanger().goTo(new LoginPlace(LoginPlace.LOGIN_TOKEN));
gotoLoginPage();
} else {
if (targetElement.hasAttribute("href")) {
String href = targetElement.getAttribute("href");
Expand Down Expand Up @@ -612,6 +612,21 @@ public void onPreviewNativeEvent(NativePreviewEvent event) {
}
}

@Override
public void gotoLoginPage() {
//tell One Sage to return to the current url
Date twoHoursFromNow = new Date();
twoHoursFromNow.setTime(twoHoursFromNow.getTime() + (2 * 60 * 60 * 1000));

cookieProvider.setCookie(
ONESAGE_REDIRECT_COOKIE_KEY,
gwt.getCurrentURL(),
twoHoursFromNow
);
//go to One Sage to log in
gwt.assignThisWindowWith(gwt.getOneSageURL());
}

@Override
public boolean handleRelativePathClick(String href) {
String placeToken = StringUtils.getGWTPlaceTokenFromURL(href);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,7 @@ public class CookieKeys {

public static String PORTAL_CONFIG =
"org.sagebionetworks.security.cookies.portal.config";

public static String ONESAGE_REDIRECT_COOKIE_KEY =
"org.sagebionetworks.cookies.redirect-after-login";
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.sagebionetworks.web.client.jsinterop;

import com.google.gwt.user.client.Window;
import jsinterop.annotations.JsNullable;
import jsinterop.annotations.JsOverlay;
import jsinterop.annotations.JsPackage;
Expand All @@ -24,11 +25,15 @@ public static SynapseContextJsObject create(
boolean utcTime
) {
SynapseContextJsObject context = new SynapseContextJsObject();
// SWC-6533: Sending all to One Sage for login, and we do not want to stack hop for Prod and Staging
boolean isStaging = Window.Location
.getHostName()
.equalsIgnoreCase("staging.synapse.org");
context.accessToken = accessToken;
context.isInExperimentalMode = isInExperimentalMode;
context.utcTime = utcTime;
context.downloadCartPageUrl = "/DownloadCart:0";
context.appId = "synapse.org";
context.appId = isStaging ? "staging.synapse.org" : "synapse.org";
context.withErrorBoundary = true;
return context;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,79 +46,22 @@ public class LoginPresenter
private AuthenticationController authenticationController;
private GlobalApplicationState globalApplicationState;
private SynapseAlert synAlert;
private PopupUtilsView popupUtils;

@Inject
public LoginPresenter(
LoginView view,
AuthenticationController authenticationController,
GlobalApplicationState globalApplicationState,
SynapseAlert synAlert,
PopupUtilsView popupUtils
SynapseAlert synAlert
) {
this.view = view;
this.authenticationController = authenticationController;
this.globalApplicationState = globalApplicationState;
this.synAlert = synAlert;
this.popupUtils = popupUtils;
view.setSynAlert(synAlert);
view.setPresenter(this);
}

@Override
public void onAcceptTermsOfUse() {
synAlert.clear();
view.showLoggingInLoader();
authenticationController.signTermsOfUse(
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
synAlert.handleException(caught);
view.showLogin();
}

@Override
public void onSuccess(Void result) {
// Have to get the UserSessionData again,
// since it won't contain the UserProfile if the terms haven't been signed
// We also need to force-reset the QueryClient so the React components know to refetch
boolean forceResetQueryClient = true;
synAlert.clear();
authenticationController.initializeFromExistingAccessTokenCookie(
new AsyncCallback<UserProfile>() {
@Override
public void onFailure(Throwable caught) {
synAlert.handleException(caught);
view.showLogin();
}

@Override
public void onSuccess(UserProfile result) {
// Signed ToU. Check for temp username, passing record, and then forward
userAuthenticated();
}
},
forceResetQueryClient
);
}
}
);
}

@Override
public void onCancelAcceptTermsOfUse() {
// confirm
popupUtils.showConfirmDialog(
ARE_YOU_SURE_YOU_WANT_TO_CANCEL,
CANCEL_TERMS_OF_USE_CONFIRM_MESSAGE,
() -> {
globalApplicationState
.getPlaceChanger()
.goTo(new LoginPlace(LoginPlace.LOGOUT_TOKEN));
}
);
}

@Override
public void start(AcceptsOneWidget panel, EventBus eventBus) {
panel.setWidget(this.view.asWidget());
Expand Down Expand Up @@ -154,24 +97,14 @@ public void showView(final LoginPlace place) {
.getPlaceChanger()
.goTo(new LoginPlace(DEFAULT_PLACE_TOKEN));
view.showErrorMessage(SSO_ERROR_UNKNOWN);
view.showLogin();
globalApplicationState.gotoLoginPage();
} else if (
CHANGE_USERNAME.equals(token) && authenticationController.isLoggedIn()
) {
// go to the change username page
gotoChangeUsernamePlace();
} else if (
SHOW_TOU.equals(token) &&
authenticationController.getCurrentUserAccessToken() != null
) {
showTermsOfUse(false);
} else if (
SHOW_SIGNED_TOU.equals(token) &&
authenticationController.getCurrentUserAccessToken() != null
) {
showTermsOfUse(true);
} else if (ORCID_NOT_LINKED.equals(token)) {
view.showLogin();
globalApplicationState.gotoLoginPage();
synAlert.showError(
"The ORCiD you entered isn't linked to a Synapse account: To sign in with ORCiD, first log in with a valid Synapse account, then link it to your ORCiD account on your Account Settings Page. If you don't have a Synapse account, it is fast, free, and easy register today."
);
Expand All @@ -183,8 +116,7 @@ public void showView(final LoginPlace place) {
);
globalApplicationState.gotoLastPlace(defaultPlace);
} else {
// standard view
view.showLogin();
globalApplicationState.gotoLoginPage();
}
}
}
Expand Down Expand Up @@ -232,20 +164,14 @@ public void goToLastPlace() {
globalApplicationState.gotoLastPlace(defaultPlace);
}

public void showTermsOfUse(boolean isSigned) {
synAlert.clear();
view.hideLoggingInLoader();
view.showTermsOfUse(isSigned);
}

public void userAuthenticated() {
view.hideLoggingInLoader();
// the user should be logged in now.
if (authenticationController.getCurrentUserAccessToken() == null) {
view.showErrorMessage(
"An error occurred during login. Please try logging in again."
);
view.showLogin();
globalApplicationState.gotoLoginPage();
} else {
checkForTempUsername();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,17 @@
import com.google.gwt.place.shared.Place;
import com.google.gwt.user.client.ui.IsWidget;
import org.sagebionetworks.web.client.SynapseView;
import org.sagebionetworks.web.client.utils.Callback;

public interface LoginView extends IsWidget, SynapseView {
void setPresenter(Presenter loginPresenter);

void showLoggingInLoader();

void hideLoggingInLoader();

void showLogin();

void showTermsOfUse(boolean hasAccepted);

void setSynAlert(IsWidget w);

public interface Presenter {
void goTo(Place place);

void goToLastPlace();
void onAcceptTermsOfUse();
void onCancelAcceptTermsOfUse();
}
}
Loading

0 comments on commit b2ed00d

Please sign in to comment.