ModiApplicativiApiHelper.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.core.config.rs.server.api.impl.applicativi;
import java.util.Map;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.config.rs.server.api.impl.ProtocolPropertiesHelper;
import org.openspcoop2.core.config.rs.server.model.Applicativo;
import org.openspcoop2.core.config.rs.server.model.AuthenticationHttps;
import org.openspcoop2.core.config.rs.server.model.AuthenticationToken;
import org.openspcoop2.core.config.rs.server.model.DominioEnum;
import org.openspcoop2.core.config.rs.server.model.ModIApplicativoAuthenticationToken;
import org.openspcoop2.core.config.rs.server.model.ModIApplicativoEsterno;
import org.openspcoop2.core.config.rs.server.model.ModIApplicativoInterno;
import org.openspcoop2.core.config.rs.server.model.ModIApplicativoSicurezzaMessaggio;
import org.openspcoop2.core.config.rs.server.model.ModIKeyStoreArchive;
import org.openspcoop2.core.config.rs.server.model.ModIKeyStoreFileApplicativo;
import org.openspcoop2.core.config.rs.server.model.ModIKeyStoreHSMApplicativo;
import org.openspcoop2.core.config.rs.server.model.ModIKeystoreEnum;
import org.openspcoop2.core.config.rs.server.model.ModIKeystoreTipologiaEnum;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.protocol.modipa.constants.ModICostanti;
import org.openspcoop2.protocol.modipa.properties.ModIDynamicConfigurationKeystoreUtilities;
import org.openspcoop2.protocol.sdk.properties.AbstractProperty;
import org.openspcoop2.protocol.sdk.properties.ProtocolProperties;
import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesFactory;
import org.openspcoop2.utils.certificate.CertificateInfo;
import org.openspcoop2.utils.service.fault.jaxrs.FaultCode;
/**
* ModiApplicativiApiHelper
*
* @author $Author$
* @version $Rev$, $Date$
*
*/
public class ModiApplicativiApiHelper {
private ModiApplicativiApiHelper() {}
public static ProtocolProperties getProtocolProperties(Applicativo body, ServizioApplicativo sa, ApplicativiEnv env) {
/** if(body.getModi() == null) {
// throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare la configurazione 'ModI'");
// }*/
ProtocolProperties p = new ProtocolProperties();
if(isDominioInterno(sa, env)) {
if(body.getModi() != null) {
if(body.getModi() instanceof ModIApplicativoInterno) {
ModIApplicativoInterno mai = (ModIApplicativoInterno)body.getModi();
if(mai.getSicurezzaMessaggio()==null && mai.getToken()==null) {
throw FaultCode.RICHIESTA_NON_VALIDA.toException("Configurazione 'ModI' non valida: definire almeno una configurazione tra sicurezza messaggio e token");
}
if(mai.getSicurezzaMessaggio()!=null) {
p.addProperty(ProtocolPropertiesFactory.newProperty(ModICostanti.MODIPA_SICUREZZA_MESSAGGIO, true));
if(mai.getSicurezzaMessaggio().getKeystore().getTipologia().equals(ModIKeystoreTipologiaEnum.HSM)) {
ModIKeyStoreHSMApplicativo hsmKeystore = (ModIKeyStoreHSMApplicativo)mai.getSicurezzaMessaggio().getKeystore();
p.addProperty(ModICostanti.MODIPA_KEYSTORE_MODE, ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_HSM);
p.addProperty(ModICostanti.MODIPA_KEYSTORE_TYPE, hsmKeystore.getPcks11Tipo());
p.addProperty(ModICostanti.MODIPA_KEY_ALIAS, hsmKeystore.getKeyAlias());
if( hsmKeystore.getKeystoreCertificato()!=null && hsmKeystore.getKeystoreCertificato().length>0) {
String filename = "applicativo.cer";
p.addProperty(ModICostanti.MODIPA_KEYSTORE_CERTIFICATE, hsmKeystore.getKeystoreCertificato(), filename, filename);
try {
CertificateInfo cert = ModIDynamicConfigurationKeystoreUtilities.readKeystoreConfig(p, true);
if(cert!=null && cert.getSubject()!=null) {
p.addProperty(ModICostanti.MODIPA_KEY_CN_SUBJECT, cert.getSubject().toString());
if(cert.getIssuer()!=null) {
p.addProperty(ModICostanti.MODIPA_KEY_CN_ISSUER, cert.getIssuer().toString());
}
}
}catch(Exception e) {
// errore sollevato in validazione
}
}
}
else if(mai.getSicurezzaMessaggio().getKeystore().getTipologia().equals(ModIKeystoreTipologiaEnum.FILESYSTEM)) {
ModIKeyStoreFileApplicativo fsKeystore = (ModIKeyStoreFileApplicativo)mai.getSicurezzaMessaggio().getKeystore();
p.addProperty(ModICostanti.MODIPA_KEYSTORE_MODE, ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_PATH);
String tipo = null;
switch(fsKeystore.getKeystoreTipo()) {
case JKS:tipo = ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_JKS;
break;
case PKCS12:tipo = ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_PKCS12;
break;
default:
break;
}
p.addProperty(ModICostanti.MODIPA_KEYSTORE_TYPE, tipo);
p.addProperty(ModICostanti.MODIPA_KEY_ALIAS, fsKeystore.getKeyAlias());
p.addProperty(ModICostanti.MODIPA_KEY_PASSWORD, fsKeystore.getKeyPassword());
p.addProperty(ModICostanti.MODIPA_KEYSTORE_PASSWORD, fsKeystore.getKeystorePassword());
p.addProperty(ModICostanti.MODIPA_KEYSTORE_PATH, fsKeystore.getKeystorePath());
p.addProperty(ModICostanti.MODIPA_KEYSTORE_BYOK_POLICY, fsKeystore.getKeystoreByokPolicy());
if( fsKeystore.getKeystoreCertificato()!=null && fsKeystore.getKeystoreCertificato().length>0) {
String filename = "applicativo.cer";
p.addProperty(ModICostanti.MODIPA_KEYSTORE_CERTIFICATE, fsKeystore.getKeystoreCertificato(), filename, filename);
try {
CertificateInfo cert = ModIDynamicConfigurationKeystoreUtilities.readKeystoreConfig(p, true);
if(cert!=null && cert.getSubject()!=null) {
p.addProperty(ModICostanti.MODIPA_KEY_CN_SUBJECT, cert.getSubject().toString());
if(cert.getIssuer()!=null) {
p.addProperty(ModICostanti.MODIPA_KEY_CN_ISSUER, cert.getIssuer().toString());
}
}
}catch(Exception e) {
// errore sollevato in validazione
}
}
} else {
ModIKeyStoreArchive archiveKeystore = (ModIKeyStoreArchive)mai.getSicurezzaMessaggio().getKeystore();
p.addProperty(ModICostanti.MODIPA_KEYSTORE_MODE, ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_ARCHIVE);
String tipo = null;
String filename = null;
switch(archiveKeystore.getKeystoreTipo()) {
case JKS:tipo = ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_JKS; filename = "Keystore.jks";
break;
case PKCS12:tipo = ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_PKCS12; filename = "Keystore.p12";
break;
default:
break;
}
p.addProperty(ModICostanti.MODIPA_KEYSTORE_TYPE, tipo);
p.addProperty(ModICostanti.MODIPA_KEY_ALIAS, archiveKeystore.getKeyAlias());
p.addProperty(ModICostanti.MODIPA_KEY_PASSWORD, archiveKeystore.getKeyPassword());
p.addProperty(ModICostanti.MODIPA_KEYSTORE_PASSWORD, archiveKeystore.getKeystorePassword());
p.addProperty(ModICostanti.MODIPA_KEYSTORE_ARCHIVE, archiveKeystore.getKeystoreArchivio(), filename, filename);
try {
CertificateInfo cert = ModIDynamicConfigurationKeystoreUtilities.readKeystoreConfig(p, false);
if(cert!=null && cert.getSubject()!=null) {
p.addProperty(ModICostanti.MODIPA_KEY_CN_SUBJECT, cert.getSubject().toString());
if(cert.getIssuer()!=null) {
p.addProperty(ModICostanti.MODIPA_KEY_CN_ISSUER, cert.getIssuer().toString());
}
}
}catch(Exception e) {
// errore sollevato in validazione
}
}
if(mai.getSicurezzaMessaggio().getReplyAudience()!=null) {
p.addProperty(ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_RISPOSTA_AUDIENCE, mai.getSicurezzaMessaggio().getReplyAudience());
}
if(mai.getSicurezzaMessaggio().getUrlX5u()!=null) {
p.addProperty(ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_REST_SA_RICHIESTA_X509_VALUE_X5URL, mai.getSicurezzaMessaggio().getUrlX5u());
}
}
if(mai.getToken()!=null) {
p.addProperty(ProtocolPropertiesFactory.newProperty(ModICostanti.MODIPA_SICUREZZA_TOKEN, true));
if(mai.getToken().getTokenPolicy()!=null) {
p.addProperty(ProtocolPropertiesFactory.newProperty(ModICostanti.MODIPA_SICUREZZA_TOKEN_POLICY, mai.getToken().getTokenPolicy()));
}
p.addProperty(ProtocolPropertiesFactory.newProperty(ModICostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_ID, mai.getToken().getIdentificativo()));
if(mai.getToken().getKid()!=null) {
p.addProperty(ProtocolPropertiesFactory.newProperty(ModICostanti.MODIPA_SICUREZZA_TOKEN_KID_ID, mai.getToken().getKid()));
}
}
} else {
throw FaultCode.RICHIESTA_NON_VALIDA.toException("Configurazione 'ModI' non valida");
}
} else {
p.addProperty(ProtocolPropertiesFactory.newProperty(ModICostanti.MODIPA_SICUREZZA_MESSAGGIO, false));
}
} else {
if(!(body.getCredenziali() instanceof AuthenticationHttps) && !(body.getCredenziali() instanceof AuthenticationToken)) {
throw FaultCode.RICHIESTA_NON_VALIDA.toException("Non sono state fornite credenziali (certificato o tokenClientId) che identificano l’applicativo");
}
if(body.getModi() != null) {
if(body.getModi() instanceof ModIApplicativoEsterno) {
ModIApplicativoEsterno mae = (ModIApplicativoEsterno)body.getModi();
if(mae.getReplyAudience()!=null) {
p.addProperty(ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_RISPOSTA_AUDIENCE, mae.getReplyAudience());
}
} else {
throw FaultCode.RICHIESTA_NON_VALIDA.toException("Configurazione 'ModI' non valida");
}
}
}
return p;
}
private static boolean isDominioInterno(ServizioApplicativo sa, ApplicativiEnv env) {
IDSoggetto idSoggetto = new IDSoggetto(sa.getTipoSoggettoProprietario(),sa.getNomeSoggettoProprietario());
return env.isDominioInterno(idSoggetto);
}
public static void populateProtocolInfo(ServizioApplicativo sa, ApplicativiEnv env, Applicativo ret) throws Exception {
Map<String, AbstractProperty<?>> p = ApplicativiApiHelper.getProtocolPropertiesMap(sa, env);
if(isDominioInterno(sa, env)) {
ModIApplicativoInterno app = new ModIApplicativoInterno();
app.setDominio(DominioEnum.INTERNO);
boolean enabledSicurezzaMessaggio = false;
AbstractProperty<?> ap = ProtocolPropertiesHelper.getProperty(p, ModICostanti.MODIPA_SICUREZZA_MESSAGGIO, false);
if(ap!=null && ap.getValue()!=null) {
enabledSicurezzaMessaggio = ProtocolPropertiesHelper.getBooleanProperty(p, ModICostanti.MODIPA_SICUREZZA_MESSAGGIO, true);
}
if(enabledSicurezzaMessaggio) {
ModIApplicativoSicurezzaMessaggio sicurezzaMsg = new ModIApplicativoSicurezzaMessaggio();
String keystoreModeString = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_MODE, true);
if(keystoreModeString.equals(ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_HSM)) {
ModIKeyStoreHSMApplicativo datiKeystore = new ModIKeyStoreHSMApplicativo();
datiKeystore.tipologia(ModIKeystoreTipologiaEnum.HSM);
String keystoreTipoString = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_TYPE, true);
datiKeystore.setPcks11Tipo(keystoreTipoString);
datiKeystore.setKeyAlias(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEY_ALIAS, true));
datiKeystore.setKeystoreCertificato(ProtocolPropertiesHelper.getByteArrayProperty(p, ModICostanti.MODIPA_KEYSTORE_CERTIFICATE, false));
sicurezzaMsg.setKeystore(datiKeystore);
}
else if(keystoreModeString.equals(ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_PATH)) {
ModIKeyStoreFileApplicativo datiKeystore = new ModIKeyStoreFileApplicativo();
datiKeystore.tipologia(ModIKeystoreTipologiaEnum.FILESYSTEM);
ModIKeystoreEnum keystoreTipo = null;
String keystoreTipoString = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_TYPE, true);
if(keystoreTipoString.equals(ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_JKS)) {
keystoreTipo = ModIKeystoreEnum.JKS;
} else if(keystoreTipoString.equals(ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_PKCS12)) {
keystoreTipo = ModIKeystoreEnum.PKCS12;
}
datiKeystore.setKeystoreTipo(keystoreTipo);
datiKeystore.setKeyAlias(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEY_ALIAS, true));
datiKeystore.setKeyPassword(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEY_PASSWORD, true));
datiKeystore.setKeystorePassword(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_PASSWORD, true));
datiKeystore.setKeystorePath(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_PATH, true));
datiKeystore.setKeystoreByokPolicy(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_BYOK_POLICY, false));
datiKeystore.setKeystoreCertificato(ProtocolPropertiesHelper.getByteArrayProperty(p, ModICostanti.MODIPA_KEYSTORE_CERTIFICATE, false));
sicurezzaMsg.setKeystore(datiKeystore);
} else if(keystoreModeString.equals(ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_ARCHIVE)) {
ModIKeyStoreArchive datiKeystore = new ModIKeyStoreArchive().tipologia(ModIKeystoreTipologiaEnum.ARCHIVIO);
ModIKeystoreEnum keystoreTipo = null;
String keystoreTipoString = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_TYPE, true);
if(keystoreTipoString.equals(ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_JKS)) {
keystoreTipo = ModIKeystoreEnum.JKS;
} else if(keystoreTipoString.equals(ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_PKCS12)) {
keystoreTipo = ModIKeystoreEnum.PKCS12;
}
datiKeystore.setKeystoreTipo(keystoreTipo);
datiKeystore.setKeyAlias(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEY_ALIAS, true));
datiKeystore.setKeyPassword(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEY_PASSWORD, true));
datiKeystore.setKeystorePassword(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_PASSWORD, true));
datiKeystore.setKeystoreArchivio(ProtocolPropertiesHelper.getByteArrayProperty(p, ModICostanti.MODIPA_KEYSTORE_ARCHIVE, true));
sicurezzaMsg.setKeystore(datiKeystore);
}
String wsaTo = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_RISPOSTA_AUDIENCE, false);
if(wsaTo != null) {
sicurezzaMsg.setReplyAudience(wsaTo);
}
String x509 = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_REST_SA_RICHIESTA_X509_VALUE_X5URL, false);
if(x509 != null) {
sicurezzaMsg.setUrlX5u(x509);
}
app.setSicurezzaMessaggio(sicurezzaMsg);
}
boolean enabledSicurezzaToken = false;
ap = ProtocolPropertiesHelper.getProperty(p, ModICostanti.MODIPA_SICUREZZA_TOKEN, false);
if(ap!=null && ap.getValue()!=null) {
enabledSicurezzaToken = ProtocolPropertiesHelper.getBooleanProperty(p, ModICostanti.MODIPA_SICUREZZA_TOKEN, true);
}
if(enabledSicurezzaToken) {
ModIApplicativoAuthenticationToken token = new ModIApplicativoAuthenticationToken();
String tokenPolicy = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_SICUREZZA_TOKEN_POLICY, false);
if(tokenPolicy != null) {
token.setTokenPolicy(tokenPolicy);
}
String identificativo = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_ID, false);
if(identificativo != null) {
token.setIdentificativo(identificativo);
}
String kid = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_SICUREZZA_TOKEN_KID_ID, false);
if(kid != null) {
token.setKid(kid);
}
app.setToken(token);
}
if(enabledSicurezzaMessaggio || enabledSicurezzaToken) {
// modi richiede la presenza obbligatoria della sicurezza
ret.setModi(app);
}
} else {
ModIApplicativoEsterno app = new ModIApplicativoEsterno();
app.setDominio(DominioEnum.ESTERNO);
String wsaTo = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_RISPOSTA_AUDIENCE, false);
if(wsaTo != null) {
app.setReplyAudience(wsaTo);
}
ret.setModi(app);
}
}
}