ModIValidazioneSemantica.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.modipa.validator;

  21. import java.io.Serializable;
  22. import java.util.ArrayList;
  23. import java.util.Date;
  24. import java.util.List;

  25. import org.apache.commons.lang.StringUtils;
  26. import org.openspcoop2.core.config.PortaApplicativa;
  27. import org.openspcoop2.core.config.PortaApplicativaAutorizzazioneServizioApplicativo;
  28. import org.openspcoop2.core.config.ServizioApplicativo;
  29. import org.openspcoop2.core.config.constants.RuoloTipologia;
  30. import org.openspcoop2.core.config.constants.StatoFunzionalita;
  31. import org.openspcoop2.core.constants.Costanti;
  32. import org.openspcoop2.core.constants.CostantiDB;
  33. import org.openspcoop2.core.constants.CostantiLabel;
  34. import org.openspcoop2.core.constants.TipoPdD;
  35. import org.openspcoop2.core.id.IDPortaApplicativa;
  36. import org.openspcoop2.core.id.IDServizioApplicativo;
  37. import org.openspcoop2.core.id.IDSoggetto;
  38. import org.openspcoop2.core.registry.Soggetto;
  39. import org.openspcoop2.message.OpenSPCoop2Message;
  40. import org.openspcoop2.message.constants.ServiceBinding;
  41. import org.openspcoop2.pdd.config.ConfigurazionePdDReader;
  42. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  43. import org.openspcoop2.pdd.config.PDNDResolver;
  44. import org.openspcoop2.pdd.core.CostantiPdD;
  45. import org.openspcoop2.pdd.core.token.InformazioniToken;
  46. import org.openspcoop2.pdd.core.token.TokenUtilities;
  47. import org.openspcoop2.pdd.core.token.parser.Claims;
  48. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  49. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  50. import org.openspcoop2.protocol.basic.validator.ValidazioneSemantica;
  51. import org.openspcoop2.protocol.engine.SecurityTokenUtilities;
  52. import org.openspcoop2.protocol.modipa.config.ModIProperties;
  53. import org.openspcoop2.protocol.modipa.constants.ModICostanti;
  54. import org.openspcoop2.protocol.modipa.utils.ModISecurityConfig;
  55. import org.openspcoop2.protocol.modipa.utils.ModIUtilities;
  56. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  57. import org.openspcoop2.protocol.sdk.Busta;
  58. import org.openspcoop2.protocol.sdk.Eccezione;
  59. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  60. import org.openspcoop2.protocol.sdk.ProtocolException;
  61. import org.openspcoop2.protocol.sdk.RestMessageSecurityToken;
  62. import org.openspcoop2.protocol.sdk.SecurityToken;
  63. import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
  64. import org.openspcoop2.protocol.sdk.constants.RuoloBusta;
  65. import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesUtils;
  66. import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
  67. import org.openspcoop2.protocol.sdk.state.IState;
  68. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  69. import org.openspcoop2.protocol.sdk.validator.ProprietaValidazione;
  70. import org.openspcoop2.protocol.sdk.validator.ValidazioneSemanticaResult;
  71. import org.openspcoop2.protocol.sdk.validator.ValidazioneUtils;
  72. import org.openspcoop2.protocol.utils.ModIUtils;
  73. import org.openspcoop2.protocol.utils.ModIValidazioneSemanticaProfiloSicurezza;
  74. import org.openspcoop2.utils.SortedMap;
  75. import org.openspcoop2.utils.certificate.remote.RemoteStoreConfig;
  76. import org.openspcoop2.utils.date.DateManager;
  77. import org.openspcoop2.utils.date.DateUtils;
  78. import org.openspcoop2.utils.digest.DigestEncoding;
  79. import org.openspcoop2.utils.properties.PropertiesUtilities;
  80. import org.openspcoop2.utils.transport.http.HttpConstants;



  81. /**
  82.  * Classe che implementa, in base al protocollo SdI, l'interfaccia {@link org.openspcoop2.protocol.sdk.validator.IValidazioneSemantica}
  83.  *
  84.  * @author Poli Andrea (apoli@link.it)
  85.  * @author $Author$
  86.  * @version $Rev$, $Date$
  87.  */

  88. public class ModIValidazioneSemantica extends ValidazioneSemantica {

  89.     /** ValidazioneUtils */
  90.     protected ValidazioneUtils validazioneUtils;
  91.    
  92.     /** Properties */
  93.     protected ModIProperties modiProperties;
  94.    
  95.     /** Errori di validazione riscontrati sulla busta */
  96.     protected java.util.List<Eccezione> erroriValidazione = new ArrayList<>();
  97.     /** Errori di processamento riscontrati sulla busta */
  98.     protected java.util.List<Eccezione> erroriProcessamento = new ArrayList<>();
  99.    
  100.     public ModIValidazioneSemantica(IProtocolFactory<?> factory, IState state) throws ProtocolException {
  101.         super(factory, state);
  102.         this.modiProperties = ModIProperties.getInstance();
  103.         this.validazioneUtils = new ValidazioneUtils(factory);
  104.     }

  105.     private static final String DIAGNOSTIC_VALIDATE = "validazioneSemantica";
  106.     private static final String DIAGNOSTIC_IN_CORSO = "inCorso";
  107.     private static final String DIAGNOSTIC_COMPLETATA = "completata";
  108.     private static final String DIAGNOSTIC_FALLITA = "fallita";
  109.    
  110.     private String getErroreClaimNonValido(String claim) {
  111.         return "Token contenente un claim '"+claim+"' non valido";
  112.     }
  113.     private String getErroreClaimNonPresente(String claim) {
  114.         return "Token non contiene il claim '"+claim+"'";
  115.     }
  116.     private Eccezione getErroreMittenteNonAutorizzato(Busta busta, String msgErrore) throws ProtocolException {
  117.         String idApp = busta.getServizioApplicativoFruitore() + " (Soggetto: "+busta.getMittente()+")";
  118.         return this.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.SICUREZZA_AUTORIZZAZIONE_FALLITA,
  119.                 "Applicativo Mittente "+idApp+" non autorizzato"+(msgErrore!=null ? "; "+msgErrore: ""));
  120.     }
  121.     private void addErroreMittenteNonAutorizzato(Busta busta, String msgErrore) throws ProtocolException {
  122.         this.erroriValidazione.add(getErroreMittenteNonAutorizzato(busta, msgErrore));
  123.     }
  124.    
  125.     private static final String MSG_ERRORE_NON_PRESENTE = "non presente";
  126.    
  127.     private String getPrefixHeader(String hdr) {
  128.         return "[Header '"+hdr+"'] ";
  129.     }
  130.    
  131.     @Override
  132.     public ValidazioneSemanticaResult valida(OpenSPCoop2Message msg, Busta busta,
  133.             ProprietaValidazione proprietaValidazione,
  134.             RuoloBusta tipoBusta) throws ProtocolException{
  135.        
  136.         this.valida(msg,busta,tipoBusta, this.protocolFactory, this.state);
  137.        
  138.         java.util.List<Eccezione> erroriValidazioneList = null;
  139.         if(!this.erroriValidazione.isEmpty()){
  140.             erroriValidazioneList = this.erroriValidazione;
  141.             if(this.context!=null) {
  142.                 this.context.addObject(Costanti.ERRORE_VALIDAZIONE_PROTOCOLLO, Costanti.ERRORE_TRUE);
  143.             }
  144.         }
  145.         java.util.List<Eccezione> erroriProcessamentoList = null;
  146.         if(!this.erroriProcessamento.isEmpty()){
  147.             erroriValidazioneList = this.erroriProcessamento;
  148.         }
  149.         return new ValidazioneSemanticaResult(erroriValidazioneList, erroriProcessamentoList, null, null, null, null);
  150.        
  151.     }

  152.     private void valida(OpenSPCoop2Message msg,Busta busta, RuoloBusta tipoBusta, IProtocolFactory<?> factory, IState state) throws ProtocolException{
  153.        
  154.         MsgDiagnostico msgDiag = null;
  155.         String tipoDiagnostico = null;
  156.         boolean verifica = false;
  157.         boolean autorizzazione = false;
  158.         int sizeListaErroriValidazionePrimaAutorizzazione = -1;
  159.         int sizeListaProcessamentoValidazionePrimaAutorizzazione = -1;
  160.         try{
  161.        
  162.             String prefixIntegrity = getPrefixHeader(this.modiProperties.getRestSecurityTokenHeaderModI());
  163.            
  164.             RequestInfo requestInfo = null;
  165.             if(this.context!=null && this.context.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
  166.                 requestInfo = (RequestInfo) this.context.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  167.             }
  168.            
  169.             boolean isRichiesta = RuoloBusta.RICHIESTA.equals(tipoBusta);
  170.            
  171.             boolean rest = msg!=null && ServiceBinding.REST.equals(msg.getServiceBinding());
  172.            
  173.             if(busta==null) {
  174.                 throw new ProtocolException("Busta undefined");
  175.             }
  176.            
  177.             IRegistryReader registryReader = null;
  178.            
  179.             TipoPdD tipoPdD = isRichiesta ? TipoPdD.APPLICATIVA : TipoPdD.DELEGATA;
  180.             IDSoggetto idSoggetto = TipoPdD.DELEGATA.equals(tipoPdD) ?
  181.                         new IDSoggetto(busta.getTipoMittente(),busta.getMittente()) :
  182.                         new IDSoggetto(busta.getTipoDestinatario(),busta.getDestinatario());
  183.             if(idSoggetto==null || idSoggetto.getTipo()==null || idSoggetto.getNome()==null) {
  184.                 idSoggetto = OpenSPCoop2Properties.getInstance().getIdentitaPortaDefault(this.protocolFactory.getProtocol(), requestInfo);
  185.             }
  186.             else {
  187.                 registryReader = this.getProtocolFactory().getCachedRegistryReader(this.state, requestInfo);
  188.                 idSoggetto.setCodicePorta(registryReader.getDominio(idSoggetto));
  189.             }
  190.             msgDiag = MsgDiagnostico.newInstance(TipoPdD.DELEGATA,
  191.                     idSoggetto,
  192.                     "ModI", requestInfo!=null && requestInfo.getProtocolContext()!=null ? requestInfo.getProtocolContext().getInterfaceName() : null,
  193.                     requestInfo,
  194.                     this.state);
  195.             if(TipoPdD.DELEGATA.equals(tipoPdD)){
  196.                 msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI);
  197.             }
  198.             else {
  199.                 msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_BUSTE);
  200.             }
  201.             msgDiag.setPddContext(this.context, this.protocolFactory);
  202.             tipoDiagnostico = isRichiesta ? ".richiesta." : ".risposta.";
  203.            
  204.            
  205.             Date now = DateManager.getDate();
  206.            
  207.            
  208.             ModIValidazioneSemanticaProfiloSicurezza modIValidazioneSemanticaProfiloSicurezza = new ModIValidazioneSemanticaProfiloSicurezza(busta, isRichiesta);
  209.            
  210.             boolean sicurezzaTokenOauth = modIValidazioneSemanticaProfiloSicurezza.isSicurezzaTokenOauth();
  211.             String securityMessageProfileSorgenteTokenIdAuth = modIValidazioneSemanticaProfiloSicurezza.getSecurityMessageProfileSorgenteTokenIdAuth();
  212.            
  213.             boolean sicurezzaMessaggio = modIValidazioneSemanticaProfiloSicurezza.isSicurezzaMessaggio();
  214.             boolean sicurezzaMessaggioIDAR04 = modIValidazioneSemanticaProfiloSicurezza.isSicurezzaMessaggioIDAR04();
  215.            
  216.             boolean sicurezzaAudit = modIValidazioneSemanticaProfiloSicurezza.isSicurezzaAudit();
  217.             String securityAuditPattern = modIValidazioneSemanticaProfiloSicurezza.getSecurityAuditPattern();
  218.            
  219.             if(sicurezzaMessaggio || sicurezzaAudit) {
  220.                 msgDiag.logPersonalizzato(DIAGNOSTIC_VALIDATE+tipoDiagnostico+DIAGNOSTIC_IN_CORSO);
  221.                 verifica=true;
  222.             }
  223.            
  224.             PortaApplicativa pa = null;
  225.            
  226.             RemoteStoreConfig rsc = null;
  227.            
  228.             if(isRichiesta && sicurezzaTokenOauth) {
  229.                
  230.                 String prefixAuthorization = getPrefixHeader(HttpConstants.AUTHORIZATION);
  231.                
  232.                 boolean sicurezzaToken = this.context.containsKey(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
  233.                 if(!sicurezzaToken) {
  234.                
  235.                     this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  236.                             CodiceErroreCooperazione.SICUREZZA_TOKEN_NON_PRESENTE,
  237.                                 prefixAuthorization+MSG_ERRORE_NON_PRESENTE));
  238.                 }
  239.                 else {
  240.                
  241.                     validateTokenAuthorizationId(msg,
  242.                             prefixAuthorization,
  243.                             modIValidazioneSemanticaProfiloSicurezza);
  244.                    
  245.                     boolean checkAudienceByModIConfig = sicurezzaMessaggio || sicurezzaAudit;
  246.                     pa = validateTokenAuthorizationAudience(msg, factory, state, requestInfo,
  247.                             isRichiesta, prefixAuthorization,
  248.                             checkAudienceByModIConfig);
  249.                                    
  250.                     PDNDResolver pdndResolver = new PDNDResolver(this.context, this.modiProperties.getRemoteStoreConfig());
  251.                     rsc = pdndResolver.enrichTokenInfo(requestInfo, sicurezzaMessaggio, sicurezzaAudit, idSoggetto);
  252.                
  253.                     boolean claimValidi = validateTokenAuthorizationClaims(rsc, idSoggetto, isRichiesta, prefixAuthorization);
  254.                     if(claimValidi) {
  255.                         if(registryReader==null) {
  256.                             registryReader = this.getProtocolFactory().getCachedRegistryReader(this.state, requestInfo);
  257.                         }
  258.                         validateTokenAuthorizationProducerIdByModIConfig(registryReader, idSoggetto,
  259.                                 isRichiesta, prefixAuthorization);
  260.                     }
  261.                 }
  262.                
  263.             }
  264.            
  265.            
  266.             if(sicurezzaMessaggio) {
  267.                
  268.                 if(isRichiesta && sicurezzaTokenOauth) {
  269.                     String id = busta.getProperty(CostantiDB.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_ID);
  270.                     if( id==null || StringUtils.isEmpty(id) ) {
  271.                         // non c'era un token di integrita nonostante ne sia stato configurato (es. per GET) e sia stato indicato di utilizzarlo come identificativo messaggio.
  272.                         // per questo motivo in ricezione buste il metodo 'ModIUtils.replaceBustaIdWithJtiTokenId' non è stato invocato
  273.                         // Utilizzo come identificativo del messaggio quello presente nel voucher.
  274.                         String jti = TokenUtilities.readJtiFromInformazioniToken(this.context);
  275.                         if(jti!=null && StringUtils.isNotEmpty(jti)) {
  276.                             ModIUtils.replaceBustaIdWithJtiTokenId(modIValidazioneSemanticaProfiloSicurezza, jti);
  277.                             msgDiag.updateKeywordIdMessaggioRichiesta(busta.getID());
  278.                             if(this.context!=null) {
  279.                                 this.context.put(Costanti.MODI_JTI_REQUEST_ID_UPDATE_DIAGNOSTIC, busta.getID());
  280.                             }
  281.                         }
  282.                     }
  283.                 }
  284.                
  285.                 String exp = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_EXP);
  286.                 if(exp!=null) {
  287.                     checkExp(exp, now, rest, "");
  288.                 }
  289.                
  290.                 String expIntegrity = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_REST_INTEGRITY_EXP);
  291.                 if(expIntegrity!=null) {
  292.                     checkExp(expIntegrity, now, rest, prefixIntegrity);
  293.                 }
  294.                
  295.                 String nbf = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_NBF);
  296.                 if(nbf!=null) {
  297.                     checkNbf(nbf, now, "");
  298.                 }
  299.                
  300.                 String nbfIntegrity = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_REST_INTEGRITY_NBF);
  301.                 if(nbfIntegrity!=null) {
  302.                     checkNbf(nbfIntegrity, now, prefixIntegrity);
  303.                 }
  304.                
  305.                 String iat = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_IAT);
  306.                 if(iat!=null) {
  307.                     checkIat(iat, msg, rest, "");
  308.                 }
  309.                
  310.                 String iatIntegrity = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_REST_INTEGRITY_IAT);
  311.                 if(iatIntegrity!=null) {
  312.                     checkIat(iatIntegrity, msg, rest, prefixIntegrity);
  313.                 }
  314.                
  315.                 String audienceBusta = busta.getProperty(rest ?
  316.                         ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_REST_AUDIENCE :
  317.                         ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_SOAP_WSA_TO   );
  318.                 List<String> listAudienceBusta = null;
  319.                 if(rest && this.modiProperties.isRestSecurityTokenAudienceProcessArrayModeEnabled()) {
  320.                     listAudienceBusta = ModIUtilities.getArrayStringAsList(audienceBusta, true);
  321.                 }
  322.                
  323.                 Object audienceAttesoObject = null;
  324.                 if(msg!=null) {
  325.                     audienceAttesoObject = msg.getContextProperty(ModICostanti.MODIPA_OPENSPCOOP2_MSG_CONTEXT_AUDIENCE_CHECK);
  326.                 }
  327.                 String audienceAtteso = null;
  328.                 if(audienceAttesoObject!=null) {
  329.                     audienceAtteso = (String) audienceAttesoObject;
  330.                 }
  331.                
  332.                 Object audienceAttesoOAuthObject = null;
  333.                 if(msg!=null) {
  334.                     audienceAttesoOAuthObject = msg.getContextProperty(ModICostanti.MODIPA_OPENSPCOOP2_MSG_CONTEXT_AUDIENCE_CHECK_OAUTH);
  335.                 }
  336.                 String audienceOAuthAtteso = null;
  337.                 if(audienceAttesoOAuthObject!=null) {
  338.                     audienceOAuthAtteso = (String) audienceAttesoOAuthObject;
  339.                 }
  340.                
  341.                 if(audienceAtteso!=null || audienceOAuthAtteso!=null) {
  342.                    
  343.                     boolean checkAudience = isAudienceValid(audienceAtteso, audienceBusta, listAudienceBusta);
  344.                    
  345.                     boolean checkAudienceOAuth = isAudienceValid(audienceOAuthAtteso, audienceBusta, listAudienceBusta);
  346.                    
  347.                     if(!checkAudience && !checkAudienceOAuth) {
  348.                        
  349.                         boolean buildSecurityTokenInRequest = true;
  350.                         Object buildSecurityTokenInRequestObject = msg.getContextProperty(ModICostanti.MODIPA_OPENSPCOOP2_MSG_CONTEXT_BUILD_SECURITY_REQUEST_TOKEN);
  351.                         if(buildSecurityTokenInRequestObject instanceof Boolean) {
  352.                             buildSecurityTokenInRequest = (Boolean) buildSecurityTokenInRequestObject;
  353.                         }
  354.                        
  355.                         if(isRichiesta || buildSecurityTokenInRequest) {
  356.                        
  357.                             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  358.                                     isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_VALIDO :
  359.                                         CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_VALIDO,
  360.                                         getErroreClaimNonValido(Claims.JSON_WEB_TOKEN_RFC_7519_AUDIENCE)));
  361.                            
  362.                         }
  363.                     }
  364.                 }
  365.                 if(rest) {
  366.                     Object audienceIntegrityAttesoObject = null;
  367.                     if(msg!=null) {
  368.                         audienceIntegrityAttesoObject = msg.getContextProperty(ModICostanti.MODIPA_OPENSPCOOP2_MSG_CONTEXT_AUDIENCE_INTEGRITY_CHECK);
  369.                     }
  370.                     String audienceIntegrityAtteso = null;
  371.                     if(audienceIntegrityAttesoObject!=null) {
  372.                         audienceIntegrityAtteso = (String) audienceIntegrityAttesoObject;
  373.                     }
  374.                    
  375.                     Object audienceIntegrityAttesoOAuthObject = null;
  376.                     if(msg!=null) {
  377.                         audienceIntegrityAttesoOAuthObject = msg.getContextProperty(ModICostanti.MODIPA_OPENSPCOOP2_MSG_CONTEXT_AUDIENCE_INTEGRITY_CHECK_OAUTH);
  378.                     }
  379.                     String audienceIntegrityOAuthAtteso = null;
  380.                     if(audienceIntegrityAttesoOAuthObject!=null) {
  381.                         audienceIntegrityOAuthAtteso = (String) audienceIntegrityAttesoOAuthObject;
  382.                     }
  383.                    
  384.                     if(audienceIntegrityAtteso!=null || audienceIntegrityOAuthAtteso!=null) {
  385.                         String audienceIntegrityBusta = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_REST_INTEGRITY_AUDIENCE);
  386.                         if(audienceIntegrityBusta==null) {
  387.                             // significa che l'audience tra i due token ricevuto e' identico
  388.                             audienceIntegrityBusta = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_REST_AUDIENCE);
  389.                         }
  390.                         List<String> listAudienceIntegrityBusta = null;
  391.                         if(audienceIntegrityBusta!=null && rest && this.modiProperties.isRestSecurityTokenAudienceProcessArrayModeEnabled()) {
  392.                             listAudienceIntegrityBusta = ModIUtilities.getArrayStringAsList(audienceIntegrityBusta, true);
  393.                         }
  394.                        
  395.                         boolean checkAudience = isAudienceValid(audienceIntegrityAtteso, audienceIntegrityBusta, listAudienceIntegrityBusta);
  396.                        
  397.                         boolean checkAudienceOAuth = isAudienceValid(audienceIntegrityOAuthAtteso, audienceIntegrityBusta, listAudienceIntegrityBusta);
  398.                        
  399.                         if(!checkAudience && !checkAudienceOAuth) {
  400.                             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  401.                                     isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_VALIDO :
  402.                                         CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_VALIDO,
  403.                                     prefixIntegrity+getErroreClaimNonValido(Claims.JSON_WEB_TOKEN_RFC_7519_AUDIENCE)));
  404.                         }
  405.                     }
  406.                 }
  407.                
  408.             }
  409.            
  410.            
  411.            
  412.             if(sicurezzaAudit) {
  413.            
  414.                 String prefixAudit = getPrefixHeader(this.modiProperties.getSecurityTokenHeaderModIAudit());
  415.                
  416.                 boolean audit02 = CostantiDB.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_CORNICE_SICUREZZA_PATTERN_AUDIT_REST_02.equals(securityAuditPattern);
  417.            
  418.                 String exp = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_CORNICE_SICUREZZA_AUDIT_EXP);
  419.                 if(exp!=null) {
  420.                     checkExp(exp, now, rest, prefixAudit);
  421.                 }
  422.                
  423.                 String nbf = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_CORNICE_SICUREZZA_AUDIT_NBF);
  424.                 if(nbf!=null) {
  425.                     checkNbf(nbf, now, prefixAudit);
  426.                 }
  427.                
  428.                 String iat = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_CORNICE_SICUREZZA_AUDIT_IAT);
  429.                 if(iat!=null) {
  430.                     checkIat(iat, msg, rest, prefixAudit);
  431.                 }
  432.                
  433.                 Object audienceAuditAttesoObject = null;
  434.                 if(msg!=null) {
  435.                     audienceAuditAttesoObject = msg.getContextProperty(ModICostanti.MODIPA_OPENSPCOOP2_MSG_CONTEXT_AUDIENCE_AUDIT_CHECK);
  436.                 }
  437.                 if(audienceAuditAttesoObject!=null) {
  438.                     String audienceAuditAtteso = (String) audienceAuditAttesoObject;
  439.                     String audienceAuditBusta = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_CORNICE_SICUREZZA_AUDIT_AUDIENCE);
  440.                     if(audienceAuditBusta==null) {
  441.                         // significa che l'audience tra i due token ricevuto e' identico
  442.                         audienceAuditBusta = busta.getProperty(ModICostanti.MODIPA_BUSTA_EXT_PROFILO_SICUREZZA_MESSAGGIO_REST_AUDIENCE);
  443.                     }
  444.                    
  445.                     List<String> listAudienceAuditBusta = null;
  446.                     if(audienceAuditBusta!=null && this.modiProperties.isSecurityTokenAuditProcessArrayModeEnabled()) {
  447.                         listAudienceAuditBusta = ModIUtilities.getArrayStringAsList(audienceAuditBusta, true);
  448.                     }
  449.                    
  450.                     boolean checkAudienceAudit = isAudienceValid(audienceAuditAtteso, audienceAuditBusta, listAudienceAuditBusta);
  451.                    
  452.                     if(!checkAudienceAudit) {
  453.                         this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  454.                                 isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_VALIDO :
  455.                                     CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_VALIDO,
  456.                                     prefixAudit+getErroreClaimNonValido(Claims.JSON_WEB_TOKEN_RFC_7519_AUDIENCE)));
  457.                     }
  458.                 }
  459.                
  460.                
  461.                 if(rsc!=null) {
  462.                    
  463.                     validatePurposeId(rsc, prefixAudit, securityAuditPattern);
  464.                    
  465.                 }
  466.                
  467.                 if(audit02) {
  468.                    
  469.                     validateAudit02(securityMessageProfileSorgenteTokenIdAuth, rest, prefixAudit);
  470.                    
  471.                 }
  472.                
  473.             }
  474.            
  475.            
  476.             if(verifica) {
  477.                 if(this.erroriValidazione.isEmpty() && this.erroriProcessamento.isEmpty()) {
  478.                     msgDiag.logPersonalizzato(DIAGNOSTIC_VALIDATE+tipoDiagnostico+DIAGNOSTIC_COMPLETATA);
  479.                 }
  480.                 else {
  481.                     String errore = null;
  482.                     if(!this.erroriValidazione.isEmpty()) {
  483.                         errore = ModIValidazioneSintattica.buildErrore(this.erroriValidazione, factory);
  484.                     }
  485.                     else {
  486.                         errore = ModIValidazioneSintattica.buildErrore(this.erroriProcessamento, factory);
  487.                     }
  488.                     msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, errore);
  489.                     msgDiag.logPersonalizzato(DIAGNOSTIC_VALIDATE+tipoDiagnostico+DIAGNOSTIC_FALLITA);
  490.                            
  491.                 }
  492.                 verifica = false;
  493.             }
  494.            
  495.            
  496.            
  497.             if(isRichiesta) {
  498.                 tipoDiagnostico = ".autorizzazione.";
  499.                 msgDiag.logPersonalizzato(DIAGNOSTIC_VALIDATE+tipoDiagnostico+DIAGNOSTIC_IN_CORSO);
  500.                 autorizzazione = true;
  501.                 sizeListaErroriValidazionePrimaAutorizzazione = this.erroriValidazione.size();
  502.                 sizeListaProcessamentoValidazionePrimaAutorizzazione = this.erroriProcessamento.size();
  503.                
  504.                
  505.                 // vale sia per sicurezza messaggio che per token
  506.                 // durante l'identificazione viene identificato 1 solo applicativo (non possono essere differenti tra token e trasporto)
  507.                 // viene quindi inserito dentro busta e usato per i controlli sottostanti
  508.                
  509.                 if(pa==null) {
  510.                     String interfaceName = null;
  511.                     if(msg!=null && msg.getTransportRequestContext()!=null && msg.getTransportRequestContext().getInterfaceName()!=null) {
  512.                         interfaceName = msg.getTransportRequestContext().getInterfaceName();
  513.                     }
  514.                     else if(requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getInterfaceName()!=null) {
  515.                         interfaceName = requestInfo.getProtocolContext().getInterfaceName();
  516.                     }
  517.                     if(interfaceName==null) {
  518.                         throw new ProtocolException("ID Porta non presente");
  519.                     }
  520.                     IDPortaApplicativa idPA = new IDPortaApplicativa();
  521.                     idPA.setNome(interfaceName);
  522.                     pa = factory.getCachedConfigIntegrationReader(state, requestInfo).getPortaApplicativa(idPA); // pa invocata
  523.                 }
  524.                
  525.                
  526.                 /** Identificazione Mittente by LineeGuida e Token */
  527.                 boolean saIdentificatoBySecurity = busta.getServizioApplicativoFruitore()!=null && !CostantiPdD.SERVIZIO_APPLICATIVO_ANONIMO.equals(busta.getServizioApplicativoFruitore());
  528.                
  529.                 boolean sicurezzaToken = this.context.containsKey(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
  530.                 boolean saIdentificatoByToken = false;
  531.                 boolean saVerificatoBySecurity = false;
  532.                 if(sicurezzaToken) {
  533.                     IDServizioApplicativo idSAbyToken = null;
  534.                     StringBuilder sbError = new StringBuilder();
  535.                     try {
  536.                         idSAbyToken = IdentificazioneApplicativoMittenteUtils.identificazioneApplicativoMittenteByToken(this.log, state, busta, this.context, requestInfo, msgDiag, sbError);
  537.                     }catch(Exception e) {
  538.                         if(sbError!=null && sbError.length()>0) {
  539.                             this.context.addObject(Costanti.ERRORE_AUTORIZZAZIONE, Costanti.ERRORE_TRUE);
  540.                             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.SICUREZZA_AUTORIZZAZIONE_FALLITA,
  541.                                     sbError.toString()));
  542.                             return;
  543.                         }
  544.                         else {
  545.                             throw e;
  546.                         }
  547.                     }
  548.                     saIdentificatoByToken = idSAbyToken!=null;
  549.                    
  550.                     if(saIdentificatoByToken) {
  551.                         /** && !saIdentificatoBySecurity) {
  552.                         L'identificazione per sicurezza, se c'è abilitata l'autenticazione per token, non dovrebbe esserci mai poichè la funzionalità è stata disabilitata.
  553.                         Con autenticazione token attiva, gli applicativi anche se presente un x509 non vengono identificati dall'autenticazione https effettuata in AbstractModIValidazioneSintatticaCommons e di conseguenza in ModIValidazioneSintatticaRest e ModIValidazioneSintatticaSoap durante il trattamento del token di sicurezza
  554.                         bisogna quindi verificare, se è presente un certificato x509 di firma, che corrisponda a quello registrato nell'applicativo di tipo token identificato*/
  555.                        
  556.                         SecurityToken securityTokenForContext = SecurityTokenUtilities.readSecurityToken(this.context);
  557.                         if(securityTokenForContext!=null) {
  558.                             try {
  559.                                 if(securityTokenForContext.getAuthorization()!=null && securityTokenForContext.getAuthorization().getCertificate()!=null) {
  560.                                     sbError = new StringBuilder();
  561.                                     String tipoToken = //"Http Header "+
  562.                                             (securityTokenForContext.getAuthorization().getHttpHeaderName()!=null ? securityTokenForContext.getAuthorization().getHttpHeaderName() : HttpConstants.AUTHORIZATION);
  563.                                     IdentificazioneApplicativoMittenteUtils.checkApplicativoTokenByX509(this.log, idSAbyToken,
  564.                                             state, requestInfo, tipoToken, securityTokenForContext.getAuthorization().getCertificate(), sbError);
  565.                                     saVerificatoBySecurity = true;
  566.                                 }
  567.                                 if(securityTokenForContext.getIntegrity()!=null && securityTokenForContext.getIntegrity().getCertificate()!=null) {
  568.                                     sbError = new StringBuilder();
  569.                                     String tipoToken = //"Http Header "+
  570.                                             (securityTokenForContext.getIntegrity().getHttpHeaderName()!=null ? securityTokenForContext.getIntegrity().getHttpHeaderName() : this.modiProperties.getRestSecurityTokenHeaderModI());
  571.                                     IdentificazioneApplicativoMittenteUtils.checkApplicativoTokenByX509(this.log, idSAbyToken,
  572.                                             state, requestInfo, tipoToken, securityTokenForContext.getIntegrity().getCertificate(), sbError);
  573.                                     saVerificatoBySecurity = true;
  574.                                 }
  575.                                 if(securityTokenForContext.getEnvelope()!=null && securityTokenForContext.getEnvelope().getCertificate()!=null) {
  576.                                     sbError = new StringBuilder();
  577.                                     String tipoToken = "WSSecurity";
  578.                                     IdentificazioneApplicativoMittenteUtils.checkApplicativoTokenByX509(this.log, idSAbyToken,
  579.                                             state, requestInfo, tipoToken, securityTokenForContext.getEnvelope().getCertificate(), sbError);
  580.                                     saVerificatoBySecurity = true;
  581.                                 }
  582.                             }catch(Exception e) {
  583.                                 if(sbError!=null && sbError.length()>0) {
  584.                                     this.context.addObject(Costanti.ERRORE_AUTORIZZAZIONE, Costanti.ERRORE_TRUE);
  585.                                     this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.SICUREZZA_AUTORIZZAZIONE_FALLITA,
  586.                                             sbError.toString()));
  587.                                     return;
  588.                                 }
  589.                                 else {
  590.                                     throw e;
  591.                                 }
  592.                             }
  593.                         }
  594.                        
  595.                     }
  596.                 }
  597.                
  598.                 boolean saFruitoreAnonimo = busta.getServizioApplicativoFruitore()==null || CostantiPdD.SERVIZIO_APPLICATIVO_ANONIMO.equals(busta.getServizioApplicativoFruitore());
  599.                                
  600.                 /** Tipi di Autorizzazione definiti */
  601.                 boolean autorizzazionePerRichiedente = false;
  602.                 if(pa.getAutorizzazioneToken()!=null) {
  603.                     autorizzazionePerRichiedente = StatoFunzionalita.ABILITATO.equals(pa.getAutorizzazioneToken().getAutorizzazioneApplicativi());
  604.                 }
  605.                 if(!autorizzazionePerRichiedente && pa.getServiziApplicativiAutorizzati()!=null) {
  606.                     // backward compatibility
  607.                     autorizzazionePerRichiedente = pa.getServiziApplicativiAutorizzati().sizeServizioApplicativoList()>0;
  608.                 }
  609.                
  610.                 boolean autorizzazionePerRuolo = false;
  611.                 boolean checkRuoloRegistro = false;
  612.                 boolean checkRuoloEsterno = false;
  613.                 if(pa.getAutorizzazioneToken()!=null) {
  614.                     autorizzazionePerRuolo = StatoFunzionalita.ABILITATO.equals(pa.getAutorizzazioneToken().getAutorizzazioneRuoli());
  615.                 }
  616.                 if(autorizzazionePerRuolo) {
  617.                     if( pa.getAutorizzazioneToken().getTipologiaRuoli()==null ||
  618.                         RuoloTipologia.QUALSIASI.equals(pa.getAutorizzazioneToken().getTipologiaRuoli())){
  619.                         checkRuoloRegistro = true;
  620.                         checkRuoloEsterno = true;
  621.                     }
  622.                     else if( RuoloTipologia.INTERNO.equals(pa.getAutorizzazioneToken().getTipologiaRuoli())){
  623.                         checkRuoloRegistro = true;
  624.                     }
  625.                     else if( RuoloTipologia.ESTERNO.equals(pa.getAutorizzazioneToken().getTipologiaRuoli())){
  626.                         checkRuoloEsterno = true;
  627.                     }
  628.                 }
  629.                
  630.                 /** Verifica consistenza identificazione del mittente */
  631.                 if(
  632.                         (
  633.                                 autorizzazionePerRichiedente
  634.                                 ||
  635.                                 (autorizzazionePerRuolo && checkRuoloRegistro && !checkRuoloEsterno)
  636.                         )
  637.                         &&
  638.                         saFruitoreAnonimo
  639.                 ){  
  640.                     this.context.addObject(Costanti.ERRORE_AUTORIZZAZIONE, Costanti.ERRORE_TRUE);
  641.                     this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.SICUREZZA_AUTORIZZAZIONE_FALLITA,
  642.                             "Applicativo Mittente non identificato"));
  643.                     return;
  644.                 }
  645.                 if(!saFruitoreAnonimo &&
  646.                     (autorizzazionePerRichiedente || checkRuoloRegistro)
  647.                     ){
  648.                     // se utilizzo l'informazione dell'applicativo, tale informazione deve essere consistente rispetto a tutti i criteri di sicurezza
  649.                     if(sicurezzaMessaggio && !sicurezzaMessaggioIDAR04 &&
  650.                         !saIdentificatoBySecurity && !saVerificatoBySecurity) {
  651.                         this.context.addObject(Costanti.ERRORE_AUTORIZZAZIONE, Costanti.ERRORE_TRUE);
  652.                         addErroreMittenteNonAutorizzato(busta, "il certificato di firma non corrisponde all'applicativo");
  653.                         return;
  654.                     }
  655.                     if(sicurezzaToken &&
  656.                         !saIdentificatoByToken) {
  657.                         // CASO DEPRECATO: questo caso non puo' succedere poiche' nel caso di sicurezza token l'identificazione avviene SOLO per token
  658.                         //                 quindi si rientra nel caso sopra 'Applicativo Mittente non identificato'
  659.                         this.context.addObject(Costanti.ERRORE_AUTORIZZAZIONE, Costanti.ERRORE_TRUE);
  660.                         addErroreMittenteNonAutorizzato(busta, "il claim 'clientId' presente nel token non corrisponde all'applicativo");
  661.                         return;
  662.                     }
  663.                 }
  664.                
  665.                 /** Autorizzazione per Richiedente */
  666.                 Eccezione eccezioneAutorizzazionePerRichiedente = null;
  667.                 if(autorizzazionePerRichiedente) {                  
  668.                     boolean autorizzato = false;
  669.                     if(pa.getServiziApplicativiAutorizzati()!=null) {
  670.                         for (PortaApplicativaAutorizzazioneServizioApplicativo paSA : pa.getServiziApplicativiAutorizzati().getServizioApplicativoList()) {
  671.                             if(paSA.getTipoSoggettoProprietario().equals(busta.getTipoMittente()) &&
  672.                                     paSA.getNomeSoggettoProprietario().equals(busta.getMittente()) &&
  673.                                     paSA.getNome().equals(busta.getServizioApplicativoFruitore())) {
  674.                                 autorizzato = true;
  675.                             }
  676.                         }
  677.                     }
  678.                     if(!autorizzato) {
  679.                         eccezioneAutorizzazionePerRichiedente = getErroreMittenteNonAutorizzato(busta, null);
  680.                     }
  681.                 }
  682.                
  683.                 /** Autorizzazione per Ruolo */
  684.                 Eccezione eccezioneAutorizzazionePerRuolo = null;
  685.                 if(autorizzazionePerRuolo) {
  686.                     StringBuilder detailsBufferRuoli = new StringBuilder();
  687.                     ServizioApplicativo sa = null;
  688.                     if(!saFruitoreAnonimo) {
  689.                         IDServizioApplicativo idSA = new IDServizioApplicativo();
  690.                         idSA.setIdSoggettoProprietario(new IDSoggetto(busta.getTipoMittente(), busta.getMittente()));
  691.                         idSA.setNome(busta.getServizioApplicativoFruitore());
  692.                         sa = factory.getCachedConfigIntegrationReader(state,requestInfo).getServizioApplicativo(idSA);
  693.                     }
  694.                     boolean authRuoli = ConfigurazionePdDReader._autorizzazioneRoles(
  695.                                     RegistroServiziManager.getInstance(state),
  696.                                     null, sa,
  697.                                     null, false,
  698.                                     this.context, requestInfo,
  699.                                     checkRuoloRegistro, checkRuoloEsterno,
  700.                                     detailsBufferRuoli,
  701.                                     pa.getAutorizzazioneToken().getRuoli().getMatch(), pa.getAutorizzazioneToken().getRuoli(),
  702.                                     true);
  703.                     if(!authRuoli) {
  704.                         String errore = "Applicativo Mittente";
  705.                         if(!saFruitoreAnonimo) {
  706.                             errore = errore + " "+ busta.getServizioApplicativoFruitore() + " (Soggetto: "+busta.getMittente()+")";
  707.                         }
  708.                         errore = errore + " non autorizzato; ";
  709.                         eccezioneAutorizzazionePerRuolo = this.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.SICUREZZA_AUTORIZZAZIONE_FALLITA,
  710.                                 errore + detailsBufferRuoli.toString());
  711.                     }
  712.                 }
  713.                
  714.                 /** Gestione Eccezioni */
  715.                 if(autorizzazionePerRichiedente && autorizzazionePerRuolo) {
  716.                     if(eccezioneAutorizzazionePerRichiedente!=null && eccezioneAutorizzazionePerRuolo!=null) {
  717.                         this.context.addObject(Costanti.ERRORE_AUTORIZZAZIONE, Costanti.ERRORE_TRUE);
  718.                         this.erroriValidazione.add(eccezioneAutorizzazionePerRuolo); // uso eccezione per ruolo che e' più completa come messaggistica
  719.                     }
  720.                     // se una delle due autorizzazione e' andata a buon fine devo autorizzare
  721.                 }
  722.                 else {
  723.                     if(eccezioneAutorizzazionePerRichiedente!=null || eccezioneAutorizzazionePerRuolo!=null) {
  724.                         this.context.addObject(Costanti.ERRORE_AUTORIZZAZIONE, Costanti.ERRORE_TRUE);
  725.                         if(eccezioneAutorizzazionePerRichiedente!=null) {
  726.                             this.erroriValidazione.add(eccezioneAutorizzazionePerRichiedente);
  727.                         }
  728.                         else {
  729.                             this.erroriValidazione.add(eccezioneAutorizzazionePerRuolo);
  730.                         }
  731.                     }
  732.                 }
  733.            
  734.                
  735.                 int sizeListaEccezioniPrimaAutorizzazione = sizeListaErroriValidazionePrimaAutorizzazione + sizeListaProcessamentoValidazionePrimaAutorizzazione;
  736.                 int sizeListaEccezioniDipoAutorizzazione = this.erroriValidazione.size() + this.erroriProcessamento.size();
  737.                 if(sizeListaEccezioniPrimaAutorizzazione == sizeListaEccezioniDipoAutorizzazione) {
  738.                     msgDiag.logPersonalizzato(DIAGNOSTIC_VALIDATE+tipoDiagnostico+DIAGNOSTIC_COMPLETATA);
  739.                 }
  740.                 else {
  741.                     String errore = null;
  742.                     if(sizeListaErroriValidazionePrimaAutorizzazione!=this.erroriValidazione.size()) {
  743.                         errore = ModIValidazioneSintattica.buildErrore(this.erroriValidazione, sizeListaErroriValidazionePrimaAutorizzazione, factory);
  744.                     }
  745.                     else {
  746.                         errore = ModIValidazioneSintattica.buildErrore(this.erroriProcessamento, sizeListaProcessamentoValidazionePrimaAutorizzazione, factory);
  747.                     }
  748.                     msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, errore);
  749.                     msgDiag.logPersonalizzato(DIAGNOSTIC_VALIDATE+tipoDiagnostico+DIAGNOSTIC_FALLITA);  
  750.                 }
  751.                 autorizzazione = false;
  752.            
  753.             } // fine autorizzazione
  754.            
  755.            
  756.         }catch(Exception e){
  757.            
  758.             if(msgDiag!=null && (verifica || autorizzazione)) {
  759.                 msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, e.getMessage());
  760.                 msgDiag.logPersonalizzato(DIAGNOSTIC_VALIDATE+tipoDiagnostico+DIAGNOSTIC_FALLITA);
  761.             }
  762.            
  763.             this.erroriProcessamento.add(this.validazioneUtils.newEccezioneProcessamento(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO,
  764.                     e.getMessage(),e));
  765.         }
  766.     }
  767.    
  768.     private boolean isAudienceValid(String audienceAtteso, String audience, List<String> listAudience) {
  769.         boolean checkAudience = false;
  770.         if(audienceAtteso!=null) {
  771.             checkAudience = audienceAtteso.equals(audience);
  772.             if(!checkAudience && listAudience!=null && !listAudience.isEmpty()) {
  773.                 for (String check : listAudience) {
  774.                     if(audienceAtteso.equals(check)) {
  775.                         checkAudience = true;
  776.                         break;
  777.                     }
  778.                 }
  779.             }
  780.         }
  781.         return checkAudience;
  782.     }

  783.     private void checkExp(String exp, Date now, boolean rest, String prefix) throws ProtocolException {
  784.        
  785.         boolean enabled = true;
  786.         if(rest) {
  787.             enabled = this.modiProperties.isRestSecurityTokenClaimsExpTimeCheck();
  788.         }
  789.         else {
  790.             enabled = this.modiProperties.isSoapSecurityTokenTimestampExpiresTimeCheck();
  791.         }
  792.         if(!enabled) {
  793.             return;
  794.         }
  795.        
  796.         if(prefix==null) {
  797.             prefix="";
  798.         }
  799.         Date dateExp = null;
  800.         try {
  801.             dateExp = DateUtils.getSimpleDateFormatMs().parse(exp);
  802.         }catch(Exception e) {
  803.             throw new ProtocolException(e.getMessage(),e);
  804.         }
  805.         /*
  806.          *   The "exp" (expiration time) claim identifies the expiration time on
  807.              *   or after which the JWT MUST NOT be accepted for processing.  The
  808.              *   processing of the "exp" claim requires that the current date/time
  809.              *   MUST be before the expiration date/time listed in the "exp" claim.
  810.          **/
  811.         Date checkNow = now;
  812.         Long tolerance = null;
  813.         if(rest) {
  814.             tolerance = this.modiProperties.getRestSecurityTokenClaimsExpTimeCheckToleranceMilliseconds();
  815.         }
  816.         else {
  817.             tolerance = this.modiProperties.getSoapSecurityTokenTimestampExpiresTimeCheckToleranceMilliseconds();
  818.         }
  819.         if(tolerance!=null && tolerance.longValue()>0) {
  820.             checkNow = new Date(now.getTime() - tolerance.longValue());
  821.         }
  822.         if(!checkNow.before(dateExp)){
  823.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.MESSAGGIO_SCADUTO,
  824.                     prefix+"Token scaduto in data '"+exp+"'"));
  825.         }
  826.     }
  827.    
  828.     private void checkNbf(String nbf, Date now, String prefix) throws ProtocolException {
  829.         if(prefix==null) {
  830.             prefix="";
  831.         }
  832.         Date dateNbf = null;
  833.         try {
  834.             dateNbf = DateUtils.getSimpleDateFormatMs().parse(nbf);
  835.         }catch(Exception e) {
  836.             throw new ProtocolException(e.getMessage(),e);
  837.         }
  838.         /*
  839.          *   The "nbf" (not before) claim identifies the time before which the JWT
  840.          *   MUST NOT be accepted for processing.  The processing of the "nbf"
  841.          *   claim requires that the current date/time MUST be after or equal to
  842.          *   the not-before date/time listed in the "nbf" claim.
  843.          **/
  844.        
  845.         Long future = this.modiProperties.getRestSecurityTokenClaimsNbfTimeCheckToleranceMilliseconds();
  846.         Date futureMax = now;
  847.         if(future!=null && future.longValue()>0) {
  848.             futureMax = new Date((now.getTime() + future.longValue()));
  849.         }
  850.        
  851.         if(!dateNbf.before(futureMax)){
  852.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.MESSAGGIO_SCADUTO,
  853.                     prefix+"Token non utilizzabile prima della data '"+nbf+"'"));
  854.         }
  855.     }
  856.    
  857.     private void checkIat(String iat, OpenSPCoop2Message msg, boolean rest, String prefix) throws ProtocolException {
  858.         if(prefix==null) {
  859.             prefix="";
  860.         }
  861.         Date dateIat = null;
  862.         try {
  863.             dateIat = DateUtils.getSimpleDateFormatMs().parse(iat);
  864.         }catch(Exception e) {
  865.             throw new ProtocolException(e.getMessage(),e);
  866.         }
  867.         /*
  868.          *   The "iat" (issued at) claim identifies the time at which the JWT was
  869.              *   issued.  This claim can be used to determine the age of the JWT.
  870.              *   The iat Claim can be used to reject tokens that were issued too far away from the current time,
  871.              *   limiting the amount of time that nonces need to be stored to prevent attacks. The acceptable range is Client specific.
  872.          **/
  873.         Long old = null;
  874.         Object iatObject = null;
  875.         if(msg!=null) {
  876.             iatObject = msg.getContextProperty(ModICostanti.MODIPA_OPENSPCOOP2_MSG_CONTEXT_IAT_TTL_CHECK);
  877.         }
  878.         if(iatObject instanceof Long) {
  879.             old = (Long) iatObject;
  880.         }
  881.         if(old==null) {
  882.             if(rest) {
  883.                 old = this.modiProperties.getRestSecurityTokenClaimsIatTimeCheckMilliseconds();
  884.             }
  885.             else {
  886.                 old = this.modiProperties.getSoapSecurityTokenTimestampCreatedTimeCheckMilliseconds();
  887.             }
  888.         }
  889.         if(old!=null) {
  890.             Date oldMax = new Date((DateManager.getTimeMillis() - old.longValue()));
  891.             if(dateIat.before(oldMax)) {
  892.                 logError(prefix+"Token creato da troppo tempo (data creazione: '"+iat+"', data più vecchia consentita: '"+DateUtils.getSimpleDateFormatMs().format(oldMax)+"', configurazione ms: '"+old.longValue()+"')");
  893.                 this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.MESSAGGIO_SCADUTO,
  894.                         prefix+"Token creato da troppo tempo (data creazione: '"+iat+"')"));
  895.             }
  896.         }
  897.        
  898.        
  899.         checkIatFuture(dateIat, prefix, iat, rest);
  900.     }
  901.     private void checkIatFuture(Date dateIat, String prefix, String iat, boolean rest) throws ProtocolException {
  902.         Long future = null;
  903.         if(rest) {
  904.             future = this.modiProperties.getRestSecurityTokenClaimsIatTimeCheckFutureToleranceMilliseconds();
  905.         }
  906.         else {
  907.             future = this.modiProperties.getSoapSecurityTokenTimestampCreatedTimeCheckFutureToleranceMilliseconds();
  908.         }
  909.         if(future!=null && future.longValue()>0) {
  910.             Date futureMax = new Date((DateManager.getTimeMillis() + future.longValue()));
  911.             if(dateIat.after(futureMax)) {
  912.                 logError(prefix+"Token creato nel futuro (data creazione: '"+iat+"', data massima futura consentita: '"+DateUtils.getSimpleDateFormatMs().format(futureMax)+"', configurazione ms: '"+future.longValue()+"')");
  913.                 this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.ORA_REGISTRAZIONE_NON_VALIDA,
  914.                         prefix+"Token creato nel futuro (data creazione: '"+iat+"')"));
  915.             }
  916.         }
  917.     }
  918.    
  919.     private void validatePurposeId(RemoteStoreConfig rsc, String prefixAudit, String securityAuditPattern) throws ProtocolException {
  920.        
  921.         try {
  922.             if(rsc!=null &&
  923.                     (this.modiProperties.isSecurityTokenAuditExpectedPurposeId() || this.modiProperties.isSecurityTokenAuditCompareAuthorizationPurposeId())) {
  924.            
  925.                 SecurityToken securityToken = ModIUtilities.readSecurityToken(this.context);
  926.                 if(securityToken==null) {
  927.                     this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  928.                             CodiceErroreCooperazione.SICUREZZA_NON_PRESENTE,
  929.                             "Token di sicurezza non presenti"));
  930.                     return;
  931.                 }
  932.                
  933.                 RestMessageSecurityToken restSecurityToken = securityToken.getAccessToken();

  934.                 String prefixAuthorization = getPrefixHeader(HttpConstants.AUTHORIZATION);
  935.                 String labelAuditPattern = CostantiDB.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_CORNICE_SICUREZZA_PATTERN_AUDIT_REST_02.equals(securityAuditPattern) ?
  936.                         CostantiLabel.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_CORNICE_SICUREZZA_PATTERN_AUDIT_REST_02 : CostantiLabel.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_CORNICE_SICUREZZA_PATTERN_AUDIT_REST_01;
  937.                 String suffixAudit02 = " (richiesto con pattern '"+labelAuditPattern+"')";
  938.                 if(restSecurityToken==null) {
  939.                     this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  940.                             CodiceErroreCooperazione.SICUREZZA_NON_PRESENTE,
  941.                             prefixAuthorization+MSG_ERRORE_NON_PRESENTE+suffixAudit02));
  942.                     return;
  943.                 }
  944.                
  945.                 RestMessageSecurityToken auditToken = securityToken.getAudit();
  946.                 if(auditToken==null) {
  947.                     this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  948.                             CodiceErroreCooperazione.SICUREZZA_NON_PRESENTE,
  949.                             prefixAudit+MSG_ERRORE_NON_PRESENTE));
  950.                     return;
  951.                 }
  952.                
  953.                 boolean expected = this.modiProperties.isSecurityTokenAuditExpectedPurposeId();
  954.                 String purposeIdAuthorization = readPurposeId(restSecurityToken, prefixAuthorization, expected);
  955.                 String purposeIdAudit = readPurposeId(auditToken, prefixAudit, expected);
  956.                
  957.                 if(this.modiProperties.isSecurityTokenAuditCompareAuthorizationPurposeId() &&
  958.                     purposeIdAuthorization!=null && purposeIdAudit!=null && !purposeIdAuthorization.equals(purposeIdAudit)) {
  959.                     String claim = org.openspcoop2.pdd.core.token.Costanti.PDND_PURPOSE_ID;
  960.                     this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  961.                             CodiceErroreCooperazione.SICUREZZA_NON_PRESENTE,
  962.                             prefixAudit+"Claim '"+claim+"' presente nel token contiene un valore '"+purposeIdAudit+"' differente da quello presente nel token "+HttpConstants.AUTHORIZATION+" ("+purposeIdAuthorization+")"));
  963.                 }
  964.             }
  965.         }catch(Exception e) {
  966.             throw new ProtocolException(e.getMessage(),e);
  967.         }

  968.     }
  969.     private String readPurposeId(RestMessageSecurityToken restSecurityToken, String prefixAuthorization, boolean required) throws ProtocolException {
  970.         String purposeId = null;
  971.         String purposeIdClaim = org.openspcoop2.pdd.core.token.Costanti.PDND_PURPOSE_ID;
  972.         try {
  973.             purposeId = restSecurityToken.getPayloadClaim(purposeIdClaim);
  974.             if( (purposeId==null || StringUtils.isEmpty(purposeId)) && required ) {
  975.                 this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  976.                         CodiceErroreCooperazione.SICUREZZA_TOKEN_NON_VALIDO,
  977.                         prefixAuthorization+getErroreClaimNonPresente(purposeIdClaim)));
  978.             }
  979.         }catch(Exception e) {
  980.             logError("Lettura purpose id token fallita: "+e.getMessage(),e);
  981.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  982.                     CodiceErroreCooperazione.SICUREZZA_TOKEN_NON_VALIDO,
  983.                     prefixAuthorization+getErroreClaimNonValido(purposeIdClaim)));
  984.         }
  985.         return purposeId;
  986.     }
  987.    
  988.     private void validateAudit02(String securityMessageProfileSorgenteTokenIdAuth, boolean rest, String prefixAudit) throws ProtocolException {
  989.         boolean expectedAccessToken = false;
  990.         if(ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_SORGENTE_TOKEN_IDAUTH_VALUE_PDND.equals(securityMessageProfileSorgenteTokenIdAuth) ||
  991.                 ModICostanti.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_SORGENTE_TOKEN_IDAUTH_VALUE_OAUTH.equals(securityMessageProfileSorgenteTokenIdAuth)) {
  992.             expectedAccessToken = true;
  993.         }
  994.        
  995.         SecurityToken securityToken = ModIUtilities.readSecurityToken(this.context);
  996.         if(securityToken==null) {
  997.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  998.                     CodiceErroreCooperazione.SICUREZZA_NON_PRESENTE,
  999.                     "Token di sicurezza non presenti"));
  1000.             return;
  1001.         }
  1002.        
  1003.         RestMessageSecurityToken restSecurityToken = null;
  1004.         if(expectedAccessToken) {
  1005.             restSecurityToken = securityToken.getAccessToken();
  1006.         }
  1007.         else {
  1008.             if(rest) {
  1009.                 restSecurityToken = securityToken.getAuthorization();
  1010.             }
  1011.             else {
  1012.                 this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1013.                         CodiceErroreCooperazione.SICUREZZA_TOKEN_NON_VALIDO,
  1014.                         "Token di sicurezza IDAuth Locale su API Soap non è utilizzabile con pattern "+CostantiLabel.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_CORNICE_SICUREZZA_PATTERN_AUDIT_REST_02));
  1015.                 return;
  1016.             }
  1017.         }
  1018.         String prefixAuthorization = getPrefixHeader(HttpConstants.AUTHORIZATION);
  1019.         String suffixAudit02 = " (richiesto con pattern '"+CostantiLabel.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_CORNICE_SICUREZZA_PATTERN_AUDIT_REST_02+"')";
  1020.         if(restSecurityToken==null) {
  1021.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1022.                     CodiceErroreCooperazione.SICUREZZA_NON_PRESENTE,
  1023.                     prefixAuthorization+MSG_ERRORE_NON_PRESENTE+suffixAudit02));
  1024.             return;
  1025.         }
  1026.        
  1027.         String digestClaimPrefix = org.openspcoop2.pdd.core.token.Costanti.PDND_DIGEST+".";
  1028.        
  1029.         String digestAlgo = readDigestAlgorithm(digestClaimPrefix, restSecurityToken, prefixAuthorization);
  1030.         String digestValue = readDigestValue(digestClaimPrefix, restSecurityToken, prefixAuthorization);
  1031.         if(digestAlgo==null || digestValue==null) {
  1032.             return; // errori gestiti nei metodi sopra
  1033.         }
  1034.        
  1035.        
  1036.         RestMessageSecurityToken auditSecurityToken = securityToken.getAudit();
  1037.         if(auditSecurityToken==null || auditSecurityToken.getToken()==null || StringUtils.isEmpty(auditSecurityToken.getToken())) {
  1038.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1039.                     CodiceErroreCooperazione.SICUREZZA_TOKEN_NON_PRESENTE,
  1040.                     prefixAudit+MSG_ERRORE_NON_PRESENTE));
  1041.             return;
  1042.         }
  1043.        
  1044.         // calcolo digest value token audit
  1045.         String digestAuditRicalcolato = null;
  1046.         try {
  1047.             digestAuditRicalcolato = org.openspcoop2.utils.digest.DigestUtils.getDigestValue(auditSecurityToken.getToken().getBytes(), digestAlgo, DigestEncoding.HEX,
  1048.                     false); // se rfc3230 true aggiunge prefisso algoritmo=
  1049.         }catch(Exception e) {
  1050.             logError("Calcolo digest del token di audit fallito: "+e.getMessage(),e);
  1051.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1052.                     CodiceErroreCooperazione.SICUREZZA,
  1053.                     prefixAudit+"check digest failed"));
  1054.             return;
  1055.         }
  1056.         if(!digestValue.equalsIgnoreCase(digestAuditRicalcolato)) {
  1057.             String digestValueClaim = digestClaimPrefix+org.openspcoop2.pdd.core.token.Costanti.PDND_DIGEST_VALUE;
  1058.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1059.                     CodiceErroreCooperazione.SICUREZZA_TOKEN_NON_VALIDO,
  1060.                     prefixAuthorization+"possiede un valore nel campo '"+digestValueClaim+"' non corrispondente al token di audit previsto dal pattern '"+CostantiLabel.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_CORNICE_SICUREZZA_PATTERN_AUDIT_REST_02+"'"));
  1061.         }
  1062.        
  1063.     }
  1064.    
  1065.     private String readDigestAlgorithm(String digestClaimPrefix, RestMessageSecurityToken restSecurityToken, String prefixAuthorization) throws ProtocolException {
  1066.         String digestAlgo = null;
  1067.         String digestAlgClaim = digestClaimPrefix+org.openspcoop2.pdd.core.token.Costanti.PDND_DIGEST_ALG;
  1068.         try {
  1069.             digestAlgo = restSecurityToken.getPayloadClaim(digestAlgClaim);
  1070.             if(digestAlgo==null || StringUtils.isEmpty(digestAlgo)) {
  1071.                 this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1072.                         CodiceErroreCooperazione.SICUREZZA_TOKEN_NON_VALIDO,
  1073.                         prefixAuthorization+getErroreClaimNonPresente(digestAlgClaim)));
  1074.             }
  1075.         }catch(Exception e) {
  1076.             logError("Lettura algoritmo di digest in authorization token fallita: "+e.getMessage(),e);
  1077.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1078.                     CodiceErroreCooperazione.SICUREZZA_TOKEN_NON_VALIDO,
  1079.                     prefixAuthorization+getErroreClaimNonValido(digestAlgClaim)));
  1080.         }
  1081.         return digestAlgo;
  1082.     }
  1083.     private String readDigestValue(String digestClaimPrefix, RestMessageSecurityToken restSecurityToken, String prefixAuthorization) throws ProtocolException {
  1084.         String digestValue = null;
  1085.         String digestValueClaim = digestClaimPrefix+org.openspcoop2.pdd.core.token.Costanti.PDND_DIGEST_VALUE;
  1086.         try {
  1087.             digestValue = restSecurityToken.getPayloadClaim(digestValueClaim);
  1088.             if(digestValue==null || StringUtils.isEmpty(digestValue)) {
  1089.                 this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1090.                         CodiceErroreCooperazione.SICUREZZA_TOKEN_NON_VALIDO,
  1091.                         prefixAuthorization+getErroreClaimNonPresente(digestValueClaim)));
  1092.             }
  1093.         }catch(Exception e) {
  1094.             logError("Lettura valore del digest audit in authorization token fallita: "+e.getMessage(),e);
  1095.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1096.                     CodiceErroreCooperazione.SICUREZZA_TOKEN_NON_VALIDO,
  1097.                     prefixAuthorization+getErroreClaimNonValido(digestValueClaim)));
  1098.         }
  1099.         return digestValue;
  1100.     }
  1101.    
  1102.    
  1103.     private void validateTokenAuthorizationId(OpenSPCoop2Message msg,
  1104.             String prefixAuthorization,
  1105.             ModIValidazioneSemanticaProfiloSicurezza modIValidazioneSemanticaProfiloSicurezza) throws ProtocolException {
  1106.    
  1107.         boolean useJtiAuthorization = ModIUtils.useJtiAuthorizationObject(msg);
  1108.         if(useJtiAuthorization) {
  1109.             String jtiClaimReceived = TokenUtilities.readJtiFromInformazioniToken(this.context);            
  1110.             if(jtiClaimReceived==null || StringUtils.isEmpty(jtiClaimReceived)) {
  1111.                
  1112.                 this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1113.                         CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_PRESENTE,
  1114.                             prefixAuthorization+getErroreClaimNonPresente(Claims.JSON_WEB_TOKEN_RFC_7519_JWT_ID)));
  1115.                
  1116.             }
  1117.             else {
  1118.                
  1119.                 if(modIValidazioneSemanticaProfiloSicurezza!=null) {
  1120.                     // nop
  1121.                 }
  1122.                 /** SPOSTATO IN RICEZIONE BUSTE per generare il corretto idMessaggio */
  1123.                 /**ModIUtils.replaceBustaIdWithJtiTokenId(modIValidazioneSemanticaProfiloSicurezza, jtiClaimReceived);*/
  1124.                
  1125.             }
  1126.         }
  1127.        
  1128.     }
  1129.    
  1130.     private PortaApplicativa validateTokenAuthorizationAudience(OpenSPCoop2Message msg, IProtocolFactory<?> factory, IState state, RequestInfo requestInfo,
  1131.             boolean isRichiesta, String prefixAuthorization,
  1132.             boolean checkAudienceByModIConfig) throws ProtocolException {
  1133.        
  1134.         PortaApplicativa pa = readPortaApplicativa(msg, factory, state, requestInfo);
  1135.        
  1136.         boolean audienceCheckDefinedInAuthorizationTokenClaims = isAudienceCheckDefinedInAuthorizationTokenClaims(pa);
  1137.    
  1138.         if(!audienceCheckDefinedInAuthorizationTokenClaims) {
  1139.            
  1140.             validateTokenAuthorizationAudienceByModIConfig(msg, factory, state, requestInfo,
  1141.                     isRichiesta, prefixAuthorization,
  1142.                     checkAudienceByModIConfig);
  1143.            
  1144.         }
  1145.        
  1146.         return pa;
  1147.     }
  1148.    
  1149.     private void validateTokenAuthorizationAudienceByModIConfig(OpenSPCoop2Message msg, IProtocolFactory<?> factory, IState state, RequestInfo requestInfo,
  1150.             boolean isRichiesta, String prefixAuthorization,
  1151.             boolean checkAudienceByModIConfig) throws ProtocolException {
  1152.         List<String> audienceClaimReceived = readAudienceFromTokenOAuth();          
  1153.         if(audienceClaimReceived==null || audienceClaimReceived.isEmpty()) {
  1154.            
  1155.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1156.                     isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_PRESENTE :
  1157.                         CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_PRESENTE,
  1158.                         prefixAuthorization+getErroreClaimNonPresente(Claims.JSON_WEB_TOKEN_RFC_7519_AUDIENCE)));
  1159.            
  1160.         }
  1161.         else {
  1162.        
  1163.             if(checkAudienceByModIConfig) {
  1164.                 checkAudienceModIConfig(msg, factory, state, requestInfo,
  1165.                         isRichiesta, prefixAuthorization,
  1166.                         audienceClaimReceived);
  1167.             }
  1168.             else {
  1169.                
  1170.                 this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1171.                         isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_VALIDO :
  1172.                             CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_VALIDO,
  1173.                             prefixAuthorization+"Token contenente un claim '"+Claims.JSON_WEB_TOKEN_RFC_7519_AUDIENCE+"' non verificabile; autorizzazione per token claim non definita"));
  1174.                
  1175.             }
  1176.            
  1177.         }
  1178.     }
  1179.    
  1180.     private boolean validateTokenAuthorizationClaims(RemoteStoreConfig rsc, IDSoggetto idSoggetto,
  1181.             boolean isRichiesta, String prefixAuthorization) throws ProtocolException{
  1182.         // valido claims obbligatori
  1183.         List<String> claimsAttesi = null;
  1184.         if(rsc!=null) {
  1185.             claimsAttesi = this.modiProperties.getValidazioneTokenPDNDClaimsRequired(idSoggetto.getNome());
  1186.         }
  1187.         else {
  1188.             claimsAttesi = this.modiProperties.getValidazioneTokenOAuthClaimsRequired(idSoggetto.getNome());    
  1189.         }
  1190.         if(claimsAttesi!=null && !claimsAttesi.isEmpty()) {
  1191.             for (String claim : claimsAttesi) {
  1192.                 String claimValue = readClaimFromTokenOAuth(claim);
  1193.                 if(claimValue==null || StringUtils.isEmpty(claimValue)) {
  1194.                     this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1195.                             isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_PRESENTE :
  1196.                                 CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_PRESENTE,
  1197.                                 prefixAuthorization+getErroreClaimNonPresente(claim)));
  1198.                     return false;
  1199.                    
  1200.                 }
  1201.             }
  1202.         }
  1203.         return true;
  1204.     }
  1205.    
  1206.     private boolean validateTokenAuthorizationProducerIdByModIConfig(IRegistryReader registriReader, IDSoggetto idSoggetto,
  1207.             boolean isRichiesta, String prefixAuthorization) throws ProtocolException{
  1208.         String producerIdClaimReceived = readProducerIdFromTokenOAuth();            
  1209.         if(producerIdClaimReceived!=null && StringUtils.isNotEmpty(producerIdClaimReceived)) {

  1210.             Soggetto s = null;
  1211.             try {
  1212.                 s = registriReader.getSoggetto(idSoggetto);
  1213.             }catch(Exception e) {
  1214.                 throw new ProtocolException(e.getMessage(),e);
  1215.             }
  1216.             String idEnte = ProtocolPropertiesUtils.getOptionalStringValuePropertyRegistry(s.getProtocolPropertyList(), ModICostanti.MODIPA_SOGGETTI_ID_ENTE_ID);
  1217.             if(idEnte!=null && StringUtils.isNotEmpty(idEnte) && !idEnte.equals(producerIdClaimReceived)) {
  1218.                 this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1219.                         isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_VALIDO :
  1220.                             CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_VALIDO,
  1221.                             prefixAuthorization+getErroreClaimNonValido(org.openspcoop2.pdd.core.token.Costanti.PDND_PRODUCER_ID)));
  1222.                 return false;
  1223.             }
  1224.            
  1225.         }
  1226.        
  1227.         return true;
  1228.     }
  1229.    
  1230.     private PortaApplicativa readPortaApplicativa(OpenSPCoop2Message msg, IProtocolFactory<?> factory, IState state, RequestInfo requestInfo) throws ProtocolException {
  1231.        
  1232.         PortaApplicativa pa = null;
  1233.         String interfaceName = null;
  1234.         if(msg!=null && msg.getTransportRequestContext()!=null && msg.getTransportRequestContext().getInterfaceName()!=null) {
  1235.             interfaceName = msg.getTransportRequestContext().getInterfaceName();
  1236.         }
  1237.         else if(requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getInterfaceName()!=null) {
  1238.             interfaceName = requestInfo.getProtocolContext().getInterfaceName();
  1239.         }
  1240.         if(interfaceName==null) {
  1241.             throw new ProtocolException("ID Porta non presente");
  1242.         }
  1243.         IDPortaApplicativa idPA = new IDPortaApplicativa();
  1244.         idPA.setNome(interfaceName);
  1245.         try {
  1246.             pa = factory.getCachedConfigIntegrationReader(state, requestInfo).getPortaApplicativa(idPA); // pa invocata
  1247.         }catch(Exception e) {
  1248.             throw new ProtocolException(e.getMessage(),e);
  1249.         }
  1250.        
  1251.         return pa;
  1252.        
  1253.     }
  1254.     private PortaApplicativa readPortaApplicativaDefault(OpenSPCoop2Message msg, IProtocolFactory<?> factory, IState state, RequestInfo requestInfo) throws ProtocolException {
  1255.         PortaApplicativa paDefault = null;
  1256.         if(msg!=null) {
  1257.             Object nomePortaInvocataObject = msg.getContextProperty(CostantiPdD.NOME_PORTA_INVOCATA);
  1258.             String nomePorta = null;
  1259.             if(nomePortaInvocataObject instanceof String) {
  1260.                 nomePorta = (String) nomePortaInvocataObject;
  1261.             }
  1262.             if(nomePorta==null && this.context!=null && this.context.containsKey(CostantiPdD.NOME_PORTA_INVOCATA)) {
  1263.                 nomePorta = (String) this.context.getObject(CostantiPdD.NOME_PORTA_INVOCATA);
  1264.             }
  1265.             if(nomePorta==null && requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getInterfaceName()!=null) {
  1266.                 nomePorta = requestInfo.getProtocolContext().getInterfaceName(); // se non e' presente 'NOME_PORTA_INVOCATA' significa che non e' stato invocato un gruppo specifico
  1267.             }
  1268.             if(nomePorta!=null) {
  1269.                 IDPortaApplicativa idPA = new IDPortaApplicativa();
  1270.                 idPA.setNome(nomePorta);
  1271.                 try {
  1272.                     paDefault = factory.getCachedConfigIntegrationReader(state, requestInfo).getPortaApplicativa(idPA);
  1273.                 }catch(Exception e) {
  1274.                     throw new ProtocolException(e.getMessage(),e);
  1275.                 }
  1276.             }
  1277.             else {
  1278.                 throw new ProtocolException("ID Porta 'default' non presente");
  1279.             }
  1280.         }
  1281.         return paDefault;
  1282.     }
  1283.     private boolean isAudienceCheckDefinedInAuthorizationTokenClaims(PortaApplicativa pa) throws ProtocolException {
  1284.        
  1285.         boolean audienceCheckDefinedInAuthorizationTokenClaims = false;
  1286.    
  1287.         if(pa.getGestioneToken()!=null && pa.getGestioneToken().getOptions()!=null) {
  1288.             SortedMap<List<String>> properties = null;
  1289.             try {
  1290.                 properties = PropertiesUtilities.convertTextToSortedListMap(pa.getGestioneToken().getOptions());
  1291.             }catch(Exception e) {
  1292.                 throw new ProtocolException(e.getMessage(),e);
  1293.             }
  1294.             if(properties!=null && properties.size()>0 && properties.containsKey(Claims.JSON_WEB_TOKEN_RFC_7519_AUDIENCE)) {
  1295.                 audienceCheckDefinedInAuthorizationTokenClaims = true; // la verifica viene fatta nell'autorizzazione per token claims                  
  1296.             }
  1297.         }
  1298.        
  1299.         return audienceCheckDefinedInAuthorizationTokenClaims;
  1300.     }
  1301.     private List<String> readAudienceFromTokenOAuth() {
  1302.         Object oInformazioniTokenNormalizzate = null;
  1303.         if(this.context!=null) {
  1304.             oInformazioniTokenNormalizzate = this.context.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
  1305.         }
  1306.         InformazioniToken informazioniTokenNormalizzate = null;
  1307.         List<String> audienceClaimReceived = null;
  1308.         if(oInformazioniTokenNormalizzate!=null) {
  1309.             informazioniTokenNormalizzate = (InformazioniToken) oInformazioniTokenNormalizzate;
  1310.             audienceClaimReceived = informazioniTokenNormalizzate.getAud();
  1311.         }
  1312.         return audienceClaimReceived;
  1313.     }
  1314.     private void checkAudienceModIConfig(OpenSPCoop2Message msg, IProtocolFactory<?> factory, IState state, RequestInfo requestInfo,
  1315.             boolean isRichiesta, String prefixAuthorization,
  1316.             List<String> audienceClaimReceived) throws ProtocolException {
  1317.         PortaApplicativa paDefault = readPortaApplicativaDefault(msg, factory, state, requestInfo);
  1318.        
  1319.         /**System.out.println("VERIFICO RISPETTO AL VALORE ATTESO '"+modISecurityConfig.getAudience()+"'");*/
  1320.        
  1321.         checkAudienceModIConfig(msg, state, requestInfo,
  1322.                 isRichiesta, prefixAuthorization,
  1323.                 paDefault,
  1324.                 audienceClaimReceived);
  1325.     }
  1326.     private void checkAudienceModIConfig(OpenSPCoop2Message msg, IState state, RequestInfo requestInfo,
  1327.             boolean isRichiesta, String prefixAuthorization,
  1328.             PortaApplicativa paDefault,
  1329.             List<String> audienceClaimReceived) throws ProtocolException {
  1330.         ModISecurityConfig modISecurityConfig = new ModISecurityConfig(msg, this.protocolFactory, state,requestInfo,
  1331.                 !isRichiesta, // fruizione,
  1332.                 isRichiesta, // request,
  1333.                 paDefault);
  1334.        
  1335.         boolean find = false;
  1336.         for (String claim : audienceClaimReceived) {
  1337.             if(claim.equalsIgnoreCase(modISecurityConfig.getAudience())) {
  1338.                 find = true;
  1339.                 break;
  1340.             }  
  1341.         }
  1342.         if(!find) {
  1343.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1344.                     isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_VALIDO :
  1345.                         CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_VALIDO,
  1346.                         prefixAuthorization+getErroreClaimNonValido(Claims.JSON_WEB_TOKEN_RFC_7519_AUDIENCE)));
  1347.         }
  1348.     }
  1349.    
  1350.     private String readProducerIdFromTokenOAuth() {
  1351.         return readClaimFromTokenOAuth(org.openspcoop2.pdd.core.token.Costanti.PDND_PRODUCER_ID);
  1352.     }
  1353.     private String readClaimFromTokenOAuth(String name) {
  1354.         Object oInformazioniTokenNormalizzate = null;
  1355.         if(this.context!=null) {
  1356.             oInformazioniTokenNormalizzate = this.context.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
  1357.         }
  1358.         InformazioniToken informazioniTokenNormalizzate = null;
  1359.         if(oInformazioniTokenNormalizzate!=null) {
  1360.             informazioniTokenNormalizzate = (InformazioniToken) oInformazioniTokenNormalizzate;
  1361.             if(informazioniTokenNormalizzate.getClaims()!=null) {
  1362.                 Serializable s = informazioniTokenNormalizzate.getClaims().get(name);
  1363.                 if(s instanceof String) {
  1364.                     return (String) s;
  1365.                 }
  1366.             }
  1367.         }
  1368.         return null;
  1369.     }
  1370. }