diff --git a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/config/WebflowConfig.java b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/config/WebflowConfig.java index 647e615fb8e525d9cb62e37800bd253c29347619..83a249ece138bf70d214b0b0ce46cb36a2ee46a2 100644 --- a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/config/WebflowConfig.java +++ b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/config/WebflowConfig.java @@ -45,7 +45,6 @@ import fr.gouv.vitamui.iam.common.utils.IdentityProviderHelper; import fr.gouv.vitamui.iam.external.client.CasExternalRestClient; import org.apereo.cas.CentralAuthenticationService; import org.apereo.cas.audit.AuditableExecution; -import org.apereo.cas.authentication.AuthenticationEventExecutionPlan; import org.apereo.cas.authentication.AuthenticationServiceSelectionPlan; import org.apereo.cas.authentication.AuthenticationSystemSupport; import org.apereo.cas.authentication.adaptive.AdaptiveAuthenticationPolicy; @@ -54,7 +53,6 @@ import org.apereo.cas.pm.PasswordManagementService; import org.apereo.cas.services.ServicesManager; import org.apereo.cas.ticket.TicketFactory; import org.apereo.cas.ticket.registry.TicketRegistry; -import org.apereo.cas.ticket.registry.TicketRegistrySupport; import org.apereo.cas.util.CollectionUtils; import org.apereo.cas.util.io.CommunicationsManager; import org.apereo.cas.web.DelegatedClientWebflowManager; @@ -178,18 +176,10 @@ public class WebflowConfig { @Qualifier("centralAuthenticationService") private ObjectProvider<CentralAuthenticationService> centralAuthenticationService; - @Autowired - @Qualifier("authenticationEventExecutionPlan") - private ObjectProvider<AuthenticationEventExecutionPlan> authenticationEventExecutionPlan; - @Autowired @Qualifier("singleSignOnParticipationStrategy") private ObjectProvider<SingleSignOnParticipationStrategy> webflowSingleSignOnParticipationStrategy; - @Autowired - @Qualifier("defaultTicketRegistrySupport") - private ObjectProvider<TicketRegistrySupport> ticketRegistrySupport; - @Autowired @Qualifier("delegatedClientDistributedSessionStore") private ObjectProvider<SessionStore> delegatedClientDistributedSessionStore; @@ -198,14 +188,14 @@ public class WebflowConfig { private String vitamuiPortalUrl; @Value("${cas.authn.surrogate.separator}") - private String surrogationSeperator; + private String surrogationSeparator; @Autowired private Utils utils; @Bean public DispatcherAction dispatcherAction() { - return new DispatcherAction(providersService, identityProviderHelper, casRestClient, surrogationSeperator, utils); + return new DispatcherAction(providersService, identityProviderHelper, casRestClient, surrogationSeparator, utils); } @Bean @@ -215,22 +205,6 @@ public class WebflowConfig { ticketRegistry, ticketFactory); } - @RefreshScope - @Bean - public Action initialFlowSetupAction() { - return new CustomInitialFlowSetupAction(CollectionUtils.wrap(argumentExtractor.getObject()), - servicesManager.getObject(), - authenticationRequestServiceSelectionStrategies.getObject(), - ticketGrantingTicketCookieGenerator.getObject(), - warnCookieGenerator.getObject(), - casProperties, - authenticationEventExecutionPlan.getObject(), - webflowSingleSignOnParticipationStrategy.getObject(), - ticketRegistrySupport.getObject(), - vitamuiPortalUrl, - surrogationSeperator); - } - @Bean public SelectRedirectAction selectRedirectAction() { return new SelectRedirectAction(); @@ -255,7 +229,7 @@ public class WebflowConfig { @Bean @Lazy public Action delegatedAuthenticationAction() { - return new AutomaticDelegatedClientAuthenticationAction( + return new CustomDelegatedClientAuthenticationAction( initialAuthenticationAttemptWebflowEventResolver.getObject(), serviceTicketRequestWebflowEventResolver.getObject(), adaptiveAuthenticationPolicy.getObject(), @@ -269,7 +243,13 @@ public class WebflowConfig { centralAuthenticationService.getObject(), webflowSingleSignOnParticipationStrategy.getObject(), delegatedClientDistributedSessionStore.getObject(), - CollectionUtils.wrap(argumentExtractor.getObject())); + CollectionUtils.wrap(argumentExtractor.getObject()), + identityProviderHelper, + providersService, + utils, + ticketRegistry, + vitamuiPortalUrl, + surrogationSeparator); } @RefreshScope diff --git a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/AutomaticDelegatedClientAuthenticationAction.java b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/CustomDelegatedClientAuthenticationAction.java similarity index 60% rename from cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/AutomaticDelegatedClientAuthenticationAction.java rename to cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/CustomDelegatedClientAuthenticationAction.java index c9d4497e217a96e44ba552b782ad3fd76a9095bd..da43deda6df053773e0ddfb17d27837e66a9b9a7 100644 --- a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/AutomaticDelegatedClientAuthenticationAction.java +++ b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/CustomDelegatedClientAuthenticationAction.java @@ -38,6 +38,7 @@ package fr.gouv.vitamui.cas.webflow.actions; import fr.gouv.vitamui.cas.provider.SamlIdentityProviderDto; import fr.gouv.vitamui.cas.provider.ProvidersService; +import fr.gouv.vitamui.cas.util.Constants; import fr.gouv.vitamui.cas.util.Utils; import fr.gouv.vitamui.commons.api.CommonConstants; import fr.gouv.vitamui.commons.api.logger.VitamUILogger; @@ -50,6 +51,7 @@ import org.apereo.cas.audit.AuditableExecution; import org.apereo.cas.authentication.AuthenticationServiceSelectionPlan; import org.apereo.cas.authentication.AuthenticationSystemSupport; import org.apereo.cas.authentication.adaptive.AdaptiveAuthenticationPolicy; +import org.apereo.cas.authentication.credential.UsernamePasswordCredential; import org.apereo.cas.configuration.CasConfigurationProperties; import org.apereo.cas.services.ServicesManager; import org.apereo.cas.ticket.TicketGrantingTicket; @@ -65,7 +67,7 @@ import org.pac4j.core.client.Clients; import org.pac4j.core.context.JEEContext; import org.pac4j.core.context.session.SessionStore; import org.pac4j.saml.client.SAML2Client; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.webflow.core.collection.MutableAttributeMap; import org.springframework.webflow.execution.Event; import org.springframework.webflow.execution.RequestContext; @@ -77,46 +79,61 @@ import java.util.List; import java.util.Optional; /** - * Regular authentication delegation + automatic delegation given the provided IdP. + * Custom authentication delegation: + * - automatic delegation given the provided IdP + * - extraction of the username/surrogate passed as a request parameter. * * */ -public class AutomaticDelegatedClientAuthenticationAction extends DelegatedClientAuthenticationAction { - - private static final VitamUILogger LOGGER = VitamUILoggerFactory.getInstance(AutomaticDelegatedClientAuthenticationAction.class); - - @Autowired - private IdentityProviderHelper identityProviderHelper; - - @Autowired - private ProvidersService providersService; - - @Autowired - private CasConfigurationProperties casProperties; - - @Autowired - private Utils utils; - - @Autowired - private TicketRegistry ticketRegistry; - - public AutomaticDelegatedClientAuthenticationAction(final CasDelegatingWebflowEventResolver initialAuthenticationAttemptWebflowEventResolver, - final CasWebflowEventResolver serviceTicketRequestWebflowEventResolver, - final AdaptiveAuthenticationPolicy adaptiveAuthenticationPolicy, - final Clients clients, - final ServicesManager servicesManager, - final AuditableExecution delegatedAuthenticationPolicyEnforcer, - final DelegatedClientWebflowManager delegatedClientWebflowManager, - final AuthenticationSystemSupport authenticationSystemSupport, - final CasConfigurationProperties casProperties, - final AuthenticationServiceSelectionPlan authenticationRequestServiceSelectionStrategies, - final CentralAuthenticationService centralAuthenticationService, - final SingleSignOnParticipationStrategy singleSignOnParticipationStrategy, - final SessionStore<JEEContext> sessionStore, final List<ArgumentExtractor> argumentExtractors) { +public class CustomDelegatedClientAuthenticationAction extends DelegatedClientAuthenticationAction { + + private static final VitamUILogger LOGGER = VitamUILoggerFactory.getInstance(CustomDelegatedClientAuthenticationAction.class); + + private final IdentityProviderHelper identityProviderHelper; + + private final ProvidersService providersService; + + private final CasConfigurationProperties casProperties; + + private final Utils utils; + + private final TicketRegistry ticketRegistry; + + private final String vitamuiPortalUrl; + + private final String surrogationSeparator; + + public CustomDelegatedClientAuthenticationAction(final CasDelegatingWebflowEventResolver initialAuthenticationAttemptWebflowEventResolver, + final CasWebflowEventResolver serviceTicketRequestWebflowEventResolver, + final AdaptiveAuthenticationPolicy adaptiveAuthenticationPolicy, + final Clients clients, + final ServicesManager servicesManager, + final AuditableExecution delegatedAuthenticationPolicyEnforcer, + final DelegatedClientWebflowManager delegatedClientWebflowManager, + final AuthenticationSystemSupport authenticationSystemSupport, + final CasConfigurationProperties casProperties, + final AuthenticationServiceSelectionPlan authenticationRequestServiceSelectionStrategies, + final CentralAuthenticationService centralAuthenticationService, + final SingleSignOnParticipationStrategy singleSignOnParticipationStrategy, + final SessionStore<JEEContext> sessionStore, + final List<ArgumentExtractor> argumentExtractors, + final IdentityProviderHelper identityProviderHelper, + final ProvidersService providersService, + final Utils utils, + final TicketRegistry ticketRegistry, + final String vitamuiPortalUrl, + final String surrogationSeparator) { super(initialAuthenticationAttemptWebflowEventResolver, serviceTicketRequestWebflowEventResolver, adaptiveAuthenticationPolicy, clients, servicesManager, delegatedAuthenticationPolicyEnforcer, delegatedClientWebflowManager, authenticationSystemSupport, casProperties, authenticationRequestServiceSelectionStrategies, centralAuthenticationService, singleSignOnParticipationStrategy, sessionStore, argumentExtractors); + this.identityProviderHelper = identityProviderHelper; + this.casProperties = casProperties; + this.providersService = providersService; + this.utils = utils; + this.ticketRegistry = ticketRegistry; + this.vitamuiPortalUrl = vitamuiPortalUrl; + this.surrogationSeparator = surrogationSeparator; } @Override @@ -125,6 +142,28 @@ public class AutomaticDelegatedClientAuthenticationAction extends DelegatedClien final Event event = super.doExecute(context); if ("error".equals(event.getId())) { + final MutableAttributeMap<Object> flowScope = context.getFlowScope(); + flowScope.put(Constants.PORTAL_URL, vitamuiPortalUrl); + + String username = context.getRequestParameters().get(Constants.USERNAME); + if (username != null) { + + username = username.toLowerCase(); + LOGGER.debug("Provided username: {}", username); + if (username.startsWith(surrogationSeparator)) { + username = org.apache.commons.lang.StringUtils.substringAfter(username, surrogationSeparator); + } + + WebUtils.putCredential(context, new UsernamePasswordCredential(username, null)); + + if (username.contains(surrogationSeparator)) { + final String[] parts = username.split("\\" + surrogationSeparator); + flowScope.put(Constants.SURROGATE, parts[0]); + flowScope.put(Constants.SUPER_USER, parts[1]); + } + } + + TicketGrantingTicket tgt = null; final String tgtId = WebUtils.getTicketGrantingTicketId(context); if (tgtId != null) { diff --git a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/CustomInitialFlowSetupAction.java b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/CustomInitialFlowSetupAction.java deleted file mode 100644 index cb481940860c6856b81dd29d4e2f136fe7370781..0000000000000000000000000000000000000000 --- a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/CustomInitialFlowSetupAction.java +++ /dev/null @@ -1,148 +0,0 @@ -/** - * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) - * and the signatories of the "VITAM - Accord du Contributeur" agreement. - * - * contact@programmevitam.fr - * - * This software is a computer program whose purpose is to implement - * implement a digital archiving front-office system for the secure and - * efficient high volumetry VITAM solution. - * - * This software is governed by the CeCILL-C license under French law and - * abiding by the rules of distribution of free software. You can use, - * modify and/ or redistribute the software under the terms of the CeCILL-C - * license as circulated by CEA, CNRS and INRIA at the following URL - * "http://www.cecill.info". - * - * As a counterpart to the access to the source code and rights to copy, - * modify and redistribute granted by the license, users are provided only - * with a limited warranty and the software's author, the holder of the - * economic rights, and the successive licensors have only limited - * liability. - * - * In this respect, the user's attention is drawn to the risks associated - * with loading, using, modifying and/or developing or reproducing the - * software by the user in light of its specific status of free software, - * that may mean that it is complicated to manipulate, and that also - * therefore means that it is reserved for developers and experienced - * professionals having in-depth computer knowledge. Users are therefore - * encouraged to load and test the software's suitability as regards their - * requirements in conditions enabling the security of their systems and/or - * data to be ensured and, more generally, to use and operate it in the - * same conditions as regards security. - * - * The fact that you are presently reading this means that you have had - * knowledge of the CeCILL-C license and that you accept its terms. - */ -package fr.gouv.vitamui.cas.webflow.actions; - -import fr.gouv.vitamui.cas.util.Constants; -import fr.gouv.vitamui.commons.api.logger.VitamUILogger; -import fr.gouv.vitamui.commons.api.logger.VitamUILoggerFactory; -import org.apache.commons.lang.StringUtils; -import org.apereo.cas.authentication.AuthenticationEventExecutionPlan; -import org.apereo.cas.authentication.AuthenticationServiceSelectionPlan; -import org.apereo.cas.authentication.credential.UsernamePasswordCredential; -import org.apereo.cas.configuration.CasConfigurationProperties; -import org.apereo.cas.services.ServicesManager; -import org.apereo.cas.ticket.registry.TicketRegistrySupport; -import org.apereo.cas.web.cookie.CasCookieBuilder; -import org.apereo.cas.web.flow.SingleSignOnParticipationStrategy; -import org.apereo.cas.web.flow.login.InitialFlowSetupAction; -import org.apereo.cas.web.support.ArgumentExtractor; -import org.apereo.cas.web.support.WebUtils; -import org.springframework.webflow.core.collection.MutableAttributeMap; -import org.springframework.webflow.execution.Event; -import org.springframework.webflow.execution.RequestContext; - -import javax.xml.bind.DatatypeConverter; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; - -/** - * Custom initial flow action to retrieve pre-filled inputs. - * - * - */ -public class CustomInitialFlowSetupAction extends InitialFlowSetupAction { - - private static final VitamUILogger LOGGER = VitamUILoggerFactory.getInstance(CustomInitialFlowSetupAction.class); - - private final String vitamuiPortalUrl; - - private final String surrogationSeperator; - - @Value("${theme.vitam-logo:#{null}}") - private String vitamLogoPath; - - @Value("${theme.vitamui-logo-large:#{null}}") - private String vitamuiLargeLogoPath; - - public CustomInitialFlowSetupAction(final List<ArgumentExtractor> argumentExtractors, - final ServicesManager servicesManager, - final AuthenticationServiceSelectionPlan authenticationRequestServiceSelectionStrategies, - final CasCookieBuilder ticketGrantingTicketCookieGenerator, - final CasCookieBuilder warnCookieGenerator, - final CasConfigurationProperties casProperties, - final AuthenticationEventExecutionPlan authenticationEventExecutionPlan, - final SingleSignOnParticipationStrategy renewalStrategy, - final TicketRegistrySupport ticketRegistrySupport, - final String vitamuiPortalUrl, - final String surrogationSeperator) { - super(argumentExtractors, servicesManager, authenticationRequestServiceSelectionStrategies, ticketGrantingTicketCookieGenerator, - warnCookieGenerator, casProperties, authenticationEventExecutionPlan, renewalStrategy, ticketRegistrySupport); - this.vitamuiPortalUrl = vitamuiPortalUrl; - this.surrogationSeperator = surrogationSeperator; - } - - @Override - public Event doExecute(final RequestContext context) { - - final MutableAttributeMap<Object> flowScope = context.getFlowScope(); - flowScope.put(Constants.PORTAL_URL, vitamuiPortalUrl); - - String username = context.getRequestParameters().get(Constants.USERNAME); - if (username != null) { - - username = username.toLowerCase(); - LOGGER.debug("Provided username: {}", username); - if (username.startsWith(surrogationSeperator)) { - username = StringUtils.substringAfter(username, surrogationSeperator); - } - - WebUtils.putCredential(context, new UsernamePasswordCredential(username, null)); - - if (username.contains(surrogationSeperator)) { - final String[] parts = username.split("\\" + surrogationSeperator); - flowScope.put(Constants.SURROGATE, parts[0]); - flowScope.put(Constants.SUPER_USER, parts[1]); - } - } - - if(vitamLogoPath != null) { - try { - Path logoFile = Paths.get(vitamLogoPath); - String logo = DatatypeConverter.printBase64Binary(Files.readAllBytes(logoFile)); - flowScope.put(Constants.VITAM_LOGO, logo); - } catch (IOException e) { - LOGGER.warn("Can't find vitam logo"); - e.printStackTrace(); - } - } - if(vitamuiLargeLogoPath != null) { - try { - Path logoFile = Paths.get(vitamuiLargeLogoPath); - String logo = DatatypeConverter.printBase64Binary(Files.readAllBytes(logoFile)); - flowScope.put(Constants.VITAM_UI_LARGE_LOGO, logo); - } catch (IOException e) { - LOGGER.warn("Can't find vitam ui large logo"); - e.printStackTrace(); - } - } - - return super.doExecute(context); - } -} diff --git a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/DispatcherAction.java b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/DispatcherAction.java index 7ff4bacf6f885b7cd137cfe143e8cea234b0b830..d8b343205251755f0331dedca68a07f0a91879b6 100644 --- a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/DispatcherAction.java +++ b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/DispatcherAction.java @@ -82,19 +82,19 @@ public class DispatcherAction extends AbstractAction { private final CasExternalRestClient casExternalRestClient; - private final String surrogationSeperator; + private final String surrogationSeparator; private final Utils utils; public DispatcherAction(final ProvidersService providersService, final IdentityProviderHelper identityProviderHelper, final CasExternalRestClient casExternalRestClient, - final String surrogationSeperator, + final String surrogationSeparator, final Utils utils) { this.providersService = providersService; this.identityProviderHelper = identityProviderHelper; this.casExternalRestClient = casExternalRestClient; - this.surrogationSeperator = surrogationSeperator; + this.surrogationSeparator = surrogationSeparator; this.utils = utils; } @@ -105,12 +105,12 @@ public class DispatcherAction extends AbstractAction { final String username = credential.getUsername().toLowerCase(); String dispatchedUser = username; String surrogate = null; - if (username.contains(surrogationSeperator)) { - dispatchedUser = StringUtils.substringAfter(username, surrogationSeperator); - if (username.startsWith(surrogationSeperator)) { + if (username.contains(surrogationSeparator)) { + dispatchedUser = StringUtils.substringAfter(username, surrogationSeparator); + if (username.startsWith(surrogationSeparator)) { WebUtils.putCredential(requestContext, new UsernamePasswordCredential(dispatchedUser, null)); } else { - surrogate = StringUtils.substringBefore(username, surrogationSeperator); + surrogate = StringUtils.substringBefore(username, surrogationSeparator); } } LOGGER.debug("Dispatching user: {} / surrogate: {}", dispatchedUser, surrogate); diff --git a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/BaseWebflowActionTest.java b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/BaseWebflowActionTest.java index e90535594bbd682368e0ddab73ab6e0b03832746..109049e4e970bdb934fb8b7fb5e325cbfbbf8cd2 100644 --- a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/BaseWebflowActionTest.java +++ b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/BaseWebflowActionTest.java @@ -9,6 +9,8 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.webflow.context.servlet.ServletExternalContext; import org.springframework.webflow.core.collection.LocalAttributeMap; import org.springframework.webflow.core.collection.MutableAttributeMap; +import org.springframework.webflow.engine.Flow; +import org.springframework.webflow.engine.FlowVariable; import org.springframework.webflow.execution.FlowExecutionContext; import org.springframework.webflow.execution.FlowSession; import org.springframework.webflow.execution.RequestContext; @@ -21,6 +23,8 @@ import javax.servlet.http.HttpSession; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import lombok.val; + /** * A base webflow action test. * @@ -52,6 +56,11 @@ public abstract class BaseWebflowActionTest { flowParameters = new LocalAttributeMap<>(); when(context.getFlowScope()).thenReturn(flowParameters); + + val flow = mock(Flow.class); + when(flow.getVariable("credential")).thenReturn(mock(FlowVariable.class)); + + when(context.getActiveFlow()).thenReturn(flow); when(context.getRequestScope()).thenReturn(flowParameters); when(context.getConversationScope()).thenReturn(flowParameters); diff --git a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/CustomInitialFlowSetupActionTest.java b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/CustomDelegatedClientAuthenticationActionTest.java similarity index 59% rename from cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/CustomInitialFlowSetupActionTest.java rename to cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/CustomDelegatedClientAuthenticationActionTest.java index 174314ad6be8c676651bbb12e3fa4ffec00e3209..e79ad5342231e9ce05c148282e168681680df8db 100644 --- a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/CustomInitialFlowSetupActionTest.java +++ b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/CustomDelegatedClientAuthenticationActionTest.java @@ -5,17 +5,27 @@ import static org.mockito.Mockito.mock; import java.util.ArrayList; -import org.apereo.cas.authentication.AuthenticationEventExecutionPlan; +import fr.gouv.vitamui.cas.provider.ProvidersService; +import fr.gouv.vitamui.cas.util.Utils; +import fr.gouv.vitamui.iam.common.utils.IdentityProviderHelper; +import org.apereo.cas.CentralAuthenticationService; +import org.apereo.cas.audit.AuditableExecution; import org.apereo.cas.authentication.AuthenticationServiceSelectionPlan; +import org.apereo.cas.authentication.AuthenticationSystemSupport; +import org.apereo.cas.authentication.adaptive.AdaptiveAuthenticationPolicy; import org.apereo.cas.authentication.credential.UsernamePasswordCredential; import org.apereo.cas.configuration.CasConfigurationProperties; import org.apereo.cas.services.ServicesManager; -import org.apereo.cas.ticket.registry.TicketRegistrySupport; -import org.apereo.cas.web.cookie.CasCookieBuilder; +import org.apereo.cas.ticket.registry.TicketRegistry; +import org.apereo.cas.web.DelegatedClientWebflowManager; import org.apereo.cas.web.flow.SingleSignOnParticipationStrategy; +import org.apereo.cas.web.flow.resolver.CasDelegatingWebflowEventResolver; +import org.apereo.cas.web.flow.resolver.CasWebflowEventResolver; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.pac4j.core.client.Clients; +import org.pac4j.core.context.session.SessionStore; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; @@ -23,31 +33,36 @@ import org.springframework.test.context.junit4.SpringRunner; import fr.gouv.vitamui.commons.api.identity.ServerIdentityAutoConfiguration; /** - * Tests {@link CustomInitialFlowSetupAction}. + * Tests {@link CustomDelegatedClientAuthenticationAction}. * * */ @RunWith(SpringRunner.class) @ContextConfiguration(classes = ServerIdentityAutoConfiguration.class) @TestPropertySource(locations = "classpath:/application-test.properties") -public final class CustomInitialFlowSetupActionTest extends BaseWebflowActionTest { +public final class CustomDelegatedClientAuthenticationActionTest extends BaseWebflowActionTest { private static final String EMAIL1 = "julien@vitamui.com"; private static final String EMAIL2 = "pierre@vitamui.com"; - private CustomInitialFlowSetupAction action; + private CustomDelegatedClientAuthenticationAction action; @Override @Before public void setUp() { super.setUp(); - action = new CustomInitialFlowSetupAction(new ArrayList<>(), mock(ServicesManager.class), - mock(AuthenticationServiceSelectionPlan.class), mock(CasCookieBuilder.class), - mock(CasCookieBuilder.class), new CasConfigurationProperties(), mock(AuthenticationEventExecutionPlan.class), - mock(SingleSignOnParticipationStrategy.class), mock(TicketRegistrySupport.class), "", ","); + action = new CustomDelegatedClientAuthenticationAction(mock(CasDelegatingWebflowEventResolver.class), + mock(CasWebflowEventResolver.class), mock(AdaptiveAuthenticationPolicy.class), + mock(Clients.class), mock(ServicesManager.class), mock(AuditableExecution.class), + mock(DelegatedClientWebflowManager.class), mock(AuthenticationSystemSupport.class), + mock(CasConfigurationProperties.class), mock(AuthenticationServiceSelectionPlan.class), + mock(CentralAuthenticationService.class), mock(SingleSignOnParticipationStrategy.class), + mock(SessionStore.class), new ArrayList<>(), mock(IdentityProviderHelper.class), + mock(ProvidersService.class), mock(Utils.class), mock(TicketRegistry.class), "", ","); } + @Test public void testUsernameNoSubrogation() { requestParameters.put("username", EMAIL1);