This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch 4_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/4_1_X by this push:
new 96c5cbc441 [SYNCOPE-1955] Aligning OIDC JWKS management
96c5cbc441 is described below
commit 96c5cbc441aa13d847f0968c57a8065639f71183
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Mon Mar 16 11:12:04 2026 +0100
[SYNCOPE-1955] Aligning OIDC JWKS management
---
.../core/persistence/api/entity/am/OIDCOpEntity.java | 4 ++--
.../core/persistence/jpa/entity/am/JPAOIDCOpEntity.java | 9 +++++----
.../core/persistence/jpa/inner/OIDCOpEntityTest.java | 3 ++-
.../persistence/neo4j/entity/am/Neo4jOIDCOpEntity.java | 9 +++++----
.../core/persistence/neo4j/inner/OIDCOpEntityTest.java | 3 ++-
.../provisioning/api/data/OIDCOpEntityDataBinder.java | 2 +-
.../java/data/OIDCOpEntityDataBinderImpl.java | 17 ++++++++++-------
.../wa/bootstrap/mapping/DefaultAttrReleaseMapper.java | 5 -----
8 files changed, 27 insertions(+), 25 deletions(-)
diff --git
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/am/OIDCOpEntity.java
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/am/OIDCOpEntity.java
index c5aa01e3a8..e66e26e579 100644
---
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/am/OIDCOpEntity.java
+++
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/am/OIDCOpEntity.java
@@ -24,9 +24,9 @@ import org.apache.syncope.core.persistence.api.entity.Entity;
public interface OIDCOpEntity extends Entity {
- String getJWKS();
+ byte[] getJWKS();
- void setJWKS(String jwks);
+ void setJWKS(byte[] jwks);
Map<String, Set<String>> getCustomScopes();
}
diff --git
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/am/JPAOIDCOpEntity.java
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/am/JPAOIDCOpEntity.java
index 4f14f8d642..e5f4e568d8 100644
---
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/am/JPAOIDCOpEntity.java
+++
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/am/JPAOIDCOpEntity.java
@@ -32,6 +32,7 @@ import jakarta.persistence.Transient;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
+import org.apache.commons.lang3.ArrayUtils;
import org.apache.syncope.core.persistence.api.entity.am.OIDCOpEntity;
import
org.apache.syncope.core.persistence.jpa.entity.AbstractGeneratedKeyEntity;
import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
@@ -50,7 +51,7 @@ public class JPAOIDCOpEntity extends
AbstractGeneratedKeyEntity implements OIDCO
@Column(nullable = false)
@Lob
- private String jwks;
+ private byte[] jwks;
@Lob
private String customScopes;
@@ -59,13 +60,13 @@ public class JPAOIDCOpEntity extends
AbstractGeneratedKeyEntity implements OIDCO
private Map<String, Set<String>> customScopesMap = new HashMap<>();
@Override
- public String getJWKS() {
+ public byte[] getJWKS() {
return jwks;
}
@Override
- public void setJWKS(final String jwks) {
- this.jwks = jwks;
+ public void setJWKS(final byte[] jwks) {
+ this.jwks = ArrayUtils.clone(jwks);
}
@Override
diff --git
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/OIDCOpEntityTest.java
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/OIDCOpEntityTest.java
index 515b8390d7..83ff443b5b 100644
---
a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/OIDCOpEntityTest.java
+++
b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/OIDCOpEntityTest.java
@@ -25,6 +25,7 @@ import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jose.jwk.KeyUse;
import com.nimbusds.jose.jwk.RSAKey;
import com.nimbusds.jose.jwk.gen.RSAKeyGenerator;
+import java.nio.charset.StandardCharsets;
import java.util.Set;
import java.util.UUID;
import org.apache.syncope.core.persistence.api.dao.OIDCOpEntityDAO;
@@ -48,7 +49,7 @@ public class OIDCOpEntityTest extends AbstractTest {
keyUse(KeyUse.SIGNATURE).
keyID(UUID.randomUUID().toString()).
generate();
- oidcOpEntity.setJWKS(new JWKSet(jwk).toString());
+ oidcOpEntity.setJWKS(new
JWKSet(jwk).toString().getBytes(StandardCharsets.UTF_8));
oidcOpEntity.getCustomScopes().put("scope1", Set.of("claim1",
"claim2"));
oidcOpEntity.getCustomScopes().put("scope2", Set.of("claim1",
"claim3", "claim4"));
diff --git
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/entity/am/Neo4jOIDCOpEntity.java
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/entity/am/Neo4jOIDCOpEntity.java
index c5d2fc0f0a..74c27f6928 100644
---
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/entity/am/Neo4jOIDCOpEntity.java
+++
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/entity/am/Neo4jOIDCOpEntity.java
@@ -23,6 +23,7 @@ import jakarta.validation.constraints.NotNull;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
+import org.apache.commons.lang3.ArrayUtils;
import org.apache.syncope.core.persistence.api.entity.am.OIDCOpEntity;
import
org.apache.syncope.core.persistence.neo4j.entity.AbstractGeneratedKeyNode;
import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
@@ -42,7 +43,7 @@ public class Neo4jOIDCOpEntity extends
AbstractGeneratedKeyNode implements OIDCO
};
@NotNull
- private String jwks;
+ private byte[] jwks;
private String customScopes;
@@ -50,13 +51,13 @@ public class Neo4jOIDCOpEntity extends
AbstractGeneratedKeyNode implements OIDCO
private Map<String, Set<String>> customScopesMap = new HashMap<>();
@Override
- public String getJWKS() {
+ public byte[] getJWKS() {
return jwks;
}
@Override
- public void setJWKS(final String jwks) {
- this.jwks = jwks;
+ public void setJWKS(final byte[] jwks) {
+ this.jwks = ArrayUtils.clone(jwks);
}
@Override
diff --git
a/core/persistence-neo4j/src/test/java/org/apache/syncope/core/persistence/neo4j/inner/OIDCOpEntityTest.java
b/core/persistence-neo4j/src/test/java/org/apache/syncope/core/persistence/neo4j/inner/OIDCOpEntityTest.java
index ec88cfc591..6fd036d0a4 100644
---
a/core/persistence-neo4j/src/test/java/org/apache/syncope/core/persistence/neo4j/inner/OIDCOpEntityTest.java
+++
b/core/persistence-neo4j/src/test/java/org/apache/syncope/core/persistence/neo4j/inner/OIDCOpEntityTest.java
@@ -25,6 +25,7 @@ import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jose.jwk.KeyUse;
import com.nimbusds.jose.jwk.RSAKey;
import com.nimbusds.jose.jwk.gen.RSAKeyGenerator;
+import java.nio.charset.StandardCharsets;
import java.util.Set;
import java.util.UUID;
import org.apache.syncope.core.persistence.api.dao.OIDCOpEntityDAO;
@@ -48,7 +49,7 @@ public class OIDCOpEntityTest extends AbstractTest {
keyUse(KeyUse.SIGNATURE).
keyID(UUID.randomUUID().toString()).
generate();
- oidcOpEntity.setJWKS(new JWKSet(jwk).toString());
+ oidcOpEntity.setJWKS(new
JWKSet(jwk).toString().getBytes(StandardCharsets.UTF_8));
oidcOpEntity.getCustomScopes().put("scope1", Set.of("claim1",
"claim2"));
oidcOpEntity.getCustomScopes().put("scope2", Set.of("claim1",
"claim3", "claim4"));
diff --git
a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/OIDCOpEntityDataBinder.java
b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/OIDCOpEntityDataBinder.java
index 20e9479e48..a2ac8530a7 100644
---
a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/OIDCOpEntityDataBinder.java
+++
b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/OIDCOpEntityDataBinder.java
@@ -53,7 +53,7 @@ public interface OIDCOpEntityDataBinder {
}
}
- String generateJWKS(String jwksKeyId, String jwksType, int jwksKeySize);
+ byte[] generateJWKS(String jwksKeyId, String jwksType, int jwksKeySize);
OIDCOpEntityTO getOIDCOpEntityTO(OIDCOpEntity oidcOpEntity);
diff --git
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/OIDCOpEntityDataBinderImpl.java
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/OIDCOpEntityDataBinderImpl.java
index 732d22946b..8dcd0cfb1c 100644
---
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/OIDCOpEntityDataBinderImpl.java
+++
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/OIDCOpEntityDataBinderImpl.java
@@ -18,7 +18,9 @@
*/
package org.apache.syncope.core.provisioning.java.data;
+import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
+import java.util.Base64;
import java.util.List;
import java.util.Locale;
import org.apache.syncope.common.lib.SyncopeClientException;
@@ -94,7 +96,7 @@ public class OIDCOpEntityDataBinderImpl implements
OIDCOpEntityDataBinder {
}
@Override
- public String generateJWKS(final String jwksKeyId, final String jwksType,
final int jwksKeySize) {
+ public byte[] generateJWKS(final String jwksKeyId, final String jwksType,
final int jwksKeySize) {
List<PublicJsonWebKey> keys = new ArrayList<>();
try {
keys.add(generate(jwksKeyId, jwksType, jwksKeySize, Use.SIGNATURE,
JsonWebKeyLifecycleState.CURRENT));
@@ -124,14 +126,16 @@ public class OIDCOpEntityDataBinderImpl implements
OIDCOpEntityDataBinder {
jwksKeySizeConfig.setValues(List.of(String.valueOf(jwksKeySize)));
waConfigDAO.save(jwksKeySizeConfig);
- return new
JsonWebKeySet(keys).toJson(JsonWebKey.OutputControlLevel.INCLUDE_PRIVATE);
+ return new JsonWebKeySet(keys).
+ toJson(JsonWebKey.OutputControlLevel.INCLUDE_PRIVATE).
+ getBytes(StandardCharsets.UTF_8);
}
@Override
public OIDCOpEntityTO getOIDCOpEntityTO(final OIDCOpEntity oidcOpEntity) {
OIDCOpEntityTO oidcOpEntityTO = new OIDCOpEntityTO();
oidcOpEntityTO.setKey(oidcOpEntity.getKey());
- oidcOpEntityTO.setJWKS(oidcOpEntity.getJWKS());
+
oidcOpEntityTO.setJWKS(Base64.getEncoder().encodeToString(oidcOpEntity.getJWKS()));
oidcOpEntityTO.getCustomScopes().putAll(oidcOpEntity.getCustomScopes());
return oidcOpEntityTO;
@@ -139,10 +143,9 @@ public class OIDCOpEntityDataBinderImpl implements
OIDCOpEntityDataBinder {
@Override
public void update(final OIDCOpEntity oidcOpEntity, final OIDCOpEntityTO
oidcOpEntityTO) {
- oidcOpEntity.setJWKS(oidcOpEntityTO.getJWKS());
- if (oidcOpEntity.getJWKS() == null) {
- oidcOpEntity.setJWKS(generateJWKS("syncope", "RSA", 2048));
- }
+ oidcOpEntity.setJWKS(oidcOpEntityTO.getJWKS() == null
+ ? generateJWKS("syncope", "RSA", 2048)
+ : Base64.getDecoder().decode(oidcOpEntityTO.getJWKS()));
oidcOpEntity.getCustomScopes().clear();
oidcOpEntity.getCustomScopes().putAll(oidcOpEntityTO.getCustomScopes());
diff --git
a/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/mapping/DefaultAttrReleaseMapper.java
b/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/mapping/DefaultAttrReleaseMapper.java
index 66c62957c0..6ead2e27b5 100644
---
a/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/mapping/DefaultAttrReleaseMapper.java
+++
b/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/mapping/DefaultAttrReleaseMapper.java
@@ -171,7 +171,6 @@ public class DefaultAttrReleaseMapper implements
AttrReleaseMapper {
protected void buildForOIDCStandardScope(
final OIDCRPClientAppTO clientApp,
- final DefaultAttrReleasePolicyConf conf,
final Map<String, BaseOidcScopeAttributeReleasePolicy> policies,
final Supplier<BaseOidcScopeAttributeReleasePolicy>
attributeReleasePolicyCreator,
final OIDCStandardScope scope,
@@ -228,7 +227,6 @@ public class DefaultAttrReleaseMapper implements
AttrReleaseMapper {
if
(OidcProfileScopeAttributeReleasePolicy.ALLOWED_CLAIMS.contains(external.toString()))
{
buildForOIDCStandardScope(
clientApp,
- conf,
policies,
OidcProfileScopeAttributeReleasePolicy::new,
OIDCStandardScope.profile,
@@ -237,7 +235,6 @@ public class DefaultAttrReleaseMapper implements
AttrReleaseMapper {
} else if
(OidcEmailScopeAttributeReleasePolicy.ALLOWED_CLAIMS.contains(external.toString()))
{
buildForOIDCStandardScope(
clientApp,
- conf,
policies,
OidcEmailScopeAttributeReleasePolicy::new,
OIDCStandardScope.email,
@@ -246,7 +243,6 @@ public class DefaultAttrReleaseMapper implements
AttrReleaseMapper {
} else if
(OidcAddressScopeAttributeReleasePolicy.ALLOWED_CLAIMS.contains(external.toString()))
{
buildForOIDCStandardScope(
clientApp,
- conf,
policies,
OidcAddressScopeAttributeReleasePolicy::new,
OIDCStandardScope.address,
@@ -255,7 +251,6 @@ public class DefaultAttrReleaseMapper implements
AttrReleaseMapper {
} else if
(OidcPhoneScopeAttributeReleasePolicy.ALLOWED_CLAIMS.contains(external.toString()))
{
buildForOIDCStandardScope(
clientApp,
- conf,
policies,
OidcPhoneScopeAttributeReleasePolicy::new,
OIDCStandardScope.phone,