ModiApplicativiApiHelper.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */

  20. package org.openspcoop2.core.config.rs.server.api.impl.applicativi;

  21. import java.util.Map;

  22. import org.openspcoop2.core.config.ServizioApplicativo;
  23. import org.openspcoop2.core.config.rs.server.api.impl.ProtocolPropertiesHelper;
  24. import org.openspcoop2.core.config.rs.server.model.Applicativo;
  25. import org.openspcoop2.core.config.rs.server.model.AuthenticationHttps;
  26. import org.openspcoop2.core.config.rs.server.model.AuthenticationToken;
  27. import org.openspcoop2.core.config.rs.server.model.DominioEnum;
  28. import org.openspcoop2.core.config.rs.server.model.ModIApplicativoAuthenticationToken;
  29. import org.openspcoop2.core.config.rs.server.model.ModIApplicativoEsterno;
  30. import org.openspcoop2.core.config.rs.server.model.ModIApplicativoInterno;
  31. import org.openspcoop2.core.config.rs.server.model.ModIApplicativoSicurezzaMessaggio;
  32. import org.openspcoop2.core.config.rs.server.model.ModIKeyStoreArchive;
  33. import org.openspcoop2.core.config.rs.server.model.ModIKeyStoreFileApplicativo;
  34. import org.openspcoop2.core.config.rs.server.model.ModIKeyStoreHSMApplicativo;
  35. import org.openspcoop2.core.config.rs.server.model.ModIKeystoreEnum;
  36. import org.openspcoop2.core.config.rs.server.model.ModIKeystoreTipologiaEnum;
  37. import org.openspcoop2.core.id.IDSoggetto;
  38. import org.openspcoop2.protocol.modipa.constants.ModICostanti;
  39. import org.openspcoop2.protocol.modipa.properties.ModIDynamicConfigurationKeystoreUtilities;
  40. import org.openspcoop2.protocol.sdk.properties.AbstractProperty;
  41. import org.openspcoop2.protocol.sdk.properties.ProtocolProperties;
  42. import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesFactory;
  43. import org.openspcoop2.utils.certificate.CertificateInfo;
  44. import org.openspcoop2.utils.service.fault.jaxrs.FaultCode;

  45. /**
  46.  * ModiApplicativiApiHelper
  47.  *
  48.  * @author $Author$
  49.  * @version $Rev$, $Date$
  50.  *
  51.  */
  52. public class ModiApplicativiApiHelper {
  53.    
  54.     private ModiApplicativiApiHelper() {}

  55.     public static ProtocolProperties getProtocolProperties(Applicativo body, ServizioApplicativo sa, ApplicativiEnv env) {
  56.         /**     if(body.getModi() == null) {
  57.         //          throw FaultCode.RICHIESTA_NON_VALIDA.toException("Specificare la configurazione 'ModI'");
  58.         //      }*/

  59.         ProtocolProperties p = new ProtocolProperties();

  60.         if(isDominioInterno(sa, env)) {

  61.             if(body.getModi() != null) {
  62.                 if(body.getModi() instanceof ModIApplicativoInterno) {
  63.                     ModIApplicativoInterno mai = (ModIApplicativoInterno)body.getModi();

  64.                     if(mai.getSicurezzaMessaggio()==null && mai.getToken()==null) {
  65.                         throw FaultCode.RICHIESTA_NON_VALIDA.toException("Configurazione 'ModI' non valida: definire almeno una configurazione tra sicurezza messaggio e token");
  66.                     }
  67.                    
  68.                     if(mai.getSicurezzaMessaggio()!=null) {
  69.                         p.addProperty(ProtocolPropertiesFactory.newProperty(ModICostanti.MODIPA_SICUREZZA_MESSAGGIO, true));
  70.    
  71.                         if(mai.getSicurezzaMessaggio().getKeystore().getTipologia().equals(ModIKeystoreTipologiaEnum.HSM)) {
  72.                             ModIKeyStoreHSMApplicativo hsmKeystore = (ModIKeyStoreHSMApplicativo)mai.getSicurezzaMessaggio().getKeystore();
  73.                             p.addProperty(ModICostanti.MODIPA_KEYSTORE_MODE, ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_HSM);
  74.    
  75.    
  76.                             p.addProperty(ModICostanti.MODIPA_KEYSTORE_TYPE, hsmKeystore.getPcks11Tipo());
  77.                             p.addProperty(ModICostanti.MODIPA_KEY_ALIAS, hsmKeystore.getKeyAlias());
  78.                             if( hsmKeystore.getKeystoreCertificato()!=null && hsmKeystore.getKeystoreCertificato().length>0) {
  79.                                 String filename = "applicativo.cer";
  80.                                 p.addProperty(ModICostanti.MODIPA_KEYSTORE_CERTIFICATE, hsmKeystore.getKeystoreCertificato(), filename, filename);
  81.                                
  82.                                 try {
  83.                                     CertificateInfo cert = ModIDynamicConfigurationKeystoreUtilities.readKeystoreConfig(p, true);
  84.                                     if(cert!=null && cert.getSubject()!=null) {
  85.                                         p.addProperty(ModICostanti.MODIPA_KEY_CN_SUBJECT, cert.getSubject().toString());
  86.                                         if(cert.getIssuer()!=null) {
  87.                                             p.addProperty(ModICostanti.MODIPA_KEY_CN_ISSUER, cert.getIssuer().toString());
  88.                                         }
  89.                                     }
  90.                                 }catch(Exception e) {
  91.                                     // errore sollevato in validazione
  92.                                 }
  93.                             }
  94.                         }
  95.                         else if(mai.getSicurezzaMessaggio().getKeystore().getTipologia().equals(ModIKeystoreTipologiaEnum.FILESYSTEM)) {
  96.                             ModIKeyStoreFileApplicativo fsKeystore = (ModIKeyStoreFileApplicativo)mai.getSicurezzaMessaggio().getKeystore();
  97.                             p.addProperty(ModICostanti.MODIPA_KEYSTORE_MODE, ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_PATH);
  98.    
  99.    
  100.                             String tipo = null;
  101.                             switch(fsKeystore.getKeystoreTipo()) {
  102.                             case JKS:tipo = ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_JKS;
  103.                             break;
  104.                             case PKCS12:tipo = ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_PKCS12;
  105.                             break;
  106.                             default:
  107.                                 break;
  108.                             }
  109.    
  110.                             p.addProperty(ModICostanti.MODIPA_KEYSTORE_TYPE, tipo);
  111.                             p.addProperty(ModICostanti.MODIPA_KEY_ALIAS, fsKeystore.getKeyAlias());
  112.                             p.addProperty(ModICostanti.MODIPA_KEY_PASSWORD, fsKeystore.getKeyPassword());
  113.                             p.addProperty(ModICostanti.MODIPA_KEYSTORE_PASSWORD, fsKeystore.getKeystorePassword());
  114.                             p.addProperty(ModICostanti.MODIPA_KEYSTORE_PATH, fsKeystore.getKeystorePath());
  115.                             p.addProperty(ModICostanti.MODIPA_KEYSTORE_BYOK_POLICY, fsKeystore.getKeystoreByokPolicy());
  116.                            
  117.                             if( fsKeystore.getKeystoreCertificato()!=null && fsKeystore.getKeystoreCertificato().length>0) {
  118.                                 String filename = "applicativo.cer";
  119.                                 p.addProperty(ModICostanti.MODIPA_KEYSTORE_CERTIFICATE, fsKeystore.getKeystoreCertificato(), filename, filename);
  120.                                
  121.                                 try {
  122.                                     CertificateInfo cert = ModIDynamicConfigurationKeystoreUtilities.readKeystoreConfig(p, true);
  123.                                     if(cert!=null && cert.getSubject()!=null) {
  124.                                         p.addProperty(ModICostanti.MODIPA_KEY_CN_SUBJECT, cert.getSubject().toString());
  125.                                         if(cert.getIssuer()!=null) {
  126.                                             p.addProperty(ModICostanti.MODIPA_KEY_CN_ISSUER, cert.getIssuer().toString());
  127.                                         }
  128.                                     }
  129.                                 }catch(Exception e) {
  130.                                     // errore sollevato in validazione
  131.                                 }
  132.                             }
  133.                            
  134.                         } else {
  135.                             ModIKeyStoreArchive archiveKeystore = (ModIKeyStoreArchive)mai.getSicurezzaMessaggio().getKeystore();
  136.                             p.addProperty(ModICostanti.MODIPA_KEYSTORE_MODE, ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_ARCHIVE);
  137.    
  138.    
  139.                             String tipo = null;
  140.                             String filename = null;
  141.    
  142.                             switch(archiveKeystore.getKeystoreTipo()) {
  143.                             case JKS:tipo = ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_JKS; filename = "Keystore.jks";
  144.                             break;
  145.                             case PKCS12:tipo = ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_PKCS12; filename = "Keystore.p12";
  146.                             break;
  147.                             default:
  148.                                 break;
  149.                             }
  150.    
  151.                             p.addProperty(ModICostanti.MODIPA_KEYSTORE_TYPE, tipo);
  152.                             p.addProperty(ModICostanti.MODIPA_KEY_ALIAS, archiveKeystore.getKeyAlias());
  153.                             p.addProperty(ModICostanti.MODIPA_KEY_PASSWORD, archiveKeystore.getKeyPassword());
  154.                             p.addProperty(ModICostanti.MODIPA_KEYSTORE_PASSWORD, archiveKeystore.getKeystorePassword());
  155.                             p.addProperty(ModICostanti.MODIPA_KEYSTORE_ARCHIVE, archiveKeystore.getKeystoreArchivio(), filename, filename);
  156.                            
  157.                             try {
  158.                                 CertificateInfo cert = ModIDynamicConfigurationKeystoreUtilities.readKeystoreConfig(p, false);
  159.                                 if(cert!=null && cert.getSubject()!=null) {
  160.                                     p.addProperty(ModICostanti.MODIPA_KEY_CN_SUBJECT, cert.getSubject().toString());
  161.                                     if(cert.getIssuer()!=null) {
  162.                                         p.addProperty(ModICostanti.MODIPA_KEY_CN_ISSUER, cert.getIssuer().toString());
  163.                                     }
  164.                                 }
  165.                             }catch(Exception e) {
  166.                                 // errore sollevato in validazione
  167.                             }
  168.                         }
  169.    
  170.                         if(mai.getSicurezzaMessaggio().getReplyAudience()!=null) {
  171.                             p.addProperty(ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_RISPOSTA_AUDIENCE, mai.getSicurezzaMessaggio().getReplyAudience());
  172.                         }
  173.    
  174.                         if(mai.getSicurezzaMessaggio().getUrlX5u()!=null) {
  175.                             p.addProperty(ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_REST_SA_RICHIESTA_X509_VALUE_X5URL, mai.getSicurezzaMessaggio().getUrlX5u());
  176.                         }
  177.                     }
  178.                    
  179.                     if(mai.getToken()!=null) {
  180.                         p.addProperty(ProtocolPropertiesFactory.newProperty(ModICostanti.MODIPA_SICUREZZA_TOKEN, true));
  181.                         if(mai.getToken().getTokenPolicy()!=null) {
  182.                             p.addProperty(ProtocolPropertiesFactory.newProperty(ModICostanti.MODIPA_SICUREZZA_TOKEN_POLICY, mai.getToken().getTokenPolicy()));
  183.                         }
  184.                         p.addProperty(ProtocolPropertiesFactory.newProperty(ModICostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_ID, mai.getToken().getIdentificativo()));
  185.                         if(mai.getToken().getKid()!=null) {
  186.                             p.addProperty(ProtocolPropertiesFactory.newProperty(ModICostanti.MODIPA_SICUREZZA_TOKEN_KID_ID, mai.getToken().getKid()));
  187.                         }
  188.                     }

  189.                 } else {
  190.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException("Configurazione 'ModI' non valida");
  191.                 }

  192.             } else {
  193.                 p.addProperty(ProtocolPropertiesFactory.newProperty(ModICostanti.MODIPA_SICUREZZA_MESSAGGIO, false));
  194.             }
  195.         } else {

  196.             if(!(body.getCredenziali() instanceof AuthenticationHttps) && !(body.getCredenziali() instanceof AuthenticationToken)) {
  197.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Non sono state fornite credenziali (certificato o tokenClientId) che identificano l’applicativo");
  198.             }
  199.             if(body.getModi() != null) {
  200.    
  201.                 if(body.getModi() instanceof ModIApplicativoEsterno) {
  202.                     ModIApplicativoEsterno mae = (ModIApplicativoEsterno)body.getModi();
  203.                     if(mae.getReplyAudience()!=null) {
  204.                         p.addProperty(ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_RISPOSTA_AUDIENCE, mae.getReplyAudience());
  205.                     }
  206.                 } else {
  207.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException("Configurazione 'ModI' non valida");
  208.                 }
  209.             }
  210.         }

  211.         return p;

  212.     }

  213.     private static boolean isDominioInterno(ServizioApplicativo sa, ApplicativiEnv env) {
  214.         IDSoggetto idSoggetto = new IDSoggetto(sa.getTipoSoggettoProprietario(),sa.getNomeSoggettoProprietario());

  215.         return env.isDominioInterno(idSoggetto);
  216.     }

  217.     public static void populateProtocolInfo(ServizioApplicativo sa, ApplicativiEnv env, Applicativo ret) throws Exception {

  218.         Map<String, AbstractProperty<?>> p = ApplicativiApiHelper.getProtocolPropertiesMap(sa, env);

  219.         if(isDominioInterno(sa, env)) {

  220.             ModIApplicativoInterno app = new ModIApplicativoInterno();
  221.             app.setDominio(DominioEnum.INTERNO);

  222.             boolean enabledSicurezzaMessaggio = false;
  223.             AbstractProperty<?> ap = ProtocolPropertiesHelper.getProperty(p, ModICostanti.MODIPA_SICUREZZA_MESSAGGIO, false);
  224.             if(ap!=null && ap.getValue()!=null) {
  225.                 enabledSicurezzaMessaggio = ProtocolPropertiesHelper.getBooleanProperty(p, ModICostanti.MODIPA_SICUREZZA_MESSAGGIO, true);
  226.             }

  227.             if(enabledSicurezzaMessaggio) {
  228.                 ModIApplicativoSicurezzaMessaggio sicurezzaMsg = new ModIApplicativoSicurezzaMessaggio();

  229.                 String keystoreModeString = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_MODE, true);

  230.                 if(keystoreModeString.equals(ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_HSM)) {
  231.                     ModIKeyStoreHSMApplicativo datiKeystore = new ModIKeyStoreHSMApplicativo();
  232.                     datiKeystore.tipologia(ModIKeystoreTipologiaEnum.HSM);

  233.                     String keystoreTipoString = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_TYPE, true);
  234.                     datiKeystore.setPcks11Tipo(keystoreTipoString);
  235.                     datiKeystore.setKeyAlias(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEY_ALIAS, true));
  236.                    
  237.                     datiKeystore.setKeystoreCertificato(ProtocolPropertiesHelper.getByteArrayProperty(p, ModICostanti.MODIPA_KEYSTORE_CERTIFICATE, false));

  238.                     sicurezzaMsg.setKeystore(datiKeystore);
  239.                 }
  240.                 else if(keystoreModeString.equals(ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_PATH)) {
  241.                     ModIKeyStoreFileApplicativo datiKeystore = new ModIKeyStoreFileApplicativo();
  242.                     datiKeystore.tipologia(ModIKeystoreTipologiaEnum.FILESYSTEM);

  243.                     ModIKeystoreEnum keystoreTipo = null;

  244.                     String keystoreTipoString = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_TYPE, true);

  245.                     if(keystoreTipoString.equals(ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_JKS)) {
  246.                         keystoreTipo = ModIKeystoreEnum.JKS;
  247.                     } else if(keystoreTipoString.equals(ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_PKCS12)) {
  248.                         keystoreTipo = ModIKeystoreEnum.PKCS12;
  249.                     }

  250.                     datiKeystore.setKeystoreTipo(keystoreTipo);
  251.                     datiKeystore.setKeyAlias(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEY_ALIAS, true));
  252.                     datiKeystore.setKeyPassword(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEY_PASSWORD, true));
  253.                     datiKeystore.setKeystorePassword(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_PASSWORD, true));
  254.                     datiKeystore.setKeystorePath(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_PATH, true));
  255.                     datiKeystore.setKeystoreByokPolicy(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_BYOK_POLICY, false));
  256.                    
  257.                     datiKeystore.setKeystoreCertificato(ProtocolPropertiesHelper.getByteArrayProperty(p, ModICostanti.MODIPA_KEYSTORE_CERTIFICATE, false));

  258.                     sicurezzaMsg.setKeystore(datiKeystore);
  259.                 } else if(keystoreModeString.equals(ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_ARCHIVE)) {
  260.                     ModIKeyStoreArchive datiKeystore = new ModIKeyStoreArchive().tipologia(ModIKeystoreTipologiaEnum.ARCHIVIO);

  261.                     ModIKeystoreEnum keystoreTipo = null;

  262.                     String keystoreTipoString = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_TYPE, true);

  263.                     if(keystoreTipoString.equals(ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_JKS)) {
  264.                         keystoreTipo = ModIKeystoreEnum.JKS;
  265.                     } else if(keystoreTipoString.equals(ModICostanti.MODIPA_KEYSTORE_TYPE_VALUE_PKCS12)) {
  266.                         keystoreTipo = ModIKeystoreEnum.PKCS12;
  267.                     }

  268.                     datiKeystore.setKeystoreTipo(keystoreTipo);
  269.                     datiKeystore.setKeyAlias(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEY_ALIAS, true));
  270.                     datiKeystore.setKeyPassword(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEY_PASSWORD, true));
  271.                     datiKeystore.setKeystorePassword(ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_KEYSTORE_PASSWORD, true));
  272.                     datiKeystore.setKeystoreArchivio(ProtocolPropertiesHelper.getByteArrayProperty(p, ModICostanti.MODIPA_KEYSTORE_ARCHIVE, true));

  273.                     sicurezzaMsg.setKeystore(datiKeystore);
  274.                 }

  275.                 String wsaTo = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_RISPOSTA_AUDIENCE, false);
  276.                 if(wsaTo != null) {
  277.                     sicurezzaMsg.setReplyAudience(wsaTo);
  278.                 }

  279.                 String x509 = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_REST_SA_RICHIESTA_X509_VALUE_X5URL, false);
  280.                 if(x509 != null) {
  281.                     sicurezzaMsg.setUrlX5u(x509);
  282.                 }
  283.                 app.setSicurezzaMessaggio(sicurezzaMsg);
  284.             }

  285.             boolean enabledSicurezzaToken = false;
  286.             ap = ProtocolPropertiesHelper.getProperty(p, ModICostanti.MODIPA_SICUREZZA_TOKEN, false);
  287.             if(ap!=null && ap.getValue()!=null) {
  288.                 enabledSicurezzaToken = ProtocolPropertiesHelper.getBooleanProperty(p, ModICostanti.MODIPA_SICUREZZA_TOKEN, true);
  289.             }

  290.             if(enabledSicurezzaToken) {
  291.                
  292.                 ModIApplicativoAuthenticationToken token = new ModIApplicativoAuthenticationToken();
  293.                
  294.                 String tokenPolicy = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_SICUREZZA_TOKEN_POLICY, false);
  295.                 if(tokenPolicy != null) {
  296.                     token.setTokenPolicy(tokenPolicy);
  297.                 }
  298.                
  299.                 String identificativo = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_ID, false);
  300.                 if(identificativo != null) {
  301.                     token.setIdentificativo(identificativo);
  302.                 }
  303.                
  304.                 String kid = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_SICUREZZA_TOKEN_KID_ID, false);
  305.                 if(kid != null) {
  306.                     token.setKid(kid);
  307.                 }
  308.                
  309.                 app.setToken(token);
  310.             }
  311.            
  312.             if(enabledSicurezzaMessaggio || enabledSicurezzaToken) {
  313.                 // modi richiede la presenza obbligatoria della sicurezza
  314.                 ret.setModi(app);
  315.             }
  316.         } else {
  317.             ModIApplicativoEsterno app = new ModIApplicativoEsterno();
  318.             app.setDominio(DominioEnum.ESTERNO);

  319.             String wsaTo = ProtocolPropertiesHelper.getStringProperty(p, ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_RISPOSTA_AUDIENCE, false);
  320.             if(wsaTo != null) {
  321.                 app.setReplyAudience(wsaTo);
  322.             }

  323.             ret.setModi(app);

  324.         }

  325.     }

  326. }