This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new bc78c922fb Advancing to Spring Boot 4.2 / Apereo CAS 8.1 (#1590)
bc78c922fb is described below

commit bc78c922fbcc5aee42f5e6f5427694748a548644
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Wed Oct 28 13:33:08 2026 +0100

    Advancing to Spring Boot 4.2 / Apereo CAS 8.1 (#1590)
---
 .../client/console/IdRepoConsoleContext.java       |  4 +-
 .../core/persistence/neo4j/PersistenceContext.java | 24 ++++++------
 .../neo4j/spring/DomainRoutingDriver.java          |  6 +++
 .../spring/policy/HaveIBeenPwnedPasswordRule.java  | 44 ++++++++++++----------
 .../core/logic/AbstractSAML2SP4UILogic.java        | 19 ++++++----
 .../apache/syncope/core/logic/SAML2SP4UILogic.java | 11 +++---
 .../syncope/core/logic/saml2/SAML2ClientCache.java |  8 ++--
 .../src/main/resources/wa-embedded.properties      |  5 ---
 pom.xml                                            |  8 ++--
 .../syncope/wa/starter/config/WAContext.java       |  8 ++--
 .../starter/mapping/OIDCRPClientAppTOMapper.java   | 10 ++++-
 wa/starter/src/main/resources/wa.properties        |  5 ---
 .../syncope/wa/starter/WAServiceRegistryTest.java  |  5 ++-
 .../starter/pac4j/saml/BaseWASAML2ClientTest.java  |  7 ++--
 .../src/test/resources/debug/wa-debug.properties   |  5 ---
 15 files changed, 90 insertions(+), 79 deletions(-)

diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/IdRepoConsoleContext.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/IdRepoConsoleContext.java
index 5aa6d499a2..3e59a06452 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/IdRepoConsoleContext.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/IdRepoConsoleContext.java
@@ -179,7 +179,7 @@ public class IdRepoConsoleContext {
                 new MutableConfiguration<String, OffsetDateTime>().
                         setTypes(String.class, OffsetDateTime.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.TEN_MINUTES)));
     }
 
@@ -190,7 +190,7 @@ public class IdRepoConsoleContext {
                 new MutableConfiguration<String, OffsetDateTime>().
                         setTypes(String.class, OffsetDateTime.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.TEN_MINUTES)));
     }
 
diff --git 
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/PersistenceContext.java
 
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/PersistenceContext.java
index bb662b4305..14881fc404 100644
--- 
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/PersistenceContext.java
+++ 
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/PersistenceContext.java
@@ -487,7 +487,7 @@ public class PersistenceContext {
                 new MutableConfiguration<EntityCacheKey, Neo4jAnyObject>().
                         setTypes(EntityCacheKey.class, Neo4jAnyObject.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(TouchedExpiryPolicy.factoryOf(Duration.ZERO)));
     }
 
@@ -603,7 +603,7 @@ public class PersistenceContext {
                 new MutableConfiguration<EntityCacheKey, Neo4jAnyType>().
                         setTypes(EntityCacheKey.class, Neo4jAnyType.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ETERNAL)));
     }
 
@@ -761,7 +761,7 @@ public class PersistenceContext {
                 new MutableConfiguration<EntityCacheKey, Neo4jConnInstance>().
                         setTypes(EntityCacheKey.class, 
Neo4jConnInstance.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ETERNAL)));
     }
 
@@ -800,7 +800,7 @@ public class PersistenceContext {
                 new MutableConfiguration<EntityCacheKey, Neo4jDelegation>().
                         setTypes(EntityCacheKey.class, Neo4jDelegation.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ETERNAL)));
     }
 
@@ -831,7 +831,7 @@ public class PersistenceContext {
                 new MutableConfiguration<EntityCacheKey, Neo4jDerSchema>().
                         setTypes(EntityCacheKey.class, Neo4jDerSchema.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ETERNAL)));
     }
 
