Validatore.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.protocol.engine.validator;

  21. import java.util.ArrayList;
  22. import java.util.Iterator;
  23. import java.util.List;

  24. import org.openspcoop2.core.id.IDServizio;
  25. import org.openspcoop2.core.id.IDSoggetto;
  26. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  27. import org.openspcoop2.core.transazioni.utils.TempiElaborazione;
  28. import org.openspcoop2.message.OpenSPCoop2Message;
  29. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  30. import org.openspcoop2.message.constants.MessageType;
  31. import org.openspcoop2.message.constants.ServiceBinding;
  32. import org.openspcoop2.protocol.engine.Configurazione;
  33. import org.openspcoop2.protocol.sdk.Busta;
  34. import org.openspcoop2.protocol.sdk.BustaRawContent;
  35. import org.openspcoop2.protocol.sdk.Context;
  36. import org.openspcoop2.protocol.sdk.Eccezione;
  37. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  38. import org.openspcoop2.protocol.sdk.ProtocolException;
  39. import org.openspcoop2.protocol.sdk.SecurityInfo;
  40. import org.openspcoop2.protocol.sdk.Servizio;
  41. import org.openspcoop2.protocol.sdk.builder.ProprietaManifestAttachments;
  42. import org.openspcoop2.protocol.sdk.config.IProtocolManager;
  43. import org.openspcoop2.protocol.sdk.constants.ErroreCooperazione;
  44. import org.openspcoop2.protocol.sdk.constants.ErroriCooperazione;
  45. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  46. import org.openspcoop2.protocol.sdk.constants.LivelloRilevanza;
  47. import org.openspcoop2.protocol.sdk.constants.RuoloBusta;
  48. import org.openspcoop2.protocol.sdk.state.IState;
  49. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  50. import org.openspcoop2.protocol.sdk.validator.IValidatoreErrori;
  51. import org.openspcoop2.protocol.sdk.validator.ProprietaValidazione;
  52. import org.openspcoop2.protocol.sdk.validator.ProprietaValidazioneErrori;
  53. import org.openspcoop2.security.message.MessageSecurityContext;
  54. import org.openspcoop2.security.message.SubErrorCodeSecurity;
  55. import org.openspcoop2.utils.LoggerWrapperFactory;
  56. import org.openspcoop2.utils.digest.IDigestReader;
  57. import org.slf4j.Logger;




  58. /**
  59.  * Classe utilizzata per effettuare la validazione di una busta
  60.  *
  61.  * @author Poli Andrea (apoli@link.it)
  62.  * @author Tronci Fabio (tronci@link.it)
  63.  * @author Lorenzo Nardi (nardi@link.it)
  64.  * @author $Author$
  65.  * @version $Rev$, $Date$
  66.  */

  67. public class Validatore  {


  68.     /* ********  F I E L D S  P R I V A T I  ******** */

  69.     /** Se IState e' un'istanza di StatefulMessage possiede una Connessione SQL in autoCommit mode su cui effettuare query
  70.      *  Altrimenti, e' un'istanza di StatelessMessage e nn necessita di connessioni  */
  71.     private IState state;
  72.    
  73.    
  74.     /** Messaggio. */
  75.     private OpenSPCoop2Message msg;
  76.     private Context context;
  77.     /** Proprieta di Validazione. */
  78.     private ProprietaValidazione proprietaValidazione;
  79.     /** Eventuale errore avvenuto durante il processo di validazione */
  80.     ErroreCooperazione errore;
  81.     IntegrationFunctionError errore_integrationFunctionError;
  82.     /** Errori di validazione riscontrati sulla busta */
  83.     private java.util.List<Eccezione> erroriValidazione = new ArrayList<>();
  84.     /** Errori di processamento riscontrati sulla busta */
  85.     private java.util.List<Eccezione> erroriProcessamento = new ArrayList<>();
  86.     private String erroreProcessamento_internalMessage;
  87.     /** Indicazione se la busta validata e' un messaggio errore */
  88.     private boolean isMessaggioErrore;
  89.     private boolean isMessaggioErroreIntestazione;
  90.     private boolean isMessaggioErroreProcessamento;
  91.     /** Indicazione se la busta validata e' una busta di servizio.
  92.      * Una busta e' una busta di servizio, se:
  93.      * - non possiede un servizio (non e' quindi una richiesta)
  94.      * - non possiede un riferimentoMsg (non e' quindi una risposta)
  95.      **/
  96.     private boolean isBustaDiServizio;
  97.     /** Oggetto Busta contenente i valori della busta ricevuta */
  98.     private Busta busta;
  99.     /** Soggetto Mittente della busta */
  100.     private IDSoggetto mittente;
  101.     /** Servizio richiesto nella busta */
  102.     private IDServizio servizio;
  103.     /** ValidazioneSintattica */
  104.     private ValidazioneSintattica validatoreSintattico;
  105.     public ValidazioneSintattica getValidatoreSintattico() {
  106.         return this.validatoreSintattico;
  107.     }
  108.     public void setValidatoreSintattico(ValidazioneSintattica validator) {
  109.         this.validatoreSintattico = validator;
  110.     }
  111.    
  112.     /** ServizioCorrelato */
  113.     private String servizioCorrelato;
  114.     /** Tipo ServizioCorrelato */
  115.     private String tipoServizioCorrelato;
  116.     /** Versione ServizioCorrelato */
  117.     private Integer versioneServizioCorrelato;
  118.     /** informazioni Servizio */
  119.     private Servizio infoServizio = null;
  120.     /** Profilo di Gestione */
  121.     private String versioneProtocollo = null;
  122.     /** RuoloBusta */
  123.     private RuoloBusta ruoloBustaRicevuta = null;
  124.     /** SecurityInfo */
  125.     private SecurityInfo securityInfo = null;
  126.    
  127.     /** Indicazione se leggere gli attributi qualificati */
  128.     private boolean readQualifiedAttribute;

  129.    
  130.     /** Logger utilizzato per debug. */
  131.     private org.slf4j.Logger log = null;
  132.     private IProtocolFactory<?> protocolFactory;
  133.     private IProtocolManager protocolManager;
  134.     /** bustaErroreHeaderIntestazione: generata solo quando la busta arrivata non contiene gli elementi principali */
  135.     private Busta bustaErroreHeaderIntestazione = null;
  136.     public Busta getBustaErroreHeaderIntestazione() {
  137.         return this.bustaErroreHeaderIntestazione;
  138.     }

  139.     /**
  140.      * Costruttore
  141.      *
  142.      * @param aMsg Messaggio da validare.
  143.      * @param aValidazione tipo di validazione.
  144.      * @param state Oggetto che rappresenta lo stato di una busta
  145.      * @throws ProtocolException
  146.      *
  147.      */
  148.     public Validatore(OpenSPCoop2Message aMsg,Context ctx,ProprietaValidazione aValidazione, IState state,boolean readQualifiedAttribute, IProtocolFactory<?> protocolFactory) throws ProtocolException {
  149.         this(aMsg,ctx,aValidazione,state,Configurazione.getLibraryLog(),readQualifiedAttribute, protocolFactory);
  150.     }
  151.     /**
  152.      * Costruttore
  153.      *
  154.      * @param aMsg Messaggio da validare.
  155.      * @param aValidazione tipo di validazione.
  156.      * @param state Oggetto che rappresenta lo stato di una busta
  157.      * @throws ProtocolException
  158.      *
  159.      */
  160.     public Validatore(OpenSPCoop2Message aMsg,Context ctx,ProprietaValidazione aValidazione,IState state,Logger alog,boolean readQualifiedAttribute, IProtocolFactory<?> protocolFactory) throws ProtocolException {
  161.         this.msg = aMsg;
  162.         this.context = ctx;
  163.         if(aValidazione == null)
  164.             this.proprietaValidazione = new ProprietaValidazione();
  165.         else
  166.             this.proprietaValidazione = aValidazione;
  167.         this.state = state;
  168.         if(alog!=null){
  169.             this.log = alog;
  170.         }else{
  171.             this.log = LoggerWrapperFactory.getLogger(Validatore.class);
  172.         }
  173.         this.readQualifiedAttribute = readQualifiedAttribute;
  174.         this.protocolFactory = protocolFactory;
  175.         this.protocolManager = this.protocolFactory.createProtocolManager();
  176.     }

  177.     /**
  178.      * Costruttore
  179.      *
  180.      * @param aMsg Messaggio da validare.
  181.      * @throws ProtocolException
  182.      *
  183.      */
  184.     public Validatore(OpenSPCoop2Message aMsg,Context ctx,IState state,Logger alog, IProtocolFactory<?> protocolFactory) throws ProtocolException {
  185.         this(aMsg,ctx,null,state,alog,false, protocolFactory);
  186.     }


  187.     public void updateState(IState state){
  188.         this.state = state;
  189.     }
  190.    
  191.     /**
  192.      * Avvia il processo di lettura di una busta ricevuta.
  193.      * Viene effettuata una validazione sintattica
  194.      * Vengono effettuati i seguenti passi:
  195.      * <ul>
  196.      * <li> Controllo header
  197.      * </ul>
  198.      *
  199.      *
  200.      * @return true in caso di identificazione con successo, false altrimenti.
  201.      *
  202.      */
  203.     public boolean validazioneSintattica() {
  204.         return validazioneSintattica(null, null);
  205.     }
  206.    
  207.     /**
  208.      * Per la validazione puo' essere necessaria la busta qualora le informazioni di cooperazione non siano dentro al messaggio.
  209.      *
  210.      * @param busta
  211.      * @return true se la struttura del messaggio e' corretta
  212.      */
  213.    
  214.     public boolean validazioneSintattica(Busta busta, Boolean isRichiestaParam) {

  215.         boolean request = (isRichiestaParam==null) || (isRichiestaParam.booleanValue());
  216.         try{
  217.             /** (Controllo presenza Busta) */
  218.             this.validatoreSintattico = new ValidazioneSintattica(this.context, this.state,this.msg, busta, isRichiestaParam, this.log,this.readQualifiedAttribute, this.protocolFactory);
  219.             if (this.validatoreSintattico.valida() == false){
  220.                 this.errore = this.validatoreSintattico.getErrore();
  221.                 this.errore_integrationFunctionError = this.validatoreSintattico.getErrore_integrationFunctionError();
  222.                 if(this.errore_integrationFunctionError==null) {
  223.                     if(request){
  224.                         this.errore_integrationFunctionError = IntegrationFunctionError.INVALID_INTEROPERABILITY_PROFILE_REQUEST;
  225.                     }
  226.                     else {
  227.                         this.errore_integrationFunctionError = IntegrationFunctionError.INVALID_INTEROPERABILITY_PROFILE_RESPONSE;
  228.                     }
  229.                 }
  230.                 this.bustaErroreHeaderIntestazione = this.validatoreSintattico.getBustaErroreHeaderIntestazione();
  231.                 return false;
  232.             }
  233.            
  234.             this.errore_integrationFunctionError = this.validatoreSintattico.getErrore_integrationFunctionError();
  235.            
  236.             this.busta = this.validatoreSintattico.getBusta();
  237.             IValidatoreErrori validatoreErrori = this.protocolFactory.createValidatoreErrori(this.state);
  238.             ProprietaValidazioneErrori pValidazioneErrori = new ProprietaValidazioneErrori();
  239.             pValidazioneErrori.setIgnoraEccezioniNonGravi(this.protocolManager.isIgnoraEccezioniNonGravi());
  240.             this.isMessaggioErrore = validatoreErrori.isBustaErrore(this.busta,this.msg,pValidazioneErrori);
  241.             this.isMessaggioErroreIntestazione = validatoreErrori.isBustaErroreIntestazione(this.busta, this.msg,pValidazioneErrori);
  242.             this.isMessaggioErroreProcessamento = validatoreErrori.isBustaErroreProcessamento(this.busta, this.msg,pValidazioneErrori);
  243.                            
  244.             this.isBustaDiServizio = this.protocolFactory.createProtocolManager().isBustaServizio(this.busta);

  245.             if(this.isMessaggioErrore){
  246.                 addListaEccezioni(this.validatoreSintattico.getErroriTrovatiSullaListaEccezioni(),this.erroriValidazione);
  247.             }
  248.             else{
  249.                 addListaEccezioni(this.validatoreSintattico.getEccezioniValidazione(),this.erroriValidazione);
  250.             }
  251.             addListaEccezioni(this.validatoreSintattico.getEccezioniProcessamento(),this.erroriProcessamento);
  252.             this.erroreProcessamento_internalMessage = this.validatoreSintattico.getErroreProcessamento_internalMessage();
  253.            
  254.             // Se comunque e' arrivata un busta di servizio, che non possiede nemmeno uno delle seguenti cose:
  255.             // - lista eccezioni
  256.             // - lista riscontri
  257.             // Allora non si tratta di una busta di servizio bensi' di una busta malformata
  258.             if((this.isBustaDiServizio) && (this.busta.sizeListaEccezioni()<=0) && (this.busta.sizeListaRiscontri()<=0)){
  259.                 Eccezione ec = Eccezione.getEccezioneValidazione(ErroriCooperazione.SERVIZIO_SCONOSCIUTO.getErroreCooperazione(), this.protocolFactory);
  260.                 this.erroriValidazione.add(ec);
  261.                 this.isBustaDiServizio = false;
  262.             }
  263.            
  264.             // Costruzione IDMittente e IDServizio
  265.             if(this.busta.getTipoMittente()!=null && this.busta.getMittente()!=null){
  266.                 this.mittente = new IDSoggetto(this.busta.getTipoMittente(),this.busta.getMittente());
  267.                 this.mittente.setCodicePorta(this.busta.getIdentificativoPortaMittente());
  268.             }
  269.             if(this.isBustaDiServizio==false) {
  270.                 try {
  271.                     this.servizio = IDServizioFactory.getInstance().getIDServizioFromValues(this.busta.getTipoServizio(),this.busta.getServizio(),
  272.                             this.busta.getTipoDestinatario(),this.busta.getDestinatario(),
  273.                             this.busta.getVersioneServizio());
  274.                 }catch(Exception e) {
  275.                     this.log.debug("Generazione IDServizio non possibile: "+ e.getMessage());
  276.                 }
  277.                 if(this.servizio!=null) {
  278.                     this.servizio.setAzione(this.busta.getAzione());
  279.                     if(this.servizio!=null && this.servizio.getSoggettoErogatore()!=null) {
  280.                         this.servizio.getSoggettoErogatore().setCodicePorta(this.busta.getIdentificativoPortaDestinatario());
  281.                     }
  282.                 }
  283.             }
  284.            
  285.             //  Se la lettura precedente ha riscontrato anomalie, ho gia' finito
  286.             if( ( (this.erroriValidazione!=null) && (this.erroriValidazione.size()>0) )
  287.                     ||
  288.                 ( (this.erroriProcessamento!=null) && (this.erroriProcessamento.size()>0) )
  289.                 )
  290.                 return true; // riscontrati errori durante la validazione sintattica.
  291.            
  292.             return true;
  293.            
  294.         }catch(Exception e){
  295.             this.log.error("validazioneSintattica",e);
  296.             this.eccezioneProcessamentoValidazioneSintattica = e;
  297.             this.errore = ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreProcessamento("Errore di processamento: " +e.getMessage());
  298.             if(request){
  299.                 this.errore_integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  300.             }
  301.             else {
  302.                 this.errore_integrationFunctionError = IntegrationFunctionError.INTERNAL_RESPONSE_ERROR;
  303.             }
  304.             return false;
  305.         }  
  306.     }
  307.     private Exception eccezioneProcessamentoValidazioneSintattica = null;
  308.     public Exception getEccezioneProcessamentoValidazioneSintattica() {
  309.         return this.eccezioneProcessamentoValidazioneSintattica;
  310.     }


  311.     /**
  312.      * Avvia il processo di validazione.
  313.      * Vengono effettuati i seguenti passi:
  314.      * <ul>
  315.      * <li> Message-Security
  316.      * <li> Controllo eventuale SOAPFault di un messaggio Errore
  317.      * <li> Controllo eventuale di un manifest degli attachments
  318.      * <li> Controllo con schema xsd
  319.      * <li> Validazione Semantica
  320.      * </ul>
  321.      *
  322.      * @param messageSecurityContext MessageSecurityContext utilizzato per l'applicazione di un header di MessageSecurity
  323.      * @return true in caso di validazione effettuata (con o senza errori), false in caso di errori di processamento
  324.      *
  325.      */
  326.     private boolean rilevatiErroriDuranteValidazioneSemantica = false;
  327.     public boolean isRilevatiErroriDuranteValidazioneSemantica() {
  328.         return this.rilevatiErroriDuranteValidazioneSemantica;
  329.     }
  330.     public boolean validazioneSemantica_beforeMessageSecurity(ServiceBinding serviceBinding, boolean rispostaConnectionReply,String profiloGestione, RequestInfo requestInfo) {
  331.         try{
  332.             this.rilevatiErroriDuranteValidazioneSemantica = true; // in fondo se arrivo corretto lo re-imposto a false
  333.            
  334.             if(this.validatoreSintattico == null){
  335.                 this.errore = ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreProcessamento("Errore di processamento: Analisi sintattica richiesta e validatoreSintattico non risulta inizializzato");
  336.                 return false;
  337.             }
  338.        
  339.             // Tipo Busta (Servizio,Richiesta,Risposta,Ricevuta)
  340.             if(this.ruoloBustaRicevuta==null)
  341.                 this.ruoloBustaRicevuta = ValidazioneSemantica.getTipoBustaDaValidare(serviceBinding, this.busta, this.protocolFactory, rispostaConnectionReply,this.state,this.log);
  342.             //log.info("Validazione tipoBusta ["+tipoBusta+"]...");
  343.        
  344.             // Riconoscimento Profilo di Gestione per servizio erogato.
  345.             try{
  346.                 if(rispostaConnectionReply){
  347.                     this.versioneProtocollo = profiloGestione;
  348.                 }else{
  349.                     if(this.busta!=null && this.busta.getMittente()!=null && this.busta.getTipoMittente()!=null){
  350.                         this.versioneProtocollo = ValidazioneSemantica.riconoscimentoVersioneProtocolloServizioErogato(this.busta, this.protocolFactory.createTraduttore(), this.ruoloBustaRicevuta, this.state, requestInfo);
  351.                     }
  352.                     else{
  353.                         // caso di protocollo che non richiedono l'autenticazione del soggetto
  354.                         this.versioneProtocollo = profiloGestione;
  355.                     }
  356.                 }
  357.             }catch(Exception e){
  358.                 // L'eventuale errore, e' dovuto al non riconoscimento nel registro dei servizi del soggetto mittente o destinatario.
  359.                 // L'errore verra' riportato poi nel resto della validazione se il messaggio non era un messaggio Errore
  360.                 // Se invece era gia' stato marcato come messaggio Errore, molto probabilmente uno dei motivi era quello!
  361.                 this.log.error("Riconoscimento profilo di gestione non riuscito",e);
  362.             }


  363.             if(this.protocolFactory.createProtocolVersionManager(this.versioneProtocollo).isEccezioniLivelloInfoAbilitato()){
  364.                 // Eventuali eccezioni trovate in buste errore, di livello INFO, non marcano il msg come BustaErrore, rieffettuo il test
  365.                 if(this.isMessaggioErrore){
  366.                     IValidatoreErrori validatoreErrori = this.protocolFactory.createValidatoreErrori(this.state);
  367.                     ProprietaValidazioneErrori pValidazioneErrori = new ProprietaValidazioneErrori();
  368.                     pValidazioneErrori.setIgnoraEccezioniNonGravi(this.protocolManager.isIgnoraEccezioniNonGravi());
  369.                     pValidazioneErrori.setVersioneProtocollo(this.versioneProtocollo);
  370.                     this.isMessaggioErrore = validatoreErrori.isBustaErrore(this.busta,this.msg,pValidazioneErrori);
  371.                     this.isMessaggioErroreIntestazione = validatoreErrori.isBustaErroreIntestazione(this.busta, this.msg,pValidazioneErrori);
  372.                     this.isMessaggioErroreProcessamento = validatoreErrori.isBustaErroreProcessamento(this.busta, this.msg,pValidazioneErrori);
  373.                 }
  374.             }

  375.             // Se la lettura precedente (readBusta) ha riscontrato anomalie, ho gia' finito
  376.             boolean ignoraEccezioniLivelloNonGravi = this.protocolFactory.createProtocolVersionManager(this.versioneProtocollo).isIgnoraEccezioniLivelloNonGrave();
  377.             int sizeErroriValidazione = countErrori(ignoraEccezioniLivelloNonGravi, this.erroriValidazione);
  378.             int sizeErroriProcessamento = countErrori(ignoraEccezioniLivelloNonGravi, this.erroriProcessamento);                
  379.             if( sizeErroriValidazione>0 || sizeErroriProcessamento>0 )
  380.                 return true; // riscontrati errori durante la validazione sintattica.

  381.         }catch(Exception e){
  382.             this.log.error("validazioneSemantica (validazioneSemantica_beforeMessageSecurity)",e);
  383.             this.eccezioneProcessamentoValidazioneSemantica = e;
  384.             this.errore = ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreCooperazione();
  385.             return false;
  386.         }

  387.         this.rilevatiErroriDuranteValidazioneSemantica = false;
  388.         return true;    
  389.     }
  390.    
  391.     public boolean validazioneSemantica_messageSecurity_readSecurityInfo(MessageSecurityContext messageSecurityContext) {
  392.         try{
  393.             this.rilevatiErroriDuranteValidazioneSemantica = true; // in fondo se arrivo corretto lo re-imposto a false
  394.                
  395.             /** Leggo contesto sicurezza prima di processare la parte MessageSecurity */
  396.             IDigestReader digestReader = null;
  397.             if(messageSecurityContext != null) {
  398.                 digestReader = messageSecurityContext.getDigestReader(this.msg!=null ? this.msg.getFactory() : OpenSPCoop2MessageFactory.getDefaultMessageFactory());
  399.             }
  400.             if(messageSecurityContext!= null && digestReader!=null){
  401.                 this.securityInfo = this.protocolFactory.createValidazioneSemantica(this.state).readSecurityInformation(digestReader,
  402.                         this.msg);
  403.             }      

  404.         }catch(Exception e){
  405.             this.log.error("validazioneSemantica (validazioneSemantica_messageSecurity_readSecurityInfo)",e);
  406.             this.eccezioneProcessamentoValidazioneSemantica = e;
  407.             this.errore = ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreCooperazione();
  408.             return false;
  409.         }

  410.         this.rilevatiErroriDuranteValidazioneSemantica = false;
  411.         return true;    
  412.     }
  413.    
  414.     public boolean validazioneSemantica_messageSecurity_process(MessageSecurityContext messageSecurityContext, StringBuilder errore, TempiElaborazione tempiElaborazione, boolean request) {
  415.         try{
  416.             this.rilevatiErroriDuranteValidazioneSemantica = true; // in fondo se arrivo corretto lo re-imposto a false
  417.                

  418.             /** Applicazione Message-Security (eventualmente per decriptare il body applicativo: utile anche per il SoapFault del MessaggioErrore) */
  419.             if(messageSecurityContext!= null && messageSecurityContext.getIncomingProperties() != null && messageSecurityContext.getIncomingProperties().size() > 0){
  420.                 boolean existsHeaderMessageSecurity = messageSecurityContext.existsSecurityHeader(this.msg, messageSecurityContext.getActor());
  421.                 if(messageSecurityContext.processIncoming(this.msg,this.busta,this.context, tempiElaborazione) == false){  
  422.                     List<Eccezione> eccezioniSicurezza = new ArrayList<>();
  423.                     if(messageSecurityContext.getListaSubCodiceErrore()!=null && messageSecurityContext.getListaSubCodiceErrore().size()>0){
  424.                         List<SubErrorCodeSecurity> subCodiciErrore = messageSecurityContext.getListaSubCodiceErrore();
  425.                         for (Iterator<?> iterator = subCodiciErrore.iterator(); iterator.hasNext();) {
  426.                             SubErrorCodeSecurity subCodiceErrore = (SubErrorCodeSecurity) iterator.next();
  427.                             Eccezione ecc = new Eccezione(ErroriCooperazione.MESSAGE_SECURITY.getErroreMessageSecurity(subCodiceErrore.getMsgErrore(), messageSecurityContext.getCodiceErrore()),true,null, this.protocolFactory);
  428.                             ecc.setSubCodiceEccezione(subCodiceErrore);
  429.                             eccezioniSicurezza.add(ecc);
  430.                         }
  431.                     }else{
  432.                         Eccezione ecc = new Eccezione(ErroriCooperazione.MESSAGE_SECURITY.getErroreMessageSecurity(messageSecurityContext.getMsgErrore(),messageSecurityContext.getCodiceErrore()), true, null, this.protocolFactory);
  433.                         eccezioniSicurezza.add(ecc);
  434.                     }
  435.                     if(request) {
  436.                         this.errore_integrationFunctionError=IntegrationFunctionError.MESSAGE_SECURITY_REQUEST_FAILED;
  437.                     }
  438.                     else {
  439.                         this.errore_integrationFunctionError=IntegrationFunctionError.MESSAGE_SECURITY_RESPONSE_FAILED;
  440.                     }
  441.                     if(this.isMessaggioErrore){
  442.                         // NOTA: il message security header puo' non essere presente se l'altra porta di dominio, ha generato un messaggio Busta Errore.
  443.                         //       La porta di dominio riesce ad aggiungere l'header di sicurezza solo se riesce ad identificare la PortaApplicativa/Delegata,
  444.                         //       altrimenti genera un msg di Busta Errore chiaramente senza header di sicurezza.
  445.                         if(existsHeaderMessageSecurity){
  446.                             for (Iterator<?> iterator = eccezioniSicurezza.iterator(); iterator.hasNext();) {
  447.                                 Eccezione ecc = (Eccezione) iterator.next();
  448.                                 this.erroriValidazione.add(ecc);    
  449.                                
  450.                                 if(errore.length()>0){
  451.                                     errore.append("\n");
  452.                                 }
  453.                                 errore.append(ecc.getDescrizione(this.protocolFactory));
  454.                             }
  455.                             return true; // riscontrati errori durante la validazione Message Security
  456.                         }
  457.                         else{
  458.                             StringBuilder bf = new StringBuilder();
  459.                             for (Iterator<?> iterator = eccezioniSicurezza.iterator(); iterator.hasNext();) {
  460.                                 Eccezione ecc = (Eccezione) iterator.next();
  461.                                 if(bf.length()>0){
  462.                                     bf.append(" ; ");
  463.                                 }
  464.                                 bf.append(ecc.toString(this.protocolFactory));
  465.                             }
  466.                             this.log.debug("MessageSecurityHeader not exists: "+bf.toString());
  467.                         }
  468.                     }else{
  469.                         for (Iterator<?> iterator = eccezioniSicurezza.iterator(); iterator.hasNext();) {
  470.                             Eccezione ecc = (Eccezione) iterator.next();
  471.                             this.erroriValidazione.add(ecc);
  472.                            
  473.                             if(errore.length()>0){
  474.                                 errore.append("\n");
  475.                             }
  476.                             errore.append(ecc.getDescrizione(this.protocolFactory));
  477.                         }
  478.                         return true; // riscontrati errori durante la validazione Message Security
  479.                     }
  480.                 }
  481.             }

  482.         }catch(Exception e){
  483.            
  484.             if(errore.length()>0){
  485.                 errore.append("\n");
  486.             }
  487.             errore.append(e.getMessage());
  488.            
  489.             this.log.error("validazioneSemantica (validazioneSemantica_messageSecurity_process)",e);
  490.             this.eccezioneProcessamentoValidazioneSemantica = e;
  491.             this.errore = ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreCooperazione();
  492.             return false;
  493.         }

  494.         this.rilevatiErroriDuranteValidazioneSemantica = false;
  495.         return true;    
  496.     }
  497.    
  498.     public boolean validazioneSemantica_afterMessageSecurity(ProprietaManifestAttachments proprietaManifestAttachments,boolean validazioneIdentificativiCompleta, RequestInfo requestInfo) {
  499.         try{
  500.             this.rilevatiErroriDuranteValidazioneSemantica = true; // in fondo se arrivo corretto lo re-imposto a false

  501.             /** Se ho ricevuto un messaggio Busta Errore, devo controllare il SOAPFault ricevuto
  502.              * Deve essere fatta dopo Message-Security per il Body (attachments manifest)
  503.              */
  504.             if(this.isMessaggioErrore){
  505.                 this.validatoreSintattico.validazioneFault(this.msg);
  506.                 addListaEccezioni(this.validatoreSintattico.getErroriTrovatiSullaListaEccezioni(),this.erroriValidazione);
  507.                 addListaEccezioni(this.validatoreSintattico.getEccezioniProcessamento(),this.erroriProcessamento);
  508.                 if( ( (this.erroriValidazione!=null) && (this.erroriValidazione.size()>0) )
  509.                         ||
  510.                     ( (this.erroriProcessamento!=null) && (this.erroriProcessamento.size()>0) )
  511.                     )
  512.                     return true; // riscontrati errori durante la validazione
  513.             }

  514.             // Controllo se il messaggio ha attachments
  515.             boolean hasAttachments = false;
  516.             if(ServiceBinding.SOAP.equals(this.msg.getServiceBinding())){
  517.                 hasAttachments = this.msg.castAsSoap().hasAttachments();
  518.             }
  519.             else if(MessageType.MIME_MULTIPART.equals(this.msg.getMessageType())){
  520.                 hasAttachments = true;
  521.             }
  522.            
  523.             /** Se ho ricevuto un messaggio con Attachments devo controllare il manifest
  524.              * Deve essere fatta dopo Message-Security per il Body (attachments manifest)
  525.              */
  526.             // Questa validazione non deve essere effettuata per messaggi Busta Errore
  527.             if(this.isMessaggioErrore==false){
  528.                 if(this.proprietaValidazione.isValidazioneManifestAttachments()){                  
  529.                     if(hasAttachments){
  530.                         this.validatoreSintattico.validazioneManifestAttachments(this.msg,proprietaManifestAttachments);
  531.                         addListaEccezioni(this.validatoreSintattico.getEccezioniValidazione(),this.erroriValidazione);
  532.                         addListaEccezioni(this.validatoreSintattico.getEccezioniProcessamento(),this.erroriProcessamento);
  533.                         if( ( (this.erroriValidazione!=null) && (this.erroriValidazione.size()>0) )
  534.                                 ||
  535.                             ( (this.erroriProcessamento!=null) && (this.erroriProcessamento.size()>0) )
  536.                             )
  537.                             return true; // riscontrati errori durante la validazione
  538.                     }
  539.                 }
  540.             }

  541.             /** Validazione semantica */
  542.             // Questa validazione non deve essere effettuata per messaggi Busta Errore
  543.             if(this.isMessaggioErrore==false){
  544.                 ValidazioneSemantica registryValidator = new ValidazioneSemantica(this.busta,this.context,this.state,validazioneIdentificativiCompleta,this.log, this.protocolFactory);
  545.                 registryValidator.valida(this.msg,this.proprietaValidazione,this.ruoloBustaRicevuta,this.versioneProtocollo, requestInfo);
  546.                 addListaEccezioni(registryValidator.getEccezioniValidazione(),this.erroriValidazione);
  547.                 addListaEccezioni(registryValidator.getEccezioniProcessamento(),this.erroriProcessamento);
  548.                 this.servizioCorrelato = registryValidator.getServizioCorrelato();
  549.                 this.tipoServizioCorrelato = registryValidator.getTipoServizioCorrelato();
  550.                 this.versioneServizioCorrelato = registryValidator.getVersioneServizioCorrelato();
  551.                 this.infoServizio = registryValidator.getInfoServizio();
  552.                 this.errore_integrationFunctionError = registryValidator.getErrore_integrationFunctionError();
  553.                 if( ( (this.erroriValidazione!=null) && (this.erroriValidazione.size()>0) )
  554.                         ||
  555.                     ( (this.erroriProcessamento!=null) && (this.erroriProcessamento.size()>0) )
  556.                     )
  557.                     return true; // riscontrati errori durante la validazione sul registro.
  558.             }

  559.             /** Validazione con SCHEMA (Opzionale): deve essere fatta dopo Message-Security per il Body (attachments manifest)*/
  560.             // Questa validazione deve essere effettuata anche per messaggi Busta Errore
  561.             if( this.proprietaValidazione.isValidazioneConSchema() ){
  562.                 ValidazioneConSchema schemaValidator = new ValidazioneConSchema(this.msg,
  563.                         this.isMessaggioErroreProcessamento, this.isMessaggioErroreIntestazione,
  564.                         this.proprietaValidazione.isValidazioneManifestAttachments(), this.log, this.protocolFactory,
  565.                         this.state);
  566.                 schemaValidator.valida(hasAttachments);
  567.                 addListaEccezioni(schemaValidator.getEccezioniValidazione(),this.erroriValidazione);
  568.                 addListaEccezioni(schemaValidator.getEccezioniProcessamento(),this.erroriProcessamento);
  569.                 if( ( (this.erroriValidazione!=null) && (this.erroriValidazione.size()>0) )
  570.                         ||
  571.                     ( (this.erroriProcessamento!=null) && (this.erroriProcessamento.size()>0) )
  572.                     )
  573.                     return true; // riscontrati errori durante la validazione
  574.             }


  575.         }catch(Exception e){
  576.             this.log.error("validazioneSemantica (validazioneSemantica_afterMessageSecurity)",e);
  577.             this.eccezioneProcessamentoValidazioneSemantica = e;
  578.             this.errore = ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreCooperazione();
  579.             return false;
  580.         }

  581.         this.rilevatiErroriDuranteValidazioneSemantica = false;
  582.         return true;    
  583.     }
  584.    
  585.     private Exception eccezioneProcessamentoValidazioneSemantica = null;
  586.     public Exception getEccezioneProcessamentoValidazioneSemantica() {
  587.         return this.eccezioneProcessamentoValidazioneSemantica;
  588.     }

  589.     /**
  590.      * In caso di avvenuto errore durante il processo di validazione,
  591.      * questo metodo ritorna l'errore.
  592.      *
  593.      * @return errore (se avvenuto).
  594.      *
  595.      */
  596.     public ErroreCooperazione getErrore(){
  597.         return this.errore;
  598.     }
  599.     public IntegrationFunctionError getErrore_integrationFunctionError() {
  600.         return this.errore_integrationFunctionError;
  601.     }

  602.     /**
  603.      * Indicazione se la validazione della busta ha riscontrato eccezioni
  604.      *
  605.      * @return true in caso la validazione abbia riscontrato eccezioni.
  606.      *
  607.      */
  608.     public boolean validazioneConEccezioni(){
  609.         if( ( (this.erroriValidazione!=null) && (this.erroriValidazione.size()>0) )
  610.                 ||
  611.             ( (this.erroriProcessamento!=null) && (this.erroriProcessamento.size()>0) )
  612.             )
  613.             return true;
  614.         else
  615.             return false;
  616.     }

  617.     /**
  618.      * Ritorna un List contenente eventuali eccezioni di validazione riscontrate nella busta.  
  619.      *
  620.      * @return Eccezioni riscontrate nella busta.
  621.      *
  622.      */
  623.     public java.util.List<Eccezione> getEccezioniValidazione(){
  624.         if(this.erroriValidazione!=null)
  625.             return this.erroriValidazione;
  626.         else
  627.             return new java.util.ArrayList<Eccezione>();
  628.     }
  629.     /**
  630.      * Ritorna un List contenente eventuali eccezioni di processamento riscontrate nella busta.  
  631.      *
  632.      * @return Eccezioni riscontrate nella busta.
  633.      *
  634.      */
  635.     public java.util.List<Eccezione> getEccezioniProcessamento(){
  636.         if(this.erroriProcessamento!=null)
  637.             return this.erroriProcessamento;
  638.         else
  639.             return new java.util.ArrayList<Eccezione>();
  640.     }
  641.    
  642.     public String getErroreProcessamento_internalMessage() {
  643.         return this.erroreProcessamento_internalMessage;
  644.     }

  645.     /**
  646.      * Indicazione se la busta processata e' un messaggio Errore.
  647.      *
  648.      * @return true se la busta e' un messaggio errore.
  649.      *
  650.      */
  651.     public boolean isErroreProtocollo(){
  652.         return this.isMessaggioErrore;
  653.     }
  654.     public boolean isMessaggioErroreIntestazione() {
  655.         return this.isMessaggioErroreIntestazione;
  656.     }
  657.     public boolean isMessaggioErroreProcessamento() {
  658.         return this.isMessaggioErroreProcessamento;
  659.     }

  660.     /**
  661.      * Indicazione se la busta processata e' una busta di servizio
  662.      *
  663.      * @return true se la busta e' una busta di servizio
  664.      *
  665.      */
  666.     public boolean isBustaDiServizio(){
  667.         return this.isBustaDiServizio;
  668.     }

  669.     /**
  670.      * Oggetto Busta contenente i valori della busta ricevuta.
  671.      *
  672.      * @return busta.
  673.      *
  674.      */
  675.     public Busta getBusta(){
  676.         return this.busta;
  677.     }


  678.     /**
  679.      * Soggetto Mittente.
  680.      *
  681.      * @return soggetto Mittente.
  682.      *
  683.      */
  684.     public IDSoggetto getSoggettoMittente(){
  685.         return this.mittente;
  686.     }

  687.     public void setMittente(IDSoggetto mittente) {
  688.         this.mittente = mittente;
  689.     }
  690.    
  691.     /**
  692.      * Identificativo del servizio presente nella busta.
  693.      *
  694.      * @return identificativo del servizio richiesto.
  695.      *
  696.      */
  697.     public IDServizio getIDServizio(){
  698.         return this.servizio;
  699.     }

  700.     /**
  701.      * Eventuale servizio correlato associato al servizio presente nella busta.
  702.      *
  703.      * @return Eventuale servizio correlato associato al servizio presente nella busta.
  704.      *
  705.      */
  706.     public String getServizioCorrelato() {
  707.         return this.servizioCorrelato;
  708.     }

  709.     /**
  710.      * Eventuale tipo di servizio correlato associato al servizio presente nella busta.
  711.      *
  712.      * @return Eventuale tipo di servizio correlato associato al servizio presente nella busta.
  713.      *
  714.      */
  715.     public String getTipoServizioCorrelato() {
  716.         return this.tipoServizioCorrelato;
  717.     }
  718.    
  719.     public Integer getVersioneServizioCorrelato() {
  720.         return this.versioneServizioCorrelato;
  721.     }
  722.    
  723.     public Servizio getInfoServizio() {
  724.         return this.infoServizio;
  725.     }

  726.     public String getProfiloGestione() {
  727.         return this.versioneProtocollo;
  728.     }
  729.     public void setProfiloGestione(String profiloGestione) {
  730.         this.versioneProtocollo = profiloGestione;
  731.     }

  732.     public RuoloBusta getRuoloBustaRicevuta(ServiceBinding serviceBinding, boolean rispostaConnectionReply) throws ProtocolException {
  733.         if(this.ruoloBustaRicevuta==null)
  734.             this.ruoloBustaRicevuta= ValidazioneSemantica.getTipoBustaDaValidare(serviceBinding, this.busta, this.protocolFactory, rispostaConnectionReply,this.state,this.log);
  735.         return this.ruoloBustaRicevuta;
  736.     }

  737.     public void setProprietaValidazione(ProprietaValidazione proprietaValidazione) {
  738.         this.proprietaValidazione = proprietaValidazione;
  739.     }
  740.    
  741.     public BustaRawContent<?> getHeaderProtocollo() {
  742.         return this.validatoreSintattico.getProtocolHeader();
  743.     }
  744.    
  745.     public BustaRawContent<?> getHeaderProtocollo_senzaControlli() throws ProtocolException{
  746.         this.validatoreSintattico = new ValidazioneSintattica(this.context, this.state,this.msg,this.log, this.protocolFactory);
  747.         return this.validatoreSintattico.getHeaderProtocollo_senzaControlli();
  748.     }

  749.     private void addListaEccezioni(List<Eccezione> from,List<Eccezione> to){
  750.         if(from!=null){
  751.             to.addAll(from);
  752.         }
  753.     }
  754.     public SecurityInfo getSecurityInfo() {
  755.         return this.securityInfo;
  756.     }
  757.    
  758.    
  759.     private int countErrori(boolean ignoraEccezioniNonGravi,List<Eccezione> list){
  760.         int size = 0;
  761.         if(list!=null){
  762.             for (Eccezione eccezione : list) {
  763.                 if(eccezione.getRilevanza()!=null && ignoraEccezioniNonGravi){
  764.                     if(LivelloRilevanza.isEccezioneLivelloGrave(eccezione.getRilevanza())){
  765.                         size++;
  766.                     }
  767.                 }
  768.                 else{
  769.                     size++;
  770.                 }
  771.             }
  772.         }
  773.         return size;
  774.     }
  775.    
  776.     public void updateMsg(OpenSPCoop2Message msg) throws ProtocolException {
  777.         String msgClassName = msg.getClass().getName()+ "";
  778.         boolean update = !msgClassName.equals(this.msg.getClass().getName());
  779.         if(update){
  780.             this.msg = msg;
  781.             if(this.validatoreSintattico!=null){
  782.                 this.validatoreSintattico.updateMsg(msg);
  783.             }
  784.         }
  785.     }
  786. }