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.IDServizio;
  37. import org.openspcoop2.core.id.IDServizioApplicativo;
  38. import org.openspcoop2.core.id.IDSoggetto;
  39. import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
  40. import org.openspcoop2.core.registry.Soggetto;
  41. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  42. import org.openspcoop2.message.OpenSPCoop2Message;
  43. import org.openspcoop2.message.constants.ServiceBinding;
  44. import org.openspcoop2.pdd.config.ConfigurazionePdDReader;
  45. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  46. import org.openspcoop2.pdd.config.PDNDResolver;
  47. import org.openspcoop2.pdd.core.CostantiPdD;
  48. import org.openspcoop2.pdd.core.token.InformazioniToken;
  49. import org.openspcoop2.pdd.core.token.TokenUtilities;
  50. import org.openspcoop2.pdd.core.token.parser.Claims;
  51. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  52. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  53. import org.openspcoop2.protocol.basic.validator.ValidazioneSemantica;
  54. import org.openspcoop2.protocol.engine.SecurityTokenUtilities;
  55. import org.openspcoop2.protocol.modipa.config.ModIProperties;
  56. import org.openspcoop2.protocol.modipa.constants.ModICostanti;
  57. import org.openspcoop2.protocol.modipa.utils.ModISecurityConfig;
  58. import org.openspcoop2.protocol.modipa.utils.ModIUtilities;
  59. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  60. import org.openspcoop2.protocol.sdk.Busta;
  61. import org.openspcoop2.protocol.sdk.Eccezione;
  62. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  63. import org.openspcoop2.protocol.sdk.ProtocolException;
  64. import org.openspcoop2.protocol.sdk.RestMessageSecurityToken;
  65. import org.openspcoop2.protocol.sdk.SecurityToken;
  66. import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
  67. import org.openspcoop2.protocol.sdk.constants.RuoloBusta;
  68. import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesUtils;
  69. import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
  70. import org.openspcoop2.protocol.sdk.state.IState;
  71. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  72. import org.openspcoop2.protocol.sdk.validator.ProprietaValidazione;
  73. import org.openspcoop2.protocol.sdk.validator.ValidazioneSemanticaResult;
  74. import org.openspcoop2.protocol.sdk.validator.ValidazioneUtils;
  75. import org.openspcoop2.protocol.utils.ModIUtils;
  76. import org.openspcoop2.protocol.utils.ModIValidazioneSemanticaProfiloSicurezza;
  77. import org.openspcoop2.utils.SortedMap;
  78. import org.openspcoop2.utils.certificate.remote.RemoteStoreConfig;
  79. import org.openspcoop2.utils.date.DateManager;
  80. import org.openspcoop2.utils.date.DateUtils;
  81. import org.openspcoop2.utils.digest.DigestEncoding;
  82. import org.openspcoop2.utils.properties.PropertiesUtilities;
  83. import org.openspcoop2.utils.transport.http.HttpConstants;



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

  91. public class ModIValidazioneSemantica extends ValidazioneSemantica {

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

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

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

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

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

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

  1223.             Soggetto s = null;
  1224.             try {
  1225.                 s = registryReader.getSoggetto(idSoggetto);
  1226.             }catch(Exception e) {
  1227.                 throw new ProtocolException(e.getMessage(),e);
  1228.             }
  1229.             String idEnte = ProtocolPropertiesUtils.getOptionalStringValuePropertyRegistry(s.getProtocolPropertyList(), ModICostanti.MODIPA_SOGGETTI_ID_ENTE_ID);
  1230.             if(idEnte!=null && StringUtils.isNotEmpty(idEnte) && !idEnte.equals(producerIdClaimReceived)) {
  1231.                 this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1232.                         isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_VALIDO :
  1233.                             CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_VALIDO,
  1234.                             prefixAuthorization+getErroreClaimNonValido(org.openspcoop2.pdd.core.token.Costanti.PDND_PRODUCER_ID)));
  1235.                 return false;
  1236.             }
  1237.            
  1238.         }
  1239.        
  1240.         return true;
  1241.     }
  1242.    
  1243.     private boolean validateTokenAuthorizationServiceDescriptorIdByModIConfig(IRegistryReader registryReader, Busta busta,
  1244.             boolean isRichiesta, String prefixAuthorization) throws ProtocolException{
  1245.        
  1246.         IDServizio idServizio = null;
  1247.         if(busta!=null && busta.getTipoServizio()!=null && busta.getServizio()!=null && busta.getVersioneServizio()!=null && busta.getTipoDestinatario()!=null && busta .getDestinatario()!=null) {
  1248.             try {
  1249.                 idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(busta.getTipoServizio(), busta.getServizio(), busta.getTipoDestinatario(), busta .getDestinatario(), busta.getVersioneServizio());
  1250.             }catch(Exception e) {
  1251.                 throw new ProtocolException(e.getMessage(),e);
  1252.             }
  1253.             AccordoServizioParteSpecifica asps = null;
  1254.             try {
  1255.                 asps = registryReader.getAccordoServizioParteSpecifica(idServizio, false);
  1256.             }catch(Exception e) {
  1257.                 throw new ProtocolException(e.getMessage(),e);
  1258.             }
  1259.             if(!validateTokenAuthorizationServiceIdByModIConfig(asps,
  1260.                     isRichiesta, prefixAuthorization) ) {
  1261.                 return false;
  1262.             }
  1263.             if(!validateTokenAuthorizationDescriptorIdByModIConfig(asps,
  1264.                     isRichiesta, prefixAuthorization) ) {
  1265.                 return false;
  1266.             }
  1267.         }
  1268.        
  1269.         return true;
  1270.     }
  1271.     private boolean validateTokenAuthorizationServiceIdByModIConfig(AccordoServizioParteSpecifica asps,
  1272.             boolean isRichiesta, String prefixAuthorization) throws ProtocolException{
  1273.        
  1274.         boolean checkEnabled = asps!=null && asps.getNomeSoggettoErogatore()!=null && this.modiProperties.isValidazioneTokenPDNDEServiceIdCheck(asps.getNomeSoggettoErogatore());
  1275.         if(!checkEnabled) {
  1276.             return true;
  1277.         }
  1278.        
  1279.         String eServiceId = ProtocolPropertiesUtils.getOptionalStringValuePropertyRegistry(asps.getProtocolPropertyList(), ModICostanti.MODIPA_API_IMPL_INFO_ESERVICE_ID);
  1280.         if(eServiceId!=null && StringUtils.isNotEmpty(eServiceId)) {
  1281.             String serviceIdClaimReceived = readServiceIdFromTokenOAuth();  
  1282.             if(serviceIdClaimReceived==null || StringUtils.isEmpty(serviceIdClaimReceived)) {
  1283.                 this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1284.                         isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_VALIDO :
  1285.                             CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_VALIDO,
  1286.                             prefixAuthorization+getErroreClaimNonPresente(org.openspcoop2.pdd.core.token.Costanti.PDND_SERVICE_ID)));
  1287.                 return false;
  1288.             }
  1289.             if(!serviceIdClaimReceived.equals(eServiceId)) {
  1290.                 this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1291.                         isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_VALIDO :
  1292.                             CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_VALIDO,
  1293.                             prefixAuthorization+getErroreClaimNonValido(org.openspcoop2.pdd.core.token.Costanti.PDND_SERVICE_ID)));
  1294.                 return false;
  1295.             }
  1296.         }
  1297.         return true;
  1298.     }
  1299.     private boolean validateTokenAuthorizationDescriptorIdByModIConfig(AccordoServizioParteSpecifica asps,
  1300.             boolean isRichiesta, String prefixAuthorization) throws ProtocolException{
  1301.        
  1302.         boolean checkEnabled = asps!=null && asps.getNomeSoggettoErogatore()!=null && this.modiProperties.isValidazioneTokenPDNDDescriptorIdCheck(asps.getNomeSoggettoErogatore());
  1303.         if(!checkEnabled) {
  1304.             return true;
  1305.         }
  1306.        
  1307.         String tmpDescriptorId = ProtocolPropertiesUtils.getOptionalStringValuePropertyRegistry(asps.getProtocolPropertyList(), ModICostanti.MODIPA_API_IMPL_INFO_DESCRIPTOR_ID);
  1308.         List<String> descriptorIdList = null;
  1309.         if(tmpDescriptorId!=null && StringUtils.isNotEmpty(tmpDescriptorId)) {
  1310.             descriptorIdList = ModISecurityConfig.convertToList(tmpDescriptorId);
  1311.         }
  1312.         if(descriptorIdList!=null && !descriptorIdList.isEmpty()) {
  1313.             return validateTokenAuthorizationDescriptorIdByModIConfig(descriptorIdList,
  1314.                     isRichiesta, prefixAuthorization);
  1315.         }
  1316.         return true;
  1317.     }
  1318.     private boolean validateTokenAuthorizationDescriptorIdByModIConfig(List<String> descriptorIdList,
  1319.             boolean isRichiesta, String prefixAuthorization) throws ProtocolException{
  1320.         String descriptorIdClaimReceived = readDescriptorIdFromTokenOAuth();    
  1321.         if(descriptorIdClaimReceived==null || StringUtils.isEmpty(descriptorIdClaimReceived)) {
  1322.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1323.                     isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_VALIDO :
  1324.                         CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_VALIDO,
  1325.                         prefixAuthorization+getErroreClaimNonPresente(org.openspcoop2.pdd.core.token.Costanti.PDND_DESCRIPTOR_ID)));
  1326.             return false;
  1327.         }
  1328.         if(!descriptorIdList.contains(descriptorIdClaimReceived)) {
  1329.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1330.                     isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_VALIDO :
  1331.                         CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_VALIDO,
  1332.                         prefixAuthorization+getErroreClaimNonValido(org.openspcoop2.pdd.core.token.Costanti.PDND_DESCRIPTOR_ID)));
  1333.             return false;
  1334.         }
  1335.         return true;
  1336.     }
  1337.    
  1338.     private PortaApplicativa readPortaApplicativa(OpenSPCoop2Message msg, IProtocolFactory<?> factory, IState state, RequestInfo requestInfo) throws ProtocolException {
  1339.        
  1340.         PortaApplicativa pa = null;
  1341.         String interfaceName = null;
  1342.         if(msg!=null && msg.getTransportRequestContext()!=null && msg.getTransportRequestContext().getInterfaceName()!=null) {
  1343.             interfaceName = msg.getTransportRequestContext().getInterfaceName();
  1344.         }
  1345.         else if(requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getInterfaceName()!=null) {
  1346.             interfaceName = requestInfo.getProtocolContext().getInterfaceName();
  1347.         }
  1348.         if(interfaceName==null) {
  1349.             throw new ProtocolException("ID Porta non presente");
  1350.         }
  1351.         IDPortaApplicativa idPA = new IDPortaApplicativa();
  1352.         idPA.setNome(interfaceName);
  1353.         try {
  1354.             pa = factory.getCachedConfigIntegrationReader(state, requestInfo).getPortaApplicativa(idPA); // pa invocata
  1355.         }catch(Exception e) {
  1356.             throw new ProtocolException(e.getMessage(),e);
  1357.         }
  1358.        
  1359.         return pa;
  1360.        
  1361.     }
  1362.     private PortaApplicativa readPortaApplicativaDefault(OpenSPCoop2Message msg, IProtocolFactory<?> factory, IState state, RequestInfo requestInfo) throws ProtocolException {
  1363.         PortaApplicativa paDefault = null;
  1364.         if(msg!=null) {
  1365.             Object nomePortaInvocataObject = msg.getContextProperty(CostantiPdD.NOME_PORTA_INVOCATA);
  1366.             String nomePorta = null;
  1367.             if(nomePortaInvocataObject instanceof String) {
  1368.                 nomePorta = (String) nomePortaInvocataObject;
  1369.             }
  1370.             if(nomePorta==null && this.context!=null && this.context.containsKey(CostantiPdD.NOME_PORTA_INVOCATA)) {
  1371.                 nomePorta = (String) this.context.getObject(CostantiPdD.NOME_PORTA_INVOCATA);
  1372.             }
  1373.             if(nomePorta==null && requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getInterfaceName()!=null) {
  1374.                 nomePorta = requestInfo.getProtocolContext().getInterfaceName(); // se non e' presente 'NOME_PORTA_INVOCATA' significa che non e' stato invocato un gruppo specifico
  1375.             }
  1376.             if(nomePorta!=null) {
  1377.                 IDPortaApplicativa idPA = new IDPortaApplicativa();
  1378.                 idPA.setNome(nomePorta);
  1379.                 try {
  1380.                     paDefault = factory.getCachedConfigIntegrationReader(state, requestInfo).getPortaApplicativa(idPA);
  1381.                 }catch(Exception e) {
  1382.                     throw new ProtocolException(e.getMessage(),e);
  1383.                 }
  1384.             }
  1385.             else {
  1386.                 throw new ProtocolException("ID Porta 'default' non presente");
  1387.             }
  1388.         }
  1389.         return paDefault;
  1390.     }
  1391.     private boolean isAudienceCheckDefinedInAuthorizationTokenClaims(PortaApplicativa pa) throws ProtocolException {
  1392.        
  1393.         boolean audienceCheckDefinedInAuthorizationTokenClaims = false;
  1394.    
  1395.         if(pa.getGestioneToken()!=null && pa.getGestioneToken().getOptions()!=null) {
  1396.             SortedMap<List<String>> properties = null;
  1397.             try {
  1398.                 properties = PropertiesUtilities.convertTextToSortedListMap(pa.getGestioneToken().getOptions());
  1399.             }catch(Exception e) {
  1400.                 throw new ProtocolException(e.getMessage(),e);
  1401.             }
  1402.             if(properties!=null && properties.size()>0 && properties.containsKey(Claims.JSON_WEB_TOKEN_RFC_7519_AUDIENCE)) {
  1403.                 audienceCheckDefinedInAuthorizationTokenClaims = true; // la verifica viene fatta nell'autorizzazione per token claims                  
  1404.             }
  1405.         }
  1406.        
  1407.         return audienceCheckDefinedInAuthorizationTokenClaims;
  1408.     }
  1409.     private List<String> readAudienceFromTokenOAuth() {
  1410.         Object oInformazioniTokenNormalizzate = null;
  1411.         if(this.context!=null) {
  1412.             oInformazioniTokenNormalizzate = this.context.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
  1413.         }
  1414.         InformazioniToken informazioniTokenNormalizzate = null;
  1415.         List<String> audienceClaimReceived = null;
  1416.         if(oInformazioniTokenNormalizzate!=null) {
  1417.             informazioniTokenNormalizzate = (InformazioniToken) oInformazioniTokenNormalizzate;
  1418.             audienceClaimReceived = informazioniTokenNormalizzate.getAud();
  1419.         }
  1420.         return audienceClaimReceived;
  1421.     }
  1422.     private void checkAudienceModIConfig(OpenSPCoop2Message msg, IProtocolFactory<?> factory, IState state, RequestInfo requestInfo,
  1423.             boolean isRichiesta, String prefixAuthorization,
  1424.             List<String> audienceClaimReceived) throws ProtocolException {
  1425.         PortaApplicativa paDefault = readPortaApplicativaDefault(msg, factory, state, requestInfo);
  1426.        
  1427.         /**System.out.println("VERIFICO RISPETTO AL VALORE ATTESO '"+modISecurityConfig.getAudience()+"'");*/
  1428.        
  1429.         checkAudienceModIConfig(msg, state, requestInfo,
  1430.                 isRichiesta, prefixAuthorization,
  1431.                 paDefault,
  1432.                 audienceClaimReceived);
  1433.     }
  1434.     private void checkAudienceModIConfig(OpenSPCoop2Message msg, IState state, RequestInfo requestInfo,
  1435.             boolean isRichiesta, String prefixAuthorization,
  1436.             PortaApplicativa paDefault,
  1437.             List<String> audienceClaimReceived) throws ProtocolException {
  1438.         ModISecurityConfig modISecurityConfig = new ModISecurityConfig(msg, this.protocolFactory, state,requestInfo,
  1439.                 !isRichiesta, // fruizione,
  1440.                 isRichiesta, // request,
  1441.                 paDefault);
  1442.        
  1443.         boolean find = false;
  1444.         for (String claim : audienceClaimReceived) {
  1445.             if(claim.equalsIgnoreCase(modISecurityConfig.getAudience())) {
  1446.                 find = true;
  1447.                 break;
  1448.             }  
  1449.         }
  1450.         if(!find) {
  1451.             this.erroriValidazione.add(this.validazioneUtils.newEccezioneValidazione(
  1452.                     isRichiesta ? CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_EROGATORE_NON_VALIDO :
  1453.                         CodiceErroreCooperazione.SERVIZIO_APPLICATIVO_FRUITORE_NON_VALIDO,
  1454.                         prefixAuthorization+getErroreClaimNonValido(Claims.JSON_WEB_TOKEN_RFC_7519_AUDIENCE)));
  1455.         }
  1456.     }
  1457.    
  1458.     private String readProducerIdFromTokenOAuth() {
  1459.         return readClaimFromTokenOAuth(org.openspcoop2.pdd.core.token.Costanti.PDND_PRODUCER_ID);
  1460.     }
  1461.     private String readServiceIdFromTokenOAuth() {
  1462.         return readClaimFromTokenOAuth(org.openspcoop2.pdd.core.token.Costanti.PDND_SERVICE_ID);
  1463.     }
  1464.     private String readDescriptorIdFromTokenOAuth() {
  1465.         return readClaimFromTokenOAuth(org.openspcoop2.pdd.core.token.Costanti.PDND_DESCRIPTOR_ID);
  1466.     }
  1467.     private String readClaimFromTokenOAuth(String name) {
  1468.         Object oInformazioniTokenNormalizzate = null;
  1469.         if(this.context!=null) {
  1470.             oInformazioniTokenNormalizzate = this.context.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
  1471.         }
  1472.         InformazioniToken informazioniTokenNormalizzate = null;
  1473.         if(oInformazioniTokenNormalizzate!=null) {
  1474.             informazioniTokenNormalizzate = (InformazioniToken) oInformazioniTokenNormalizzate;
  1475.             if(informazioniTokenNormalizzate.getClaims()!=null) {
  1476.                 Serializable s = informazioniTokenNormalizzate.getClaims().get(name);
  1477.                 if(s instanceof String) {
  1478.                     return (String) s;
  1479.                 }
  1480.             }
  1481.         }
  1482.         return null;
  1483.     }
  1484. }