ApplicativiApiServiceImpl.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.List;

  22. import org.apache.commons.lang.StringEscapeUtils;
  23. import org.apache.commons.lang.StringUtils;
  24. import org.openspcoop2.core.commons.Filtri;
  25. import org.openspcoop2.core.commons.Liste;
  26. import org.openspcoop2.core.config.Credenziali;
  27. import org.openspcoop2.core.config.InvocazionePorta;
  28. import org.openspcoop2.core.config.ServizioApplicativo;
  29. import org.openspcoop2.core.config.constants.CostantiConfigurazione;
  30. import org.openspcoop2.core.config.rs.server.api.ApplicativiApi;
  31. import org.openspcoop2.core.config.rs.server.api.impl.ApiKeyInfo;
  32. import org.openspcoop2.core.config.rs.server.api.impl.Helper;
  33. import org.openspcoop2.core.config.rs.server.api.impl.HttpRequestWrapper;
  34. import org.openspcoop2.core.config.rs.server.config.ServerProperties;
  35. import org.openspcoop2.core.config.rs.server.model.Applicativo;
  36. import org.openspcoop2.core.config.rs.server.model.AuthenticationApiKey;
  37. import org.openspcoop2.core.config.rs.server.model.AuthenticationHttpBasic;
  38. import org.openspcoop2.core.config.rs.server.model.BaseCredenziali;
  39. import org.openspcoop2.core.config.rs.server.model.ListaApplicativi;
  40. import org.openspcoop2.core.config.rs.server.model.ModalitaAccessoEnum;
  41. import org.openspcoop2.core.config.rs.server.model.OneOfBaseCredenzialiCredenziali;
  42. import org.openspcoop2.core.config.rs.server.model.Proprieta4000OpzioneCifratura;
  43. import org.openspcoop2.core.id.IDServizioApplicativo;
  44. import org.openspcoop2.core.id.IDSoggetto;
  45. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  46. import org.openspcoop2.protocol.sdk.constants.ConsoleOperationType;
  47. import org.openspcoop2.protocol.sdk.properties.ProtocolProperties;
  48. import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesUtils;
  49. import org.openspcoop2.utils.service.BaseImpl;
  50. import org.openspcoop2.utils.service.authorization.AuthorizationConfig;
  51. import org.openspcoop2.utils.service.authorization.AuthorizationManager;
  52. import org.openspcoop2.utils.service.beans.ProfiloEnum;
  53. import org.openspcoop2.utils.service.beans.utils.BaseHelper;
  54. import org.openspcoop2.utils.service.beans.utils.ListaUtils;
  55. import org.openspcoop2.utils.service.context.IContext;
  56. import org.openspcoop2.utils.service.fault.jaxrs.FaultCode;
  57. import org.openspcoop2.web.ctrlstat.core.ConsoleSearch;
  58. import org.openspcoop2.web.ctrlstat.costanti.CostantiControlStation;
  59. import org.openspcoop2.web.ctrlstat.plugins.ExtendedConnettore;
  60. import org.openspcoop2.web.ctrlstat.servlet.sa.ServiziApplicativiCostanti;
  61. import org.openspcoop2.web.ctrlstat.servlet.sa.ServiziApplicativiGeneralInfo;
  62. import org.openspcoop2.web.ctrlstat.servlet.sa.ServiziApplicativiUtilities;
  63. import org.openspcoop2.web.lib.mvc.TipoOperazione;

  64. /**
  65.  * ApplicativiApiServiceImpl
  66.  *
  67.  * @author $Author$
  68.  * @version $Rev$, $Date$
  69.  *
  70.  */
  71. public class ApplicativiApiServiceImpl extends BaseImpl implements ApplicativiApi {

  72.     public ApplicativiApiServiceImpl(){
  73.         super(org.slf4j.LoggerFactory.getLogger(ApplicativiApiServiceImpl.class));
  74.     }
  75.    
  76.     private AuthorizationConfig getAuthorizationConfig() throws Exception{
  77.         return new AuthorizationConfig(ServerProperties.getInstance().getProperties());
  78.     }

  79.     /**
  80.      * Creazione di un oapplicativo
  81.      *
  82.      * Questa operazione consente di creare un applicativo associato ad un soggetto interno
  83.      *
  84.      */
  85.     @Override
  86.     public void createApplicativo(Applicativo body, ProfiloEnum profilo, String soggetto) {
  87.         IContext context = this.getContext();
  88.         try {
  89.             context.getLogger().info("Invocazione in corso ...");    

  90.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  91.             context.getLogger().debug("Autorizzazione completata con successo");
  92.            
  93.             BaseHelper.throwIfNull(body);
  94.                
  95.             Applicativo applicativo = body;
  96.             try{
  97.                 applicativo.setCredenziali(ApplicativiApiHelper.translateCredenzialiApplicativo(applicativo, true));
  98.             }
  99.             catch(javax.ws.rs.WebApplicationException e) {
  100.                 throw e;
  101.             }
  102.             catch(Throwable e) {
  103.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(e);
  104.             }

  105.             HttpRequestWrapper wrap = new HttpRequestWrapper(context.getServletRequest());
  106.             ApplicativiEnv env = new ApplicativiEnv(wrap, profilo, soggetto, context);                  
  107.    
  108.             String protocollo = env.protocolFactory.getProtocol();
  109.             String tipoSoggetto = ProtocolFactoryManager.getInstance().getDefaultOrganizationTypes().get(protocollo);
  110.             IDSoggetto idSoggetto = new IDSoggetto(tipoSoggetto,env.idSoggetto.getNome());
  111.             IDServizioApplicativo idSA = new IDServizioApplicativo();
  112.             idSA.setIdSoggettoProprietario(idSoggetto);
  113.             idSA.setNome(applicativo.getNome());
  114.            
  115.             ApiKeyInfo keyInfo = ApplicativiApiHelper.createApiKey(applicativo.getCredenziali(), idSA, env.saCore, protocollo);
  116.             boolean updateKey = false;
  117.            
  118.             ServizioApplicativo sa = ApplicativiApiHelper.applicativoToServizioApplicativo(applicativo, env.tipo_protocollo, env.idSoggetto.getNome(), env.stationCore, keyInfo, true);
  119.                        
  120.             if ( ApplicativiApiHelper.isApplicativoDuplicato(sa, env.saCore) ) {
  121.                 throw FaultCode.CONFLITTO.toException(
  122.                         "Il Servizio Applicativo " + sa.getNome() + " è già stato registrato per il soggetto scelto."
  123.                 );
  124.             }
  125.            
  126.             ProtocolProperties protocolProperties = null;
  127.             if(profilo != null) {
  128.                 protocolProperties = ApplicativiApiHelper.getProtocolProperties(body, profilo, sa, env);
  129.    
  130.                 if(protocolProperties != null) {
  131.                     sa.setProtocolPropertyList(ProtocolPropertiesUtils.toProtocolPropertiesConfig(protocolProperties, ConsoleOperationType.ADD, null));
  132.                 }
  133.             }

  134.             ApplicativiApiHelper.overrideSAParameters(wrap, env.saHelper, sa, applicativo, keyInfo, updateKey);
  135.             wrap.overrideParameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_PROTOCOLLO, env.tipo_protocollo);
  136.            
  137.             List<String> listaTipiProtocollo = ProtocolFactoryManager.getInstance().getProtocolNamesAsList();
  138.             IDSoggetto soggettoMultitenantSelezionato = new IDSoggetto(env.idSoggetto.getTipo(), env.idSoggetto.getNome());
  139.            
  140.            
  141.             String dominio = null;
  142.             boolean dominioInterno = env.isDominioInterno(idSoggetto);
  143.             if(!dominioInterno) {
  144.                 if(profilo != null && !(profilo.equals(ProfiloEnum.APIGATEWAY) || profilo.equals(ProfiloEnum.MODI) || profilo.equals(ProfiloEnum.MODIPA))) {
  145.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException("Impossibile creare un applicativo per un soggetto esterno col profilo ["+profilo+"]");
  146.                 }
  147.                 dominio = "esterno";
  148.             }

  149.             ApplicativiApiHelper.validateCredentials(applicativo.getCredenziali(), dominioInterno,
  150.                     profilo!=null && (profilo.equals(ProfiloEnum.MODI) || profilo.equals(ProfiloEnum.MODIPA)));
  151.            
  152.             ServiziApplicativiGeneralInfo generalInfo = ServiziApplicativiUtilities.getGeneralInfo(false, env.idSoggetto.getId().toString(), listaTipiProtocollo,
  153.                     env.saCore, env.saHelper, env.userLogin, true,
  154.                     soggettoMultitenantSelezionato.toString(), dominio);
  155.                        

  156.             List<ExtendedConnettore> listExtendedConnettore = null; // Non serve alla checkData perchè gli applicativi sono sempre fruitori

  157.             if (! env.saHelper.servizioApplicativoCheckData(
  158.                     TipoOperazione.ADD,
  159.                     generalInfo.getSoggettiList(),
  160.                     -1,
  161.                     sa.getTipologiaFruizione(),
  162.                     sa.getTipologiaErogazione(),
  163.                     listExtendedConnettore, null,
  164.                     new StringBuilder()
  165.                 )) {
  166.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  167.             }
  168.                
  169.             ApplicativiApiHelper.validateProperties(env, protocolProperties, sa, ConsoleOperationType.ADD);

  170.             env.saCore.performCreateOperation(env.userLogin, false, sa);
  171.            
  172.             if(keyInfo!=null) {
  173.                 context.getServletResponse().setHeader(ApiKeyInfo.API_KEY, keyInfo.getApiKey());
  174.                 if(keyInfo.isMultipleApiKeys()) {
  175.                     context.getServletResponse().setHeader(ApiKeyInfo.APP_ID, keyInfo.getAppId());
  176.                 }
  177.             }
  178.            
  179.             context.getLogger().info("Invocazione completata con successo");
  180.                        
  181.             // Bug Fix: altrimenti viene generato 204
  182.             context.getServletResponse().setStatus(201);
  183.         }
  184.         catch(javax.ws.rs.WebApplicationException e) {
  185.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  186.             throw e;
  187.         }
  188.         catch(Throwable e) {
  189.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  190.             throw FaultCode.ERRORE_INTERNO.toException(e);
  191.         }
  192.     }


  193.     /**
  194.      * Elimina un applicativo
  195.      *
  196.      * Questa operazione consente di eliminare un applicativo identificato dal nome e dal soggetto di riferimento
  197.      *
  198.      */
  199.     @Override
  200.     public void deleteApplicativo(String nome, ProfiloEnum profilo, String soggetto) {
  201.         IContext context = this.getContext();
  202.         try {
  203.             context.getLogger().info("Invocazione in corso ...");    

  204.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  205.             context.getLogger().debug("Autorizzazione completata con successo");    
  206.          
  207.             ApplicativiEnv env = new ApplicativiEnv(context.getServletRequest(), profilo, soggetto, context);
  208.             IDServizioApplicativo idServizioApplicativo = null;
  209.             ServizioApplicativo sa = null;
  210.             try {
  211.                 idServizioApplicativo = new IDServizioApplicativo();
  212.                 idServizioApplicativo.setIdSoggettoProprietario(env.idSoggetto.toIDSoggetto());
  213.                
  214.             } catch (Exception e) {
  215.                 throw FaultCode.NOT_FOUND.toException("Soggetto non trovato.");
  216.             }
  217.            
  218.             idServizioApplicativo.setNome(nome);
  219.             try {
  220.                 sa = env.saCore.getServizioApplicativo(idServizioApplicativo);
  221.             } catch (Exception e) {
  222.             }
  223.            
  224.             if (sa != null) {
  225.                 StringBuilder inUsoMessage = new StringBuilder();
  226.                 ServiziApplicativiUtilities.deleteServizioApplicativo(sa, context.getAuthentication().getName(), env.saCore, env.saHelper, inUsoMessage, "\n");
  227.                
  228.                 if (inUsoMessage.length() > 0) {
  229.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(inUsoMessage.toString()));
  230.                 }
  231.                
  232.             } else if (env.delete_404) {
  233.                 throw FaultCode.NOT_FOUND.toException("Servizio applicativo con nome: " + nome + " non trovato.");
  234.             }
  235.            
  236.             context.getLogger().info("Invocazione completata con successo");    
  237.         }
  238.         catch(javax.ws.rs.WebApplicationException e) {
  239.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  240.             throw e;
  241.         }
  242.         catch(Throwable e) {
  243.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  244.             throw FaultCode.ERRORE_INTERNO.toException(e);
  245.         }
  246.     }
  247.    
  248.     /**
  249.      * Ricerca applicativi
  250.      *
  251.      * Elenca gli applicativi registrati
  252.      *
  253.      */
  254.     @Override
  255.     public ListaApplicativi findAllApplicativi(ProfiloEnum profilo, String soggetto, String q, Integer limit, Integer offset, String ruolo, ModalitaAccessoEnum tipoCredenziali, Boolean profiloQualsiasi, Boolean soggettoQualsiasi) {
  256.         IContext context = this.getContext();
  257.         try {
  258.             context.getLogger().info("Invocazione in corso ...");    

  259.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  260.             context.getLogger().debug("Autorizzazione completata con successo");    
  261.                        
  262.             ApplicativiEnv env = new ApplicativiEnv(context.getServletRequest(), profilo, soggetto, context);
  263.            
  264.             int idLista = Liste.SERVIZIO_APPLICATIVO;

  265.             ConsoleSearch ricerca = Helper.setupRicercaPaginata(q, limit, offset, idLista, env.idSoggetto.toIDSoggetto(), env.tipo_protocollo);
  266.            
  267.             if(profiloQualsiasi!=null && profiloQualsiasi) {
  268.                 ricerca.clearFilter(idLista, Filtri.FILTRO_PROTOCOLLO);
  269.             }
  270.             if(soggettoQualsiasi!=null && soggettoQualsiasi) {
  271.                 ricerca.clearFilter(idLista, Filtri.FILTRO_SOGGETTO);
  272.             }
  273.            
  274.             /**ricerca.addFilter(idLista, Filtri.FILTRO_RUOLO_SERVIZIO_APPLICATIVO, Filtri.VALUE_FILTRO_RUOLO_SERVIZIO_APPLICATIVO_FRUITORE);
  275.             ricerca.addFilter(idLista, Filtri.FILTRO_TIPO_SERVIZIO_APPLICATIVO, CostantiConfigurazione.CLIENT_OR_SERVER);*/
  276.             ricerca.addFilter(idLista, Filtri.FILTRO_TIPO_SERVIZIO_APPLICATIVO, CostantiConfigurazione.CLIENT); // Nelle API per adesso sono gestiti solo gli applicativi SERVER
  277.            
  278.             if (ruolo != null && ruolo.trim().length() > 0)
  279.                 ricerca.addFilter(idLista, Filtri.FILTRO_RUOLO, ruolo.trim());
  280.            
  281.             if(tipoCredenziali!=null) {
  282.                 String filtro = Helper.tipoAuthFromModalitaAccesso.get(tipoCredenziali);
  283.                 if(filtro!=null && !"".equals(filtro)) {
  284.                     ricerca.addFilter(idLista, Filtri.FILTRO_TIPO_CREDENZIALI, filtro);
  285.                 }
  286.             }
  287.            
  288.             List<ServizioApplicativo> saLista = env.saCore.soggettiServizioApplicativoList(null, ricerca);
  289.            
  290.             final ListaApplicativi ret = ListaUtils.costruisciListaPaginata(
  291.                     context.getUriInfo(),
  292.                     ricerca.getIndexIniziale(idLista),
  293.                     ricerca.getPageSize(idLista),
  294.                     ricerca.getNumEntries(idLista),
  295.                     ListaApplicativi.class
  296.                 );
  297.                
  298.             saLista.forEach( sa -> ret.addItemsItem(ApplicativiApiHelper.servizioApplicativoToApplicativoItem(sa)));    
  299.        
  300.             context.getLogger().info("Invocazione completata con successo");
  301.            
  302.             return Helper.returnOrNotFound(ret);
  303.         }
  304.         catch(javax.ws.rs.WebApplicationException e) {
  305.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  306.             throw e;
  307.         }
  308.         catch(Throwable e) {
  309.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  310.             throw FaultCode.ERRORE_INTERNO.toException(e);
  311.         }
  312.     }
  313.    
  314.     /**
  315.      * Restituisce il dettaglio di un applicativo
  316.      *
  317.      * Questa operazione consente di ottenere il dettaglio di un applicativo identificato dal nome e dal soggetto di riferimento
  318.      *
  319.      */
  320.     @Override
  321.     public Applicativo getApplicativo(String nome, ProfiloEnum profilo, String soggetto) {
  322.         IContext context = this.getContext();
  323.         try {
  324.             context.getLogger().info("Invocazione in corso ...");    

  325.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  326.             context.getLogger().debug("Autorizzazione completata con successo");    
  327.                                
  328.             ApplicativiEnv env = new ApplicativiEnv(context.getServletRequest(), profilo, soggetto, context);
  329.            
  330.             ServizioApplicativo sa = null;          
  331.             try {
  332.                 IDServizioApplicativo idServizioApplicativo = new IDServizioApplicativo();
  333.                 idServizioApplicativo.setIdSoggettoProprietario(env.idSoggetto.toIDSoggetto());
  334.                 idServizioApplicativo.setNome(nome);
  335.                 sa = env.saCore.getServizioApplicativo(idServizioApplicativo);
  336.             } catch ( Exception e) {
  337.                 throw FaultCode.NOT_FOUND.toException("Servizio applicativo con nome: " + nome + " non trovato.");
  338.             }
  339.            
  340.             context.getLogger().info("Invocazione completata con successo");
  341.            
  342.             Applicativo applicativo = ApplicativiApiHelper.servizioApplicativoToApplicativo(sa);
  343.             ApplicativiApiHelper.populateProtocolInfo(sa, applicativo, env, profilo);
  344.             return applicativo;

  345.         }
  346.         catch(javax.ws.rs.WebApplicationException e) {
  347.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  348.             throw e;
  349.         }
  350.         catch(Throwable e) {
  351.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  352.             throw FaultCode.ERRORE_INTERNO.toException(e);
  353.         }
  354.     }
  355.    
  356.     /**
  357.      * Modifica i dati di un applicativo
  358.      *
  359.      * Questa operazione consente di aggiornare i dati di un applicativo identificato dal nome e dal soggetto di riferimento
  360.      */
  361.     @Override
  362.     public void updateApplicativo(Applicativo body, String nome, ProfiloEnum profilo, String soggetto) {
  363.         IContext context = this.getContext();
  364.         try {
  365.             context.getLogger().info("Invocazione in corso ...");    

  366.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  367.             context.getLogger().debug("Autorizzazione completata con successo");    
  368.            
  369.             BaseHelper.throwIfNull(body);
  370.            
  371.             Applicativo applicativo = body;
  372.             try{
  373.                 applicativo.setCredenziali(ApplicativiApiHelper.translateCredenzialiApplicativo(applicativo, false));
  374.             }
  375.             catch(javax.ws.rs.WebApplicationException e) {
  376.                 throw e;
  377.             }
  378.             catch(Throwable e) {
  379.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(e);
  380.             }
  381.            
  382.             final ApplicativiEnv env = new ApplicativiEnv(context.getServletRequest(), profilo, soggetto, context);
  383.             soggetto = env.idSoggetto.getNome();
  384.            
  385.             final ServizioApplicativo oldSa = BaseHelper.supplyOrNotFound( () -> ApplicativiApiHelper.getServizioApplicativo(nome, env.idSoggetto.getNome(), env.tipo_protocollo, env.saCore), "Servizio Applicativo");
  386.             ApiKeyInfo keyInfo = ApplicativiApiHelper.getApiKey(oldSa, false);
  387.             boolean updateKey = false;
  388.            
  389.             final ServizioApplicativo tmpSa = ApplicativiApiHelper.applicativoToServizioApplicativo(applicativo, env.tipo_protocollo, soggetto, env.stationCore, keyInfo, false);
  390.             final ServizioApplicativo newSa = ApplicativiApiHelper.getServizioApplicativo(nome, env.idSoggetto.getNome(), env.tipo_protocollo, env.saCore);
  391.            
  392.             if(ModalitaAccessoEnum.HTTP_BASIC.equals(body.getCredenziali().getModalitaAccesso())) {
  393.                 AuthenticationHttpBasic httpBasic = (AuthenticationHttpBasic) body.getCredenziali();
  394.                 if(httpBasic.getPassword()==null || StringUtils.isEmpty(httpBasic.getPassword())) {
  395.                     // password in update non è obbligatoria
  396.                     boolean set = false;
  397.                     if(newSa.getInvocazionePorta()!=null && newSa.getInvocazionePorta().sizeCredenzialiList()>0) {
  398.                         Credenziali cNewSaImageDB = newSa.getInvocazionePorta().getCredenziali(0);
  399.                         Credenziali cTmp = tmpSa.getInvocazionePorta().sizeCredenzialiList()>0 ? tmpSa.getInvocazionePorta().getCredenziali(0) : null;
  400.                         if(cNewSaImageDB!=null && cTmp!=null) {
  401.                             cTmp.setPassword(cNewSaImageDB.getPassword());
  402.                             cTmp.setCertificateStrictVerification(cNewSaImageDB.isCertificateStrictVerification());
  403.                             set = true;
  404.                         }
  405.                     }
  406.                     if(!set) {
  407.                         throw FaultCode.RICHIESTA_NON_VALIDA.toException("Tipo di autenticazione '"+body.getCredenziali().getModalitaAccesso()+"'; indicare la password");
  408.                     }
  409.                 }
  410.             }
  411.             else if(ModalitaAccessoEnum.API_KEY.equals(body.getCredenziali().getModalitaAccesso())) {
  412.                 AuthenticationApiKey apiKeyCred = (AuthenticationApiKey) body.getCredenziali();
  413.                 boolean appId = Helper.isAppId(apiKeyCred.isAppId());
  414.                 if(appId != keyInfo.isMultipleApiKeys()) {
  415.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException("Tipo di autenticazione '"+body.getCredenziali().getModalitaAccesso()+"'; modifica del tipo (appId) non consentita");
  416.                 }
  417.             }
  418.            
  419.             newSa.setNome(tmpSa.getNome());
  420.             newSa.setDescrizione(tmpSa.getDescrizione());
  421.             newSa.setIdSoggetto(tmpSa.getIdSoggetto());
  422.             newSa.setNomeSoggettoProprietario(tmpSa.getNomeSoggettoProprietario());
  423.             newSa.setTipoSoggettoProprietario(tmpSa.getTipoSoggettoProprietario());    
  424.             newSa.getInvocazionePorta().setCredenzialiList(tmpSa.getInvocazionePorta().getCredenzialiList());
  425.             newSa.getInvocazionePorta().setRuoli(tmpSa.getInvocazionePorta().getRuoli());

  426.             newSa.getProprietaList().clear();
  427.             if(applicativo.getProprieta()!=null && !applicativo.getProprieta().isEmpty()) {
  428.                 for (Proprieta4000OpzioneCifratura proprieta : applicativo.getProprieta()) {
  429.                     org.openspcoop2.core.config.Proprieta pConfig = new org.openspcoop2.core.config.Proprieta();
  430.                     pConfig.setNome(proprieta.getNome());
  431.                     if(env.saCore!=null && env.saCore.getDriverBYOKUtilities()!=null &&
  432.                             proprieta.isEncrypted()!=null && proprieta.isEncrypted().booleanValue()) {
  433.                         pConfig.setValore(env.saCore.getDriverBYOKUtilities().wrap(proprieta.getValore()));
  434.                     }
  435.                     else {
  436.                         if(proprieta.getValore().length()>4000) {
  437.                             throw FaultCode.RICHIESTA_NON_VALIDA.toException(CostantiControlStation.MESSAGGIO_ERRORE_VALORE_PROPRIETA_4000);
  438.                         }
  439.                         pConfig.setValore(proprieta.getValore());
  440.                     }
  441.                     newSa.addProprieta(pConfig);
  442.                 }
  443.             }
  444.            
  445.             // Vincolo rilasciato in 3.3.1
  446.             /**if (!oldSa.getNome().equals(newSa.getNome())) {
  447.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException("Non è possibile modificare il nome del servizio applicativo");
  448.             }*/
  449.            
  450.             ProtocolProperties protocolProperties = null;
  451.             if(profilo != null) {
  452.                 protocolProperties = ApplicativiApiHelper.getProtocolProperties(body, profilo, newSa, env);
  453.    
  454.                 if(protocolProperties != null) {
  455.                     newSa.setProtocolPropertyList(ProtocolPropertiesUtils.toProtocolPropertiesConfig(protocolProperties, ConsoleOperationType.ADD, null));
  456.                 }
  457.             }

  458.                    
  459.             IDServizioApplicativo oldID = new IDServizioApplicativo();
  460.             oldID.setIdSoggettoProprietario(ApplicativiApiHelper.getIDSoggetto(oldSa.getNomeSoggettoProprietario(), env.tipo_protocollo));
  461.             oldID.setNome(oldSa.getNome());
  462.            
  463.             newSa.setOldIDServizioApplicativoForUpdate(oldID);
  464.            
  465.             boolean dominioInternoNewSoggetto = env.isDominioInterno(new IDSoggetto(newSa.getTipoSoggettoProprietario(), newSa.getNomeSoggettoProprietario()));
  466.             ApplicativiApiHelper.validateCredentials(applicativo.getCredenziali(), dominioInternoNewSoggetto,
  467.                     profilo!=null && (profilo.equals(ProfiloEnum.MODI) || profilo.equals(ProfiloEnum.MODIPA)));
  468.            
  469.             List<ExtendedConnettore> listExtendedConnettore = null; // connettori extended non supportati via API
  470.            
  471.             ApplicativiApiHelper.overrideSAParameters(env.requestWrapper, env.saHelper, newSa, applicativo, keyInfo, updateKey);
  472.             env.requestWrapper.overrideParameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_PROTOCOLLO, env.tipo_protocollo);
  473.            
  474.             if (! env.saHelper.servizioApplicativoCheckData(
  475.                     TipoOperazione.CHANGE,
  476.                     null,
  477.                     oldSa.getIdSoggetto(),
  478.                     newSa.getTipologiaFruizione(),
  479.                     newSa.getTipologiaErogazione(),
  480.                     listExtendedConnettore, newSa,
  481.                     new StringBuilder()
  482.                 )) {
  483.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  484.             }
  485.            
  486.             ApplicativiApiHelper.validateProperties(env, protocolProperties, newSa, ConsoleOperationType.CHANGE);

  487.             // eseguo l'aggiornamento
  488.             List<Object> listOggettiDaAggiornare = ServiziApplicativiUtilities.getOggettiDaAggiornare(env.saCore, oldID, newSa);
  489.             env.saCore.performUpdateOperation(env.userLogin, false, listOggettiDaAggiornare.toArray());
  490.                    
  491.             context.getLogger().info("Invocazione completata con successo");    
  492.         }
  493.         catch(javax.ws.rs.WebApplicationException e) {
  494.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  495.             throw e;
  496.         }
  497.         catch(Throwable e) {
  498.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  499.             throw FaultCode.ERRORE_INTERNO.toException(e);
  500.         }
  501.     }
  502.    
  503.     /**
  504.      * Modifica i dati di un applicativo
  505.      *
  506.      * Questa operazione consente di aggiornare le credenziali associate ad un applicativo identificato dal nome e dal soggetto di riferimento
  507.      */
  508.     @Override
  509.     public void updateCredenzialiApplicativo(BaseCredenziali body, String nome, ProfiloEnum profilo, String soggetto) {
  510.         IContext context = this.getContext();
  511.         try {
  512.             context.getLogger().info("Invocazione in corso ...");    

  513.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  514.             context.getLogger().debug("Autorizzazione completata con successo");    
  515.            
  516.             BaseHelper.throwIfNull(body);
  517.            
  518.             OneOfBaseCredenzialiCredenziali credenziali = null;
  519.             try{
  520.                 credenziali = ApplicativiApiHelper.translateCredenzialiApplicativo(body, true); // metto true, come se fosse create per obbligare la password basic
  521.             }
  522.             catch(javax.ws.rs.WebApplicationException e) {
  523.                 throw e;
  524.             }
  525.             catch(Throwable e) {
  526.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(e);
  527.             }
  528.            
  529.             final ApplicativiEnv env = new ApplicativiEnv(context.getServletRequest(), profilo, soggetto, context);
  530.            
  531.             final ServizioApplicativo oldSa = BaseHelper.supplyOrNotFound( () -> ApplicativiApiHelper.getServizioApplicativo(nome, env.idSoggetto.getNome(), env.tipo_protocollo, env.saCore), "Servizio Applicativo");
  532.            
  533.             IDServizioApplicativo oldID = new IDServizioApplicativo();
  534.             oldID.setIdSoggettoProprietario(ApplicativiApiHelper.getIDSoggetto(oldSa.getNomeSoggettoProprietario(), env.tipo_protocollo));
  535.             oldID.setNome(oldSa.getNome());
  536.                        
  537.             ApiKeyInfo keyInfo = ApplicativiApiHelper.createApiKey(credenziali, oldID, env.saCore, env.protocolFactory.getProtocol());
  538.             boolean updateKey = true;
  539.            
  540.             List<Credenziali> newCredenziali = ApplicativiApiHelper.credenzialiFromAuth(credenziali, keyInfo);
  541.             if(oldSa.getInvocazionePorta()==null) {
  542.                 oldSa.setInvocazionePorta(new InvocazionePorta());
  543.             }
  544.             oldSa.getInvocazionePorta().getCredenzialiList().clear();
  545.             oldSa.getInvocazionePorta().getCredenzialiList().addAll(newCredenziali);
  546.            
  547.             oldSa.setOldIDServizioApplicativoForUpdate(oldID);
  548.                
  549.             boolean dominioInterno = env.isDominioInterno(oldID.getIdSoggettoProprietario());
  550.             ApplicativiApiHelper.validateCredentials(body.getCredenziali(), dominioInterno,
  551.                     profilo!=null && (profilo.equals(ProfiloEnum.MODI) || profilo.equals(ProfiloEnum.MODIPA)));
  552.            
  553.             List<ExtendedConnettore> listExtendedConnettore = null; // Non serve alla checkData perchè da Api, gli applicativi sono sempre fruitori
  554.            
  555.             ApplicativiApiHelper.overrideSAParameters(env.requestWrapper, env.saHelper, oldSa, credenziali, keyInfo, updateKey);
  556.             env.requestWrapper.overrideParameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_PROTOCOLLO, env.tipo_protocollo);
  557.            
  558.             if (! env.saHelper.servizioApplicativoCheckData(
  559.                     TipoOperazione.CHANGE,
  560.                     null,
  561.                     oldSa.getIdSoggetto(),
  562.                     oldSa.getTipologiaFruizione(),
  563.                     oldSa.getTipologiaErogazione(),
  564.                     listExtendedConnettore, oldSa,
  565.                     new StringBuilder()
  566.                 )) {
  567.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  568.             }
  569.            
  570.             // eseguo l'aggiornamento
  571.             List<Object> listOggettiDaAggiornare = ServiziApplicativiUtilities.getOggettiDaAggiornare(env.saCore, oldID, oldSa);
  572.             env.saCore.performUpdateOperation(env.userLogin, false, listOggettiDaAggiornare.toArray());
  573.                
  574.             if(keyInfo!=null) {
  575.                 context.getServletResponse().setHeader(ApiKeyInfo.API_KEY, keyInfo.getApiKey());
  576.                 if(keyInfo.isMultipleApiKeys()) {
  577.                     context.getServletResponse().setHeader(ApiKeyInfo.APP_ID, keyInfo.getAppId());
  578.                 }
  579.             }
  580.            
  581.             context.getLogger().info("Invocazione completata con successo");    
  582.         }
  583.         catch(javax.ws.rs.WebApplicationException e) {
  584.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  585.             throw e;
  586.         }
  587.         catch(Throwable e) {
  588.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  589.             throw FaultCode.ERRORE_INTERNO.toException(e);
  590.         }
  591.     }
  592. }