@@ -915,7 +915,7 @@ public class PersistenceContext {
                 new MutableConfiguration<EntityCacheKey, Neo4jGroup>().
                         setTypes(EntityCacheKey.class, Neo4jGroup.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(TouchedExpiryPolicy.factoryOf(Duration.ZERO)));
     }
 
@@ -972,7 +972,7 @@ public class PersistenceContext {
                 new MutableConfiguration<EntityCacheKey, 
Neo4jImplementation>().
                         setTypes(EntityCacheKey.class, 
Neo4jImplementation.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ETERNAL)));
     }
 
@@ -1071,7 +1071,7 @@ public class PersistenceContext {
                 new MutableConfiguration<EntityCacheKey, Neo4jPlainSchema>().
                         setTypes(EntityCacheKey.class, Neo4jPlainSchema.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ETERNAL)));
     }
 
@@ -1151,7 +1151,7 @@ public class PersistenceContext {
                 new MutableConfiguration<EntityCacheKey, Neo4jRealm>().
                         setTypes(EntityCacheKey.class, Neo4jRealm.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ETERNAL)));
     }
 
@@ -1262,7 +1262,7 @@ public class PersistenceContext {
                 new MutableConfiguration<EntityCacheKey, 
Neo4jExternalResource>().
                         setTypes(EntityCacheKey.class, 
Neo4jExternalResource.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ETERNAL)));
     }
 
@@ -1307,7 +1307,7 @@ public class PersistenceContext {
                 new MutableConfiguration<EntityCacheKey, Neo4jRole>().
                         setTypes(EntityCacheKey.class, Neo4jRole.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ETERNAL)));
     }
 
@@ -1426,7 +1426,7 @@ public class PersistenceContext {
                 new MutableConfiguration<EntityCacheKey, Neo4jUser>().
                         setTypes(EntityCacheKey.class, Neo4jUser.class).
                         setStoreByValue(false).
-                        setReadThrough(true).
+                        setReadThrough(false).
                         
setExpiryPolicyFactory(TouchedExpiryPolicy.factoryOf(Duration.ZERO)));
     }
 
diff --git 
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/spring/DomainRoutingDriver.java
 
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/spring/DomainRoutingDriver.java
index 027e1707d3..b7c28d9709 100644
--- 
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/spring/DomainRoutingDriver.java
+++ 
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/spring/DomainRoutingDriver.java
@@ -27,6 +27,7 @@ import org.neo4j.driver.BookmarkManager;
 import org.neo4j.driver.Driver;
 import org.neo4j.driver.ExecutableQuery;
 import org.neo4j.driver.SessionConfig;
