RicezioneContenutiApplicativiGestioneToken.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.pdd.services.core;

  21. import java.util.List;

  22. import org.openspcoop2.core.config.GestioneTokenAutenticazione;
  23. import org.openspcoop2.core.config.PortaDelegata;
  24. import org.openspcoop2.core.id.IDPortaDelegata;
  25. import org.openspcoop2.core.id.IDSoggetto;
  26. import org.openspcoop2.core.transazioni.utils.CredenzialiMittente;
  27. import org.openspcoop2.message.OpenSPCoop2Message;
  28. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  29. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  30. import org.openspcoop2.pdd.core.CostantiPdD;
  31. import org.openspcoop2.pdd.core.PdDContext;
  32. import org.openspcoop2.pdd.core.autenticazione.GestoreAutenticazione;
  33. import org.openspcoop2.pdd.core.handlers.InRequestContext;
  34. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  35. import org.openspcoop2.pdd.core.token.GestoreToken;
  36. import org.openspcoop2.pdd.core.token.InformazioniToken;
  37. import org.openspcoop2.pdd.core.token.PolicyGestioneToken;
  38. import org.openspcoop2.pdd.core.token.pd.EsitoDynamicDiscoveryPortaDelegata;
  39. import org.openspcoop2.pdd.core.token.pd.EsitoGestioneTokenPortaDelegata;
  40. import org.openspcoop2.pdd.core.token.pd.EsitoPresenzaTokenPortaDelegata;
  41. import org.openspcoop2.pdd.core.token.pd.GestioneToken;
  42. import org.openspcoop2.pdd.core.transazioni.Transaction;
  43. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  44. import org.openspcoop2.pdd.services.error.RicezioneContenutiApplicativiInternalErrorGenerator;
  45. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  46. import org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione;
  47. import org.openspcoop2.protocol.sdk.constants.ErroreIntegrazione;
  48. import org.openspcoop2.protocol.sdk.constants.ErroriIntegrazione;
  49. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  50. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  51. import org.openspcoop2.utils.transport.http.HttpConstants;
  52. import org.slf4j.Logger;

  53. /**
  54.  * RicezioneContenutiApplicativiGestioneToken
  55.  *
  56.  * @author Poli Andrea (apoli@link.it)
  57.  * @author $Author$
  58.  * @version $Rev$, $Date$
  59.  */
  60. public class RicezioneContenutiApplicativiGestioneToken {

  61.     private MsgDiagnostico msgDiag;
  62.     private Logger logCore;
  63.    
  64.     private PortaDelegata portaDelegata;
  65.     private IDPortaDelegata identificativoPortaDelegata;
  66.    
  67.     private OpenSPCoop2Message requestMessage;
  68.    
  69.     private RicezioneContenutiApplicativiContext msgContext;
  70.     private RicezioneContenutiApplicativiInternalErrorGenerator generatoreErrore;
  71.     private InRequestContext inRequestContext;
  72.    
  73.     private ConfigurazionePdDManager configurazionePdDReader;
  74.    
  75.     private PdDContext pddContext;
  76.     private String idTransazione;
  77.     private IOpenSPCoopState openspcoopstate;
  78.     private Transaction transaction;
  79.     private RequestInfo requestInfo;
  80.    
  81.     private IProtocolFactory<?> protocolFactory;
  82.    
  83.     private IDSoggetto identitaPdD;
  84.    
  85.     public RicezioneContenutiApplicativiGestioneToken(MsgDiagnostico msgDiag, Logger logCore,
  86.             PortaDelegata portaDelegata, IDPortaDelegata identificativoPortaDelegata,
  87.             OpenSPCoop2Message requestMessage,
  88.             RicezioneContenutiApplicativiContext msgContext, RicezioneContenutiApplicativiInternalErrorGenerator generatoreErrore, InRequestContext inRequestContext,
  89.             ConfigurazionePdDManager configurazionePdDReader,
  90.             PdDContext pddContext, String idTransazione,
  91.             IOpenSPCoopState openspcoopstate, Transaction transaction, RequestInfo requestInfo,
  92.             IProtocolFactory<?> protocolFactory,
  93.             IDSoggetto identitaPdD) {
  94.         this.msgDiag = msgDiag;
  95.         this.logCore = logCore;
  96.                
  97.         this.portaDelegata = portaDelegata;
  98.         this.identificativoPortaDelegata = identificativoPortaDelegata;
  99.        
  100.         this.requestMessage = requestMessage;
  101.        
  102.         this.msgContext = msgContext;
  103.         this.generatoreErrore = generatoreErrore;
  104.         this.inRequestContext = inRequestContext;
  105.        
  106.         this.configurazionePdDReader = configurazionePdDReader;
  107.        
  108.         this.pddContext = pddContext;
  109.         this.idTransazione = idTransazione;
  110.         this.openspcoopstate = openspcoopstate;
  111.         this.transaction = transaction;
  112.         this.requestInfo = requestInfo;
  113.        
  114.         this.protocolFactory = protocolFactory;
  115.        
  116.         this.identitaPdD = identitaPdD;
  117.        
  118.     }
  119.    
  120.     // Result
  121.     private GestioneTokenAutenticazione gestioneTokenAutenticazione = null;
  122.     private String token = null;
  123.     private String tipoGestioneToken = null;
  124.    
  125.     public GestioneTokenAutenticazione getGestioneTokenAutenticazione() {
  126.         return this.gestioneTokenAutenticazione;
  127.     }
  128.     public String getToken() {
  129.         return this.token;
  130.     }
  131.     public String getTipoGestioneToken() {
  132.         return this.tipoGestioneToken;
  133.     }
  134.    
  135.     public boolean process() {
  136.        
  137.         try {
  138.             this.tipoGestioneToken = this.configurazionePdDReader.getGestioneToken(this.portaDelegata);
  139.             if(this.portaDelegata!=null && this.portaDelegata.getGestioneToken()!=null) {
  140.                 this.gestioneTokenAutenticazione = this.portaDelegata.getGestioneToken().getAutenticazione();
  141.             }
  142.         } catch (Exception e) {
  143.             this.msgDiag.logErroreGenerico(e, "letturaToken");
  144.             this.logCore.error(this.msgDiag.getMessaggio_replaceKeywords("letturaToken"),e);
  145.             this.openspcoopstate.releaseResource();
  146.             if (this.msgContext.isGestioneRisposta()) {
  147.                 this.msgContext.setMessageResponse((this.generatoreErrore.build(this.pddContext,IntegrationFunctionError.INTERNAL_REQUEST_ERROR,
  148.                         ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  149.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE), e,null)));
  150.             }
  151.             return false;
  152.         }
  153.        
  154.         String gestioneTokenPrefix = "processo di gestione token ["+ this.tipoGestioneToken + "] ";
  155.        
  156.         this.msgDiag.mediumDebug("GestioneToken...");
  157.         this.msgContext.getIntegrazione().setTipoGestioneToken(this.tipoGestioneToken);
  158.         if (this.tipoGestioneToken == null) {

  159.             this.msgDiag.logPersonalizzato("gestioneTokenDisabilitata");
  160.            
  161.         } else {

  162.             this.transaction.getTempiElaborazione().startToken();
  163.             try {
  164.            
  165.                 ErroreIntegrazione errore = null;
  166.                 Exception eGestioneToken = null;
  167.                 OpenSPCoop2Message errorMessageGestioneToken = null;
  168.                 String wwwAuthenticateErrorHeader = null;
  169.                 boolean fineGestione = false;
  170.                 IntegrationFunctionError integrationFunctionError = null;
  171.                 try {
  172.                    
  173.                     PolicyGestioneToken policyGestioneToken = this.configurazionePdDReader.getPolicyGestioneToken(this.portaDelegata, this.requestInfo);
  174.                    
  175.                     this.pddContext.addObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_POLICY,
  176.                             policyGestioneToken.getName());
  177.                     this.pddContext.addObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_REALM,
  178.                             policyGestioneToken.getRealm());
  179.                     this.pddContext.addObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_MESSAGE_ERROR_BODY_EMPTY,
  180.                             policyGestioneToken.isMessageErrorGenerateEmptyMessage());
  181.                     this.pddContext.addObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_MESSAGE_ERROR_GENERIC_MESSAGE,
  182.                             policyGestioneToken.isMessageErrorGenerateGenericMessage());
  183.                    
  184.                     this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_POLICY_GESTIONE, this.tipoGestioneToken);
  185.                     this.msgContext.getIntegrazione().setTokenPolicy(this.tipoGestioneToken);
  186.                     this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_POLICY_AZIONI, policyGestioneToken.getLabelAzioniGestioneToken());
  187.                     this.msgContext.getIntegrazione().setTokenPolicyActions(policyGestioneToken.getAzioniGestioneToken());
  188.                     this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_TIPO, policyGestioneToken.getLabelTipoToken());
  189.                     this.msgDiag.logPersonalizzato("gestioneTokenInCorso");
  190.                    
  191.                     org.openspcoop2.pdd.core.token.pd.DatiInvocazionePortaDelegata datiInvocazione = new org.openspcoop2.pdd.core.token.pd.DatiInvocazionePortaDelegata();
  192.                     datiInvocazione.setInfoConnettoreIngresso(this.inRequestContext.getConnettore());
  193.                     datiInvocazione.setState(this.openspcoopstate.getStatoRichiesta());
  194.                     datiInvocazione.setIdModulo(this.msgContext.getIdModulo());
  195.                     datiInvocazione.setMessage(this.requestMessage);
  196.                     datiInvocazione.setIdPD(this.identificativoPortaDelegata);
  197.                     datiInvocazione.setPd(this.portaDelegata);      
  198.                     datiInvocazione.setPolicyGestioneToken(policyGestioneToken);
  199.                     datiInvocazione.setRequestInfo(this.requestInfo);
  200.                    
  201.                     GestoreToken.validazioneConfigurazione(datiInvocazione); // assicura che la configurazione sia corretta
  202.                    
  203.                     GestioneToken gestioneTokenEngine = new GestioneToken(this.logCore, this.idTransazione, this.pddContext, this.protocolFactory);
  204.                    
  205.                     // cerco token
  206.                    
  207.                     this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_POSIZIONE, policyGestioneToken.getLabelPosizioneToken());
  208.                     this.msgDiag.logPersonalizzato("gestioneTokenInCorso.verificaPresenzaToken");
  209.                    
  210.                     EsitoPresenzaTokenPortaDelegata esitoPresenzaToken = gestioneTokenEngine.verificaPresenzaToken(datiInvocazione);
  211.                     EsitoDynamicDiscoveryPortaDelegata esitoDynamicDiscovery = null;
  212.                     EsitoGestioneTokenPortaDelegata esitoValidazioneToken = null;
  213.                     EsitoGestioneTokenPortaDelegata esitoIntrospectionToken = null;
  214.                     EsitoGestioneTokenPortaDelegata esitoUserInfoToken = null;
  215.                     if(esitoPresenzaToken.isPresente()) {
  216.                         this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN, esitoPresenzaToken.getToken());
  217.                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.verificaPresenzaToken.trovato"); // stampa del token info
  218.                        
  219.                         this.token = esitoPresenzaToken.getToken();
  220.                         this.pddContext.addObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_POSIZIONE, esitoPresenzaToken);
  221.                        
  222.                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.verificaPresenzaToken.completataSuccesso");
  223.    
  224.                        
  225.                         // dynamicDiscovery
  226.                         if(!fineGestione) {
  227.                            
  228.                             if(policyGestioneToken.isDynamicDiscovery()) {
  229.                            
  230.                                 this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_ENDPOINT_SERVIZIO_DYNAMIC_DISCOVERY, policyGestioneToken.getDynamicDiscoveryEndpoint());
  231.                                
  232.                                 this.msgDiag.logPersonalizzato("gestioneTokenInCorso.dynamicDiscovery");
  233.                                
  234.                                 esitoDynamicDiscovery = gestioneTokenEngine.dynamicDiscovery(datiInvocazione, esitoPresenzaToken);
  235.                                 if(esitoDynamicDiscovery.isValido()) {
  236.                                    
  237.                                     this.msgDiag.logPersonalizzato("gestioneTokenInCorso.dynamicDiscovery.completataSuccesso");
  238.                                    
  239.                                     this.msgDiag.addKeyword(CostantiPdD.KEY_DYNAMIC_DISCOVERY_INFO, esitoDynamicDiscovery.getDynamicDiscovery().getRawResponse());
  240.                                    
  241.                                     this.pddContext.addObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_ESITO_DYNAMIC_DISCOVERY, esitoDynamicDiscovery);
  242.                                    
  243.                                     if(esitoDynamicDiscovery.isInCache()) {
  244.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.dynamicDiscovery.inCache");
  245.                                     }
  246.                                     else {
  247.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.dynamicDiscovery.validato");
  248.                                     }
  249.                                 }
  250.                                 else {
  251.                                    
  252.                                     this.msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, esitoDynamicDiscovery.getDetails());
  253.                                     // La gestione di fallire o dare warning è delegata alla funzionalità stessa jwt/introspection/userInfo che sono le azioni
  254.                                     /**if(policyGestioneToken.isDynamicDiscoveryWarningOnly()) {
  255.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.dynamicDiscovery.warningOnly.fallita");
  256.                                     }
  257.                                     else {
  258.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.dynamicDiscovery.fallita");
  259.                                         fineGestione = true;
  260.                                     }*/
  261.                                     this.msgDiag.logPersonalizzato("gestioneTokenInCorso.dynamicDiscovery.fallita");
  262.                                    
  263.                                     String msgErrore = gestioneTokenPrefix+"(Introspection) fallito: " + esitoDynamicDiscovery.getDetails();
  264.                                     if(esitoDynamicDiscovery.getEccezioneProcessamento()!=null) {
  265.                                         this.logCore.error(msgErrore,esitoDynamicDiscovery.getEccezioneProcessamento());
  266.                                     }
  267.                                     else {
  268.                                         this.logCore.error(msgErrore);
  269.                                     }
  270.                                
  271.                                     // La gestione di fallire o dare warning è delegata alla funzionalità stessa jwt/introspection/userInfo che sono le azioni
  272.                                     /**
  273.                                     errore = esitoDynamicDiscovery.getErroreIntegrazione();
  274.                                     eGestioneToken = esitoDynamicDiscovery.getEccezioneProcessamento();
  275.                                     errorMessageGestioneToken = esitoDynamicDiscovery.getErrorMessage();
  276.                                     wwwAuthenticateErrorHeader = esitoDynamicDiscovery.getWwwAuthenticateErrorHeader();
  277.                                     integrationFunctionError = esitoDynamicDiscovery.getIntegrationFunctionError();
  278.                                     **/
  279.                                    
  280.                                 }
  281.                             }
  282.                             else {
  283.                                 this.msgDiag.logPersonalizzato("gestioneTokenInCorso.dynamicDiscovery.disabilitata");
  284.                             }
  285.                            
  286.                         }
  287.                        
  288.                        
  289.                         // validazione jwt
  290.                         if(!fineGestione) {
  291.                            
  292.                             if(policyGestioneToken.isValidazioneJWT()) {
  293.                            
  294.                                 this.msgDiag.logPersonalizzato("gestioneTokenInCorso.validazioneToken");
  295.                                
  296.                                 esitoValidazioneToken = gestioneTokenEngine.validazioneJWTToken(datiInvocazione, esitoPresenzaToken, esitoDynamicDiscovery);
  297.                                 if(esitoValidazioneToken.isValido()) {
  298.                                    
  299.                                     this.msgDiag.logPersonalizzato("gestioneTokenInCorso.validazioneToken.completataSuccesso");
  300.                                    
  301.                                     this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_INFO, esitoValidazioneToken.getInformazioniToken().getRawResponse());
  302.                                    
  303.                                     this.pddContext.addObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_ESITO_VALIDAZIONE, esitoValidazioneToken);
  304.                                    
  305.                                     if(esitoValidazioneToken.isInCache()) {
  306.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.validazioneToken.inCache");
  307.                                     }
  308.                                     else {
  309.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.validazioneToken.validato");
  310.                                     }
  311.                                 }
  312.                                 else {
  313.                                    
  314.                                     this.msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, esitoValidazioneToken.getDetails());
  315.                                     if(policyGestioneToken.isValidazioneJWTWarningOnly()) {
  316.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.validazioneToken.warningOnly.fallita");
  317.                                     }
  318.                                     else {
  319.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.validazioneToken.fallita");
  320.                                         fineGestione = true;
  321.                                     }
  322.                                    
  323.                                     String msgErrore = gestioneTokenPrefix+"(validazione JWT) fallito: " + esitoValidazioneToken.getDetails();
  324.                                     if(esitoValidazioneToken.getEccezioneProcessamento()!=null) {
  325.                                         this.logCore.error(msgErrore,esitoValidazioneToken.getEccezioneProcessamento());
  326.                                     }
  327.                                     else {
  328.                                         this.logCore.error(msgErrore);
  329.                                     }
  330.                                
  331.                                     errore = esitoValidazioneToken.getErroreIntegrazione();
  332.                                     eGestioneToken = esitoValidazioneToken.getEccezioneProcessamento();
  333.                                     errorMessageGestioneToken = esitoValidazioneToken.getErrorMessage();
  334.                                     wwwAuthenticateErrorHeader = esitoValidazioneToken.getWwwAuthenticateErrorHeader();
  335.                                     integrationFunctionError = esitoValidazioneToken.getIntegrationFunctionError();
  336.                                    
  337.                                 }
  338.                             }
  339.                             else {
  340.                                 this.msgDiag.logPersonalizzato("gestioneTokenInCorso.validazioneToken.disabilitata");
  341.                             }
  342.                            
  343.                         }
  344.                        
  345.                        
  346.                         // introspection
  347.                         if(!fineGestione) {
  348.                            
  349.                             if(policyGestioneToken.isIntrospection()) {
  350.                            
  351.                                 String endpoint = null;
  352.                                 if(esitoDynamicDiscovery!=null) {
  353.                                     if(esitoDynamicDiscovery.isValido() && esitoDynamicDiscovery.getDynamicDiscovery()!=null) {
  354.                                         endpoint = esitoDynamicDiscovery.getDynamicDiscovery().getIntrospectionEndpoint();
  355.                                     }
  356.                                     else {
  357.                                         endpoint = "dynamic discovery";
  358.                                     }
  359.                                 }
  360.                                 else {
  361.                                     endpoint = policyGestioneToken.getIntrospectionEndpoint();
  362.                                 }
  363.                                 this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_ENDPOINT_SERVIZIO_INTROSPECTION, endpoint);
  364.                                
  365.                                 this.msgDiag.logPersonalizzato("gestioneTokenInCorso.introspectionToken");
  366.                                
  367.                                 esitoIntrospectionToken = gestioneTokenEngine.introspectionToken(datiInvocazione, esitoPresenzaToken, esitoDynamicDiscovery);
  368.                                 if(esitoIntrospectionToken.isValido()) {
  369.                                    
  370.                                     this.msgDiag.logPersonalizzato("gestioneTokenInCorso.introspectionToken.completataSuccesso");
  371.                                    
  372.                                     this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_INFO, esitoIntrospectionToken.getInformazioniToken().getRawResponse());
  373.                                    
  374.                                     this.pddContext.addObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_ESITO_INTROSPECTION, esitoIntrospectionToken);
  375.                                    
  376.                                     if(esitoIntrospectionToken.isInCache()) {
  377.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.introspectionToken.inCache");
  378.                                     }
  379.                                     else {
  380.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.introspectionToken.validato");
  381.                                     }
  382.                                 }
  383.                                 else {
  384.                                    
  385.                                     this.msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, esitoIntrospectionToken.getDetails());
  386.                                     if(policyGestioneToken.isIntrospectionWarningOnly()) {
  387.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.introspectionToken.warningOnly.fallita");
  388.                                     }
  389.                                     else {
  390.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.introspectionToken.fallita");
  391.                                         fineGestione = true;
  392.                                     }
  393.                                    
  394.                                     String msgErrore = gestioneTokenPrefix+"(Introspection) fallito: " + esitoIntrospectionToken.getDetails();
  395.                                     if(esitoIntrospectionToken.getEccezioneProcessamento()!=null) {
  396.                                         this.logCore.error(msgErrore,esitoIntrospectionToken.getEccezioneProcessamento());
  397.                                     }
  398.                                     else {
  399.                                         this.logCore.error(msgErrore);
  400.                                     }
  401.                                
  402.                                     errore = esitoIntrospectionToken.getErroreIntegrazione();
  403.                                     eGestioneToken = esitoIntrospectionToken.getEccezioneProcessamento();
  404.                                     errorMessageGestioneToken = esitoIntrospectionToken.getErrorMessage();
  405.                                     wwwAuthenticateErrorHeader = esitoIntrospectionToken.getWwwAuthenticateErrorHeader();
  406.                                     integrationFunctionError = esitoIntrospectionToken.getIntegrationFunctionError();
  407.                                    
  408.                                 }
  409.                             }
  410.                             else {
  411.                                 this.msgDiag.logPersonalizzato("gestioneTokenInCorso.introspectionToken.disabilitata");
  412.                             }
  413.                            
  414.                         }
  415.                        
  416.                        
  417.                         // userInfo
  418.                         if(!fineGestione) {
  419.                            
  420.                             if(policyGestioneToken.isUserInfo()) {
  421.                            
  422.                                 String endpoint = null;
  423.                                 if(esitoDynamicDiscovery!=null) {
  424.                                     if(esitoDynamicDiscovery.isValido() && esitoDynamicDiscovery.getDynamicDiscovery()!=null) {
  425.                                         endpoint = esitoDynamicDiscovery.getDynamicDiscovery().getUserinfoEndpoint();
  426.                                     }
  427.                                     else {
  428.                                         endpoint = "dynamic discovery";
  429.                                     }
  430.                                 }
  431.                                 else {
  432.                                     endpoint = policyGestioneToken.getUserInfoEndpoint();
  433.                                 }
  434.                                 this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_ENDPOINT_SERVIZIO_USER_INFO, endpoint);
  435.                                
  436.                                 this.msgDiag.logPersonalizzato("gestioneTokenInCorso.userInfoToken");
  437.                                
  438.                                 esitoUserInfoToken = gestioneTokenEngine.userInfoToken(datiInvocazione, esitoPresenzaToken, esitoDynamicDiscovery);
  439.                                 if(esitoUserInfoToken.isValido()) {
  440.                                    
  441.                                     this.msgDiag.logPersonalizzato("gestioneTokenInCorso.userInfoToken.completataSuccesso");
  442.                                    
  443.                                     this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_INFO, esitoUserInfoToken.getInformazioniToken().getRawResponse());
  444.                                    
  445.                                     this.pddContext.addObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_ESITO_USER_INFO, esitoUserInfoToken);
  446.                                    
  447.                                     if(esitoUserInfoToken.isInCache()) {
  448.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.userInfoToken.inCache");
  449.                                     }
  450.                                     else {
  451.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.userInfoToken.validato");
  452.                                     }
  453.                                 }
  454.                                 else {
  455.                                    
  456.                                     this.msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, esitoUserInfoToken.getDetails());
  457.                                     if(policyGestioneToken.isUserInfoWarningOnly()) {
  458.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.userInfoToken.warningOnly.fallita");
  459.                                     }
  460.                                     else {
  461.                                         this.msgDiag.logPersonalizzato("gestioneTokenInCorso.userInfoToken.fallita");
  462.                                         fineGestione = true;
  463.                                     }
  464.                                    
  465.                                     String msgErrore = gestioneTokenPrefix+"(UserInfo) fallito: " + esitoUserInfoToken.getDetails();
  466.                                     if(esitoUserInfoToken.getEccezioneProcessamento()!=null) {
  467.                                         this.logCore.error(msgErrore,esitoUserInfoToken.getEccezioneProcessamento());
  468.                                     }
  469.                                     else {
  470.                                         this.logCore.error(msgErrore);
  471.                                     }
  472.                                
  473.                                     errore = esitoUserInfoToken.getErroreIntegrazione();
  474.                                     eGestioneToken = esitoUserInfoToken.getEccezioneProcessamento();
  475.                                     errorMessageGestioneToken = esitoUserInfoToken.getErrorMessage();
  476.                                     wwwAuthenticateErrorHeader = esitoUserInfoToken.getWwwAuthenticateErrorHeader();
  477.                                     integrationFunctionError = esitoUserInfoToken.getIntegrationFunctionError();
  478.                                    
  479.                                 }
  480.                             }
  481.                             else {
  482.                                 this.msgDiag.logPersonalizzato("gestioneTokenInCorso.userInfoToken.disabilitata");
  483.                             }
  484.                            
  485.                         }
  486.                        
  487.                        
  488.                     }
  489.                     else {
  490.                        
  491.                         if(!policyGestioneToken.isTokenOpzionale()) {
  492.                        
  493.                             this.msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, esitoPresenzaToken.getDetails());
  494.                             this.msgDiag.logPersonalizzato("gestioneTokenInCorso.verificaPresenzaToken.fallita");
  495.                            
  496.                             fineGestione = true;
  497.                            
  498.                             String msgErrore = gestioneTokenPrefix+"fallito: " + esitoPresenzaToken.getDetails();
  499.                             if(esitoPresenzaToken.getEccezioneProcessamento()!=null) {
  500.                                 this.logCore.error(msgErrore,esitoPresenzaToken.getEccezioneProcessamento());
  501.                             }
  502.                             else {
  503.                                 this.logCore.error(msgErrore);
  504.                             }
  505.                    
  506.                             errore = esitoPresenzaToken.getErroreIntegrazione();
  507.                             eGestioneToken = esitoPresenzaToken.getEccezioneProcessamento();
  508.                             errorMessageGestioneToken = esitoPresenzaToken.getErrorMessage();
  509.                             wwwAuthenticateErrorHeader = esitoPresenzaToken.getWwwAuthenticateErrorHeader();
  510.                             integrationFunctionError = IntegrationFunctionError.TOKEN_NOT_FOUND;
  511.                        
  512.                         }
  513.                        
  514.                     }
  515.            
  516.                     if(fineGestione) {
  517.                         if(esitoPresenzaToken.isPresente()) {
  518.                             this.pddContext.addObject(org.openspcoop2.core.constants.Costanti.ERRORE_TOKEN, "true");
  519.                         }
  520.                         else {
  521.                             this.pddContext.addObject(org.openspcoop2.core.constants.Costanti.TOKEN_NON_PRESENTE, "true");
  522.                         }
  523.                         this.msgDiag.logPersonalizzato("gestioneTokenFallita");
  524.                        
  525.                         List<InformazioniToken> listaEsiti = GestoreToken.getInformazioniTokenNonValide(esitoValidazioneToken, esitoIntrospectionToken, esitoUserInfoToken);
  526.                         InformazioniToken informazioniTokenNormalizzate = null;
  527.                         if(listaEsiti!=null && !listaEsiti.isEmpty()) {
  528.                             informazioniTokenNormalizzate = GestoreToken.normalizeInformazioniToken(listaEsiti);
  529.                             informazioniTokenNormalizzate.setValid(false);
  530.                         }
  531.                         if(informazioniTokenNormalizzate==null && esitoDynamicDiscovery!=null && esitoDynamicDiscovery.getDynamicDiscovery()!=null) {
  532.                             informazioniTokenNormalizzate = new InformazioniToken();
  533.                             if(esitoPresenzaToken!=null) {
  534.                                 informazioniTokenNormalizzate.setToken(esitoPresenzaToken.getToken());
  535.                             }
  536.                             informazioniTokenNormalizzate.setDynamicDiscovery(esitoDynamicDiscovery.getDynamicDiscovery());
  537.                         }
  538.                         if(informazioniTokenNormalizzate!=null) {
  539.                            
  540.                             if(esitoDynamicDiscovery!=null) {
  541.                                 informazioniTokenNormalizzate.setDynamicDiscovery(esitoDynamicDiscovery.getDynamicDiscovery());
  542.                             }
  543.                            
  544.                             this.pddContext.addObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE, informazioniTokenNormalizzate);
  545.                            
  546.                             this.transaction.setInformazioniToken(informazioniTokenNormalizzate);
  547.                         }
  548.                     }
  549.                     else {
  550.                         if(esitoPresenzaToken.isPresente()) {
  551.                             List<InformazioniToken> listaEsiti = GestoreToken.getInformazioniTokenValide(esitoValidazioneToken, esitoIntrospectionToken, esitoUserInfoToken);
  552.                             InformazioniToken informazioniTokenNormalizzate = null;
  553.                             if(listaEsiti!=null && !listaEsiti.isEmpty()) {
  554.                                 informazioniTokenNormalizzate = GestoreToken.normalizeInformazioniToken(listaEsiti);
  555.                                 informazioniTokenNormalizzate.setValid(true);
  556.                             }
  557.                             if(informazioniTokenNormalizzate==null && esitoDynamicDiscovery!=null && esitoDynamicDiscovery.getDynamicDiscovery()!=null) {
  558.                                 informazioniTokenNormalizzate = new InformazioniToken();
  559.                                 if(esitoPresenzaToken!=null) {
  560.                                     informazioniTokenNormalizzate.setToken(esitoPresenzaToken.getToken());
  561.                                 }
  562.                                 informazioniTokenNormalizzate.setDynamicDiscovery(esitoDynamicDiscovery.getDynamicDiscovery());
  563.                             }
  564.                             if(informazioniTokenNormalizzate!=null) {
  565.                                
  566.                                 if(esitoDynamicDiscovery!=null) {
  567.                                     informazioniTokenNormalizzate.setDynamicDiscovery(esitoDynamicDiscovery.getDynamicDiscovery());
  568.                                 }
  569.                                
  570.                                 this.pddContext.addObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE, informazioniTokenNormalizzate);
  571.                                
  572.                                 this.transaction.setInformazioniToken(informazioniTokenNormalizzate);
  573.                             }
  574.                                                
  575.                             this.msgDiag.mediumDebug("Gestione forward token ...");
  576.                             gestioneTokenEngine.forwardToken(datiInvocazione,esitoPresenzaToken,
  577.                                     esitoValidazioneToken, esitoIntrospectionToken, esitoUserInfoToken,
  578.                                     informazioniTokenNormalizzate);
  579.                             this.msgDiag.mediumDebug("Gestione forward token completata");
  580.                            
  581.                             this.msgDiag.logPersonalizzato("gestioneTokenCompletataConSuccesso");
  582.                         }
  583.                         else {
  584.                             this.msgDiag.logPersonalizzato("gestioneTokenCompletataSenzaRilevazioneToken");
  585.                         }              
  586.                     }
  587.                    
  588.                 } catch (Exception e) {
  589.                    
  590.                     this.msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, e.getMessage());
  591.                     this.msgDiag.logPersonalizzato("gestioneTokenFallita.erroreGenerico");
  592.                     this.logCore.error(gestioneTokenPrefix+"fallito, " + e.getMessage(),e);
  593.                    
  594.                     errore = ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  595.                             get5XX_ErroreProcessamento(gestioneTokenPrefix+"fallito, " + e.getMessage(),
  596.                                     CodiceErroreIntegrazione.CODICE_560_GESTIONE_TOKEN);
  597.                     eGestioneToken = e;
  598.                    
  599.                     integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  600.                    
  601.                     fineGestione = true;
  602.                    
  603.                 }
  604.                 if (fineGestione) {
  605.                    
  606.                     this.openspcoopstate.releaseResource();
  607.        
  608.                     if (this.msgContext.isGestioneRisposta()) {
  609.                         if(errorMessageGestioneToken!=null) {
  610.                             this.msgContext.setMessageResponse(errorMessageGestioneToken);
  611.                         }
  612.                         else {
  613.                             if(CodiceErroreIntegrazione.CODICE_443_TOKEN_NON_PRESENTE.equals(errore.getCodiceErrore())){
  614.                                 if(integrationFunctionError==null) {
  615.                                     integrationFunctionError = IntegrationFunctionError.TOKEN_NOT_FOUND;
  616.                                 }
  617.                             }
  618.                             else if(CodiceErroreIntegrazione.CODICE_444_TOKEN_NON_VALIDO.equals(errore.getCodiceErrore())){
  619.                                 if(integrationFunctionError==null) {
  620.                                     integrationFunctionError = IntegrationFunctionError.TOKEN_INVALID;
  621.                                 }
  622.                             }
  623.                             else{
  624.                                 if(integrationFunctionError==null) {
  625.                                     integrationFunctionError = IntegrationFunctionError.INTERNAL_REQUEST_ERROR;
  626.                                 }
  627.                             }
  628.                            
  629.                             OpenSPCoop2Message errorOpenSPCoopMsg = (this.generatoreErrore.build(this.pddContext,integrationFunctionError,errore,
  630.                                     eGestioneToken,null));
  631.                            
  632.                             if(wwwAuthenticateErrorHeader!=null) {
  633.                                 errorOpenSPCoopMsg.forceTransportHeader(HttpConstants.AUTHORIZATION_RESPONSE_WWW_AUTHENTICATE, wwwAuthenticateErrorHeader);
  634.                             }
  635.                            
  636.                             this.msgContext.setMessageResponse(errorOpenSPCoopMsg);
  637.                         }
  638.                     }
  639.                    
  640.                     updateCredenzialiToken();
  641.                    
  642.                     return false;
  643.                    
  644.                 }
  645.             }finally {
  646.                 this.transaction.getTempiElaborazione().endToken();
  647.             }
  648.         }
  649.        
  650.         return true;
  651.        
  652.     }
  653.    
  654.     private void updateCredenzialiToken() {
  655.        
  656.         // Viene chiamato se la validazione fallisce
  657.        
  658.         if(OpenSPCoop2Properties.getInstance().isGestioneTokenSaveTokenAuthenticationInfoValidationFailed()) {
  659.             CredenzialiMittente credenzialiMittente = this.transaction.getCredenzialiMittente();
  660.             if(credenzialiMittente==null) {
  661.                 credenzialiMittente = new CredenzialiMittente();
  662.                 try {
  663.                     this.transaction.setCredenzialiMittente(credenzialiMittente);
  664.                 }catch(Exception e) {
  665.                     this.logCore.error("SetCredenzialiMittente error: "+e.getMessage(),e);
  666.                 }
  667.             }
  668.             InformazioniToken informazioniTokenNormalizzate = null;
  669.             if(this.pddContext.containsKey(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE)) {
  670.                 informazioniTokenNormalizzate = (InformazioniToken) this.pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
  671.             }
  672.             if(informazioniTokenNormalizzate!=null) {
  673.                 try {
  674.                     GestoreAutenticazione.updateCredenzialiToken(
  675.                             this.identitaPdD,
  676.                             RicezioneContenutiApplicativi.ID_MODULO, this.idTransazione, informazioniTokenNormalizzate, null, credenzialiMittente,
  677.                             this.openspcoopstate, "RicezioneContenutiApplicativi.credenzialiToken", this.requestInfo,
  678.                             this.pddContext);
  679.                 }catch(Exception e) {
  680.                     this.logCore.error("updateCredenzialiToken error: "+e.getMessage(),e);
  681.                 }
  682.             }
  683.         }
  684.     }
  685. }