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