Skip to content

Commit bcde7b2

Browse files
committed
Add SSO Error Context and update Login Context
1 parent 466591a commit bcde7b2

4 files changed

Lines changed: 74 additions & 47 deletions

File tree

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

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
import org.springframework.webflow.execution.RequestContext;
1818

1919
import java.io.Serializable;
20-
import java.net.URLEncoder;
21-
import java.nio.charset.StandardCharsets;
2220
import java.util.Optional;
2321
import java.util.Set;
2422

@@ -55,8 +53,6 @@ protected Event doExecute(RequestContext context) {
5553
final boolean unsupportedInstitutionLogin = isUnsupportedInstitutionLogin(context);
5654
final boolean orcidRedirect = isOrcidLoginAutoRedirect(context);
5755
final String orcidLoginUrl = getOrcidLoginUrlFromFlowScope(context);
58-
59-
final String encodedServiceUrl = getEncodedServiceUrlFromRequestContext(context);
6056
final boolean defaultService = isFromFlowlessErrorPage(context);
6157
final OsfUrlProperties osfUrl = Optional.of(context).map(
6258
requestContext -> (OsfUrlProperties) requestContext.getFlowScope().get(OsfCasWebflowConstants.FLOW_PARAMETER_OSF_URL)
@@ -72,7 +68,6 @@ protected Event doExecute(RequestContext context) {
7268
-> (OsfCasLoginContext) requestContext.getFlowScope().get(PARAMETER_LOGIN_CONTEXT)).orElse(null);
7369
if (loginContext == null) {
7470
loginContext = new OsfCasLoginContext(
75-
encodedServiceUrl,
7671
institutionLogin,
7772
institutionId,
7873
StringUtils.EMPTY,
@@ -83,7 +78,6 @@ protected Event doExecute(RequestContext context) {
8378
defaultServiceUrl
8479
);
8580
} else {
86-
loginContext.setEncodedServiceUrl(encodedServiceUrl);
8781
loginContext.setInstitutionLogin(institutionLogin);
8882
loginContext.setInstitutionId(institutionId);
8983
loginContext.setInstitutionSupportEmail(StringUtils.EMPTY);
@@ -150,14 +144,6 @@ private String getOrcidLoginUrlFromFlowScope(final RequestContext context) {
150144
return null;
151145
}
152146

153-
private String getEncodedServiceUrlFromRequestContext(final RequestContext context) throws AssertionError {
154-
final String serviceUrl = context.getRequestParameters().get(PARAMETER_SERVICE);
155-
if (StringUtils.isBlank(serviceUrl)) {
156-
return null;
157-
}
158-
return URLEncoder.encode(serviceUrl, StandardCharsets.UTF_8);
159-
}
160-
161147
private boolean isFromFlowlessErrorPage(final RequestContext context) {
162148
final String errorCode = context.getRequestParameters().get(PARAMETER_REDIRECT_SOURCE);
163149
return !StringUtils.isBlank(errorCode) && EXPECTED_REDIRECT_CODES.contains(errorCode);

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.cos.cas.osf.configuration.model.OsfApiProperties;
1919
import io.cos.cas.osf.configuration.model.OsfUrlProperties;
2020
import io.cos.cas.osf.web.support.OsfApiInstitutionAuthenticationResult;
21+
import io.cos.cas.osf.web.support.OsfCasSsoErrorContext;
2122

2223
import com.nimbusds.jose.crypto.DirectEncrypter;
2324
import com.nimbusds.jose.crypto.MACSigner;
@@ -141,6 +142,8 @@
141142
@Getter
142143
public class OsfPrincipalFromNonInteractiveCredentialsAction extends AbstractNonInteractiveCredentialsAction {
143144

145+
private static final String PARAMETER_SSO_ERROR_CONTEXT = "osfSsoErrorContext";
146+
144147
private static final String USERNAME_PARAMETER_NAME = "username";
145148

146149
private static final String VERIFICATION_KEY_PARAMETER_NAME = "verification_key";
@@ -810,4 +813,35 @@ private String retrieveDepartment(final String departmentRaw, final boolean eduP
810813
}
811814
return "";
812815
}
816+
817+
/**
818+
* Prepare {@link OsfCasSsoErrorContext} and put it in flow.
819+
*
820+
* @param context the request context
821+
* @param handleErrorName the error name
822+
* @param errorMessage the error message
823+
* @param ssoEmail user's SSO email
824+
* @param ssoIdentity user's SSO identity
825+
* @param institutionId institution ID
826+
* @param institutionSupportEmail institution support email
827+
*/
828+
private void setSsoErrorContext(
829+
final RequestContext context,
830+
final String handleErrorName,
831+
final String errorMessage,
832+
final String ssoEmail,
833+
final String ssoIdentity,
834+
final String institutionId,
835+
final String institutionSupportEmail
836+
) {
837+
OsfCasSsoErrorContext ssoErrorContext = new OsfCasSsoErrorContext(
838+
handleErrorName,
839+
errorMessage,
840+
ssoEmail,
841+
ssoIdentity,
842+
institutionId,
843+
institutionSupportEmail
844+
);
845+
context.getFlowScope().put(PARAMETER_SSO_ERROR_CONTEXT, ssoErrorContext);
846+
}
813847
}

src/main/java/io/cos/cas/osf/web/support/OsfCasLoginContext.java

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,6 @@ public class OsfCasLoginContext implements Serializable {
2626

2727
private static final long serialVersionUID = 7523144720609509742L;
2828

29-
/**
30-
* The encoded service URL provided by the "service=" query param in the request URL.
31-
*
32-
* This attribute is deprecated and should be removed since 1) ThymeLeaf handles URL building elegantly in the template and 2) both of
33-
* the flow parameters "service.originalUrl" and "originalUrl" stores the current service information.
34-
*/
35-
private String encodedServiceUrl;
36-
37-
private String handleErrorName;
38-
3929
private boolean institutionLogin;
4030

4131
private String institutionId;
@@ -56,27 +46,4 @@ public class OsfCasLoginContext implements Serializable {
5646
* e.g. http(s)://[OSF Domain]/login?next=[encoded version of http(s)://[OSF Domain]/]
5747
*/
5848
private String defaultServiceUrl;
59-
60-
public OsfCasLoginContext (
61-
final String encodedServiceUrl,
62-
final boolean institutionLogin,
63-
final String institutionId,
64-
final String institutionSupportEmail,
65-
final boolean unsupportedInstitutionLogin,
66-
final boolean orcidRedirect,
67-
final String orcidLoginUrl,
68-
final boolean defaultService,
69-
final String defaultServiceUrl
70-
) {
71-
this.encodedServiceUrl = encodedServiceUrl;
72-
this.handleErrorName = null;
73-
this.institutionLogin = institutionLogin;
74-
this.institutionId = institutionId;
75-
this.institutionSupportEmail = institutionSupportEmail;
76-
this.unsupportedInstitutionLogin = unsupportedInstitutionLogin;
77-
this.orcidRedirect = orcidRedirect;
78-
this.orcidLoginUrl = orcidLoginUrl;
79-
this.defaultService = defaultService;
80-
this.defaultServiceUrl = defaultServiceUrl;
81-
}
8249
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.cos.cas.osf.web.support;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import lombok.Setter;
7+
import lombok.ToString;
8+
9+
import java.io.Serializable;
10+
11+
/**
12+
* This is {@link OsfCasSsoErrorContext}.
13+
*
14+
* Stores detailed error information, which can be prepared and put into flow before raising an exception. Extends {@link Serializable}
15+
* so that it can be put into and retrieved from the flow context conveniently.
16+
*
17+
* @author Longze Chen
18+
* @since 23.2.0
19+
*/
20+
@AllArgsConstructor
21+
@Getter
22+
@NoArgsConstructor
23+
@ToString
24+
@Setter
25+
public class OsfCasSsoErrorContext implements Serializable {
26+
27+
private static final long serialVersionUID = -1366351087792035267L;
28+
29+
private String handleErrorName;
30+
31+
private String errorMessage;
32+
33+
private String ssoEmail;
34+
35+
private String ssoIdentity;
36+
37+
private String institutionId;
38+
39+
private String institutionSupportEmail;
40+
}

0 commit comments

Comments
 (0)