11package io .cos .cas .osf .web .flow .login ;
22
3+ import io .cos .cas .osf .configuration .model .OsfUrlProperties ;
34import io .cos .cas .osf .web .flow .support .OsfCasWebflowConstants ;
45import 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