SoggettiApiServiceImpl.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.soggetti;

  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.rs.server.api.SoggettiApi;
  27. import org.openspcoop2.core.config.rs.server.api.impl.ApiKeyInfo;
  28. import org.openspcoop2.core.config.rs.server.api.impl.Helper;
  29. import org.openspcoop2.core.config.rs.server.config.ServerProperties;
  30. import org.openspcoop2.core.config.rs.server.model.AuthenticationApiKey;
  31. import org.openspcoop2.core.config.rs.server.model.AuthenticationHttpBasic;
  32. import org.openspcoop2.core.config.rs.server.model.BaseCredenziali;
  33. import org.openspcoop2.core.config.rs.server.model.DominioEnum;
  34. import org.openspcoop2.core.config.rs.server.model.ListaSoggetti;
  35. import org.openspcoop2.core.config.rs.server.model.ModalitaAccessoEnum;
  36. import org.openspcoop2.core.config.rs.server.model.OneOfBaseCredenzialiCredenziali;
  37. import org.openspcoop2.core.config.rs.server.model.Soggetto;
  38. import org.openspcoop2.core.id.IDSoggetto;
  39. import org.openspcoop2.core.registry.CredenzialiSoggetto;
  40. import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
  41. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  42. import org.openspcoop2.protocol.sdk.constants.ConsoleOperationType;
  43. import org.openspcoop2.protocol.sdk.properties.ProtocolProperties;
  44. import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesUtils;
  45. import org.openspcoop2.utils.UtilsException;
  46. import org.openspcoop2.utils.service.BaseImpl;
  47. import org.openspcoop2.utils.service.authorization.AuthorizationConfig;
  48. import org.openspcoop2.utils.service.authorization.AuthorizationManager;
  49. import org.openspcoop2.utils.service.beans.ProfiloEnum;
  50. import org.openspcoop2.utils.service.beans.utils.BaseHelper;
  51. import org.openspcoop2.utils.service.beans.utils.ListaUtils;
  52. import org.openspcoop2.utils.service.context.IContext;
  53. import org.openspcoop2.utils.service.fault.jaxrs.FaultCode;
  54. import org.openspcoop2.web.ctrlstat.core.ConsoleSearch;
  55. import org.openspcoop2.web.ctrlstat.dao.SoggettoCtrlStat;
  56. import org.openspcoop2.web.ctrlstat.servlet.soggetti.SoggettiUtilities;
  57. import org.openspcoop2.web.lib.mvc.TipoOperazione;


  58. /**
  59.  * SoggettiApiServiceImpl
  60.  *
  61.  * @author $Author$
  62.  * @version $Rev$, $Date$
  63.  *
  64.  */
  65. public class SoggettiApiServiceImpl extends BaseImpl implements SoggettiApi {

  66.     public SoggettiApiServiceImpl(){
  67.         super(org.slf4j.LoggerFactory.getLogger(SoggettiApiServiceImpl.class));
  68.     }

  69.     private AuthorizationConfig getAuthorizationConfig() throws UtilsException{
  70.         return new AuthorizationConfig(ServerProperties.getInstance().getProperties());
  71.     }

  72.     /**
  73.      * Creazione di un soggetto
  74.      *
  75.      * Questa operazione consente di creare un soggetto
  76.      *
  77.      */
  78.     @Override
  79.     public void createSoggetto(Soggetto body, ProfiloEnum profilo) {
  80.         IContext context = this.getContext();
  81.         try {
  82.             context.getLogger().info("Invocazione in corso ...");    

  83.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  84.             context.getLogger().debug("Autorizzazione completata con successo");

  85.             if (profilo == null)
  86.                 profilo = Helper.getProfiloDefault();
  87.            
  88.             SoggettiEnv env = new SoggettiEnv(context.getServletRequest(),  profilo, context);

  89.             /**if (profilo == null)
  90.                 profilo = Helper.getProfiloDefault();*/
  91.            
  92.             Soggetto soggetto = null;
  93.             try{
  94.                 soggetto = body;
  95.                
  96.                 if ( soggetto.getCredenziali() != null && soggetto.getCredenziali().getModalitaAccesso() != null ) {
  97.                     soggetto.setCredenziali(Helper.translateCredenziali(soggetto.getCredenziali(), true));
  98.                 }
  99.                
  100.             }
  101.             catch(javax.ws.rs.WebApplicationException e) {
  102.                 throw e;
  103.             }
  104.             catch(Exception e) {
  105.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(e);
  106.             }
  107.            
  108.             String protocollo = env.protocolFactory.getProtocol();
  109.             String tipoSoggetto = ProtocolFactoryManager.getInstance().getDefaultOrganizationTypes().get(protocollo);
  110.             IDSoggetto idSoggetto = new IDSoggetto(tipoSoggetto,soggetto.getNome());
  111.        
  112.             SoggettiApiHelper.validateCredentials(soggetto.getCredenziali());
  113.            
  114.             ApiKeyInfo keyInfo = null;
  115.             if ( soggetto.getCredenziali() != null && soggetto.getCredenziali().getModalitaAccesso() != null ) {
  116.                 keyInfo = SoggettiApiHelper.createApiKey(soggetto.getCredenziali(), idSoggetto, env.soggettiCore, protocollo);
  117.                 boolean updateKey = false;
  118.                 SoggettiApiHelper.overrideAuthParams(env.soggettiHelper, soggetto, env.requestWrapper,
  119.                         keyInfo, updateKey);
  120.             }
  121.            
  122.             org.openspcoop2.core.registry.Soggetto soggettoRegistro = SoggettiApiHelper.soggettoApiToRegistro(soggetto, env, keyInfo);
  123.            
  124.             ProtocolProperties protocolProperties = null;
  125.             if(profilo != null) {
  126.                 protocolProperties = SoggettiApiHelper.getProtocolProperties(body, profilo, soggettoRegistro, env);
  127.    
  128.                 if(protocolProperties != null) {
  129.                     soggettoRegistro.setProtocolPropertyList(ProtocolPropertiesUtils.toProtocolPropertiesRegistry(protocolProperties, ConsoleOperationType.ADD, null));
  130.                 }
  131.             }
  132.            
  133.            
  134.             IDSoggetto idSogg = new IDSoggetto();
  135.             idSogg.setNome(soggettoRegistro.getNome());
  136.             idSogg.setTipo(soggettoRegistro.getTipo());
  137.             idSogg.setCodicePorta(soggettoRegistro.getIdentificativoPorta());
  138.            
  139.             if (env.soggettiCore.existsSoggetto(idSogg))
  140.                 throw FaultCode.CONFLITTO.toException("Esiste già un soggetto con il nome e il tipo scelti");
  141.             if (env.soggettiCore.existsSoggetto(soggettoRegistro.getCodiceIpa()))
  142.                 throw FaultCode.CONFLITTO.toException("Esiste già un soggetto con codice IPA " + soggettoRegistro.getCodiceIpa());
  143.            
  144.             boolean isOk = env.soggettiHelper.soggettiCheckData(
  145.                     TipoOperazione.ADD,
  146.                     null,
  147.                     env.tipo_soggetto,
  148.                     soggettoRegistro.getNome(),
  149.                     soggettoRegistro.getCodiceIpa(),
  150.                     null,   //pd_url_prefix_rewriter,
  151.                     null,   //pa_url_prefix_rewriter,
  152.                     null, false, soggettoRegistro.getDescrizione(), soggettoRegistro.getPortaDominio());
  153.            
  154.             if (!isOk)
  155.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  156.    
  157.             // Dal debug isRouter è sempre false.
  158.             org.openspcoop2.core.config.Soggetto soggettoConfig = SoggettiApiHelper.soggettoRegistroToConfig(soggettoRegistro,new org.openspcoop2.core.config.Soggetto(),false);
  159.             SoggettoCtrlStat sog = new SoggettoCtrlStat(soggettoRegistro, soggettoConfig);
  160.            
  161.             env.soggettiCore.performCreateOperation(env.userLogin, false, sog);    
  162.        
  163.             context.getLogger().info("Invocazione completata con successo");  
  164.            
  165.             if(keyInfo!=null) {
  166.                 context.getServletResponse().setHeader(ApiKeyInfo.API_KEY, keyInfo.getApiKey());
  167.                 if(keyInfo.isMultipleApiKeys()) {
  168.                     context.getServletResponse().setHeader(ApiKeyInfo.APP_ID, keyInfo.getAppId());
  169.                 }
  170.             }
  171.            
  172.             // Bug Fix: altrimenti viene generato 204
  173.             context.getServletResponse().setStatus(201);
  174.         }
  175.         catch(javax.ws.rs.WebApplicationException e) {
  176.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  177.             throw e;
  178.         }
  179.         catch(Throwable e) {
  180.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  181.             throw FaultCode.ERRORE_INTERNO.toException(e);
  182.         }
  183.     }


  184.    
  185.     /**
  186.      * Elimina un soggetto
  187.      *
  188.      * Questa operazione consente di eliminare un soggetto identificato dal nome
  189.      *
  190.      */
  191.     @Override
  192.     public void deleteSoggetto(String nome, ProfiloEnum profilo) {
  193.         IContext context = this.getContext();
  194.         try {
  195.             context.getLogger().info("Invocazione in corso ...");    

  196.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  197.             context.getLogger().debug("Autorizzazione completata con successo");
  198.            
  199.             if (profilo == null)
  200.                 profilo = Helper.getProfiloDefault();
  201.            
  202.             SoggettiEnv env = new SoggettiEnv(context.getServletRequest(), profilo, context);
  203.             IDSoggetto idSogg = new IDSoggetto(env.tipo_soggetto, nome);
  204.            
  205.             org.openspcoop2.core.registry.Soggetto soggettoRegistro = BaseHelper.evalnull(() -> env.soggettiCore.getSoggettoRegistro(idSogg) );
  206.             org.openspcoop2.core.config.Soggetto soggettoConfig = BaseHelper.evalnull(() -> env.soggettiCore.getSoggetto(soggettoRegistro.getId() ));
  207.            
  208.             if  ( soggettoRegistro != null && soggettoConfig != null ) {

  209.                 StringBuilder inUsoMessage = new StringBuilder();
  210.                 SoggettiUtilities.deleteSoggetto(
  211.                         soggettoRegistro,
  212.                         soggettoConfig,
  213.                         env.userLogin,
  214.                         env.soggettiCore,
  215.                         env.soggettiHelper,
  216.                         inUsoMessage,
  217.                         "\n"
  218.                     );
  219.                 if (inUsoMessage.length() > 0)
  220.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.escapeHtml(inUsoMessage.toString()));
  221.             }
  222.             else if (env.delete_404) {
  223.                 throw FaultCode.NOT_FOUND.toException("Nessun soggetto corrisponde al nome e il profilo indicati");
  224.             }
  225.                    
  226.             context.getLogger().info("Invocazione completata con successo");    
  227.         }
  228.        
  229.         catch(javax.ws.rs.WebApplicationException e) {
  230.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  231.             throw e;
  232.         }
  233.         catch(Throwable e) {
  234.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  235.             throw FaultCode.ERRORE_INTERNO.toException(e);
  236.         }
  237.     }
  238.    
  239.     /**
  240.      * Ricerca soggetti
  241.      *
  242.      * Elenca i soggetti registrati
  243.      *
  244.      */
  245.     @Override
  246.     public ListaSoggetti findAllSoggetti(ProfiloEnum profilo, String q, Integer limit, Integer offset, DominioEnum dominio, String ruolo, ModalitaAccessoEnum tipoCredenziali, Boolean profiloQualsiasi) {
  247.         IContext context = this.getContext();
  248.         try {
  249.             context.getLogger().info("Invocazione in corso ...");    

  250.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  251.             context.getLogger().debug("Autorizzazione completata con successo");
  252.            
  253.             if (profilo == null)
  254.                 profilo = Helper.getProfiloDefault();
  255.            
  256.             SoggettiEnv env = new SoggettiEnv(context.getServletRequest(), profilo, context);                        
  257.             int idLista = Liste.SOGGETTI;
  258.             ConsoleSearch ricerca = Helper.setupRicercaPaginata(q, limit, offset, idLista, env.idSoggetto.toIDSoggetto(), env.tipo_protocollo);
  259.            
  260.             if(profiloQualsiasi!=null && profiloQualsiasi) {
  261.                 ricerca.clearFilter(idLista, Filtri.FILTRO_PROTOCOLLO);
  262.             }
  263.            
  264.             if (dominio != null)
  265.                 ricerca.addFilter(idLista, Filtri.FILTRO_DOMINIO, dominio.toString());
  266.             if (ruolo != null && ruolo.trim().length() > 0)
  267.                 ricerca.addFilter(idLista, Filtri.FILTRO_RUOLO, ruolo.trim());
  268.             if(tipoCredenziali!=null) {
  269.                 String filtro = Helper.tipoAuthFromModalitaAccesso.get(tipoCredenziali);
  270.                 if(filtro!=null && !"".equals(filtro)) {
  271.                     ricerca.addFilter(idLista, Filtri.FILTRO_TIPO_CREDENZIALI, filtro);
  272.                 }
  273.             }
  274.            
  275.             List<org.openspcoop2.core.registry.Soggetto> soggetti = env.soggettiCore.soggettiRegistroList(null, ricerca);
  276.            
  277.             if ( soggetti.size() == 0 && env.findall_404 )
  278.                 throw FaultCode.NOT_FOUND.toException("Nessun soggetto corrisponde ai criteri di ricerca specificati");
  279.            
  280.             final ListaSoggetti ret = ListaUtils.costruisciListaPaginata(
  281.                     context.getUriInfo(),
  282.                     ricerca.getIndexIniziale(idLista),
  283.                     ricerca.getPageSize(idLista),
  284.                     ricerca.getNumEntries(idLista),
  285.                     ListaSoggetti.class
  286.                 );
  287.            
  288.             soggetti.forEach( s -> {
  289.                 ret.addItemsItem(SoggettiApiHelper.soggettoRegistroToItem(s,env.pddCore,env.soggettiCore));
  290.             });
  291.            
  292.             context.getLogger().info("Invocazione completata con successo");
  293.             return ret;
  294.      
  295.         }
  296.         catch(javax.ws.rs.WebApplicationException e) {
  297.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  298.             throw e;
  299.         }
  300.         catch(Throwable e) {
  301.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  302.             throw FaultCode.ERRORE_INTERNO.toException(e);
  303.         }
  304.     }
  305.    
  306.     /**
  307.      * Restituisce il dettaglio di un soggetto
  308.      *
  309.      * Questa operazione consente di ottenere il dettaglio di un soggetto identificato dal nome
  310.      *
  311.      *
  312.      */
  313.     @Override
  314.     public Soggetto getSoggetto(String nome, ProfiloEnum profilo) {
  315.         IContext context = this.getContext();
  316.         try {
  317.             context.getLogger().info("Invocazione in corso ...");    

  318.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  319.             context.getLogger().debug("Autorizzazione completata con successo");    
  320.            
  321.             if (profilo == null)
  322.                 profilo = Helper.getProfiloDefault();
  323.            
  324.             SoggettiEnv env = new SoggettiEnv(context.getServletRequest(), profilo, context);          
  325.             IDSoggetto idSogg = new IDSoggetto(env.tipo_soggetto,nome);
  326.            
  327.             org.openspcoop2.core.registry.Soggetto soggettoReg = BaseHelper.supplyOrNotFound( () -> env.soggettiCore.getSoggettoRegistro(idSogg), "Soggetto " + idSogg.toString() );
  328.            
  329.             Soggetto soggettoApi = BaseHelper.supplyOrNotFound( () -> SoggettiApiHelper.soggettoRegistroToApi(soggettoReg, env.pddCore,env.soggettiCore), "Soggetto " + idSogg.toString());
  330.            
  331.             if (soggettoApi == null)
  332.                 throw FaultCode.NOT_FOUND.toException("Nessun soggetto trovato corrisponde al nome " + nome + " e profilo " + profilo.toString());
  333.                      
  334.             SoggettiApiHelper.populateProtocolInfo(soggettoReg, soggettoApi, env, profilo);
  335.        
  336.             context.getLogger().info("Invocazione completata con successo");
  337.             return soggettoApi;
  338.      
  339.         }
  340.         catch(javax.ws.rs.WebApplicationException e) {
  341.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  342.             throw e;
  343.         }
  344.         catch(Throwable e) {
  345.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  346.             throw FaultCode.ERRORE_INTERNO.toException(e);
  347.         }
  348.     }
  349.    
  350.     /**
  351.      * Modifica i dati di un soggetto
  352.      *
  353.      * Questa operazione consente di aggiornare le credenziali associate ad un soggetto identificato dal nome
  354.      *
  355.      */
  356.     @Override
  357.     public void updateCredenzialiSoggetto(BaseCredenziali body, String nome, ProfiloEnum profilo) {
  358.         IContext context = this.getContext();
  359.         try {
  360.             context.getLogger().info("Invocazione in corso ...");    

  361.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  362.             context.getLogger().debug("Autorizzazione completata con successo");
  363.            
  364.             if (profilo == null)
  365.                 profilo = Helper.getProfiloDefault();
  366.            
  367.             SoggettiApiHelper.validateCredentials(body.getCredenziali());
  368.            
  369.             OneOfBaseCredenzialiCredenziali credenziali = null;
  370.             try{
  371.                 credenziali = Helper.translateCredenziali(body.getCredenziali(), true); // metto true, come se fosse create per obbligare la password basic
  372.             }
  373.             catch(javax.ws.rs.WebApplicationException e) {
  374.                 throw e;
  375.             }
  376.             catch(Throwable e) {
  377.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(e);
  378.             }

  379.             final SoggettiEnv env = new SoggettiEnv(context.getServletRequest(), profilo, context);
  380.            
  381.             final IDSoggetto idSogg = new IDSoggetto(env.tipo_soggetto,nome);          
  382.             org.openspcoop2.core.registry.Soggetto oldSoggetto = null;
  383.             try {
  384.                 oldSoggetto = env.soggettiCore.getSoggettoRegistro(idSogg);
  385.             } catch (Exception e) {        
  386.             }
  387.             if (oldSoggetto == null)
  388.                 throw FaultCode.NOT_FOUND.toException("Nessun soggetto trovato corrisponde al nome " + nome + " e profilo " + profilo.toString());
  389.            
  390.             ApiKeyInfo keyInfo = SoggettiApiHelper.createApiKey(credenziali, idSogg, env.soggettiCore, env.protocolFactory.getProtocol());
  391.             boolean updateKey = true;
  392.            
  393.             SoggettiApiHelper.overrideAuthParams(env.soggettiHelper, credenziali, env.requestWrapper,
  394.                     keyInfo, updateKey);
  395.                        
  396.             final org.openspcoop2.core.registry.Soggetto newSoggetto = env.soggettiCore.getSoggettoRegistro(idSogg);
  397.            
  398.             try {
  399.                 List<CredenzialiSoggetto> newCredenziali = Helper.apiCredenzialiToGovwayCred(
  400.                             body.getCredenziali(),
  401.                             body.getCredenziali().getModalitaAccesso(),
  402.                             CredenzialiSoggetto.class,
  403.                             org.openspcoop2.core.registry.constants.CredenzialeTipo.class,
  404.                             keyInfo
  405.                 );      
  406.                 newSoggetto.getCredenzialiList().clear();
  407.                 newSoggetto.getCredenzialiList().addAll(newCredenziali);
  408.             }catch(Exception e) {
  409.                 throw new DriverRegistroServiziException(e.getMessage(),e);
  410.             }
  411.                        
  412.             boolean isOk = env.soggettiHelper.soggettiCheckData(
  413.                     TipoOperazione.CHANGE,
  414.                     oldSoggetto.getId().toString(),
  415.                     env.tipo_soggetto,
  416.                     newSoggetto.getNome(),
  417.                     newSoggetto.getCodiceIpa(),
  418.                     null,  // this.pd_url_prefix_rewriter,
  419.                     null, // this.pa_url_prefix_rewriter,
  420.                     oldSoggetto,
  421.                     false,  //IsSupportatoAutenticazione
  422.                     newSoggetto.getDescrizione(),
  423.                     newSoggetto.getPortaDominio()
  424.                 );
  425.            
  426.             if (!isOk)
  427.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  428.            
  429.             newSoggetto.setOldIDSoggettoForUpdate(new IDSoggetto(oldSoggetto.getTipo(), oldSoggetto.getNome()));
  430.             env.soggettiCore.performUpdateOperation(env.userLogin, false, newSoggetto);

  431.             if(keyInfo!=null) {
  432.                 context.getServletResponse().setHeader(ApiKeyInfo.API_KEY, keyInfo.getApiKey());
  433.                 if(keyInfo.isMultipleApiKeys()) {
  434.                     context.getServletResponse().setHeader(ApiKeyInfo.APP_ID, keyInfo.getAppId());
  435.                 }
  436.             }
  437.            
  438.             context.getLogger().info("Invocazione completata con successo");
  439.              
  440.         }
  441.         catch(javax.ws.rs.WebApplicationException e) {
  442.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  443.             throw e;
  444.         }
  445.         catch(Throwable e) {
  446.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  447.             throw FaultCode.ERRORE_INTERNO.toException(e);
  448.         }
  449.     }
  450.    
  451.     @Override
  452.     public void updateSoggetto(Soggetto body, String nome, ProfiloEnum profilo) {
  453.         IContext context = this.getContext();
  454.         try {
  455.             context.getLogger().info("Invocazione in corso ...");    

  456.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  457.             context.getLogger().debug("Autorizzazione completata con successo");
  458.            
  459.             if (profilo == null)
  460.                 profilo = Helper.getProfiloDefault();
  461.            
  462.             SoggettiApiHelper.validateCredentials(body.getCredenziali());
  463.            
  464.             Soggetto soggetto = null;
  465.             try{
  466.                 soggetto = (Soggetto) body;
  467.                 soggetto.setCredenziali(Helper.translateCredenziali(soggetto.getCredenziali(), false));
  468.             }
  469.             catch(javax.ws.rs.WebApplicationException e) {
  470.                 throw e;
  471.             }
  472.             catch(Throwable e) {
  473.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(e);
  474.             }

  475.             final SoggettiEnv env = new SoggettiEnv(context.getServletRequest(), profilo, context);
  476.            
  477.             final IDSoggetto idSogg = new IDSoggetto(env.tipo_soggetto,nome);
  478.             org.openspcoop2.core.registry.Soggetto oldSoggetto = null;
  479.             try {
  480.                 oldSoggetto = env.soggettiCore.getSoggettoRegistro(idSogg);
  481.             } catch (Exception e) {        
  482.             }
  483.             if (oldSoggetto == null)
  484.                 throw FaultCode.NOT_FOUND.toException("Nessun soggetto trovato corrisponde al nome " + nome + " e profilo " + profilo.toString());
  485.            
  486.             ApiKeyInfo keyInfo = SoggettiApiHelper.getApiKey(oldSoggetto, false);
  487.             boolean updateKey = false;
  488.            
  489.             SoggettiApiHelper.overrideAuthParams(env.soggettiHelper, soggetto, env.requestWrapper,
  490.                     keyInfo, updateKey);
  491.                        
  492.             SoggettoCtrlStat oldSoggettoCtrlStat = env.soggettiCore.getSoggettoCtrlStat(oldSoggetto.getId());
  493.            
  494.             final org.openspcoop2.core.registry.Soggetto newSoggetto = env.soggettiCore.getSoggettoRegistro(idSogg);
  495.            
  496.             SoggettiApiHelper.convert(body, newSoggetto, env, keyInfo);
  497.            
  498.             if(body.getCredenziali()!=null && body.getCredenziali().getModalitaAccesso()!=null) {
  499.                 if(ModalitaAccessoEnum.HTTP_BASIC.equals(body.getCredenziali().getModalitaAccesso())) {
  500.                     AuthenticationHttpBasic httpBasic = (AuthenticationHttpBasic) body.getCredenziali();
  501.                     if(httpBasic.getPassword()==null || StringUtils.isEmpty(httpBasic.getPassword())) {
  502.                         // password in update non è obbligatoria
  503.                         boolean set = false;
  504.                         if(oldSoggetto.sizeCredenzialiList()>0) {
  505.                             CredenzialiSoggetto cImageDB = oldSoggetto.getCredenziali(0);
  506.                             CredenzialiSoggetto cTmp = newSoggetto.getCredenziali(0);
  507.                             if(cImageDB!=null && cTmp!=null) {
  508.                                 cTmp.setPassword(cImageDB.getPassword());
  509.                                 cTmp.setCertificateStrictVerification(cImageDB.isCertificateStrictVerification());
  510.                                 set = true;
  511.                             }
  512.                         }
  513.                         if(!set) {
  514.                             throw FaultCode.RICHIESTA_NON_VALIDA.toException("Tipo di autenticazione '"+body.getCredenziali().getModalitaAccesso()+"'; indicare la password");
  515.                         }
  516.                     }
  517.                 }
  518.                 else if(ModalitaAccessoEnum.API_KEY.equals(body.getCredenziali().getModalitaAccesso())) {
  519.                     AuthenticationApiKey apiKeyCred = (AuthenticationApiKey) body.getCredenziali();
  520.                     boolean appId = Helper.isAppId(apiKeyCred.isAppId());
  521.                     if(appId != keyInfo.isMultipleApiKeys()) {
  522.                         throw FaultCode.RICHIESTA_NON_VALIDA.toException("Tipo di autenticazione '"+body.getCredenziali().getModalitaAccesso()+"'; modifica del tipo (appId) non consentita");
  523.                     }
  524.                 }
  525.             }
  526.            
  527.             ProtocolProperties protocolProperties = null;
  528.             if(profilo != null) {
  529.                 protocolProperties = SoggettiApiHelper.getProtocolProperties(body, profilo, newSoggetto, env);
  530.    
  531.                 if(protocolProperties != null) {
  532.                     newSoggetto.setProtocolPropertyList(ProtocolPropertiesUtils.toProtocolPropertiesRegistry(protocolProperties, ConsoleOperationType.ADD, null));
  533.                 }
  534.             }
  535.            
  536.             boolean isOk = env.soggettiHelper.soggettiCheckData(
  537.                     TipoOperazione.CHANGE,
  538.                     oldSoggetto.getId().toString(),
  539.                     env.tipo_soggetto,
  540.                     newSoggetto.getNome(),
  541.                     newSoggetto.getCodiceIpa(),
  542.                     null,  // this.pd_url_prefix_rewriter,
  543.                     null, // this.pa_url_prefix_rewriter,
  544.                     oldSoggetto,
  545.                     false,  //IsSupportatoAutenticazione
  546.                     newSoggetto.getDescrizione(),
  547.                     newSoggetto.getPortaDominio()
  548.                 );
  549.            
  550.             if (!isOk)
  551.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  552.            
  553.             org.openspcoop2.core.config.Soggetto soggettoConfig = SoggettiApiHelper.soggettoRegistroToConfig(newSoggetto,oldSoggettoCtrlStat.getSoggettoConf(),false);
  554.             newSoggetto.setOldIDSoggettoForUpdate(new IDSoggetto(oldSoggetto.getTipo(), oldSoggetto.getNome()));
  555.             soggettoConfig.setOldIDSoggettoForUpdate(new IDSoggetto(oldSoggetto.getTipo(), oldSoggetto.getNome()));

  556.             SoggettoCtrlStat sog = new SoggettoCtrlStat(newSoggetto, soggettoConfig);
  557.            
  558.             sog.setOldNomeForUpdate(oldSoggetto.getNome());
  559.             sog.setOldTipoForUpdate(oldSoggetto.getTipo());

  560.             // eseguo l'aggiornamento
  561.             List<Object> listOggettiDaAggiornare = SoggettiUtilities.getOggettiDaAggiornare(
  562.                     env.soggettiCore,
  563.                     oldSoggetto.getNome(),
  564.                     newSoggetto.getNome(),
  565.                     oldSoggetto.getTipo(),
  566.                     newSoggetto.getTipo(),
  567.                     sog)
  568.                 ;
  569.             env.soggettiCore.performUpdateOperation(env.userLogin, false, listOggettiDaAggiornare.toArray());

  570.             context.getLogger().info("Invocazione completata con successo");
  571.              
  572.         }
  573.         catch(javax.ws.rs.WebApplicationException e) {
  574.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  575.             throw e;
  576.         }
  577.         catch(Throwable e) {
  578.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  579.             throw FaultCode.ERRORE_INTERNO.toException(e);
  580.         }
  581.     }
  582.    
  583. }