From 1612bd7b93bcbea00a0810a9acc85c938fdd528d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=B4me=20LELEU?= <jerome.leleu@teamdlab.com>
Date: Thu, 2 Apr 2020 09:48:19 +0200
Subject: [PATCH] change password is triggered when the user is already
 authenticated using the doChangePassword parameter

---
 .../fr/gouv/vitamui/cas/config/AppConfig.java | 17 +++++---
 .../vitamui/cas/config/WebflowConfig.java     | 18 +++++---
 .../cas/pm/ResetPasswordController.java       | 40 +----------------
 .../java/fr/gouv/vitamui/cas/util/Utils.java  | 39 +++++++++++++++++
 ...8NSendPasswordResetInstructionsAction.java | 43 +------------------
 .../actions/TriggerChangePasswordAction.java  |  9 ++--
 .../RestPasswordManagementConfiguration.java  | 14 +-----
 ...urrogateRestAuthenticationServiceTest.java |  8 ++--
 .../UserAuthenticationHandlerTest.java        | 10 ++---
 .../UserPrincipalResolverTest.java            | 20 ++++-----
 .../IamRestPasswordManagementServiceTest.java |  2 +-
 .../cas/provider/ProvidersServiceTest.java    |  2 +-
 .../webflow/actions/DispatcherActionTest.java |  2 +-
 13 files changed, 88 insertions(+), 136 deletions(-)

diff --git a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/config/AppConfig.java b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/config/AppConfig.java
index bbc58298..a4635ed6 100644
--- a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/config/AppConfig.java
+++ b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/config/AppConfig.java
@@ -78,6 +78,7 @@ import fr.gouv.vitamui.iam.common.utils.Saml2ClientBuilder;
 import fr.gouv.vitamui.iam.external.client.CasExternalRestClient;
 import fr.gouv.vitamui.iam.external.client.IamExternalRestClientFactory;
 import fr.gouv.vitamui.iam.external.client.IdentityProviderExternalRestClient;
