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 73ac574b64 [SYNCOPE-1865] Add missing conf parameters for OIDC client
apps (#990)
73ac574b64 is described below
commit 73ac574b64600eb2745528578ec1d4d945265226
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Fri Feb 14 21:38:37 2025 +0100
[SYNCOPE-1865] Add missing conf parameters for OIDC client apps (#990)
---
.../clientapps/ClientAppModalPanelBuilder.java | 67 ++++++++++-
.../clientapps/ClientAppDirectoryPanel.properties | 9 ++
.../ClientAppDirectoryPanel_fr_CA.properties | 9 ++
.../ClientAppDirectoryPanel_it.properties | 9 ++
.../ClientAppDirectoryPanel_ja.properties | 9 ++
.../ClientAppDirectoryPanel_pt_BR.properties | 9 ++
.../ClientAppDirectoryPanel_ru.properties | 9 ++
.../syncope/common/lib/to/OIDCRPClientAppTO.java | 116 ++++++++++++++++++-
...OIDCGrantType.java => OIDCApplicationType.java} | 18 ++-
.../syncope/common/lib/types/OIDCGrantType.java | 22 +++-
.../syncope/common/lib/types/OIDCSubjectType.java | 13 ++-
...CGrantType.java => OIDCTokenEncryptionAlg.java} | 31 +++++-
...tType.java => OIDCTokenEncryptionEncoding.java} | 23 +++-
...OIDCGrantType.java => OIDCTokenSigningAlg.java} | 20 +++-
.../persistence/api/entity/am/OIDCRPClientApp.java | 40 +++++++
.../common/dao/AbstractAnySearchDAO.java | 2 +-
.../jpa/dao/AbstractJPAAnySearchDAO.java | 2 +-
.../jpa/entity/am/JPAOIDCRPClientApp.java | 123 ++++++++++++++++++++-
.../persistence/neo4j/dao/Neo4jAnySearchDAO.java | 25 ++---
.../neo4j/entity/am/Neo4jOIDCRPClientApp.java | 116 ++++++++++++++++++-
.../java/data/ClientAppDataBinderImpl.java | 34 ++++--
.../dao/ElasticsearchAnySearchDAO.java | 6 +-
.../opensearch/dao/OpenSearchAnySearchDAO.java | 6 +-
pom.xml | 2 +-
.../starter/mapping/OIDCRPClientAppTOMapper.java | 35 +++++-
25 files changed, 678 insertions(+), 77 deletions(-)
diff --git
a/client/am/console/src/main/java/org/apache/syncope/client/console/clientapps/ClientAppModalPanelBuilder.java
b/client/am/console/src/main/java/org/apache/syncope/client/console/clientapps/ClientAppModalPanelBuilder.java
index 5da5d0340f..8ffcd8311e 100644
---
a/client/am/console/src/main/java/org/apache/syncope/client/console/clientapps/ClientAppModalPanelBuilder.java
+++
b/client/am/console/src/main/java/org/apache/syncope/client/console/clientapps/ClientAppModalPanelBuilder.java
@@ -61,10 +61,14 @@ import org.apache.syncope.common.lib.to.OIDCRPClientAppTO;
import org.apache.syncope.common.lib.to.RealmTO;
import org.apache.syncope.common.lib.types.ClientAppType;
import org.apache.syncope.common.lib.types.LogoutType;
+import org.apache.syncope.common.lib.types.OIDCApplicationType;
import org.apache.syncope.common.lib.types.OIDCClientAuthenticationMethod;
import org.apache.syncope.common.lib.types.OIDCGrantType;
import org.apache.syncope.common.lib.types.OIDCResponseType;
import org.apache.syncope.common.lib.types.OIDCSubjectType;
+import org.apache.syncope.common.lib.types.OIDCTokenEncryptionAlg;
+import org.apache.syncope.common.lib.types.OIDCTokenEncryptionEncoding;
+import org.apache.syncope.common.lib.types.OIDCTokenSigningAlg;
import org.apache.syncope.common.lib.types.PolicyType;
import org.apache.syncope.common.lib.types.SAML2SPNameId;
import org.apache.syncope.common.lib.types.XmlSecAlgorithm;
@@ -295,8 +299,61 @@ public class ClientAppModalPanelBuilder<T extends
ClientAppTO> extends AbstractM
clientSecret.setChoices(List.of(RandomStringUtils.secure().nextNumeric(15)));
fields.add(clientSecret.setRequired(true));
+ AjaxTextFieldPanel idTokenIssuer = new AjaxTextFieldPanel(
+ "field", "idTokenIssuer", new
PropertyModel<>(clientAppTO, "idTokenIssuer"), false);
+ fields.add(idTokenIssuer);
+
+ AjaxCheckBoxPanel signIdToken = new AjaxCheckBoxPanel(
+ "field", "signIdToken", new
PropertyModel<>(clientAppTO, "signIdToken"));
+ fields.add(signIdToken);
+ AjaxDropDownChoicePanel<OIDCTokenSigningAlg>
idTokenSigningAlg = new AjaxDropDownChoicePanel<>(
+ "field", "idTokenSigningAlg", new
PropertyModel<>(clientAppTO, "idTokenSigningAlg"), false);
+
idTokenSigningAlg.setChoices(List.of(OIDCTokenSigningAlg.values()));
+ fields.add(idTokenSigningAlg.addRequiredLabel());
+
fields.add(new AjaxCheckBoxPanel(
- "field", "signIdToken", new
PropertyModel<>(clientAppTO, "signIdToken")));
+ "field", "encryptIdToken", new
PropertyModel<>(clientAppTO, "encryptIdToken")));
+ AjaxDropDownChoicePanel<OIDCTokenEncryptionAlg>
idTokenEncryptionAlg =
+ new AjaxDropDownChoicePanel<>(
+ "field",
+ "idTokenEncryptionAlg",
+ new PropertyModel<>(clientAppTO,
"idTokenEncryptionAlg"),
+ false);
+
idTokenEncryptionAlg.setChoices(List.of(OIDCTokenEncryptionAlg.values()));
+ fields.add(idTokenEncryptionAlg.addRequiredLabel());
+ AjaxDropDownChoicePanel<OIDCTokenEncryptionEncoding>
idTokenEncryptionEncoding =
+ new AjaxDropDownChoicePanel<>(
+ "field",
+ "idTokenEncryptionEncoding",
+ new PropertyModel<>(clientAppTO,
"idTokenEncryptionEncoding"),
+ false);
+
idTokenEncryptionEncoding.setChoices(List.of(OIDCTokenEncryptionEncoding.values()));
+ fields.add(idTokenEncryptionEncoding);
+
+ AjaxDropDownChoicePanel<OIDCTokenSigningAlg>
userInfoSigningAlg = new AjaxDropDownChoicePanel<>(
+ "field",
+ "userInfoSigningAlg",
+ new PropertyModel<>(clientAppTO,
"userInfoSigningAlg"),
+ false);
+
userInfoSigningAlg.setChoices(List.of(OIDCTokenSigningAlg.values()));
+ fields.add(userInfoSigningAlg);
+ AjaxDropDownChoicePanel<OIDCTokenEncryptionAlg>
userInfoEncryptedResponseAlg =
+ new AjaxDropDownChoicePanel<>(
+ "field",
+ "userInfoEncryptedResponseAlg",
+ new PropertyModel<>(clientAppTO,
"userInfoEncryptedResponseAlg"),
+ false);
+
userInfoEncryptedResponseAlg.setChoices(List.of(OIDCTokenEncryptionAlg.values()));
+ fields.add(userInfoEncryptedResponseAlg);
+ AjaxDropDownChoicePanel<OIDCTokenEncryptionEncoding>
userInfoEncryptedResponseEncoding =
+ new AjaxDropDownChoicePanel<>(
+ "field",
+ "userInfoEncryptedResponseEncoding",
+ new PropertyModel<>(clientAppTO,
"userInfoEncryptedResponseEncoding"),
+ false);
+
userInfoEncryptedResponseEncoding.setChoices(List.of(OIDCTokenEncryptionEncoding.values()));
+ fields.add(userInfoEncryptedResponseEncoding);
+
fields.add(new AjaxCheckBoxPanel(
"field", "jwtAccessToken", new
PropertyModel<>(clientAppTO, "jwtAccessToken")));
fields.add(new AjaxCheckBoxPanel(
@@ -307,8 +364,12 @@ public class ClientAppModalPanelBuilder<T extends
ClientAppTO> extends AbstractM
AjaxDropDownChoicePanel<OIDCSubjectType> subjectType = new
AjaxDropDownChoicePanel<>(
"field", "subjectType", new
PropertyModel<>(clientAppTO, "subjectType"), false);
subjectType.setChoices(List.of(OIDCSubjectType.values()));
- subjectType.addRequiredLabel().setEnabled(true);
- fields.add(subjectType);
+
fields.add(subjectType.addRequiredLabel().setEnabled(true));
+
+ AjaxDropDownChoicePanel<OIDCApplicationType>
applicationType = new AjaxDropDownChoicePanel<>(
+ "field", "applicationType", new
PropertyModel<>(clientAppTO, "applicationType"), false);
+
applicationType.setChoices(List.of(OIDCApplicationType.values()));
+
fields.add(applicationType.addRequiredLabel().setEnabled(true));
AjaxTextFieldPanel redirectUri = new
AjaxTextFieldPanel("panel", "redirectUris", new Model<>());
fields.add(new MultiFieldPanel.Builder<String>(
diff --git
a/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel.properties
b/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel.properties
index 734fe671ab..14d8af8023 100644
---
a/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel.properties
+++
b/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel.properties
@@ -71,3 +71,12 @@ jwks=JWKS
jwksUri=JWKS URI
tokenEndpointAuthenticationMethod=Token Endpoint Authentication Method
generateRefreshToken=Generate Refresh Token
+idTokenIssuer=IdToken issuer
+idTokenSigningAlg=IdToken signing algorithm
+encryptIdToken=Encrypt IdToken
+idTokenEncryptionAlg=IdToken encryption algorithm
+idTokenEncryptionEncoding=IdToken encryption encoding
+applicationType=Application Type
+userInfoSigningAlg=UserInfo Signing Algorithm
+userInfoEncryptedResponseAlg=UserInfo Encrypted Response Algorithm
+userInfoEncryptedResponseEncoding=UserInfo Encrypted Response Encoding
diff --git
a/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_fr_CA.properties
b/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_fr_CA.properties
index e1cded71e7..07742eb2a4 100644
---
a/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_fr_CA.properties
+++
b/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_fr_CA.properties
@@ -71,3 +71,12 @@ jwks=JWKS
jwksUri=JWKS URI
tokenEndpointAuthenticationMethod=Token Endpoint Authentication Method
generateRefreshToken=Generate Refresh Token
+idTokenIssuer=IdToken issuer
+idTokenSigningAlg=IdToken signing algorithm
+encryptIdToken=Encrypt IdToken
+idTokenEncryptionAlg=IdToken encryption algorithm
+idTokenEncryptionEncoding=IdToken encryption encoding
+applicationType=Application Type
+userInfoSigningAlg=UserInfo Signing Algorithm
+userInfoEncryptedResponseAlg=UserInfo Encrypted Response Algorithm
+userInfoEncryptedResponseEncoding=UserInfo Encrypted Response Encoding
diff --git
a/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_it.properties
b/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_it.properties
index a9cb0277f8..7a6e813c79 100644
---
a/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_it.properties
+++
b/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_it.properties
@@ -71,3 +71,12 @@ jwks=JWKS
jwksUri=JWKS URI
tokenEndpointAuthenticationMethod=Metodo di autenticazione dell'endpoint token
generateRefreshToken=Genera Refresh Token
+idTokenIssuer=IdToken issuer
+idTokenSigningAlg=Algoritmo di firma IdToken
+encryptIdToken=Cifra IdToken
+idTokenEncryptionAlg=Algoritmo di cifratura IdToken
+idTokenEncryptionEncoding=Codifica di cifratura IdToken
+applicationType=Tipo applicazione
+userInfoSigningAlg=Algoritmo di firma UserInfo
+userInfoEncryptedResponseAlg=Algoritmo di cifratura risposta UserInfo
+userInfoEncryptedResponseEncoding=Codifica di cifratura risposta UserInfo
diff --git
a/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_ja.properties
b/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_ja.properties
index 207cc7f18f..4026612504 100644
---
a/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_ja.properties
+++
b/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_ja.properties
@@ -71,3 +71,12 @@ jwks=JWKS
jwksUri=JWKS URI
tokenEndpointAuthenticationMethod=Token Endpoint Authentication Method
generateRefreshToken=Generate Refresh Token
+idTokenIssuer=IdToken issuer
+idTokenSigningAlg=IdToken signing algorithm
+encryptIdToken=Encrypt IdToken
+idTokenEncryptionAlg=IdToken encryption algorithm
+idTokenEncryptionEncoding=IdToken encryption encoding
+applicationType=Application Type
+userInfoSigningAlg=UserInfo Signing Algorithm
+userInfoEncryptedResponseAlg=UserInfo Encrypted Response Algorithm
+userInfoEncryptedResponseEncoding=UserInfo Encrypted Response Encoding
diff --git
a/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_pt_BR.properties
b/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_pt_BR.properties
index 65ddf146bb..f8ea1d3017 100644
---
a/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_pt_BR.properties
+++
b/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_pt_BR.properties
@@ -71,3 +71,12 @@ jwks=JWKS
jwksUri=JWKS URI
tokenEndpointAuthenticationMethod=Token Endpoint Authentication Method
generateRefreshToken=Generate Refresh Token
+idTokenIssuer=IdToken issuer
+idTokenSigningAlg=IdToken signing algorithm
+encryptIdToken=Encrypt IdToken
+idTokenEncryptionAlg=IdToken encryption algorithm
+idTokenEncryptionEncoding=IdToken encryption encoding
+applicationType=Application Type
+userInfoSigningAlg=UserInfo Signing Algorithm
+userInfoEncryptedResponseAlg=UserInfo Encrypted Response Algorithm
+userInfoEncryptedResponseEncoding=UserInfo Encrypted Response Encoding
diff --git
a/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_ru.properties
b/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_ru.properties
index b49b8abc9f..f2a04216c2 100644
---
a/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_ru.properties
+++
b/client/am/console/src/main/resources/org/apache/syncope/client/console/clientapps/ClientAppDirectoryPanel_ru.properties
@@ -72,3 +72,12 @@ jwks=JWKS
jwksUri=JWKS URI
tokenEndpointAuthenticationMethod=Token Endpoint Authentication Method
generateRefreshToken=Generate Refresh Token
+idTokenIssuer=IdToken issuer
+idTokenSigningAlg=IdToken signing algorithm
+encryptIdToken=Encrypt IdToken
+idTokenEncryptionAlg=IdToken encryption algorithm
+idTokenEncryptionEncoding=IdToken encryption encoding
+applicationType=Application Type
+userInfoSigningAlg=UserInfo Signing Algorithm
+userInfoEncryptedResponseAlg=UserInfo Encrypted Response Algorithm
+userInfoEncryptedResponseEncoding=UserInfo Encrypted Response Encoding
diff --git
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/OIDCRPClientAppTO.java
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/OIDCRPClientAppTO.java
index 04ab489a33..eb77daedd7 100644
---
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/OIDCRPClientAppTO.java
+++
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/to/OIDCRPClientAppTO.java
@@ -26,10 +26,14 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.types.OIDCApplicationType;
import org.apache.syncope.common.lib.types.OIDCClientAuthenticationMethod;
import org.apache.syncope.common.lib.types.OIDCGrantType;
import org.apache.syncope.common.lib.types.OIDCResponseType;
import org.apache.syncope.common.lib.types.OIDCSubjectType;
+import org.apache.syncope.common.lib.types.OIDCTokenEncryptionAlg;
+import org.apache.syncope.common.lib.types.OIDCTokenEncryptionEncoding;
+import org.apache.syncope.common.lib.types.OIDCTokenSigningAlg;
@Schema(allOf = { ClientAppTO.class })
public class OIDCRPClientAppTO extends ClientAppTO {
@@ -40,7 +44,23 @@ public class OIDCRPClientAppTO extends ClientAppTO {
private String clientSecret;
- private boolean signIdToken;
+ private String idTokenIssuer;
+
+ private boolean signIdToken = true;
+
+ private OIDCTokenSigningAlg idTokenSigningAlg = OIDCTokenSigningAlg.none;
+
+ private boolean encryptIdToken;
+
+ private OIDCTokenEncryptionAlg idTokenEncryptionAlg =
OIDCTokenEncryptionAlg.none;
+
+ private OIDCTokenEncryptionEncoding idTokenEncryptionEncoding;
+
+ private OIDCTokenSigningAlg userInfoSigningAlg;
+
+ private OIDCTokenEncryptionAlg userInfoEncryptedResponseAlg;
+
+ private OIDCTokenEncryptionEncoding userInfoEncryptedResponseEncoding;
private boolean jwtAccessToken;
@@ -48,7 +68,9 @@ public class OIDCRPClientAppTO extends ClientAppTO {
private boolean generateRefreshToken = true;
- private OIDCSubjectType subjectType;
+ private OIDCSubjectType subjectType = OIDCSubjectType.PUBLIC;
+
+ private OIDCApplicationType applicationType = OIDCApplicationType.WEB;
private final List<String> redirectUris = new ArrayList<>();
@@ -110,6 +132,14 @@ public class OIDCRPClientAppTO extends ClientAppTO {
return supportedResponseTypes;
}
+ public String getIdTokenIssuer() {
+ return idTokenIssuer;
+ }
+
+ public void setIdTokenIssuer(final String idTokenIssuer) {
+ this.idTokenIssuer = idTokenIssuer;
+ }
+
public boolean isSignIdToken() {
return signIdToken;
}
@@ -118,6 +148,62 @@ public class OIDCRPClientAppTO extends ClientAppTO {
this.signIdToken = signIdToken;
}
+ public boolean isEncryptIdToken() {
+ return encryptIdToken;
+ }
+
+ public void setEncryptIdToken(final boolean encryptIdToken) {
+ this.encryptIdToken = encryptIdToken;
+ }
+
+ public OIDCTokenSigningAlg getIdTokenSigningAlg() {
+ return idTokenSigningAlg;
+ }
+
+ public void setIdTokenSigningAlg(final OIDCTokenSigningAlg
idTokenSigningAlg) {
+ this.idTokenSigningAlg = idTokenSigningAlg;
+ }
+
+ public OIDCTokenEncryptionAlg getIdTokenEncryptionAlg() {
+ return idTokenEncryptionAlg;
+ }
+
+ public void setIdTokenEncryptionAlg(final OIDCTokenEncryptionAlg
idTokenEncryptionAlg) {
+ this.idTokenEncryptionAlg = idTokenEncryptionAlg;
+ }
+
+ public OIDCTokenEncryptionEncoding getIdTokenEncryptionEncoding() {
+ return idTokenEncryptionEncoding;
+ }
+
+ public void setIdTokenEncryptionEncoding(final OIDCTokenEncryptionEncoding
idTokenEncryptionEncoding) {
+ this.idTokenEncryptionEncoding = idTokenEncryptionEncoding;
+ }
+
+ public OIDCTokenSigningAlg getUserInfoSigningAlg() {
+ return userInfoSigningAlg;
+ }
+
+ public void setUserInfoSigningAlg(final OIDCTokenSigningAlg
userInfoSigningAlg) {
+ this.userInfoSigningAlg = userInfoSigningAlg;
+ }
+
+ public OIDCTokenEncryptionAlg getUserInfoEncryptedResponseAlg() {
+ return userInfoEncryptedResponseAlg;
+ }
+
+ public void setUserInfoEncryptedResponseAlg(final OIDCTokenEncryptionAlg
userInfoEncryptedResponseAlg) {
+ this.userInfoEncryptedResponseAlg = userInfoEncryptedResponseAlg;
+ }
+
+ public OIDCTokenEncryptionEncoding getUserInfoEncryptedResponseEncoding() {
+ return userInfoEncryptedResponseEncoding;
+ }
+
+ public void setUserInfoEncryptedResponseEncoding(final
OIDCTokenEncryptionEncoding encoding) {
+ this.userInfoEncryptedResponseEncoding = encoding;
+ }
+
public OIDCSubjectType getSubjectType() {
return subjectType;
}
@@ -126,6 +212,14 @@ public class OIDCRPClientAppTO extends ClientAppTO {
this.subjectType = subjectType;
}
+ public OIDCApplicationType getApplicationType() {
+ return applicationType;
+ }
+
+ public void setApplicationType(final OIDCApplicationType applicationType) {
+ this.applicationType = applicationType;
+ }
+
public boolean isJwtAccessToken() {
return jwtAccessToken;
}
@@ -205,11 +299,20 @@ public class OIDCRPClientAppTO extends ClientAppTO {
.appendSuper(super.equals(obj))
.append(this.clientId, rhs.clientId)
.append(this.clientSecret, rhs.clientSecret)
+ .append(this.idTokenIssuer, rhs.idTokenIssuer)
.append(this.signIdToken, rhs.signIdToken)
+ .append(this.idTokenSigningAlg, rhs.idTokenSigningAlg)
+ .append(this.encryptIdToken, rhs.encryptIdToken)
+ .append(this.idTokenEncryptionAlg, rhs.idTokenEncryptionAlg)
+ .append(this.idTokenEncryptionEncoding,
rhs.idTokenEncryptionEncoding)
+ .append(this.userInfoSigningAlg, rhs.userInfoSigningAlg)
+ .append(this.userInfoEncryptedResponseAlg,
rhs.userInfoEncryptedResponseAlg)
+ .append(this.userInfoEncryptedResponseEncoding,
rhs.userInfoEncryptedResponseEncoding)
.append(this.jwtAccessToken, rhs.jwtAccessToken)
.append(this.bypassApprovalPrompt, rhs.bypassApprovalPrompt)
.append(this.generateRefreshToken, rhs.generateRefreshToken)
.append(this.subjectType, rhs.subjectType)
+ .append(this.applicationType, rhs.applicationType)
.append(this.redirectUris, rhs.redirectUris)
.append(this.supportedGrantTypes, rhs.supportedGrantTypes)
.append(this.supportedResponseTypes,
rhs.supportedResponseTypes)
@@ -227,11 +330,20 @@ public class OIDCRPClientAppTO extends ClientAppTO {
.appendSuper(super.hashCode())
.append(clientId)
.append(clientSecret)
+ .append(idTokenIssuer)
.append(signIdToken)
+ .append(idTokenSigningAlg)
+ .append(encryptIdToken)
+ .append(idTokenEncryptionAlg)
+ .append(idTokenEncryptionEncoding)
+ .append(userInfoSigningAlg)
+ .append(userInfoEncryptedResponseAlg)
+ .append(userInfoEncryptedResponseEncoding)
.append(jwtAccessToken)
.append(bypassApprovalPrompt)
.append(generateRefreshToken)
.append(subjectType)
+ .append(applicationType)
.append(redirectUris)
.append(supportedGrantTypes)
.append(supportedResponseTypes)
diff --git
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCApplicationType.java
similarity index 75%
copy from
common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
copy to
common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCApplicationType.java
index 837f80ec3d..9d5f8d1383 100644
---
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
+++
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCApplicationType.java
@@ -18,11 +18,17 @@
*/
package org.apache.syncope.common.lib.types;
-public enum OIDCGrantType {
- authorization_code,
- password,
- client_credentials,
- refresh_token,
- device_code;
+public enum OIDCApplicationType {
+ WEB("web"),
+ NATIVE("native");
+ private final String externalForm;
+
+ OIDCApplicationType(final String external) {
+ this.externalForm = external;
+ }
+
+ public String getExternalForm() {
+ return externalForm;
+ }
}
diff --git
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
index 837f80ec3d..de392c65e6 100644
---
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
+++
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
@@ -19,10 +19,22 @@
package org.apache.syncope.common.lib.types;
public enum OIDCGrantType {
- authorization_code,
- password,
- client_credentials,
- refresh_token,
- device_code;
+ authorization_code("authorization_code"),
+ password("password"),
+ client_credentials("client_credentials"),
+ refresh_token("refresh_token"),
+ ciba("urn:openid:params:grant-type:ciba"),
+ token_exchange("urn:ietf:params:oauth:grant-type:token-exchange"),
+ device_code("urn:ietf:params:oauth:grant-type:device_code"),
+ uma_ticket("urn:ietf:params:oauth:grant-type:uma-ticket");
+ private final String externalForm;
+
+ OIDCGrantType(final String external) {
+ this.externalForm = external;
+ }
+
+ public String getExternalForm() {
+ return externalForm;
+ }
}
diff --git
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCSubjectType.java
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCSubjectType.java
index 9a1caeca9b..4fa75b1753 100644
---
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCSubjectType.java
+++
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCSubjectType.java
@@ -19,7 +19,16 @@
package org.apache.syncope.common.lib.types;
public enum OIDCSubjectType {
- PAIRWISE,
- PUBLIC
+ PUBLIC("public"),
+ PAIRWISE("pairwise");
+ private final String externalForm;
+
+ OIDCSubjectType(final String external) {
+ this.externalForm = external;
+ }
+
+ public String getExternalForm() {
+ return externalForm;
+ }
}
diff --git
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCTokenEncryptionAlg.java
similarity index 57%
copy from
common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
copy to
common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCTokenEncryptionAlg.java
index 837f80ec3d..0c2b813d7e 100644
---
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
+++
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCTokenEncryptionAlg.java
@@ -18,11 +18,30 @@
*/
package org.apache.syncope.common.lib.types;
-public enum OIDCGrantType {
- authorization_code,
- password,
- client_credentials,
- refresh_token,
- device_code;
+public enum OIDCTokenEncryptionAlg {
+ none("none"),
+ RSA1("RSA1_5"),
+ RSA_OAEP("RSA-OAEP"),
+ RSA_OAEP_256("RSA-OAEP-256"),
+ A128KW("A128KW"),
+ A192KW("A192KW"),
+ A256KW("A256KW"),
+ A128GCMKW("A128GCMKW"),
+ A192GCMKW("A192GCMKW"),
+ A256GCMKW("A256GCMKW"),
+ ECDH_ES("ECDH-ES"),
+ ECDH_ES_A128KW("ECDH-ES+A128KW"),
+ ECDH_ES_A192KW("ECDH-ES+A192KW"),
+ ECDH_ES_A256KW("ECDH-ES+A256KW");
+
+ private final String externalForm;
+
+ OIDCTokenEncryptionAlg(final String external) {
+ this.externalForm = external;
+ }
+
+ public String getExternalForm() {
+ return externalForm;
+ }
}
diff --git
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCTokenEncryptionEncoding.java
similarity index 66%
copy from
common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
copy to
common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCTokenEncryptionEncoding.java
index 837f80ec3d..6e39797249 100644
---
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
+++
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCTokenEncryptionEncoding.java
@@ -18,11 +18,22 @@
*/
package org.apache.syncope.common.lib.types;
-public enum OIDCGrantType {
- authorization_code,
- password,
- client_credentials,
- refresh_token,
- device_code;
+public enum OIDCTokenEncryptionEncoding {
+ A128CBC_HS256("A128CBC-HS256"),
+ A192CBC_HS384("A192CBC-HS384"),
+ A256CBC_HS512("A256CBC-HS512"),
+ A128GCM("A128GCM"),
+ A192GCM("A192GCM"),
+ A256GCM("A256GCM");
+
+ private final String externalForm;
+
+ OIDCTokenEncryptionEncoding(final String external) {
+ this.externalForm = external;
+ }
+
+ public String getExternalForm() {
+ return externalForm;
+ }
}
diff --git
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCTokenSigningAlg.java
similarity index 82%
copy from
common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
copy to
common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCTokenSigningAlg.java
index 837f80ec3d..0751147b95 100644
---
a/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCGrantType.java
+++
b/common/am/lib/src/main/java/org/apache/syncope/common/lib/types/OIDCTokenSigningAlg.java
@@ -18,11 +18,19 @@
*/
package org.apache.syncope.common.lib.types;
-public enum OIDCGrantType {
- authorization_code,
- password,
- client_credentials,
- refresh_token,
- device_code;
+public enum OIDCTokenSigningAlg {
+ none,
+ RS256,
+ RS384,
+ RS512,
+ PS256,
+ PS384,
+ PS512,
+ ES256,
+ ES384,
+ ES512,
+ HS256,
+ HS384,
+ HS512;
}
diff --git
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/am/OIDCRPClientApp.java
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/am/OIDCRPClientApp.java
index ddcfc8ce02..6eb3a3b655 100644
---
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/am/OIDCRPClientApp.java
+++
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/am/OIDCRPClientApp.java
@@ -19,10 +19,14 @@
package org.apache.syncope.core.persistence.api.entity.am;
import java.util.Set;
+import org.apache.syncope.common.lib.types.OIDCApplicationType;
import org.apache.syncope.common.lib.types.OIDCClientAuthenticationMethod;
import org.apache.syncope.common.lib.types.OIDCGrantType;
import org.apache.syncope.common.lib.types.OIDCResponseType;
import org.apache.syncope.common.lib.types.OIDCSubjectType;
+import org.apache.syncope.common.lib.types.OIDCTokenEncryptionAlg;
+import org.apache.syncope.common.lib.types.OIDCTokenEncryptionEncoding;
+import org.apache.syncope.common.lib.types.OIDCTokenSigningAlg;
public interface OIDCRPClientApp extends ClientApp {
@@ -42,10 +46,42 @@ public interface OIDCRPClientApp extends ClientApp {
Set<String> getScopes();
+ String getIdTokenIssuer();
+
+ void setIdTokenIssuer(String idTokenIssuer);
+
boolean isSignIdToken();
void setSignIdToken(boolean signIdToken);
+ OIDCTokenSigningAlg getIdTokenSigningAlg();
+
+ void setIdTokenSigningAlg(OIDCTokenSigningAlg idTokenSigningAlg);
+
+ boolean isEncryptIdToken();
+
+ void setEncryptIdToken(boolean encryptIdToken);
+
+ OIDCTokenEncryptionAlg getIdTokenEncryptionAlg();
+
+ void setIdTokenEncryptionAlg(OIDCTokenEncryptionAlg idTokenEncryptionAlg);
+
+ OIDCTokenEncryptionEncoding getIdTokenEncryptionEncoding();
+
+ void setIdTokenEncryptionEncoding(OIDCTokenEncryptionEncoding
idTokenEncryptionEncoding);
+
+ OIDCTokenSigningAlg getUserInfoSigningAlg();
+
+ void setUserInfoSigningAlg(OIDCTokenSigningAlg userInfoSigningAlg);
+
+ OIDCTokenEncryptionAlg getUserInfoEncryptedResponseAlg();
+
+ void setUserInfoEncryptedResponseAlg(OIDCTokenEncryptionAlg
userInfoEncryptedResponseAlg);
+
+ OIDCTokenEncryptionEncoding getUserInfoEncryptedResponseEncoding();
+
+ void setUserInfoEncryptedResponseEncoding(OIDCTokenEncryptionEncoding
encoding);
+
boolean isJwtAccessToken();
void setJwtAccessToken(boolean jwtAccessToken);
@@ -62,6 +98,10 @@ public interface OIDCRPClientApp extends ClientApp {
void setSubjectType(OIDCSubjectType subjectType);
+ OIDCApplicationType getApplicationType();
+
+ void setApplicationType(OIDCApplicationType applicationType);
+
String getJwks();
void setJwks(String jwks);
diff --git
a/core/persistence-common/src/main/java/org/apache/syncope/core/persistence/common/dao/AbstractAnySearchDAO.java
b/core/persistence-common/src/main/java/org/apache/syncope/core/persistence/common/dao/AbstractAnySearchDAO.java
index 082ce0aafa..fb3c3731a2 100644
---
a/core/persistence-common/src/main/java/org/apache/syncope/core/persistence/common/dao/AbstractAnySearchDAO.java
+++
b/core/persistence-common/src/main/java/org/apache/syncope/core/persistence/common/dao/AbstractAnySearchDAO.java
@@ -237,7 +237,7 @@ public abstract class AbstractAnySearchDAO implements
AnySearchDAO {
Pageable pageable,
AnyTypeKind kind);
- protected Pair<PlainSchema, PlainAttrValue> check(final AttrCond cond,
final AnyTypeKind kind) {
+ protected Pair<PlainSchema, PlainAttrValue> check(final AttrCond cond) {
PlainSchema schema = plainSchemaDAO.findById(cond.getSchema()).
orElseThrow(() -> new IllegalArgumentException("Invalid schema
" + cond.getSchema()));
diff --git
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAAnySearchDAO.java
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAAnySearchDAO.java
index 5dad3a5461..8a397077c1 100644
---
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAAnySearchDAO.java
+++
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAAnySearchDAO.java
@@ -234,7 +234,7 @@ abstract class AbstractJPAAnySearchDAO extends
AbstractAnySearchDAO {
map(anyCond -> getQuery(anyCond, not, parameters,
svs)).
or(() -> cond.asLeaf(AttrCond.class).
map(attrCond -> {
- Pair<PlainSchema, PlainAttrValue> checked =
check(attrCond, svs.anyTypeKind);
+ Pair<PlainSchema, PlainAttrValue> checked =
check(attrCond);
Pair<Boolean, AnySearchNode> query =
getQuery(attrCond, not, checked, parameters, svs);
if (query.getLeft()) {
plainSchemas.add(checked.getLeft().getKey());
diff --git
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/am/JPAOIDCRPClientApp.java
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/am/JPAOIDCRPClientApp.java
index e1c7bbe824..0ced79e62d 100644
---
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/am/JPAOIDCRPClientApp.java
+++
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/am/JPAOIDCRPClientApp.java
@@ -33,10 +33,14 @@ import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import java.util.HashSet;
import java.util.Set;
+import org.apache.syncope.common.lib.types.OIDCApplicationType;
import org.apache.syncope.common.lib.types.OIDCClientAuthenticationMethod;
import org.apache.syncope.common.lib.types.OIDCGrantType;
import org.apache.syncope.common.lib.types.OIDCResponseType;
import org.apache.syncope.common.lib.types.OIDCSubjectType;
+import org.apache.syncope.common.lib.types.OIDCTokenEncryptionAlg;
+import org.apache.syncope.common.lib.types.OIDCTokenEncryptionEncoding;
+import org.apache.syncope.common.lib.types.OIDCTokenSigningAlg;
import org.apache.syncope.core.persistence.api.entity.am.OIDCRPClientApp;
import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
@@ -68,7 +72,29 @@ public class JPAOIDCRPClientApp extends AbstractClientApp
implements OIDCRPClien
private String clientSecret;
- private boolean signIdToken;
+ private String idTokenIssuer;
+
+ private boolean signIdToken = true;
+
+ @Enumerated(EnumType.STRING)
+ private OIDCTokenSigningAlg idTokenSigningAlg = OIDCTokenSigningAlg.none;
+
+ private boolean encryptIdToken;
+
+ @Enumerated(EnumType.STRING)
+ private OIDCTokenEncryptionAlg idTokenEncryptionAlg =
OIDCTokenEncryptionAlg.none;
+
+ @Enumerated(EnumType.STRING)
+ private OIDCTokenEncryptionEncoding idTokenEncryptionEncoding;
+
+ @Enumerated(EnumType.STRING)
+ private OIDCTokenSigningAlg userInfoSigningAlg;
+
+ @Enumerated(EnumType.STRING)
+ private OIDCTokenEncryptionAlg userInfoEncryptedResponseAlg;
+
+ @Enumerated(EnumType.STRING)
+ private OIDCTokenEncryptionEncoding userInfoEncryptedResponseEncoding;
private boolean jwtAccessToken;
@@ -77,7 +103,10 @@ public class JPAOIDCRPClientApp extends AbstractClientApp
implements OIDCRPClien
private boolean generateRefreshToken = true;
@Enumerated(EnumType.STRING)
- private OIDCSubjectType subjectType;
+ private OIDCSubjectType subjectType = OIDCSubjectType.PUBLIC;
+
+ @Enumerated(EnumType.STRING)
+ private OIDCApplicationType applicationType = OIDCApplicationType.WEB;
@Lob
private String redirectUris;
@@ -138,6 +167,16 @@ public class JPAOIDCRPClientApp extends AbstractClientApp
implements OIDCRPClien
this.clientSecret = clientSecret;
}
+ @Override
+ public String getIdTokenIssuer() {
+ return idTokenIssuer;
+ }
+
+ @Override
+ public void setIdTokenIssuer(final String idTokenIssuer) {
+ this.idTokenIssuer = idTokenIssuer;
+ }
+
@Override
public boolean isSignIdToken() {
return signIdToken;
@@ -148,6 +187,76 @@ public class JPAOIDCRPClientApp extends AbstractClientApp
implements OIDCRPClien
this.signIdToken = signIdToken;
}
+ @Override
+ public OIDCTokenSigningAlg getIdTokenSigningAlg() {
+ return idTokenSigningAlg;
+ }
+
+ @Override
+ public void setIdTokenSigningAlg(final OIDCTokenSigningAlg
idTokenSigningAlg) {
+ this.idTokenSigningAlg = idTokenSigningAlg;
+ }
+
+ @Override
+ public boolean isEncryptIdToken() {
+ return encryptIdToken;
+ }
+
+ @Override
+ public void setEncryptIdToken(final boolean encryptIdToken) {
+ this.encryptIdToken = encryptIdToken;
+ }
+
+ @Override
+ public OIDCTokenEncryptionAlg getIdTokenEncryptionAlg() {
+ return idTokenEncryptionAlg;
+ }
+
+ @Override
+ public void setIdTokenEncryptionAlg(final OIDCTokenEncryptionAlg
idTokenEncryptionAlg) {
+ this.idTokenEncryptionAlg = idTokenEncryptionAlg;
+ }
+
+ @Override
+ public OIDCTokenEncryptionEncoding getIdTokenEncryptionEncoding() {
+ return idTokenEncryptionEncoding;
+ }
+
+ @Override
+ public void setIdTokenEncryptionEncoding(final OIDCTokenEncryptionEncoding
idTokenEncryptionEncoding) {
+ this.idTokenEncryptionEncoding = idTokenEncryptionEncoding;
+ }
+
+ @Override
+ public OIDCTokenSigningAlg getUserInfoSigningAlg() {
+ return userInfoSigningAlg;
+ }
+
+ @Override
+ public void setUserInfoSigningAlg(final OIDCTokenSigningAlg
userInfoSigningAlg) {
+ this.userInfoSigningAlg = userInfoSigningAlg;
+ }
+
+ @Override
+ public OIDCTokenEncryptionAlg getUserInfoEncryptedResponseAlg() {
+ return userInfoEncryptedResponseAlg;
+ }
+
+ @Override
+ public void setUserInfoEncryptedResponseAlg(final OIDCTokenEncryptionAlg
userInfoEncryptedResponseAlg) {
+ this.userInfoEncryptedResponseAlg = userInfoEncryptedResponseAlg;
+ }
+
+ @Override
+ public OIDCTokenEncryptionEncoding getUserInfoEncryptedResponseEncoding() {
+ return userInfoEncryptedResponseEncoding;
+ }
+
+ @Override
+ public void setUserInfoEncryptedResponseEncoding(final
OIDCTokenEncryptionEncoding encoding) {
+ this.userInfoEncryptedResponseEncoding = encoding;
+ }
+
@Override
public boolean isJwtAccessToken() {
return jwtAccessToken;
@@ -188,6 +297,16 @@ public class JPAOIDCRPClientApp extends AbstractClientApp
implements OIDCRPClien
this.subjectType = subjectType;
}
+ @Override
+ public OIDCApplicationType getApplicationType() {
+ return applicationType;
+ }
+
+ @Override
+ public void setApplicationType(final OIDCApplicationType applicationType) {
+ this.applicationType = applicationType;
+ }
+
@Override
public Set<OIDCGrantType> getSupportedGrantTypes() {
return supportedGrantTypesSet;
diff --git
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java
index f9c99dff7c..3ae751c2ff 100644
---
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java
+++
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java
@@ -383,7 +383,6 @@ public class Neo4jAnySearchDAO extends AbstractAnySearchDAO
{
}
protected void fillAttrQuery(
- final AnyUtils anyUtils,
final TextStringBuilder query,
final PlainAttrValue attrValue,
final PlainSchema schema,
@@ -393,16 +392,16 @@ public class Neo4jAnySearchDAO extends
AbstractAnySearchDAO {
if (not && cond.getType() == AttrCond.Type.ISNULL) {
cond.setType(AttrCond.Type.ISNOTNULL);
- fillAttrQuery(anyUtils, query, attrValue, schema, cond, true,
parameters);
+ fillAttrQuery(query, attrValue, schema, cond, true, parameters);
return;
}
if (not) {
if (schema.isUniqueConstraint()) {
- fillAttrQuery(anyUtils, query, attrValue, schema, cond, false,
parameters);
+ fillAttrQuery(query, attrValue, schema, cond, false,
parameters);
query.replaceFirst("WHERE", "WHERE NOT(");
query.append(')');
} else {
- fillAttrQuery(anyUtils, query, attrValue, schema, cond, false,
parameters);
+ fillAttrQuery(query, attrValue, schema, cond, false,
parameters);
query.replaceAll("any(", schema.getKey() + " IS NULL OR
none(");
}
return;
@@ -513,7 +512,7 @@ public class Neo4jAnySearchDAO extends AbstractAnySearchDAO
{
final TextStringBuilder query,
final PlainAttrValue attrValue,
final PlainSchema schema,
- final AttrCond cond,
+ final AnyCond cond,
final boolean not,
final Map<String, Object> parameters) {
@@ -672,23 +671,17 @@ public class Neo4jAnySearchDAO extends
AbstractAnySearchDAO {
TextStringBuilder query = new TextStringBuilder("MATCH (n) WHERE ");
- plainSchemaDAO.findById(cond.getSchema()).ifPresentOrElse(
- schema -> fillAttrQuery(
- anyUtilsFactory.getInstance(kind),
- query, checked.getMiddle(), checked.getLeft(),
checked.getRight(), not, parameters),
- () -> fillAttrQuery(
- query, checked.getMiddle(), checked.getLeft(),
checked.getRight(), not, parameters));
+ fillAttrQuery(query, checked.getMiddle(), checked.getLeft(),
checked.getRight(), not, parameters);
return Pair.of(query.toString(), checked.getRight().getSchema());
}
protected Pair<String, PlainSchema> getQuery(
- final AnyTypeKind kind,
final AttrCond cond,
final boolean not,
final Map<String, Object> parameters) {
- Pair<PlainSchema, PlainAttrValue> checked = check(cond, kind);
+ Pair<PlainSchema, PlainAttrValue> checked = check(cond);
TextStringBuilder query = new TextStringBuilder("MATCH (n) ");
switch (cond.getType()) {
@@ -699,9 +692,7 @@ public class Neo4jAnySearchDAO extends AbstractAnySearchDAO
{
query.append("WHERE
n.`plainAttrs.").append(checked.getLeft().getKey()).append("` IS NULL");
default ->
- fillAttrQuery(
- anyUtilsFactory.getInstance(kind),
- query, checked.getRight(), checked.getLeft(), cond,
not, parameters);
+ fillAttrQuery(query, checked.getRight(), checked.getLeft(),
cond, not, parameters);
}
return Pair.of(query.toString(), checked.getLeft());
@@ -781,7 +772,7 @@ public class Neo4jAnySearchDAO extends AbstractAnySearchDAO
{
Optional.ofNullable(anyCondResult.getRight()).ifPresent(involvedFields::add);
},
() -> cond.asLeaf(AttrCond.class).ifPresent(leaf -> {
- Pair<String, PlainSchema> attrCondResult =
getQuery(kind, leaf, not, parameters);
+ Pair<String, PlainSchema> attrCondResult =
getQuery(leaf, not, parameters);
query.append(attrCondResult.getLeft());
involvedPlainSchemas.add(attrCondResult.getRight());
if (kind != AnyTypeKind.GROUP
diff --git
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/entity/am/Neo4jOIDCRPClientApp.java
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/entity/am/Neo4jOIDCRPClientApp.java
index 677d2d8f24..2e6d41b6ce 100644
---
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/entity/am/Neo4jOIDCRPClientApp.java
+++
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/entity/am/Neo4jOIDCRPClientApp.java
@@ -22,10 +22,14 @@ import com.fasterxml.jackson.core.type.TypeReference;
import jakarta.validation.constraints.NotNull;
import java.util.HashSet;
import java.util.Set;
+import org.apache.syncope.common.lib.types.OIDCApplicationType;
import org.apache.syncope.common.lib.types.OIDCClientAuthenticationMethod;
import org.apache.syncope.common.lib.types.OIDCGrantType;
import org.apache.syncope.common.lib.types.OIDCResponseType;
import org.apache.syncope.common.lib.types.OIDCSubjectType;
+import org.apache.syncope.common.lib.types.OIDCTokenEncryptionAlg;
+import org.apache.syncope.common.lib.types.OIDCTokenEncryptionEncoding;
+import org.apache.syncope.common.lib.types.OIDCTokenSigningAlg;
import org.apache.syncope.core.persistence.api.entity.am.OIDCRPClientApp;
import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
import org.springframework.data.annotation.Transient;
@@ -59,7 +63,23 @@ public class Neo4jOIDCRPClientApp extends AbstractClientApp
implements OIDCRPCli
private String clientSecret;
- private boolean signIdToken;
+ private String idTokenIssuer;
+
+ private boolean signIdToken = true;
+
+ private OIDCTokenSigningAlg idTokenSigningAlg = OIDCTokenSigningAlg.none;
+
+ private boolean encryptIdToken;
+
+ private OIDCTokenEncryptionAlg idTokenEncryptionAlg =
OIDCTokenEncryptionAlg.none;
+
+ private OIDCTokenEncryptionEncoding idTokenEncryptionEncoding;
+
+ private OIDCTokenSigningAlg userInfoSigningAlg;
+
+ private OIDCTokenEncryptionAlg userInfoEncryptedResponseAlg;
+
+ private OIDCTokenEncryptionEncoding userInfoEncryptedResponseEncoding;
private boolean jwtAccessToken;
@@ -67,7 +87,9 @@ public class Neo4jOIDCRPClientApp extends AbstractClientApp
implements OIDCRPCli
private boolean generateRefreshToken = true;
- private OIDCSubjectType subjectType;
+ private OIDCSubjectType subjectType = OIDCSubjectType.PUBLIC;
+
+ private OIDCApplicationType applicationType = OIDCApplicationType.WEB;
private String redirectUris;
@@ -122,6 +144,16 @@ public class Neo4jOIDCRPClientApp extends
AbstractClientApp implements OIDCRPCli
this.clientSecret = clientSecret;
}
+ @Override
+ public String getIdTokenIssuer() {
+ return idTokenIssuer;
+ }
+
+ @Override
+ public void setIdTokenIssuer(final String idTokenIssuer) {
+ this.idTokenIssuer = idTokenIssuer;
+ }
+
@Override
public boolean isSignIdToken() {
return signIdToken;
@@ -132,6 +164,76 @@ public class Neo4jOIDCRPClientApp extends
AbstractClientApp implements OIDCRPCli
this.signIdToken = signIdToken;
}
+ @Override
+ public OIDCTokenSigningAlg getIdTokenSigningAlg() {
+ return idTokenSigningAlg;
+ }
+
+ @Override
+ public void setIdTokenSigningAlg(final OIDCTokenSigningAlg
idTokenSigningAlg) {
+ this.idTokenSigningAlg = idTokenSigningAlg;
+ }
+
+ @Override
+ public boolean isEncryptIdToken() {
+ return encryptIdToken;
+ }
+
+ @Override
+ public void setEncryptIdToken(final boolean encryptIdToken) {
+ this.encryptIdToken = encryptIdToken;
+ }
+
+ @Override
+ public OIDCTokenEncryptionAlg getIdTokenEncryptionAlg() {
+ return idTokenEncryptionAlg;
+ }
+
+ @Override
+ public void setIdTokenEncryptionAlg(final OIDCTokenEncryptionAlg
idTokenEncryptionAlg) {
+ this.idTokenEncryptionAlg = idTokenEncryptionAlg;
+ }
+
+ @Override
+ public OIDCTokenEncryptionEncoding getIdTokenEncryptionEncoding() {
+ return idTokenEncryptionEncoding;
+ }
+
+ @Override
+ public void setIdTokenEncryptionEncoding(final OIDCTokenEncryptionEncoding
idTokenEncryptionEncoding) {
+ this.idTokenEncryptionEncoding = idTokenEncryptionEncoding;
+ }
+
+ @Override
+ public OIDCTokenSigningAlg getUserInfoSigningAlg() {
+ return userInfoSigningAlg;
+ }
+
+ @Override
+ public void setUserInfoSigningAlg(final OIDCTokenSigningAlg
userInfoSigningAlg) {
+ this.userInfoSigningAlg = userInfoSigningAlg;
+ }
+
+ @Override
+ public OIDCTokenEncryptionAlg getUserInfoEncryptedResponseAlg() {
+ return userInfoEncryptedResponseAlg;
+ }
+
+ @Override
+ public void setUserInfoEncryptedResponseAlg(final OIDCTokenEncryptionAlg
userInfoEncryptedResponseAlg) {
+ this.userInfoEncryptedResponseAlg = userInfoEncryptedResponseAlg;
+ }
+
+ @Override
+ public OIDCTokenEncryptionEncoding getUserInfoEncryptedResponseEncoding() {
+ return userInfoEncryptedResponseEncoding;
+ }
+
+ @Override
+ public void setUserInfoEncryptedResponseEncoding(final
OIDCTokenEncryptionEncoding encoding) {
+ this.userInfoEncryptedResponseEncoding = encoding;
+ }
+
@Override
public boolean isJwtAccessToken() {
return jwtAccessToken;
@@ -172,6 +274,16 @@ public class Neo4jOIDCRPClientApp extends
AbstractClientApp implements OIDCRPCli
this.subjectType = subjectType;
}
+ @Override
+ public OIDCApplicationType getApplicationType() {
+ return applicationType;
+ }
+
+ @Override
+ public void setApplicationType(final OIDCApplicationType applicationType) {
+ this.applicationType = applicationType;
+ }
+
@Override
public Set<OIDCGrantType> getSupportedGrantTypes() {
return supportedGrantTypesSet;
diff --git
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ClientAppDataBinderImpl.java
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ClientAppDataBinderImpl.java
index 6610416087..9ffd3d6211 100644
---
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ClientAppDataBinderImpl.java
+++
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ClientAppDataBinderImpl.java
@@ -104,13 +104,13 @@ public class ClientAppDataBinderImpl implements
ClientAppDataBinder {
protected SAML2SPClientApp doCreate(final SAML2SPClientAppTO clientAppTO) {
SAML2SPClientApp saml2sp =
entityFactory.newEntity(SAML2SPClientApp.class);
- update(saml2sp, clientAppTO);
+ doUpdate(saml2sp, clientAppTO);
return saml2sp;
}
protected CASSPClientApp doCreate(final CASSPClientAppTO clientAppTO) {
CASSPClientApp saml2sp = entityFactory.newEntity(CASSPClientApp.class);
- update(saml2sp, clientAppTO);
+ doUpdate(saml2sp, clientAppTO);
return saml2sp;
}
@@ -215,20 +215,29 @@ public class ClientAppDataBinderImpl implements
ClientAppDataBinder {
protected OIDCRPClientApp doCreate(final OIDCRPClientAppTO clientAppTO) {
OIDCRPClientApp oidcrp =
entityFactory.newEntity(OIDCRPClientApp.class);
- update(oidcrp, clientAppTO);
+ doUpdate(oidcrp, clientAppTO);
return oidcrp;
}
protected void doUpdate(final OIDCRPClientApp clientApp, final
OIDCRPClientAppTO clientAppTO) {
copyToEntity(clientApp, clientAppTO);
- clientApp.setClientSecret(clientAppTO.getClientSecret());
clientApp.setClientId(clientAppTO.getClientId());
+ clientApp.setClientSecret(clientAppTO.getClientSecret());
+ clientApp.setIdTokenIssuer(clientAppTO.getIdTokenIssuer());
clientApp.setSignIdToken(clientAppTO.isSignIdToken());
+ clientApp.setIdTokenSigningAlg(clientAppTO.getIdTokenSigningAlg());
+ clientApp.setEncryptIdToken(clientAppTO.isEncryptIdToken());
+
clientApp.setIdTokenEncryptionAlg(clientAppTO.getIdTokenEncryptionAlg());
+
clientApp.setIdTokenEncryptionEncoding(clientAppTO.getIdTokenEncryptionEncoding());
+ clientApp.setUserInfoSigningAlg(clientAppTO.getUserInfoSigningAlg());
+
clientApp.setUserInfoEncryptedResponseAlg(clientAppTO.getUserInfoEncryptedResponseAlg());
+
clientApp.setUserInfoEncryptedResponseEncoding(clientAppTO.getUserInfoEncryptedResponseEncoding());
clientApp.setJwtAccessToken(clientAppTO.isJwtAccessToken());
clientApp.setBypassApprovalPrompt(clientAppTO.isBypassApprovalPrompt());
clientApp.setGenerateRefreshToken(clientAppTO.isGenerateRefreshToken());
clientApp.setSubjectType(clientAppTO.getSubjectType());
+ clientApp.setApplicationType(clientAppTO.getApplicationType());
clientApp.getRedirectUris().clear();
clientApp.getRedirectUris().addAll(clientAppTO.getRedirectUris());
clientApp.getSupportedGrantTypes().clear();
@@ -249,16 +258,27 @@ public class ClientAppDataBinderImpl implements
ClientAppDataBinder {
clientAppTO.setClientId(clientApp.getClientId());
clientAppTO.setClientSecret(clientApp.getClientSecret());
+ clientAppTO.setIdTokenIssuer(clientApp.getIdTokenIssuer());
clientAppTO.setSignIdToken(clientApp.isSignIdToken());
+ clientAppTO.setIdTokenSigningAlg(clientApp.getIdTokenSigningAlg());
+ clientAppTO.setEncryptIdToken(clientApp.isEncryptIdToken());
+
clientAppTO.setIdTokenEncryptionAlg(clientApp.getIdTokenEncryptionAlg());
+
clientAppTO.setIdTokenEncryptionEncoding(clientApp.getIdTokenEncryptionEncoding());
+ clientAppTO.setUserInfoSigningAlg(clientApp.getUserInfoSigningAlg());
+
clientAppTO.setUserInfoEncryptedResponseAlg(clientApp.getUserInfoEncryptedResponseAlg());
+
clientAppTO.setUserInfoEncryptedResponseEncoding(clientApp.getUserInfoEncryptedResponseEncoding());
+ clientAppTO.setJwtAccessToken(clientApp.isJwtAccessToken());
+
clientAppTO.setBypassApprovalPrompt(clientApp.isBypassApprovalPrompt());
+
clientAppTO.setGenerateRefreshToken(clientApp.isGenerateRefreshToken());
clientAppTO.setSubjectType(clientApp.getSubjectType());
+ clientAppTO.setApplicationType(clientApp.getApplicationType());
clientAppTO.getRedirectUris().addAll(clientApp.getRedirectUris());
+ clientAppTO.getSupportedGrantTypes().clear();
clientAppTO.getSupportedGrantTypes().addAll(clientApp.getSupportedGrantTypes());
+ clientAppTO.getSupportedResponseTypes().clear();
clientAppTO.getSupportedResponseTypes().addAll(clientApp.getSupportedResponseTypes());
clientAppTO.getScopes().addAll(clientApp.getScopes());
clientAppTO.setLogoutUri(clientApp.getLogoutUri());
- clientAppTO.setJwtAccessToken(clientApp.isJwtAccessToken());
-
clientAppTO.setBypassApprovalPrompt(clientApp.isBypassApprovalPrompt());
-
clientAppTO.setGenerateRefreshToken(clientApp.isGenerateRefreshToken());
clientAppTO.setJwks(clientApp.getJwks());
clientAppTO.setJwksUri(clientApp.getJwksUri());
clientAppTO.setTokenEndpointAuthenticationMethod(clientApp.getTokenEndpointAuthenticationMethod());
diff --git
a/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java
b/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java
index b62f2ba4e3..0f8db06f73 100644
---
a/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java
+++
b/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java
@@ -359,7 +359,7 @@ public class ElasticsearchAnySearchDAO extends
AbstractAnySearchDAO {
if (query == null) {
query = cond.asLeaf(AnyCond.class).map(ac -> getQuery(ac,
kind)).
- or(() -> cond.asLeaf(AttrCond.class).map(ac ->
getQuery(ac, kind))).
+ or(() ->
cond.asLeaf(AttrCond.class).map(this::getQuery)).
orElse(null);
}
@@ -594,8 +594,8 @@ public class ElasticsearchAnySearchDAO extends
AbstractAnySearchDAO {
return query;
}
- protected Query getQuery(final AttrCond cond, final AnyTypeKind kind) {
- Pair<PlainSchema, PlainAttrValue> checked = check(cond, kind);
+ protected Query getQuery(final AttrCond cond) {
+ Pair<PlainSchema, PlainAttrValue> checked = check(cond);
return fillAttrQuery(checked.getLeft(), checked.getRight(), cond);
}
diff --git
a/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java
b/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java
index bb9340c417..3ec387e77e 100644
---
a/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java
+++
b/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java
@@ -357,7 +357,7 @@ public class OpenSearchAnySearchDAO extends
AbstractAnySearchDAO {
if (query == null) {
query = cond.asLeaf(AnyCond.class).map(ac -> getQuery(ac,
kind)).
- or(() -> cond.asLeaf(AttrCond.class).map(ac ->
getQuery(ac, kind))).
+ or(() ->
cond.asLeaf(AttrCond.class).map(this::getQuery)).
orElse(null);
}
@@ -588,8 +588,8 @@ public class OpenSearchAnySearchDAO extends
AbstractAnySearchDAO {
return query;
}
- protected Query getQuery(final AttrCond cond, final AnyTypeKind kind) {
- Pair<PlainSchema, PlainAttrValue> checked = check(cond, kind);
+ protected Query getQuery(final AttrCond cond) {
+ Pair<PlainSchema, PlainAttrValue> checked = check(cond);
return fillAttrQuery(checked.getLeft(), checked.getRight(), cond);
}
diff --git a/pom.xml b/pom.xml
index 0dd1c47a8c..6dcac368b4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -507,7 +507,7 @@ under the License.
<docker.mysql.version>9.0</docker.mysql.version>
<docker.mariadb.version>11</docker.mariadb.version>
<docker.oracle.version>23-slim-faststart</docker.oracle.version>
- <docker.neo4j.version>5.26.1</docker.neo4j.version>
+ <docker.neo4j.version>5.26.2</docker.neo4j.version>
<jdbc.postgresql.version>42.7.5</jdbc.postgresql.version>
<jdbc.mysql.version>9.2.0</jdbc.mysql.version>
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 2ae5e10c37..0f5e528c0e 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
@@ -28,6 +28,8 @@ import org.apache.syncope.common.lib.to.ClientAppTO;
import org.apache.syncope.common.lib.to.OIDCRPClientAppTO;
import org.apache.syncope.common.lib.types.OIDCGrantType;
import org.apache.syncope.common.lib.types.OIDCResponseType;
+import org.apache.syncope.common.lib.types.OIDCTokenEncryptionAlg;
+import org.apache.syncope.common.lib.types.OIDCTokenSigningAlg;
import org.apache.syncope.common.lib.wa.WAClientApp;
import org.apereo.cas.oidc.claims.OidcCustomScopeAttributeReleasePolicy;
import org.apereo.cas.services.ChainingAttributeReleasePolicy;
@@ -63,17 +65,41 @@ public class OIDCRPClientAppTOMapper extends
AbstractClientAppMapper {
OIDCRPClientAppTO rp =
OIDCRPClientAppTO.class.cast(clientApp.getClientAppTO());
OidcRegisteredService service = new OidcRegisteredService();
+
setCommon(service, rp);
service.setServiceId(rp.getRedirectUris().stream().
filter(Objects::nonNull).
collect(Collectors.joining("|")));
+
service.setClientId(rp.getClientId());
service.setClientSecret(rp.getClientSecret());
+
+ service.setIdTokenIssuer(rp.getIdTokenIssuer());
service.setSignIdToken(rp.isSignIdToken());
- if (!service.isSignIdToken()) {
- service.setIdTokenSigningAlg("none");
+ if (service.isSignIdToken()) {
+ Optional.ofNullable(rp.getIdTokenSigningAlg()).
+ filter(v -> v != OIDCTokenSigningAlg.none).
+ ifPresent(v -> service.setIdTokenSigningAlg(v.name()));
+ } else {
+ service.setIdTokenSigningAlg(OIDCTokenSigningAlg.none.name());
}
+ service.setEncryptIdToken(rp.isEncryptIdToken());
+ if (service.isEncryptIdToken()) {
+ Optional.ofNullable(rp.getIdTokenEncryptionAlg()).
+ filter(v -> v != OIDCTokenEncryptionAlg.none).
+ ifPresent(v ->
service.setIdTokenEncryptionAlg(v.getExternalForm()));
+ Optional.ofNullable(rp.getIdTokenEncryptionEncoding()).
+ ifPresent(v ->
service.setIdTokenEncryptionEncoding(v.getExternalForm()));
+ } else {
+
service.setIdTokenEncryptionAlg(OIDCTokenEncryptionAlg.none.getExternalForm());
+ }
+ Optional.ofNullable(rp.getUserInfoSigningAlg()).ifPresent(v ->
service.setUserInfoSigningAlg(v.name()));
+ Optional.ofNullable(rp.getUserInfoEncryptedResponseAlg()).
+ ifPresent(v ->
service.setUserInfoEncryptedResponseAlg(v.getExternalForm()));
+ Optional.ofNullable(rp.getUserInfoEncryptedResponseEncoding()).
+ ifPresent(v ->
service.setUserInfoEncryptedResponseEncoding(v.getExternalForm()));
+
service.setJwtAccessToken(rp.isJwtAccessToken());
service.setBypassApprovalPrompt(rp.isBypassApprovalPrompt());
service.setGenerateRefreshToken(rp.isGenerateRefreshToken());
@@ -82,11 +108,12 @@ public class OIDCRPClientAppTOMapper extends
AbstractClientAppMapper {
} else {
service.setJwks(rp.getJwks());
}
+ Optional.ofNullable(rp.getSubjectType()).ifPresent(v ->
service.setSubjectType(v.getExternalForm()));
+ Optional.ofNullable(rp.getApplicationType()).ifPresent(v ->
service.setApplicationType(v.getExternalForm()));
service.setSupportedGrantTypes(rp.getSupportedGrantTypes().stream().
- map(OIDCGrantType::name).collect(Collectors.toSet()));
+
map(OIDCGrantType::getExternalForm).collect(Collectors.toSet()));
service.setSupportedResponseTypes(rp.getSupportedResponseTypes().stream().
map(OIDCResponseType::getExternalForm).collect(Collectors.toSet()));
- Optional.ofNullable(rp.getSubjectType()).ifPresent(st ->
service.setSubjectType(st.name()));
service.setLogoutUrl(rp.getLogoutUri());
service.setTokenEndpointAuthenticationMethod(rp.getTokenEndpointAuthenticationMethod().name());