Skip to content

Commit 1a32137

Browse files
committed
Merge branch 'cslzchen/fix-login-actions' into feature/institution-sso
2 parents 8ea7916 + 74d4a5e commit 1a32137

1 file changed

Lines changed: 39 additions & 11 deletions

File tree

src/main/java/io/cos/cas/osf/web/flow/login/OsfDefaultLoginPreparationAction.java

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.cos.cas.osf.web.flow.login;
22

3+
import io.cos.cas.osf.configuration.model.OsfUrlProperties;
34
import io.cos.cas.osf.web.flow.support.OsfCasWebflowConstants;
45
import io.cos.cas.osf.web.support.OsfCasLoginContext;
56

@@ -49,45 +50,63 @@ public OsfDefaultLoginPreparationAction(
4950
@Override
5051
protected Event doExecute(RequestContext context) {
5152

52-
OsfCasLoginContext loginContext;
53-
final String serviceUrl = getEncodedServiceUrlFromRequestContext(context);
5453
final boolean institutionLogin = isInstitutionLogin(context);
5554
final String institutionId = getInstitutionIdFromRequestContext(context);
5655
final boolean orcidRedirect = isOrcidLoginAutoRedirect(context);
5756
final String orcidLoginUrl = getOrcidLoginUrlFromFlowScope(context);
5857

58+
final String encodedServiceUrl = getEncodedServiceUrlFromRequestContext(context);
59+
final boolean defaultService = isFromFlowlessErrorPage(context);
60+
final OsfUrlProperties osfUrl = Optional.of(context).map(
61+
requestContext -> (OsfUrlProperties) requestContext.getFlowScope().get(OsfCasWebflowConstants.FLOW_PARAMETER_OSF_URL)
62+
).orElse(null);
63+
if (osfUrl == null) {
64+
LOGGER.error("The login web flow has not been initialized correctly.");
65+
return error();
66+
}
67+
final String defaultServiceUrl = osfUrl.constructDefaultServiceUrl();
68+
69+
OsfCasLoginContext loginContext;
5970
loginContext = Optional.of(context).map(requestContext
6071
-> (OsfCasLoginContext) requestContext.getFlowScope().get(PARAMETER_LOGIN_CONTEXT)).orElse(null);
6172
if (loginContext == null) {
6273
loginContext = new OsfCasLoginContext(
63-
serviceUrl,
74+
encodedServiceUrl,
6475
institutionLogin,
6576
institutionId,
6677
orcidRedirect,
67-
orcidLoginUrl
78+
orcidLoginUrl,
79+
defaultService,
80+
defaultServiceUrl
6881
);
6982
} else {
70-
loginContext.setServiceUrl(serviceUrl);
83+
loginContext.setDefaultServiceUrl(encodedServiceUrl);
7184
loginContext.setInstitutionLogin(institutionLogin);
7285
loginContext.setInstitutionId(institutionId);
7386
loginContext.setOrcidLoginUrl(orcidLoginUrl);
7487
loginContext.setOrcidRedirect(false);
88+
loginContext.setDefaultService(defaultService);
89+
loginContext.setDefaultServiceUrl(defaultServiceUrl);
7590
}
7691
context.getFlowScope().put(PARAMETER_LOGIN_CONTEXT, loginContext);
7792

78-
if (loginContext.isInstitutionLogin()) {
93+
if (loginContext.isDefaultService()) {
94+
if (StringUtils.isNotBlank(defaultServiceUrl)) {
95+
return autoRedirectToDefaultServiceLogin();
96+
}
97+
LOGGER.error("Default service login auto-redirect failed due to URL configurations not found in context.");
98+
return error();
99+
} else if (loginContext.isInstitutionLogin()) {
79100
return switchToInstitutionLogin();
80-
}
81-
82-
if (loginContext.isOrcidRedirect()) {
101+
} else if (loginContext.isOrcidRedirect()) {
83102
if (StringUtils.isNotBlank(orcidLoginUrl)) {
84103
return autoRedirectToOrcidLogin();
85104
}
86105
LOGGER.error("ORCiD login auto-redirect failed due to delegation configurations not found in context.");
87106
return error();
107+
} else {
108+
return continueToUsernamePasswordLogin();
88109
}
89-
90-
return continueToUsernamePasswordLogin();
91110
}
92111

93112
private boolean isInstitutionLogin(final RequestContext context) {
@@ -127,6 +146,11 @@ private String getEncodedServiceUrlFromRequestContext(final RequestContext conte
127146
return URLEncoder.encode(serviceUrl, StandardCharsets.UTF_8);
128147
}
129148

149+
private boolean isFromFlowlessErrorPage(final RequestContext context) {
150+
final String errorCode = context.getRequestParameters().get(PARAMETER_ERROR_SOURCE);
151+
return !StringUtils.isBlank(errorCode) && EXPECTED_ERROR_CODES.contains(errorCode);
152+
}
153+
130154
private Event continueToUsernamePasswordLogin() {
131155
return new Event(this, OsfCasWebflowConstants.TRANSITION_ID_USERNAME_PASSWORD_LOGIN);
132156
}
@@ -138,4 +162,8 @@ private Event switchToInstitutionLogin() {
138162
private Event autoRedirectToOrcidLogin() {
139163
return new Event(this, OsfCasWebflowConstants.TRANSITION_ID_ORCID_LOGIN_AUTO_REDIRECT);
140164
}
165+
166+
private Event autoRedirectToDefaultServiceLogin() {
167+
return new Event(this, OsfCasWebflowConstants.TRANSITION_ID_DEFAULT_SERVICE_LOGIN_AUTO_REDIRECT);
168+
}
141169
}

0 commit comments

Comments
 (0)