+import org.springframework.mail.javamail.JavaMailSender;
 
 /**
  * Configure all beans to customize the CAS server.
@@ -151,6 +152,13 @@ public class AppConfig extends BaseTicketCatalogConfigurer {
     @Qualifier("accessTokenExpirationPolicy")
     private ExpirationPolicyBuilder accessTokenExpirationPolicy;
 
+    @Autowired
+    private JavaMailSender mailSender;
+
+    @Autowired
+    @Qualifier("delegatedClientDistributedSessionStore")
+    private SessionStore delegatedClientDistributedSessionStore;
+
     @Value("${token.api.cas}")
     private String tokenApiCas;
 
@@ -166,10 +174,6 @@ public class AppConfig extends BaseTicketCatalogConfigurer {
     @Value("${vitamui.cas.identity}")
     private String casIdentity;
 
-    @Autowired
-    @Qualifier("delegatedClientDistributedSessionStore")
-    private SessionStore delegatedClientDistributedSessionStore;
-
     @Bean
     public UserAuthenticationHandler userAuthenticationHandler() {
         return new UserAuthenticationHandler(servicesManager, principalFactory, casRestClient(), utils(), ipHeaderName);
@@ -233,7 +237,7 @@ public class AppConfig extends BaseTicketCatalogConfigurer {
 
     @Bean
     public Utils utils() {
-        return new Utils(casRestClient(), tokenApiCas, casTenantIdentifier, casIdentity);
+        return new Utils(casRestClient(), tokenApiCas, casTenantIdentifier, casIdentity, mailSender);
     }
 
     @Bean
@@ -246,8 +250,7 @@ public class AppConfig extends BaseTicketCatalogConfigurer {
     @RefreshScope
     public OAuth20AccessTokenFactory defaultAccessTokenFactory() {
         return new CustomOAuth20DefaultAccessTokenFactory(accessTokenExpirationPolicy,
-            accessTokenJwtBuilder,
-            servicesManager);
+            accessTokenJwtBuilder, servicesManager);
     }
 
     @Override
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 5b5607c5..36d298cf 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
@@ -53,6 +53,7 @@ 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;
@@ -184,18 +185,21 @@ public class WebflowConfig {
     @Qualifier("delegatedClientDistributedSessionStore")
     private ObjectProvider<SessionStore> delegatedClientDistributedSessionStore;
 
-    @Value("${vitamui.portal.url}")
-    private String vitamuiPortalUrl;
-
-    @Value("${cas.authn.surrogate.separator}")
-    private String surrogationSeparator;
-
     @Autowired
     private Utils utils;
 
     @Autowired
     private DelegatedClientWebflowManager delegatedClientWebflowManager;
 
+    @Autowired
+    private TicketRegistrySupport ticketRegistrySupport;
+
+    @Value("${vitamui.portal.url}")
+    private String vitamuiPortalUrl;
+
+    @Value("${cas.authn.surrogate.separator}")
+    private String surrogationSeparator;
+
     @Bean
     public DispatcherAction dispatcherAction() {
         return new DispatcherAction(providersService, identityProviderHelper, casRestClient,
@@ -216,7 +220,7 @@ public class WebflowConfig {
 
     @Bean
     public TriggerChangePasswordAction triggerChangePasswordAction() {
-        return new TriggerChangePasswordAction();
+        return new TriggerChangePasswordAction(ticketRegistrySupport, utils);
     }
 
     @Bean
diff --git a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/pm/ResetPasswordController.java b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/pm/ResetPasswordController.java
index 01cda714..ab6e3872 100644
--- a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/pm/ResetPasswordController.java
+++ b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/pm/ResetPasswordController.java
@@ -40,8 +40,6 @@ import static org.apereo.cas.web.flow.CasWebflowConfigurer.FLOW_ID_LOGIN;
 
 import java.util.Locale;
 
-import javax.mail.internet.MimeMessage;
-
 import org.apache.commons.lang3.StringUtils;
 import org.apereo.cas.configuration.CasConfigurationProperties;
 import org.apereo.cas.pm.PasswordManagementService;
@@ -51,8 +49,6 @@ import org.apereo.cas.util.io.CommunicationsManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.HierarchicalMessageSource;
-import org.springframework.mail.javamail.JavaMailSender;
-import org.springframework.mail.javamail.MimeMessageHelper;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -95,9 +91,6 @@ public class ResetPasswordController {
     @Autowired
     private Utils utils;
 
-    @Autowired
-    private JavaMailSender mailSender;
-
     @GetMapping("/resetPassword")
     public boolean resetPassword(@RequestParam(value = "username", defaultValue = "") final String username,
             @RequestParam(value = "firstname", defaultValue = "") final String firstname,
@@ -154,37 +147,6 @@ public class ResetPasswordController {
     }
 
     protected boolean sendPasswordResetEmailToAccount(final String to, final String subject, final String msg) {
-        return htmlEmail(msg, casProperties.getAuthn().getPm().getReset().getMail().getFrom(), subject, to, null, null);
-    }
-
-    private boolean htmlEmail(final String text, final String from, final String subject, final String to, final String cc, final String bcc) {
-        try {
-            if (mailSender == null || StringUtils.isBlank(text) || StringUtils.isBlank(from) || StringUtils.isBlank(subject) || StringUtils.isBlank(to)) {
-                LOGGER.warn("Could not send email to [{}] because either no address/subject/text is found or email settings are not configured.", to);
-                return false;
-            }
-
-            final MimeMessage message = mailSender.createMimeMessage();
-            final MimeMessageHelper helper = new MimeMessageHelper(message);
-            helper.setTo(to);
-            message.setContent(text, "text/html; charset=UTF-8");
-            helper.setSubject(subject);
-            helper.setFrom(from);
-            helper.setPriority(1);
-
-            if (StringUtils.isNotBlank(cc)) {
-                helper.setCc(cc);
-            }
-
-            if (StringUtils.isNotBlank(bcc)) {
-                helper.setBcc(bcc);
-            }
-            mailSender.send(message);
-            return true;
-        }
-        catch (final Exception ex) {
-            LOGGER.error(ex.getMessage(), ex);
-        }
-        return false;
+        return utils.htmlEmail(msg, casProperties.getAuthn().getPm().getReset().getMail().getFrom(), subject, to, null, null);
     }
 }
diff --git a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/util/Utils.java b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/util/Utils.java
index 02551461..b3928976 100644
--- a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/util/Utils.java
+++ b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/util/Utils.java
@@ -41,6 +41,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
+import javax.mail.internet.MimeMessage;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletResponse;
 
@@ -56,6 +57,8 @@ import org.apereo.cas.web.support.WebUtils;
 import org.pac4j.core.util.CommonHelper;
 import org.pac4j.core.context.Pac4jConstants;
 import org.pac4j.saml.client.SAML2Client;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.MimeMessageHelper;
 import org.springframework.webflow.context.ExternalContext;
 import org.springframework.webflow.execution.Action;
 import org.springframework.webflow.execution.Event;
@@ -90,6 +93,8 @@ public class Utils {
 
     private final String casIdentity;
 
+    private final JavaMailSender mailSender;
+
     public ExternalHttpContext buildContext(final String username) {
         return new ExternalHttpContext(casTenantIdentifier, casToken, "cas+" + username, casIdentity);
     }
@@ -157,4 +162,38 @@ public class Utils {
             return "\"passwordResetURL\"...";
         }
     }
+
+    public boolean htmlEmail(final String text, final String from, final String subject, final String to, final String cc, final String bcc) {
+        try {
+            if (mailSender == null || org.apache.commons.lang3.StringUtils.isBlank(text) || org.apache.commons.lang3.StringUtils.isBlank(from)
+                || org.apache.commons.lang3.StringUtils.isBlank(subject) || org.apache.commons.lang3.StringUtils.isBlank(to)) {
+                LOGGER.warn(
+                    "Could not send email to [{}] because either no address/subject/text is found or email settings are not configured.",
+                    to);
+                return false;
+            }
+
+            final MimeMessage message = mailSender.createMimeMessage();
+            final MimeMessageHelper helper = new MimeMessageHelper(message);
+            helper.setTo(to);
+            message.setContent(text, "text/html; charset=UTF-8");
+            helper.setSubject(subject);
+            helper.setFrom(from);
+            helper.setPriority(1);
+
+            if (org.apache.commons.lang3.StringUtils.isNotBlank(cc)) {
+                helper.setCc(cc);
+            }
+
+            if (org.apache.commons.lang3.StringUtils.isNotBlank(bcc)) {
+                helper.setBcc(bcc);
+            }
+            mailSender.send(message);
+            return true;
+        }
+        catch (final Exception ex) {
+            LOGGER.error(ex.getMessage(), ex);
+        }
+        return false;
+    }
 }
diff --git a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/I18NSendPasswordResetInstructionsAction.java b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/I18NSendPasswordResetInstructionsAction.java
index 6792accc..e40a4c64 100644
--- a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/I18NSendPasswordResetInstructionsAction.java
+++ b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/I18NSendPasswordResetInstructionsAction.java
@@ -57,13 +57,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.HierarchicalMessageSource;
 import org.springframework.context.i18n.LocaleContextHolder;
-import org.springframework.mail.javamail.JavaMailSender;
-import org.springframework.mail.javamail.MimeMessageHelper;
 import org.springframework.webflow.core.collection.MutableAttributeMap;
 import org.springframework.webflow.execution.Event;
 import org.springframework.webflow.execution.RequestContext;
 
-import javax.mail.internet.MimeMessage;
 import javax.servlet.http.HttpServletRequest;
 
 /**
@@ -93,9 +90,6 @@ public class I18NSendPasswordResetInstructionsAction extends SendPasswordResetIn
 
     private final CommunicationsManager communicationsManager;
 
-    @Autowired
-    private JavaMailSender mailSender;
-
     private final PasswordManagementService passwordManagementService;
 
     public I18NSendPasswordResetInstructionsAction(final CasConfigurationProperties casProperties,
@@ -162,42 +156,7 @@ public class I18NSendPasswordResetInstructionsAction extends SendPasswordResetIn
     protected boolean sendPasswordResetEmailToAccount(final String to, final String url) {
         final PmMessageToSend messageToSend = PmMessageToSend.buildMessage(messageSource, "", "", "10", url,
                 LocaleContextHolder.getLocale());
-        return htmlEmail(messageToSend.getText(), casProperties.getAuthn().getPm().getReset().getMail().getFrom(),
+        return utils.htmlEmail(messageToSend.getText(), casProperties.getAuthn().getPm().getReset().getMail().getFrom(),
                 messageToSend.getSubject(), to, null, null);
     }
-
-    private boolean htmlEmail(final String text, final String from, final String subject, final String to,
-            final String cc, final String bcc) {
-        try {
-            if (this.mailSender == null || StringUtils.isBlank(text) || StringUtils.isBlank(from)
-                    || StringUtils.isBlank(subject) || StringUtils.isBlank(to)) {
-                LOGGER.warn(
-                        "Could not send email to [{}] because either no address/subject/text is found or email settings are not configured.",
-                        to);
-                return false;
-            }
-
-            final MimeMessage message = this.mailSender.createMimeMessage();
-            final MimeMessageHelper helper = new MimeMessageHelper(message);
-            helper.setTo(to);
-            message.setContent(text, "text/html; charset=UTF-8");
-            helper.setSubject(subject);
-            helper.setFrom(from);
-            helper.setPriority(1);
-
-            if (StringUtils.isNotBlank(cc)) {
-                helper.setCc(cc);
-            }
-
-            if (StringUtils.isNotBlank(bcc)) {
-                helper.setBcc(bcc);
-            }
-            this.mailSender.send(message);
-            return true;
-        }
-        catch (final Exception ex) {
-            LOGGER.error(ex.getMessage(), ex);
-        }
-        return false;
-    }
 }
diff --git a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/TriggerChangePasswordAction.java b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/TriggerChangePasswordAction.java
index 0bcba810..42635891 100644
--- a/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/TriggerChangePasswordAction.java
+++ b/cas/cas-server/src/main/java/fr/gouv/vitamui/cas/webflow/actions/TriggerChangePasswordAction.java
@@ -40,12 +40,12 @@ import fr.gouv.vitamui.cas.util.Utils;
 import fr.gouv.vitamui.commons.api.CommonConstants;
 import fr.gouv.vitamui.commons.api.logger.VitamUILogger;
 import fr.gouv.vitamui.commons.api.logger.VitamUILoggerFactory;
+import lombok.RequiredArgsConstructor;
 import org.apereo.cas.authentication.credential.UsernamePasswordCredential;
 import org.apereo.cas.authentication.principal.Principal;
 import org.apereo.cas.pm.web.flow.PasswordManagementWebflowConfigurer;
 import org.apereo.cas.ticket.registry.TicketRegistrySupport;
 import org.apereo.cas.web.support.WebUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.webflow.action.AbstractAction;
 import org.springframework.webflow.execution.Event;
 import org.springframework.webflow.execution.RequestContext;
@@ -56,6 +56,7 @@ import org.springframework.webflow.execution.RequestContextHolder;
  *
  *
  */
