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.utils.UtilsException;
  43. import org.openspcoop2.utils.service.BaseImpl;
  44. import org.openspcoop2.utils.service.authorization.AuthorizationConfig;
  45. import org.openspcoop2.utils.service.authorization.AuthorizationManager;
  46. import org.openspcoop2.utils.service.beans.ProfiloEnum;
  47. import org.openspcoop2.utils.service.beans.utils.BaseHelper;
  48. import org.openspcoop2.utils.service.beans.utils.ListaUtils;
  49. import org.openspcoop2.utils.service.context.IContext;
  50. import org.openspcoop2.utils.service.fault.jaxrs.FaultCode;
  51. import org.openspcoop2.web.ctrlstat.core.ConsoleSearch;
  52. import org.openspcoop2.web.ctrlstat.dao.SoggettoCtrlStat;
  53. import org.openspcoop2.web.ctrlstat.servlet.soggetti.SoggettiUtilities;
  54. import org.openspcoop2.web.lib.mvc.TipoOperazione;


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

  63.     public SoggettiApiServiceImpl(){
  64.         super(org.slf4j.LoggerFactory.getLogger(SoggettiApiServiceImpl.class));
  65.     }

  66.     private AuthorizationConfig getAuthorizationConfig() throws UtilsException{
  67.         return new AuthorizationConfig(ServerProperties.getInstance().getProperties());
  68.     }

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

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

  82.             SoggettiEnv env = new SoggettiEnv(context.getServletRequest(),  profilo, context);

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


  168.    
  169.     /**
  170.      * Elimina un soggetto
  171.      *
  172.      * Questa operazione consente di eliminare un soggetto identificato dal nome
  173.      *
  174.      */
  175.     @Override
  176.     public void deleteSoggetto(String nome, ProfiloEnum profilo) {
  177.         IContext context = this.getContext();
  178.         try {
  179.             context.getLogger().info("Invocazione in corso ...");    

  180.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  181.             context.getLogger().debug("Autorizzazione completata con successo");
  182.            
  183.             if (profilo == null)
  184.                 profilo = Helper.getProfiloDefault();
  185.            
  186.             SoggettiEnv env = new SoggettiEnv(context.getServletRequest(), profilo, context);
  187.             IDSoggetto idSogg = new IDSoggetto(env.tipo_soggetto, nome);
  188.            
  189.             org.openspcoop2.core.registry.Soggetto soggettoRegistro = BaseHelper.evalnull(() -> env.soggettiCore.getSoggettoRegistro(idSogg) );
  190.             org.openspcoop2.core.config.Soggetto soggettoConfig = BaseHelper.evalnull(() -> env.soggettiCore.getSoggetto(soggettoRegistro.getId() ));
  191.            
  192.             if  ( soggettoRegistro != null && soggettoConfig != null ) {

  193.                 StringBuilder inUsoMessage = new StringBuilder();
  194.                 SoggettiUtilities.deleteSoggetto(
  195.                         soggettoRegistro,
  196.                         soggettoConfig,
  197.                         env.userLogin,
  198.                         env.soggettiCore,
  199.                         env.soggettiHelper,
  200.                         inUsoMessage,
  201.                         "\n"
  202.                     );
  203.                 if (inUsoMessage.length() > 0)
  204.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.escapeHtml(inUsoMessage.toString()));
  205.             }
  206.             else if (env.delete_404) {
  207.                 throw FaultCode.NOT_FOUND.toException("Nessun soggetto corrisponde al nome e il profilo indicati");
  208.             }
  209.                    
  210.             context.getLogger().info("Invocazione completata con successo");    
  211.         }
  212.        
  213.         catch(javax.ws.rs.WebApplicationException e) {
  214.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  215.             throw e;
  216.         }
  217.         catch(Throwable e) {
  218.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  219.             throw FaultCode.ERRORE_INTERNO.toException(e);
  220.         }
  221.     }
  222.    
  223.     /**
  224.      * Ricerca soggetti
  225.      *
  226.      * Elenca i soggetti registrati
  227.      *
  228.      */
  229.     @Override
  230.     public ListaSoggetti findAllSoggetti(ProfiloEnum profilo, String q, Integer limit, Integer offset, DominioEnum dominio, String ruolo, ModalitaAccessoEnum tipoCredenziali, Boolean profiloQualsiasi) {
  231.         IContext context = this.getContext();
  232.         try {
  233.             context.getLogger().info("Invocazione in corso ...");    

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

  299.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  300.             context.getLogger().debug("Autorizzazione completata con successo");    
  301.            
  302.             SoggettiEnv env = new SoggettiEnv(context.getServletRequest(), profilo, context);          
  303.             IDSoggetto idSogg = new IDSoggetto(env.tipo_soggetto,nome);
  304.            
  305.             org.openspcoop2.core.registry.Soggetto soggettoReg = BaseHelper.supplyOrNotFound( () -> env.soggettiCore.getSoggettoRegistro(idSogg), "Soggetto " + idSogg.toString() );
  306.            
  307.             Soggetto soggettoApi = BaseHelper.supplyOrNotFound( () -> SoggettiApiHelper.soggettoRegistroToApi(soggettoReg, env.pddCore,env.soggettiCore), "Soggetto " + idSogg.toString());
  308.            
  309.             if (soggettoApi == null)
  310.                 throw FaultCode.NOT_FOUND.toException("Nessun soggetto trovato corrisponde al nome " + nome + " e profilo " + profilo.toString());
  311.                        
  312.        
  313.             context.getLogger().info("Invocazione completata con successo");
  314.             return soggettoApi;
  315.      
  316.         }
  317.         catch(javax.ws.rs.WebApplicationException e) {
  318.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  319.             throw e;
  320.         }
  321.         catch(Throwable e) {
  322.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  323.             throw FaultCode.ERRORE_INTERNO.toException(e);
  324.         }
  325.     }
  326.    
  327.     /**
  328.      * Modifica i dati di un soggetto
  329.      *
  330.      * Questa operazione consente di aggiornare le credenziali associate ad un soggetto identificato dal nome
  331.      *
  332.      */
  333.     @Override
  334.     public void updateCredenzialiSoggetto(BaseCredenziali body, String nome, ProfiloEnum profilo) {
  335.         IContext context = this.getContext();
  336.         try {
  337.             context.getLogger().info("Invocazione in corso ...");    

  338.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  339.             context.getLogger().debug("Autorizzazione completata con successo");
  340.            
  341.             if (profilo == null)
  342.                 profilo = Helper.getProfiloDefault();
  343.            
  344.             SoggettiApiHelper.validateCredentials(body.getCredenziali());
  345.            
  346.             OneOfBaseCredenzialiCredenziali credenziali = null;
  347.             try{
  348.                 credenziali = Helper.translateCredenziali(body.getCredenziali(), true); // metto true, come se fosse create per obbligare la password basic
  349.             }
  350.             catch(javax.ws.rs.WebApplicationException e) {
  351.                 throw e;
  352.             }
  353.             catch(Throwable e) {
  354.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(e);
  355.             }

  356.             final SoggettiEnv env = new SoggettiEnv(context.getServletRequest(), profilo, context);
  357.            
  358.             final IDSoggetto idSogg = new IDSoggetto(env.tipo_soggetto,nome);          
  359.             org.openspcoop2.core.registry.Soggetto oldSoggetto = null;
  360.             try {
  361.                 oldSoggetto = env.soggettiCore.getSoggettoRegistro(idSogg);
  362.             } catch (Exception e) {        
  363.             }
  364.             if (oldSoggetto == null)
  365.                 throw FaultCode.NOT_FOUND.toException("Nessun soggetto trovato corrisponde al nome " + nome + " e profilo " + profilo.toString());
  366.            
  367.             ApiKeyInfo keyInfo = SoggettiApiHelper.createApiKey(credenziali, idSogg, env.soggettiCore, env.protocolFactory.getProtocol());
  368.             boolean updateKey = true;
  369.            
  370.             SoggettiApiHelper.overrideAuthParams(env.soggettiHelper, credenziali, env.requestWrapper,
  371.                     keyInfo, updateKey);
  372.                        
  373.             final org.openspcoop2.core.registry.Soggetto newSoggetto = env.soggettiCore.getSoggettoRegistro(idSogg);
  374.            
  375.             try {
  376.                 List<CredenzialiSoggetto> newCredenziali = Helper.apiCredenzialiToGovwayCred(
  377.                             body.getCredenziali(),
  378.                             body.getCredenziali().getModalitaAccesso(),
  379.                             CredenzialiSoggetto.class,
  380.                             org.openspcoop2.core.registry.constants.CredenzialeTipo.class,
  381.                             keyInfo
  382.                 );      
  383.                 newSoggetto.getCredenzialiList().clear();
  384.                 newSoggetto.getCredenzialiList().addAll(newCredenziali);
  385.             }catch(Exception e) {
  386.                 throw new DriverRegistroServiziException(e.getMessage(),e);
  387.             }
  388.            
  389.            
  390.             boolean isOk = env.soggettiHelper.soggettiCheckData(
  391.                     TipoOperazione.CHANGE,
  392.                     oldSoggetto.getId().toString(),
  393.                     env.tipo_soggetto,
  394.                     newSoggetto.getNome(),
  395.                     newSoggetto.getCodiceIpa(),
  396.                     null,  // this.pd_url_prefix_rewriter,
  397.                     null, // this.pa_url_prefix_rewriter,
  398.                     oldSoggetto,
  399.                     false,  //IsSupportatoAutenticazione
  400.                     newSoggetto.getDescrizione(),
  401.                     newSoggetto.getPortaDominio()
  402.                 );
  403.            
  404.             if (!isOk)
  405.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  406.            
  407.             newSoggetto.setOldIDSoggettoForUpdate(new IDSoggetto(oldSoggetto.getTipo(), oldSoggetto.getNome()));
  408.             env.soggettiCore.performUpdateOperation(env.userLogin, false, newSoggetto);

  409.             if(keyInfo!=null) {
  410.                 context.getServletResponse().setHeader(ApiKeyInfo.API_KEY, keyInfo.getApiKey());
  411.                 if(keyInfo.isMultipleApiKeys()) {
  412.                     context.getServletResponse().setHeader(ApiKeyInfo.APP_ID, keyInfo.getAppId());
  413.                 }
  414.             }
  415.            
  416.             context.getLogger().info("Invocazione completata con successo");
  417.              
  418.         }
  419.         catch(javax.ws.rs.WebApplicationException e) {
  420.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  421.             throw e;
  422.         }
  423.         catch(Throwable e) {
  424.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  425.             throw FaultCode.ERRORE_INTERNO.toException(e);
  426.         }
  427.     }
  428.    
  429.     @Override
  430.     public void updateSoggetto(Soggetto body, String nome, ProfiloEnum profilo) {
  431.         IContext context = this.getContext();
  432.         try {
  433.             context.getLogger().info("Invocazione in corso ...");    

  434.             AuthorizationManager.authorize(context, getAuthorizationConfig());
  435.             context.getLogger().debug("Autorizzazione completata con successo");
  436.            
  437.             if (profilo == null)
  438.                 profilo = Helper.getProfiloDefault();
  439.            
  440.             SoggettiApiHelper.validateCredentials(body.getCredenziali());
  441.            
  442.             Soggetto soggetto = null;
  443.             try{
  444.                 soggetto = (Soggetto) body;
  445.                 soggetto.setCredenziali(Helper.translateCredenziali(soggetto.getCredenziali(), false));
  446.             }
  447.             catch(javax.ws.rs.WebApplicationException e) {
  448.                 throw e;
  449.             }
  450.             catch(Throwable e) {
  451.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(e);
  452.             }

  453.             final SoggettiEnv env = new SoggettiEnv(context.getServletRequest(), profilo, context);
  454.            
  455.             final IDSoggetto idSogg = new IDSoggetto(env.tipo_soggetto,nome);
  456.             org.openspcoop2.core.registry.Soggetto oldSoggetto = null;
  457.             try {
  458.                 oldSoggetto = env.soggettiCore.getSoggettoRegistro(idSogg);
  459.             } catch (Exception e) {        
  460.             }
  461.             if (oldSoggetto == null)
  462.                 throw FaultCode.NOT_FOUND.toException("Nessun soggetto trovato corrisponde al nome " + nome + " e profilo " + profilo.toString());
  463.            
  464.             ApiKeyInfo keyInfo = SoggettiApiHelper.getApiKey(oldSoggetto, false);
  465.             boolean updateKey = false;
  466.            
  467.             SoggettiApiHelper.overrideAuthParams(env.soggettiHelper, soggetto, env.requestWrapper,
  468.                     keyInfo, updateKey);
  469.                        
  470.             SoggettoCtrlStat oldSoggettoCtrlStat = env.soggettiCore.getSoggettoCtrlStat(oldSoggetto.getId());
  471.            
  472.             final org.openspcoop2.core.registry.Soggetto newSoggetto = env.soggettiCore.getSoggettoRegistro(idSogg);
  473.            
  474.             SoggettiApiHelper.convert(body, newSoggetto, env, keyInfo);
  475.            
  476.             if(ModalitaAccessoEnum.HTTP_BASIC.equals(body.getCredenziali().getModalitaAccesso())) {
  477.                 AuthenticationHttpBasic httpBasic = (AuthenticationHttpBasic) body.getCredenziali();
  478.                 if(httpBasic.getPassword()==null || StringUtils.isEmpty(httpBasic.getPassword())) {
  479.                     // password in update non è obbligatoria
  480.                     boolean set = false;
  481.                     if(oldSoggetto.sizeCredenzialiList()>0) {
  482.                         CredenzialiSoggetto cImageDB = oldSoggetto.getCredenziali(0);
  483.                         CredenzialiSoggetto cTmp = newSoggetto.getCredenziali(0);
  484.                         if(cImageDB!=null && cTmp!=null) {
  485.                             cTmp.setPassword(cImageDB.getPassword());
  486.                             cTmp.setCertificateStrictVerification(cImageDB.isCertificateStrictVerification());
  487.                             set = true;
  488.                         }
  489.                     }
  490.                     if(!set) {
  491.                         throw FaultCode.RICHIESTA_NON_VALIDA.toException("Tipo di autenticazione '"+body.getCredenziali().getModalitaAccesso()+"'; indicare la password");
  492.                     }
  493.                 }
  494.             }
  495.             else if(ModalitaAccessoEnum.API_KEY.equals(body.getCredenziali().getModalitaAccesso())) {
  496.                 AuthenticationApiKey apiKeyCred = (AuthenticationApiKey) body.getCredenziali();
  497.                 boolean appId = Helper.isAppId(apiKeyCred.isAppId());
  498.                 if(appId != keyInfo.isMultipleApiKeys()) {
  499.                     throw FaultCode.RICHIESTA_NON_VALIDA.toException("Tipo di autenticazione '"+body.getCredenziali().getModalitaAccesso()+"'; modifica del tipo (appId) non consentita");
  500.                 }
  501.             }
  502.            
  503.             boolean isOk = env.soggettiHelper.soggettiCheckData(
  504.                     TipoOperazione.CHANGE,
  505.                     oldSoggetto.getId().toString(),
  506.                     env.tipo_soggetto,
  507.                     newSoggetto.getNome(),
  508.                     newSoggetto.getCodiceIpa(),
  509.                     null,  // this.pd_url_prefix_rewriter,
  510.                     null, // this.pa_url_prefix_rewriter,
  511.                     oldSoggetto,
  512.                     false,  //IsSupportatoAutenticazione
  513.                     newSoggetto.getDescrizione(),
  514.                     newSoggetto.getPortaDominio()
  515.                 );
  516.            
  517.             if (!isOk)
  518.                 throw FaultCode.RICHIESTA_NON_VALIDA.toException(StringEscapeUtils.unescapeHtml(env.pd.getMessage()));
  519.            
  520.             org.openspcoop2.core.config.Soggetto soggettoConfig = SoggettiApiHelper.soggettoRegistroToConfig(newSoggetto,oldSoggettoCtrlStat.getSoggettoConf(),false);
  521.             newSoggetto.setOldIDSoggettoForUpdate(new IDSoggetto(oldSoggetto.getTipo(), oldSoggetto.getNome()));
  522.             soggettoConfig.setOldIDSoggettoForUpdate(new IDSoggetto(oldSoggetto.getTipo(), oldSoggetto.getNome()));

  523.             SoggettoCtrlStat sog = new SoggettoCtrlStat(newSoggetto, soggettoConfig);
  524.            
  525.             sog.setOldNomeForUpdate(oldSoggetto.getNome());
  526.             sog.setOldTipoForUpdate(oldSoggetto.getTipo());

  527.             // eseguo l'aggiornamento
  528.             List<Object> listOggettiDaAggiornare = SoggettiUtilities.getOggettiDaAggiornare(
  529.                     env.soggettiCore,
  530.                     oldSoggetto.getNome(),
  531.                     newSoggetto.getNome(),
  532.                     oldSoggetto.getTipo(),
  533.                     newSoggetto.getTipo(),
  534.                     sog)
  535.                 ;
  536.             env.soggettiCore.performUpdateOperation(env.userLogin, false, listOggettiDaAggiornare.toArray());

  537.             context.getLogger().info("Invocazione completata con successo");
  538.              
  539.         }
  540.         catch(javax.ws.rs.WebApplicationException e) {
  541.             context.getLogger().error_except404("Invocazione terminata con errore '4xx': %s",e, e.getMessage());
  542.             throw e;
  543.         }
  544.         catch(Throwable e) {
  545.             context.getLogger().error("Invocazione terminata con errore: %s",e, e.getMessage());
  546.             throw FaultCode.ERRORE_INTERNO.toException(e);
  547.         }
  548.     }
  549.    
  550. }