blob: f3eb189ea20e3eaf1c4c74bc19939b532c098db5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.syncope.core.provisioning.java.data;
import org.apache.syncope.common.lib.SyncopeClientException;
import org.apache.syncope.common.lib.to.CASSPClientAppTO;
import org.apache.syncope.common.lib.to.ClientAppTO;
import org.apache.syncope.common.lib.to.OIDCRPClientAppTO;
import org.apache.syncope.common.lib.to.SAML2SPClientAppTO;
import org.apache.syncope.common.lib.types.ClientExceptionType;
import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
import org.apache.syncope.core.persistence.api.entity.EntityFactory;
import org.apache.syncope.core.persistence.api.entity.auth.ClientApp;
import org.apache.syncope.core.persistence.api.entity.policy.AccessPolicy;
import org.apache.syncope.core.persistence.api.entity.policy.AttrReleasePolicy;
import org.apache.syncope.core.persistence.api.entity.policy.AuthPolicy;
import org.apache.syncope.core.persistence.api.entity.policy.Policy;
import org.apache.syncope.core.provisioning.api.data.ClientAppDataBinder;
import org.apache.syncope.core.persistence.api.entity.auth.SAML2SPClientApp;
import org.apache.syncope.core.persistence.api.entity.auth.CASSPClientApp;
import org.apache.syncope.core.persistence.api.entity.auth.OIDCRPClientApp;
public class ClientAppDataBinderImpl implements ClientAppDataBinder {
protected final PolicyDAO policyDAO;
protected final EntityFactory entityFactory;
public ClientAppDataBinderImpl(final PolicyDAO policyDAO, final EntityFactory entityFactory) {
this.policyDAO = policyDAO;
this.entityFactory = entityFactory;
}
@Override
@SuppressWarnings("unchecked")
public <T extends ClientApp> T create(final ClientAppTO clientAppTO) {
if (clientAppTO instanceof SAML2SPClientAppTO) {
return (T) doCreate((SAML2SPClientAppTO) clientAppTO);
} else if (clientAppTO instanceof OIDCRPClientAppTO) {
return (T) doCreate((OIDCRPClientAppTO) clientAppTO);
} else if (clientAppTO instanceof CASSPClientAppTO) {
return (T) doCreate((CASSPClientAppTO) clientAppTO);
} else {
throw new IllegalArgumentException("Unsupported client app: " + clientAppTO.getClass().getName());
}
}
@Override
public <T extends ClientApp> void update(final T clientApp, final ClientAppTO clientAppTO) {
if (clientAppTO instanceof SAML2SPClientAppTO) {
doUpdate((SAML2SPClientApp) clientApp, (SAML2SPClientAppTO) clientAppTO);
} else if (clientAppTO instanceof OIDCRPClientAppTO) {
doUpdate((OIDCRPClientApp) clientApp, (OIDCRPClientAppTO) clientAppTO);
} else if (clientAppTO instanceof CASSPClientAppTO) {
doUpdate((CASSPClientApp) clientApp, (CASSPClientAppTO) clientAppTO);
} else {
throw new IllegalArgumentException("Unsupported client app: " + clientAppTO.getClass().getName());
}
}
@Override
@SuppressWarnings("unchecked")
public <T extends ClientAppTO> T getClientAppTO(final ClientApp clientApp) {
if (clientApp instanceof SAML2SPClientApp) {
return (T) getSAMLClientAppTO((SAML2SPClientApp) clientApp);
}
if (clientApp instanceof OIDCRPClientApp) {
return (T) getOIDCClientAppTO((OIDCRPClientApp) clientApp);
}
if (clientApp instanceof CASSPClientApp) {
return (T) getCASClientAppTO((CASSPClientApp) clientApp);
}
throw new IllegalArgumentException("Unsupported client app: " + clientApp.getClass().getName());
}
protected SAML2SPClientApp doCreate(final SAML2SPClientAppTO clientAppTO) {
SAML2SPClientApp saml2sp = entityFactory.newEntity(SAML2SPClientApp.class);
update(saml2sp, clientAppTO);
return saml2sp;
}
protected CASSPClientApp doCreate(final CASSPClientAppTO clientAppTO) {
CASSPClientApp saml2sp = entityFactory.newEntity(CASSPClientApp.class);
update(saml2sp, clientAppTO);
return saml2sp;
}
protected void doUpdate(final SAML2SPClientApp clientApp, final SAML2SPClientAppTO clientAppTO) {
copyToEntity(clientApp, clientAppTO);
clientApp.setEntityId(clientAppTO.getEntityId());
clientApp.setMetadataLocation(clientAppTO.getMetadataLocation());
clientApp.setMetadataSignatureLocation(clientAppTO.getMetadataSignatureLocation());
clientApp.setSignAssertions(clientAppTO.isSignAssertions());
clientApp.setSignResponses(clientAppTO.isSignResponses());
clientApp.setEncryptionOptional(clientAppTO.isEncryptionOptional());
clientApp.setEncryptAssertions(clientAppTO.isEncryptAssertions());
clientApp.setRequiredAuthenticationContextClass(clientAppTO.getRequiredAuthenticationContextClass());
clientApp.setRequiredNameIdFormat(clientAppTO.getRequiredNameIdFormat());
clientApp.setSkewAllowance(clientAppTO.getSkewAllowance());
clientApp.setNameIdQualifier(clientAppTO.getNameIdQualifier());
clientApp.getAssertionAudiences().clear();
clientApp.getAssertionAudiences().addAll(clientAppTO.getAssertionAudiences());
clientApp.setServiceProviderNameIdQualifier(clientAppTO.getServiceProviderNameIdQualifier());
clientApp.getSigningSignatureAlgorithms().clear();
clientApp.getSigningSignatureAlgorithms().addAll(
clientAppTO.getSigningSignatureAlgorithms());
clientApp.getSigningSignatureReferenceDigestMethods().clear();
clientApp.getSigningSignatureReferenceDigestMethods().addAll(
clientAppTO.getSigningSignatureReferenceDigestMethods());
clientApp.getEncryptionKeyAlgorithms().clear();
clientApp.getEncryptionKeyAlgorithms().addAll(
clientAppTO.getEncryptionKeyAlgorithms());
clientApp.getEncryptionDataAlgorithms().clear();
clientApp.getEncryptionDataAlgorithms().addAll(
clientAppTO.getEncryptionDataAlgorithms());
clientApp.getSigningSignatureBlackListedAlgorithms().clear();
clientApp.getSigningSignatureBlackListedAlgorithms().
addAll(clientAppTO.getSigningSignatureBlackListedAlgorithms());
clientApp.getEncryptionBlackListedAlgorithms().clear();
clientApp.getEncryptionBlackListedAlgorithms().addAll(
clientAppTO.getEncryptionBlackListedAlgorithms());
}
protected static void copyToTO(final ClientApp clientApp, final ClientAppTO clientAppTO) {
clientAppTO.setName(clientApp.getName());
clientAppTO.setKey(clientApp.getKey());
clientAppTO.setDescription(clientApp.getDescription());
clientAppTO.setClientAppId(clientApp.getClientAppId());
clientAppTO.setTheme(clientApp.getTheme());
if (clientApp.getAuthPolicy() != null) {
clientAppTO.setAuthPolicy(clientApp.getAuthPolicy().getKey());
}
if (clientApp.getAccessPolicy() != null) {
clientAppTO.setAccessPolicy(clientApp.getAccessPolicy().getKey());
}
if (clientApp.getAttrReleasePolicy() != null) {
clientAppTO.setAttrReleasePolicy(clientApp.getAttrReleasePolicy().getKey());
}
clientAppTO.getProperties().addAll(clientApp.getProperties());
}
protected static SAML2SPClientAppTO getSAMLClientAppTO(final SAML2SPClientApp clientApp) {
SAML2SPClientAppTO clientAppTO = new SAML2SPClientAppTO();
copyToTO(clientApp, clientAppTO);
clientAppTO.setEntityId(clientApp.getEntityId());
clientAppTO.setMetadataLocation(clientApp.getMetadataLocation());
clientAppTO.setMetadataSignatureLocation(clientApp.getMetadataSignatureLocation());
clientAppTO.setSignAssertions(clientApp.isSignAssertions());
clientAppTO.setSignResponses(clientApp.isSignResponses());
clientAppTO.setEncryptionOptional(clientApp.isEncryptionOptional());
clientAppTO.setEncryptAssertions(clientApp.isEncryptAssertions());
clientAppTO.setRequiredAuthenticationContextClass(clientApp.getRequiredAuthenticationContextClass());
clientAppTO.setRequiredNameIdFormat(clientApp.getRequiredNameIdFormat());
clientAppTO.setSkewAllowance(clientApp.getSkewAllowance());
clientAppTO.setNameIdQualifier(clientApp.getNameIdQualifier());
clientAppTO.getAssertionAudiences().addAll(clientApp.getAssertionAudiences());
clientAppTO.setServiceProviderNameIdQualifier(clientApp.getServiceProviderNameIdQualifier());
clientAppTO.getSigningSignatureAlgorithms().addAll(
clientApp.getSigningSignatureAlgorithms());
clientAppTO.getSigningSignatureReferenceDigestMethods().addAll(
clientApp.getSigningSignatureReferenceDigestMethods());
clientAppTO.getEncryptionKeyAlgorithms().addAll(
clientApp.getEncryptionKeyAlgorithms());
clientAppTO.getEncryptionDataAlgorithms().addAll(
clientApp.getEncryptionDataAlgorithms());
clientAppTO.getSigningSignatureBlackListedAlgorithms().addAll(
clientApp.getSigningSignatureBlackListedAlgorithms());
clientAppTO.getEncryptionBlackListedAlgorithms().addAll(
clientApp.getEncryptionBlackListedAlgorithms());
return clientAppTO;
}
protected OIDCRPClientApp doCreate(final OIDCRPClientAppTO clientAppTO) {
OIDCRPClientApp oidcrp = entityFactory.newEntity(OIDCRPClientApp.class);
update(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.setSignIdToken(clientAppTO.isSignIdToken());
clientApp.setJwtAccessToken(clientAppTO.isJwtAccessToken());
clientApp.setSubjectType(clientAppTO.getSubjectType());
clientApp.getRedirectUris().clear();
clientApp.getRedirectUris().addAll(clientAppTO.getRedirectUris());
clientApp.getSupportedGrantTypes().clear();
clientApp.getSupportedGrantTypes().addAll(clientAppTO.getSupportedGrantTypes());
clientApp.getSupportedResponseTypes().clear();
clientApp.getSupportedResponseTypes().addAll(clientAppTO.getSupportedResponseTypes());
clientApp.setLogoutUri(clientAppTO.getLogoutUri());
}
protected static OIDCRPClientAppTO getOIDCClientAppTO(final OIDCRPClientApp clientApp) {
OIDCRPClientAppTO clientAppTO = new OIDCRPClientAppTO();
copyToTO(clientApp, clientAppTO);
clientAppTO.setClientId(clientApp.getClientId());
clientAppTO.setClientSecret(clientApp.getClientSecret());
clientAppTO.setSignIdToken(clientApp.isSignIdToken());
clientAppTO.setSubjectType(clientApp.getSubjectType());
clientAppTO.getRedirectUris().addAll(clientApp.getRedirectUris());
clientAppTO.getSupportedGrantTypes().addAll(clientApp.getSupportedGrantTypes());
clientAppTO.getSupportedResponseTypes().addAll(clientApp.getSupportedResponseTypes());
clientAppTO.setLogoutUri(clientApp.getLogoutUri());
clientAppTO.setJwtAccessToken(clientApp.isJwtAccessToken());
return clientAppTO;
}
protected void doUpdate(final CASSPClientApp clientApp, final CASSPClientAppTO clientAppTO) {
copyToEntity(clientApp, clientAppTO);
clientApp.setServiceId(clientAppTO.getServiceId());
}
protected static CASSPClientAppTO getCASClientAppTO(final CASSPClientApp clientApp) {
CASSPClientAppTO clientAppTO = new CASSPClientAppTO();
copyToTO(clientApp, clientAppTO);
clientAppTO.setServiceId(clientApp.getServiceId());
return clientAppTO;
}
protected void copyToEntity(final ClientApp clientApp, final ClientAppTO clientAppTO) {
clientApp.setName(clientAppTO.getName());
clientApp.setClientAppId(clientAppTO.getClientAppId());
clientApp.setDescription(clientAppTO.getDescription());
clientApp.setTheme(clientAppTO.getTheme());
if (clientAppTO.getAuthPolicy() == null) {
clientApp.setAuthPolicy(null);
} else {
Policy policy = policyDAO.find(clientAppTO.getAuthPolicy());
if (policy instanceof AuthPolicy) {
clientApp.setAuthPolicy((AuthPolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + AuthPolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
if (clientAppTO.getAccessPolicy() == null) {
clientApp.setAccessPolicy(null);
} else {
Policy policy = policyDAO.find(clientAppTO.getAccessPolicy());
if (policy instanceof AccessPolicy) {
clientApp.setAccessPolicy((AccessPolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + AccessPolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
if (clientAppTO.getAttrReleasePolicy() == null) {
clientApp.setAttrReleasePolicy(null);
} else {
Policy policy = policyDAO.find(clientAppTO.getAttrReleasePolicy());
if (policy instanceof AttrReleasePolicy) {
clientApp.setAttrReleasePolicy((AttrReleasePolicy) policy);
} else {
SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidPolicy);
sce.getElements().add("Expected " + AttrReleasePolicy.class.getSimpleName()
+ ", found " + policy.getClass().getSimpleName());
throw sce;
}
}
clientApp.setProperties(clientAppTO.getProperties());
}
}