+@RequiredArgsConstructor
 public class TriggerChangePasswordAction extends AbstractAction {
 
     private static final VitamUILogger LOGGER = VitamUILoggerFactory.getInstance(TriggerChangePasswordAction.class);
@@ -63,11 +64,9 @@ public class TriggerChangePasswordAction extends AbstractAction {
     public static final String EVENT_ID_CHANGE_PASSWORD = "changePassword";
     public static final String EVENT_ID_CONTINUE = "continue";
 
-    @Autowired
-    private TicketRegistrySupport ticketRegistrySupport;
+    private final TicketRegistrySupport ticketRegistrySupport;
 
-    @Autowired
-    private Utils utils;
+    private final Utils utils;
 
     protected Event doExecute(final RequestContext context) {
 
diff --git a/cas/cas-server/src/main/java/org/apereo/cas/config/pm/RestPasswordManagementConfiguration.java b/cas/cas-server/src/main/java/org/apereo/cas/config/pm/RestPasswordManagementConfiguration.java
index fd739b75..1cdfea9d 100644
--- a/cas/cas-server/src/main/java/org/apereo/cas/config/pm/RestPasswordManagementConfiguration.java
+++ b/cas/cas-server/src/main/java/org/apereo/cas/config/pm/RestPasswordManagementConfiguration.java
@@ -5,13 +5,9 @@ import fr.gouv.vitamui.cas.provider.ProvidersService;
 import fr.gouv.vitamui.iam.common.utils.IdentityProviderHelper;
 import fr.gouv.vitamui.iam.external.client.CasExternalRestClient;
 import org.apereo.cas.configuration.CasConfigurationProperties;
-import org.apereo.cas.pm.PasswordHistoryService;
 import org.apereo.cas.pm.PasswordManagementService;
-import org.apereo.cas.util.crypto.CipherExecutor;
 
-import org.springframework.beans.factory.ObjectProvider;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.context.annotation.Bean;
@@ -28,15 +24,7 @@ public class RestPasswordManagementConfiguration {
     @Autowired
     private CasConfigurationProperties casProperties;
 
-    @Autowired
-    @Qualifier("passwordManagementCipherExecutor")
-    private ObjectProvider<CipherExecutor> passwordManagementCipherExecutor;
-
-    @Autowired
-    @Qualifier("passwordHistoryService")
-    private ObjectProvider<PasswordHistoryService> passwordHistoryService;
-
-    // customisation JLE:
+    // customisation:
     @Autowired
     private CasExternalRestClient casExternalRestClient;
 
diff --git a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/authentication/IamSurrogateRestAuthenticationServiceTest.java b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/authentication/IamSurrogateRestAuthenticationServiceTest.java
index 35b08641..3407b165 100644
--- a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/authentication/IamSurrogateRestAuthenticationServiceTest.java
+++ b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/authentication/IamSurrogateRestAuthenticationServiceTest.java
@@ -47,7 +47,7 @@ public final class IamSurrogateRestAuthenticationServiceTest {
     public void setUp() {
         casExternalRestClient = mock(CasExternalRestClient.class);
 
-        final Utils utils = new Utils(casExternalRestClient, null, 0, null);
+        val utils = new Utils(casExternalRestClient, null, 0, null, null);
         service = new IamSurrogateRestAuthenticationService(casExternalRestClient, mock(ServicesManager.class), utils);
     }
 
@@ -60,7 +60,7 @@ public final class IamSurrogateRestAuthenticationServiceTest {
 
     @Test
     public void testCanAuthenticateCannotSurrogate() {
-        final SubrogationDto subrogation = surrogation();
+        val subrogation = surrogation();
         subrogation.setSurrogate("anotherUser");
         when(casExternalRestClient.getSubrogationsBySuperUserId(any(ExternalHttpContext.class), eq(SU_ID)))
             .thenReturn(Arrays.asList(subrogation));
@@ -70,7 +70,7 @@ public final class IamSurrogateRestAuthenticationServiceTest {
 
     @Test
     public void testCanAuthenticateNotAccepted() {
-        final SubrogationDto subrogation = surrogation();
+        val subrogation = surrogation();
         subrogation.setStatus(SubrogationStatusEnum.CREATED);
         when(casExternalRestClient.getSubrogationsBySuperUserId(any(ExternalHttpContext.class), eq(SU_ID)))
             .thenReturn(Arrays.asList(subrogation));
@@ -95,7 +95,7 @@ public final class IamSurrogateRestAuthenticationServiceTest {
     }
 
     private SubrogationDto surrogation() {
-        final SubrogationDto subrogation = new SubrogationDto();
+        val subrogation = new SubrogationDto();
         subrogation.setSurrogate(SURROGATE);
         subrogation.setSuperUser(SU_EMAIL);
         subrogation.setStatus(SubrogationStatusEnum.ACCEPTED);
diff --git a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/authentication/UserAuthenticationHandlerTest.java b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/authentication/UserAuthenticationHandlerTest.java
index 853db4ea..eb1b350b 100644
--- a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/authentication/UserAuthenticationHandlerTest.java
+++ b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/authentication/UserAuthenticationHandlerTest.java
@@ -18,7 +18,7 @@ import fr.gouv.vitamui.cas.util.Utils;
 import fr.gouv.vitamui.commons.api.identity.ServerIdentityAutoConfiguration;
 import fr.gouv.vitamui.commons.api.enums.UserTypeEnum;
 import fr.gouv.vitamui.iam.external.client.CasExternalRestClient;
-import org.apereo.cas.authentication.AuthenticationHandlerExecutionResult;
+import lombok.val;
 import org.apereo.cas.authentication.Credential;
 import org.apereo.cas.authentication.PreventedException;
 import org.apereo.cas.authentication.credential.UsernamePasswordCredential;
@@ -61,7 +61,7 @@ public final class UserAuthenticationHandlerTest {
     @Before
     public void setUp() {
         casExternalRestClient = mock(CasExternalRestClient.class);
-        final Utils utils = new Utils(casExternalRestClient, null, 0, null);
+        val utils = new Utils(casExternalRestClient, null, 0, null, null);
         handler = new UserAuthenticationHandler(null, new DefaultPrincipalFactory(), casExternalRestClient, utils, null);
         credential = new UsernamePasswordCredential(USERNAME, PASSWORD);
     }
@@ -71,7 +71,7 @@ public final class UserAuthenticationHandlerTest {
         when(casExternalRestClient.login(any(ExternalHttpContext.class), eq(USERNAME), eq(PASSWORD), eq(null), eq(null)))
                 .thenReturn(basicUser(UserStatusEnum.ENABLED));
 
-        final AuthenticationHandlerExecutionResult result = handler.authenticate(credential);
+        val result = handler.authenticate(credential);
         assertEquals(USERNAME, result.getPrincipal().getId());
     }
 
@@ -100,7 +100,7 @@ public final class UserAuthenticationHandlerTest {
 
     @Test(expected = AccountPasswordMustChangeException.class)
     public void testExpiredPassword() throws GeneralSecurityException, PreventedException {
-        final UserDto user = basicUser(UserStatusEnum.ENABLED);
+        val user = basicUser(UserStatusEnum.ENABLED);
         user.setPasswordExpirationDate(OffsetDateTime.now().minusDays(1));
         when(casExternalRestClient.login(any(ExternalHttpContext.class), eq(USERNAME), eq(PASSWORD), eq(null), eq(null)))
             .thenReturn(user);
@@ -133,7 +133,7 @@ public final class UserAuthenticationHandlerTest {
     }
 
     private UserDto basicUser(final UserStatusEnum status) {
-        final UserDto user = new UserDto();
+        val user = new UserDto();
         user.setStatus(status);
         user.setType(UserTypeEnum.NOMINATIVE);
         user.setPasswordExpirationDate(OffsetDateTime.now().plusDays(1));
diff --git a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/authentication/UserPrincipalResolverTest.java b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/authentication/UserPrincipalResolverTest.java
index a8029130..d006f8e8 100644
--- a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/authentication/UserPrincipalResolverTest.java
+++ b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/authentication/UserPrincipalResolverTest.java
@@ -19,7 +19,6 @@ import org.apereo.cas.authentication.SurrogateUsernamePasswordCredential;
 import org.apereo.cas.authentication.credential.UsernamePasswordCredential;
 import org.apereo.cas.authentication.principal.ClientCredential;
 import org.apereo.cas.authentication.principal.DefaultPrincipalFactory;
-import org.apereo.cas.authentication.principal.Principal;
 import org.apereo.cas.authentication.principal.PrincipalFactory;
 import org.junit.Before;
 import org.junit.Test;
@@ -76,7 +75,7 @@ public final class UserPrincipalResolverTest extends BaseWebflowActionTest {
         super.setUp();
 
         casExternalRestClient = mock(CasExternalRestClient.class);
-        final Utils utils = new Utils(casExternalRestClient, null, 0, null);
+        val utils = new Utils(casExternalRestClient, null, 0, null, null);
         principalFactory = new DefaultPrincipalFactory();
         sessionStore = mock(SessionStore.class);
         resolver = new UserPrincipalResolver(principalFactory, casExternalRestClient, utils, sessionStore);
@@ -87,7 +86,7 @@ public final class UserPrincipalResolverTest extends BaseWebflowActionTest {
         when(casExternalRestClient.getUserByEmail(any(ExternalHttpContext.class), eq(USERNAME),
                 eq(Optional.of(CommonConstants.AUTH_TOKEN_PARAMETER)))).thenReturn(userProfile(UserStatusEnum.ENABLED));
 
-        final Principal principal = resolver.resolve(new UsernamePasswordCredential(USERNAME, PWD),
+        val principal = resolver.resolve(new UsernamePasswordCredential(USERNAME, PWD),
             Optional.of(principalFactory.createPrincipal(USERNAME)), Optional.empty());
 
         assertEquals(USERNAME_ID, principal.getId());
@@ -103,7 +102,7 @@ public final class UserPrincipalResolverTest extends BaseWebflowActionTest {
             eq(Optional.of(CommonConstants.AUTH_TOKEN_PARAMETER)))).thenReturn(userProfile(UserStatusEnum.ENABLED));
         when(sessionStore.get(any(JEEContext.class), eq(Constants.SURROGATE))).thenReturn(Optional.empty());
 
-        final Principal principal = resolver.resolve(new ClientCredential(),
+        val principal = resolver.resolve(new ClientCredential(),
             Optional.of(principalFactory.createPrincipal(USERNAME)), Optional.empty());
 
         assertEquals(USERNAME_ID, principal.getId());
@@ -124,7 +123,7 @@ public final class UserPrincipalResolverTest extends BaseWebflowActionTest {
         val credential = new SurrogateUsernamePasswordCredential();
         credential.setUsername(ADMIN);
         credential.setSurrogateUsername(USERNAME);
-        final Principal principal = resolver.resolve(credential, Optional.of(principalFactory.createPrincipal(ADMIN)), Optional.empty());
+        val principal = resolver.resolve(credential, Optional.of(principalFactory.createPrincipal(ADMIN)), Optional.empty());
 
         assertEquals(USERNAME_ID, principal.getId());
         final Map<String, List<Object>> attributes = principal.getAttributes();
@@ -142,8 +141,7 @@ public final class UserPrincipalResolverTest extends BaseWebflowActionTest {
             eq(Optional.empty()))).thenReturn(adminProfile());
         when(sessionStore.get(any(JEEContext.class), eq(Constants.SURROGATE))).thenReturn(Optional.of(USERNAME));
 
-        final Principal principal = resolver.resolve(new ClientCredential(),
-            Optional.of(principalFactory.createPrincipal(ADMIN)), Optional.empty());
+        val  principal = resolver.resolve(new ClientCredential(), Optional.of(principalFactory.createPrincipal(ADMIN)), Optional.empty());
 
         assertEquals(USERNAME_ID, principal.getId());
         final Map<String, List<Object>> attributes = principal.getAttributes();
@@ -158,7 +156,7 @@ public final class UserPrincipalResolverTest extends BaseWebflowActionTest {
         when(casExternalRestClient.getUserByEmail(any(ExternalHttpContext.class), eq(USERNAME), eq(Optional.of(CommonConstants.AUTH_TOKEN_PARAMETER))))
                 .thenReturn(authUserDto);
 
-        final Principal principal = resolver.resolve(new UsernamePasswordCredential(USERNAME, PWD),
+        val principal = resolver.resolve(new UsernamePasswordCredential(USERNAME, PWD),
             Optional.of(principalFactory.createPrincipal(USERNAME)), Optional.empty());
 
         assertEquals(USERNAME_ID, principal.getId());
@@ -204,7 +202,7 @@ public final class UserPrincipalResolverTest extends BaseWebflowActionTest {
     }
 
     private AuthUserDto profile(final UserStatusEnum status, final String id) {
-        final AuthUserDto user = new AuthUserDto();
+        val user = new AuthUserDto();
         user.setId(id);
         user.setStatus(status);
         user.setType(UserTypeEnum.NOMINATIVE);
@@ -214,9 +212,9 @@ public final class UserPrincipalResolverTest extends BaseWebflowActionTest {
         address.setCity("Paris");
         address.setCountry("France");
         user.setAddress(address);
-        final ProfileDto profile = new ProfileDto();
+        val profile = new ProfileDto();
         profile.setRoles(Arrays.asList(new Role(ROLE_NAME)));
-        final GroupDto group = new GroupDto();
+        val group = new GroupDto();
         group.setProfiles(Arrays.asList(profile));
         user.setProfileGroup(group);
         user.setCustomerId("customerId");
diff --git a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/pm/IamRestPasswordManagementServiceTest.java b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/pm/IamRestPasswordManagementServiceTest.java
index 8e73e8ea..f609c624 100644
--- a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/pm/IamRestPasswordManagementServiceTest.java
+++ b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/pm/IamRestPasswordManagementServiceTest.java
@@ -76,7 +76,7 @@ public final class IamRestPasswordManagementServiceTest {
         identityProviderDto.setInternal(true);
         when(identityProviderHelper.findByUserIdentifier(any(List.class), eq(EMAIL))).thenReturn(Optional.of(identityProviderDto));
         service = new IamRestPasswordManagementService(casExternalRestClient, null, providersService, identityProviderHelper);
-        final Utils utils = new Utils(casExternalRestClient, null, 0, null);
+        final Utils utils = new Utils(casExternalRestClient, null, 0, null, null);
         service.setUtils(utils);
         final RequestContext context = mock(RequestContext.class);
         RequestContextHolder.setRequestContext(context);
diff --git a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/provider/ProvidersServiceTest.java b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/provider/ProvidersServiceTest.java
index c57b6467..c9762528 100644
--- a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/provider/ProvidersServiceTest.java
+++ b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/provider/ProvidersServiceTest.java
@@ -57,7 +57,7 @@ public final class ProvidersServiceTest {
         restClient = mock(IdentityProviderExternalRestClient.class);
         service.setIdentityProviderExternalRestClient(restClient);
         final CasExternalRestClient casExternalRestClient = mock(CasExternalRestClient.class);
-        final Utils utils = new Utils(casExternalRestClient, null, 0, null);
+        final Utils utils = new Utils(casExternalRestClient, null, 0, null, null);
         service.setUtils(utils);
 
         provider = new IdentityProviderDto();
diff --git a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/DispatcherActionTest.java b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/DispatcherActionTest.java
index d7745918..fa96aedb 100644
--- a/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/DispatcherActionTest.java
+++ b/cas/cas-server/src/test/java/fr/gouv/vitamui/cas/webflow/actions/DispatcherActionTest.java
@@ -65,7 +65,7 @@ public final class DispatcherActionTest extends BaseWebflowActionTest {
         identityProviderHelper = mock(IdentityProviderHelper.class);
         casExternalRestClient = mock(CasExternalRestClient.class);
 
-        final Utils utils = new Utils(casExternalRestClient, null, 0, null);
+        final Utils utils = new Utils(casExternalRestClient, null, 0, null, null);
         action = new DispatcherAction(providersService, identityProviderHelper, casExternalRestClient, ",", utils, mock(SessionStore.class));
 
         final SAML2Client client = new SAML2Client();
-- 
GitLab