+import org.neo4j.driver.encryption.BasePropertyEncryption;
 
 public class DomainRoutingDriver implements Driver {
 
@@ -105,4 +106,9 @@ public class DomainRoutingDriver implements Driver {
     public CompletionStage<Boolean> supportsMultiDbAsync() {
         return delegate().supportsMultiDbAsync();
     }
+
+    @Override
+    public <T extends BasePropertyEncryption> T propertyEncryption(final 
Class<T> type) {
+        return delegate().propertyEncryption(type);
+    }
 }
diff --git 
a/core/spring/src/main/java/org/apache/syncope/core/spring/policy/HaveIBeenPwnedPasswordRule.java
 
b/core/spring/src/main/java/org/apache/syncope/core/spring/policy/HaveIBeenPwnedPasswordRule.java
index 8817c42182..b1bfcc82f2 100644
--- 
a/core/spring/src/main/java/org/apache/syncope/core/spring/policy/HaveIBeenPwnedPasswordRule.java
+++ 
b/core/spring/src/main/java/org/apache/syncope/core/spring/policy/HaveIBeenPwnedPasswordRule.java
@@ -18,7 +18,11 @@
  */
 package org.apache.syncope.core.spring.policy;
 
+import java.io.IOException;
 import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
 import java.security.GeneralSecurityException;
 import java.util.Optional;
 import java.util.stream.Stream;
@@ -34,19 +38,16 @@ import 
org.apache.syncope.core.provisioning.api.rules.PasswordRuleConfClass;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.ResponseEntity;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.client.HttpStatusCodeException;
-import org.springframework.web.client.RestTemplate;
 
 @PasswordRuleConfClass(HaveIBeenPwnedPasswordRuleConf.class)
 public class HaveIBeenPwnedPasswordRule implements PasswordRule {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(HaveIBeenPwnedPasswordRule.class);
 
+    private static final HttpClient HTTP_CLIENT = HttpClient.newHttpClient();
+
     @Autowired
     private EncryptorManager encryptorManager;
 
@@ -70,24 +71,29 @@ public class HaveIBeenPwnedPasswordRule implements 
PasswordRule {
     protected void enforce(final String clearPassword) {
         try {
             String sha1 = encryptorManager.getInstance().encode(clearPassword, 
CipherAlgorithm.SHA1);
+            String prefix = sha1.substring(0, 5);
 
-            HttpHeaders headers = new HttpHeaders();
-            headers.set(HttpHeaders.USER_AGENT, "Apache Syncope");
-            ResponseEntity<String> response = new RestTemplate().exchange(
-                    URI.create("https://api.pwnedpasswords.com/range/"; + 
sha1.substring(0, 5)),
-                    HttpMethod.GET,
-                    new HttpEntity<>(null, headers),
-                    String.class);
-            if (StringUtils.isNotBlank(response.getBody())) {
-                if (Stream.of(response.getBody().split("\\n")).
-                        anyMatch(line -> sha1.equals(sha1.substring(0, 5) + 
StringUtils.substringBefore(line, ":")))) {
-
-                    throw new PasswordPolicyException("Password pwned");
-                }
+            HttpRequest request = HttpRequest.newBuilder().
+                    header(HttpHeaders.USER_AGENT, "Apache Syncope").
+                    uri(URI.create("https://api.pwnedpasswords.com/range/"; + 
prefix)).
+                    GET().
+                    build();
+            HttpResponse<String> response = HTTP_CLIENT.send(request, 
HttpResponse.BodyHandlers.ofString());
+
+            if (response.statusCode() < 200 || response.statusCode() >= 300) {
+                LOG.error("Error while contacting the PwnedPasswords service: 
HTTP {}", response.statusCode());
+                return;
+            }
+
+            if (StringUtils.isNotBlank(response.body())
+                    && Stream.of(response.body().split("\\R")).
+                            anyMatch(line -> sha1.equals(prefix + 
StringUtils.substringBefore(line, ":")))) {
+
+                throw new PasswordPolicyException("Password pwned");
             }
         } catch (GeneralSecurityException e) {
             LOG.error("Could not encode the password value as SHA1", e);
-        } catch (HttpStatusCodeException e) {
+        } catch (IOException | InterruptedException e) {
             LOG.error("Error while contacting the PwnedPasswords service", e);
         }
     }
diff --git 
a/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/AbstractSAML2SP4UILogic.java
 
b/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/AbstractSAML2SP4UILogic.java
index b838f3eb1b..a00a405658 100644
--- 
a/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/AbstractSAML2SP4UILogic.java
+++ 
b/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/AbstractSAML2SP4UILogic.java
@@ -23,6 +23,8 @@ import java.security.KeyStore;
 import java.security.PrivateKey;
 import java.security.cert.X509Certificate;
 import org.apache.syncope.common.lib.to.EntityTO;
+import org.pac4j.core.config.properties.KeystoreProperties;
+import org.pac4j.core.config.properties.ResourceProperties;
 import org.pac4j.core.keystore.generation.BaseKeystoreGenerator;
 import org.pac4j.saml.config.SAML2Configuration;
 import org.springframework.core.io.FileUrlResource;
@@ -44,14 +46,15 @@ abstract class AbstractSAML2SP4UILogic extends 
AbstractTransactionalLogic<Entity
 
     protected SAML2Configuration newSAML2Configuration() {
         SAML2Configuration cfg = new SAML2Configuration(
-                resourceResolver.getResource(props.getKeystore()),
-                props.getKeystoreAlias(),
-                props.getKeystoreType(),
-                props.getKeystoreStorepass(),
-                props.getKeystoreKeypass(),
-                null);
+                new KeystoreProperties().
+                        setKeyStoreAlias(props.getKeystoreAlias()).
+                        setKeyStoreType(props.getKeystoreType()).
+                        
setResource(resourceResolver.getResource(props.getKeystore())).
+                        setKeystorePassword(props.getKeystoreStorepass()).
+                        setPrivateKeyPassword(props.getKeystoreKeypass()),
+                new ResourceProperties());
 
-        if (cfg.getKeystore().getKeystoreResource() instanceof 
FileUrlResource) {
+        if (cfg.getKeystore().getResource() instanceof FileUrlResource) {
             cfg.getKeystore().setKeystoreGenerator(new 
BaseKeystoreGenerator(cfg.getKeystore()) {
 
                 @Override
@@ -65,7 +68,7 @@ abstract class AbstractSAML2SP4UILogic extends 
AbstractTransactionalLogic<Entity
 
                 @Override
                 public InputStream retrieve() throws Exception {
-                    return 
cfg.getKeystore().getKeystoreResource().getInputStream();
+                    return cfg.getKeystore().getResource().getInputStream();
                 }
             });
         }
diff --git 
a/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/SAML2SP4UILogic.java
 
b/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/SAML2SP4UILogic.java
index d2c3244502..e45dbd0e77 100644
--- 
a/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/SAML2SP4UILogic.java
+++ 
b/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/SAML2SP4UILogic.java
@@ -167,7 +167,8 @@ public class SAML2SP4UILogic extends 
AbstractSAML2SP4UILogic {
             SAML2Configuration cfg = newSAML2Configuration();
             cfg.setServiceProviderEntityId(spEntityID);
             cfg.setCallbackUrl(getCallbackUrl(spEntityID, urlContext));
-            
SAML2ClientCache.getSPMetadataPath(spEntityID).ifPresent(cfg::setServiceProviderMetadataResourceFilepath);
+            SAML2ClientCache.getSPMetadataPath(spEntityID).
+                    ifPresent(path -> 
cfg.getIdentityProviderMetadata().setPath(path));
 
             EntityDescriptor entityDescriptor =
                     (EntityDescriptor) new 
SAML2ServiceProviderMetadataResolver(cfg).getEntityDescriptorElement();
@@ -184,10 +185,10 @@ public class SAML2SP4UILogic extends 
AbstractSAML2SP4UILogic {
 
             
entityDescriptor.getSPSSODescriptor(SAMLConstants.SAML20P_NS).getSingleLogoutServices().
                     removeIf(slo -> 
!SAML2BindingType.POST.getUri().equals(slo.getBinding())
-                    && 
!SAML2BindingType.REDIRECT.getUri().equals(slo.getBinding()));
+                            && 
!SAML2BindingType.REDIRECT.getUri().equals(slo.getBinding()));
             
entityDescriptor.getSPSSODescriptor(SAMLConstants.SAML20P_NS).getSingleLogoutServices().
                     forEach(slo -> slo.setLocation(
-                    getCallbackUrl(spEntityID, 
urlContext).replace("/assertion-consumer", "/logout")));
+                            getCallbackUrl(spEntityID, 
urlContext).replace("/assertion-consumer", "/logout")));
 
             try {
                 metadata = 
cfg.toMetadataGenerator().getMetadata(entityDescriptor);
@@ -218,7 +219,7 @@ public class SAML2SP4UILogic extends 
AbstractSAML2SP4UILogic {
 
         return saml2ClientCache.get(idp.getEntityID(), spEntityID).
                 orElseGet(() -> saml2ClientCache.add(
-                idp, newSAML2Configuration(), spEntityID, 
getCallbackUrl(spEntityID, urlContext)));
+                        idp, newSAML2Configuration(), spEntityID, 
getCallbackUrl(spEntityID, urlContext)));
     }
 
     protected SAML2Client getSAML2Client(
@@ -522,7 +523,7 @@ public class SAML2SP4UILogic extends 
AbstractSAML2SP4UILogic {
 
         
Optional.ofNullable(idpDAO.findByEntityID(saml2Client.getIdentityProviderResolvedEntityId())).
                 orElseThrow(() -> new NotFoundException(
-                "SAML 2.0 IdP '" + 
saml2Client.getIdentityProviderResolvedEntityId() + '\''));
+                        "SAML 2.0 IdP '" + 
saml2Client.getIdentityProviderResolvedEntityId() + '\''));
 
         // 2. validate the provided SAML response
         SAML2SP4UIContext webCtx = new SAML2SP4UIContext(
diff --git 
a/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2ClientCache.java
 
b/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2ClientCache.java
index 52ced1243f..eda32bcfd8 100644
--- 
a/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2ClientCache.java
+++ 
b/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2ClientCache.java
@@ -70,7 +70,7 @@ public class SAML2ClientCache {
     public static SAML2SP4UIIdPTO importMetadata(
             final InputStream metadata, final SAML2Configuration cfg) throws 
IOException {
 
-        cfg.setIdentityProviderMetadataResource(new 
ByteArrayResource(metadata.readAllBytes()));
+        cfg.getIdentityProviderMetadata().setResource(new 
ByteArrayResource(metadata.readAllBytes()));
         SAML2IdentityProviderMetadataResolver metadataResolver = new 
SAML2IdentityProviderMetadataResolver(cfg);
         metadataResolver.init();
         cfg.setIdentityProviderMetadataResolver(metadataResolver);
@@ -103,7 +103,7 @@ public class SAML2ClientCache {
 
         
entityDescriptor.getIDPSSODescriptor(SAMLConstants.SAML20P_NS).getSingleLogoutServices().stream().
                 filter(slo -> 
SAML2BindingType.POST.getUri().equals(slo.getBinding())
-                || 
SAML2BindingType.REDIRECT.getUri().equals(slo.getBinding())).
+                        || 
SAML2BindingType.REDIRECT.getUri().equals(slo.getBinding())).
                 findFirst().
                 ifPresent(slo -> idpTO.setLogoutSupported(true));
 
@@ -129,13 +129,13 @@ public class SAML2ClientCache {
 
         cfg.setIdentityProviderEntityId(idp.getEntityID());
 
-        cfg.setIdentityProviderMetadataResource(new 
ByteArrayResource(idp.getMetadata()));
+        cfg.getIdentityProviderMetadata().setResource(new 
ByteArrayResource(idp.getMetadata()));
         SAML2IdentityProviderMetadataResolver metadataResolver = new 
SAML2IdentityProviderMetadataResolver(cfg);
         metadataResolver.init();
         cfg.setIdentityProviderMetadataResolver(metadataResolver);
 
         cfg.setServiceProviderEntityId(spEntityID);
-        
getSPMetadataPath(spEntityID).ifPresent(cfg::setServiceProviderMetadataResourceFilepath);
+        getSPMetadataPath(spEntityID).ifPresent(path -> 
cfg.getIdentityProviderMetadata().setPath(path));
 
         SAML2Client saml2Client = new SAML2Client(cfg);
         saml2Client.setCallbackUrlResolver(new 
NoParameterCallbackUrlResolver());
diff --git a/fit/wa-reference/src/main/resources/wa-embedded.properties 
b/fit/wa-reference/src/main/resources/wa-embedded.properties
index 40d6658489..6d0268f2e6 100644
--- a/fit/wa-reference/src/main/resources/wa-embedded.properties
+++ b/fit/wa-reference/src/main/resources/wa-embedded.properties
@@ -31,11 +31,6 @@ cas.authn.syncope.name=DefaultSyncopeAuthModule
 
 service.discovery.address=https://localhost:9443/syncope-wa/
 
-##
-# Default strategy for matching request paths against
-# registered Spring MVC handler mappings
-spring.mvc.pathmatch.matching-strategy=ant-path-matcher
-
 cas.http-client.allow-local-urls=true
 
 
cas.tgc.crypto.signing.key=GBFdLSLDY0V-a9bc0anJZqygsxYUNPUU80XM6pSKTUjRc_qm7LQQ73m5f0QWidfM_xyymg1L2suMhoFsst4XwQ
diff --git a/pom.xml b/pom.xml
index 3146a2332c..ec69fddadc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -435,9 +435,9 @@ under the License.
     <bouncycastle.version>1.86</bouncycastle.version>
     <nimbus-jose-jwt.version>10.10</nimbus-jose-jwt.version>
 
-    <spring-boot.version>4.1.2</spring-boot.version>
+    <spring-boot.version>4.2.0-RC1</spring-boot.version>
 
-    <hibernate.version>7.4.13.Final</hibernate.version>
+    <hibernate.version>7.4.14.Final</hibernate.version>
 
     <jasypt.version>1.9.3</jasypt.version>
 
@@ -463,9 +463,9 @@ under the License.
     <commons-text.version>1.15.0</commons-text.version>
     <commons-codec.version>1.22.1</commons-codec.version>
 
-    <pac4j.version>6.5.9</pac4j.version>
+    <pac4j.version>6.6.0</pac4j.version>
 
-    <cas.version>8.0.3</cas.version>
+    <cas.version>8.1.0-RC3</cas.version>
     <cas-client.version>4.1.1</cas-client.version>
 
     <swagger-core.version>2.2.55</swagger-core.version>
diff --git 
a/wa/starter/src/main/java/org/apache/syncope/wa/starter/config/WAContext.java 
b/wa/starter/src/main/java/org/apache/syncope/wa/starter/config/WAContext.java
index e4b2400e9e..8b07f5a9e6 100644
--- 
a/wa/starter/src/main/java/org/apache/syncope/wa/starter/config/WAContext.java
+++ 
b/wa/starter/src/main/java/org/apache/syncope/wa/starter/config/WAContext.java
@@ -129,7 +129,7 @@ import 
org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.security.provisioning.InMemoryUserDetailsManager;
 import org.springframework.transaction.support.TransactionTemplate;
-import org.springframework.web.client.RestTemplate;
+import org.springframework.web.client.RestClient;
 
 @Configuration(proxyBeanMethods = false)
 public class WAContext {
@@ -473,8 +473,8 @@ public class WAContext {
     @RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
     @Bean
     public PasswordManagementService restPasswordChangeService(
-            @Qualifier("passwordChangeServiceRestTemplate")
-            final RestTemplate passwordChangeServiceRestTemplate,
+            @Qualifier("passwordChangeServiceRestClient")
+            final RestClient passwordChangeServiceRestClient,
             final CasConfigurationProperties casProperties,
             @Qualifier("passwordManagementCipherExecutor")
             final CipherExecutor<Serializable, String> 
passwordManagementCipherExecutor,
@@ -486,7 +486,7 @@ public class WAContext {
             return new RestPasswordManagementService(
                     passwordManagementCipherExecutor,
                     casProperties,
-                    passwordChangeServiceRestTemplate,
+                    passwordChangeServiceRestClient,
                     passwordHistoryService);
         }
 
diff --git 
a/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/OIDCRPClientAppTOMapper.java
 
b/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/OIDCRPClientAppTOMapper.java
index 4e2c8824b3..83d7e0deb2 100644
--- 
a/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/OIDCRPClientAppTOMapper.java
+++ 
b/wa/starter/src/main/java/org/apache/syncope/wa/starter/mapping/OIDCRPClientAppTOMapper.java
@@ -18,6 +18,8 @@
  */
 package org.apache.syncope.wa.starter.mapping;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
@@ -42,6 +44,7 @@ import 
org.apereo.cas.services.RegisteredServiceTicketGrantingTicketExpirationPo
 import 
org.apereo.cas.support.oauth.services.DefaultRegisteredServiceOAuthAccessTokenExpirationPolicy;
 import 
org.apereo.cas.support.oauth.services.DefaultRegisteredServiceOAuthDeviceTokenExpirationPolicy;
 import 
org.apereo.cas.support.oauth.services.DefaultRegisteredServiceOAuthRefreshTokenExpirationPolicy;
+import 
org.apereo.cas.support.oauth.services.OAuthRegisteredServiceClientSecret;
 
 public class OIDCRPClientAppTOMapper extends AbstractClientAppMapper {
 
@@ -72,8 +75,11 @@ public class OIDCRPClientAppTOMapper extends 
AbstractClientAppMapper {
                 collect(Collectors.joining("|")));
 
         service.setClientId(rp.getClientId());
-        service.setClientSecret(rp.getClientSecret());
-        service.setClientSecretExpiration(rp.getClientSecretExpiration());
+        List<OAuthRegisteredServiceClientSecret> clientSecrets = new 
ArrayList<>();
+        clientSecrets.add(rp.getClientSecretExpiration() == 0L
+                ? 
OAuthRegisteredServiceClientSecret.withoutExpiration(rp.getClientSecret())
+                : new OAuthRegisteredServiceClientSecret(rp.getClientSecret(), 
rp.getClientSecretExpiration()));
+        service.setClientSecrets(clientSecrets);
 
         service.setIdTokenIssuer(rp.getIdTokenIssuer());
         service.setSignIdToken(rp.isSignIdToken());
diff --git a/wa/starter/src/main/resources/wa.properties 
b/wa/starter/src/main/resources/wa.properties
index c2f8bb9981..ac8cc672f6 100644
--- a/wa/starter/src/main/resources/wa.properties
+++ b/wa/starter/src/main/resources/wa.properties
@@ -113,11 +113,6 @@ 
cas.authn.mfa.web-authn.core.application-id=https://localhost:8443
 cas.authn.mfa.web-authn.core.relying-party-name=Syncope 
 cas.authn.mfa.web-authn.core.relying-party-id=syncope.apache.org
 
-##
-# Default strategy for matching request paths against
-# registered Spring MVC handler mappings
-spring.mvc.pathmatch.matching-strategy=ant-path-matcher
-
 ##
 # Disable CGLib Proxies
 spring.aop.auto=true
diff --git 
a/wa/starter/src/test/java/org/apache/syncope/wa/starter/WAServiceRegistryTest.java
 
b/wa/starter/src/test/java/org/apache/syncope/wa/starter/WAServiceRegistryTest.java
index 69888267f6..65ada9aaf5 100644
--- 
a/wa/starter/src/test/java/org/apache/syncope/wa/starter/WAServiceRegistryTest.java
+++ 
b/wa/starter/src/test/java/org/apache/syncope/wa/starter/WAServiceRegistryTest.java
@@ -56,6 +56,7 @@ import 
org.apereo.cas.services.RegisteredServiceAccessStrategy;
 import org.apereo.cas.services.RegisteredServiceDelegatedAuthenticationPolicy;
 import org.apereo.cas.services.RegisteredServiceLogoutType;
 import org.apereo.cas.services.ServicesManager;
+import 
org.apereo.cas.support.oauth.services.OAuthRegisteredServiceClientSecret;
 import org.apereo.cas.support.saml.services.SamlRegisteredService;
 import org.apereo.cas.util.RandomUtils;
 import org.junit.jupiter.api.Test;
@@ -177,7 +178,9 @@ public class WAServiceRegistryTest extends AbstractTest {
         OIDCRPClientAppTO oidcrpto = 
OIDCRPClientAppTO.class.cast(waClientApp.getClientAppTO());
         assertEquals("uri1|uri2", oidc.getServiceId());
         assertEquals(oidcrpto.getClientId(), oidc.getClientId());
-        assertEquals(oidcrpto.getClientSecret(), oidc.getClientSecret());
+        List<OAuthRegisteredServiceClientSecret> clientSecrets = 
oidc.getClientSecrets();
+        assertEquals(1, clientSecrets.size());
+        assertEquals(oidcrpto.getClientSecret(), 
clientSecrets.getFirst().getValue());
         
assertTrue(oidc.getAuthenticationPolicy().getRequiredAuthenticationHandlers().contains("TestAuthModule"));
         
assertTrue(((AnyAuthenticationHandlerRegisteredServiceAuthenticationPolicyCriteria)
 oidc.
                 getAuthenticationPolicy().getCriteria()).isTryAll());
diff --git 
a/wa/starter/src/test/java/org/apache/syncope/wa/starter/pac4j/saml/BaseWASAML2ClientTest.java
 
b/wa/starter/src/test/java/org/apache/syncope/wa/starter/pac4j/saml/BaseWASAML2ClientTest.java
index 465a32b0b1..0ef624ac4d 100644
--- 
a/wa/starter/src/test/java/org/apache/syncope/wa/starter/pac4j/saml/BaseWASAML2ClientTest.java
+++ 
b/wa/starter/src/test/java/org/apache/syncope/wa/starter/pac4j/saml/BaseWASAML2ClientTest.java
@@ -99,17 +99,18 @@ public abstract class BaseWASAML2ClientTest {
 
     protected static SAML2Configuration getSAML2Configuration() throws 
Exception {
         SAML2Configuration cfg = new SAML2Configuration();
-        cfg.getKeystore().setKeystoreResource(new ByteArrayResource(new 
byte[0]));
+        cfg.getKeystore().setResource(new ByteArrayResource(new byte[0]));
         cfg.getKeystore().setKeystorePassword("password");
         cfg.getKeystore().setPrivateKeyPassword("password");
 
-        cfg.setIdentityProviderMetadataResource(new 
ClassPathResource("idp-metadata.xml"));
+        cfg.getIdentityProviderMetadata().setResource(new 
ClassPathResource("idp-metadata.xml"));
 
         SAML2IdentityProviderMetadataResolver idpMetadataResolver = new 
SAML2IdentityProviderMetadataResolver(cfg);
         idpMetadataResolver.init();
         cfg.setIdentityProviderMetadataResolver(idpMetadataResolver);
 
-        cfg.setServiceProviderMetadataResource(new 
FileSystemResource(Files.createTempFile("sp-metadata", ".xml")));
+        cfg.getServiceProviderMetadata().setResource(
+                new FileSystemResource(Files.createTempFile("sp-metadata", 
".xml")));
 
         return cfg;
     }
diff --git a/wa/starter/src/test/resources/debug/wa-debug.properties 
b/wa/starter/src/test/resources/debug/wa-debug.properties
index 7343d1e3e4..626761738e 100644
--- a/wa/starter/src/test/resources/debug/wa-debug.properties
+++ b/wa/starter/src/test/resources/debug/wa-debug.properties
@@ -30,8 +30,3 @@ cas.authn.accept.users=admin::password
 #cas.authn.syncope.url=http://localhost:9080/syncope
 cas.authn.syncope.url=https://localhost:9443/syncope
 cas.authn.syncope.name=DefaultSyncopeAuthModule
-
-##
-# Default strategy for matching request paths against
-# registered Spring MVC handler mappings
-spring.mvc.pathmatch.matching-strategy=ant-path-matcher

Reply via email to