GestoreAutenticazione.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.core.autenticazione;

  21. import java.security.SecureRandom;
  22. import java.sql.Connection;
  23. import java.util.ArrayList;
  24. import java.util.Date;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;

  28. import org.apache.commons.lang.StringUtils;
  29. import org.openspcoop2.core.commons.dao.DAOFactory;
  30. import org.openspcoop2.core.commons.dao.DAOFactoryProperties;
  31. import org.openspcoop2.core.config.GestioneTokenAutenticazione;
  32. import org.openspcoop2.core.config.PortaDelegata;
  33. import org.openspcoop2.core.config.constants.CostantiConfigurazione;
  34. import org.openspcoop2.core.config.constants.StatoFunzionalita;
  35. import org.openspcoop2.core.id.IDPortaApplicativa;
  36. import org.openspcoop2.core.id.IDPortaDelegata;
  37. import org.openspcoop2.core.id.IDServizioApplicativo;
  38. import org.openspcoop2.core.id.IDSoggetto;
  39. import org.openspcoop2.core.transazioni.CredenzialeMittente;
  40. import org.openspcoop2.core.transazioni.IdCredenzialeMittente;
  41. import org.openspcoop2.core.transazioni.dao.ICredenzialeMittenteService;
  42. import org.openspcoop2.core.transazioni.utils.CredenzialiMittente;
  43. import org.openspcoop2.core.transazioni.utils.TipoCredenzialeMittente;
  44. import org.openspcoop2.core.transazioni.utils.credenziali.AbstractCredenziale;
  45. import org.openspcoop2.core.transazioni.utils.credenziali.AbstractSearchCredenziale;
  46. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeApi;
  47. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeClientAddress;
  48. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeEventi;
  49. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeGruppi;
  50. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeSearchApi;
  51. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeSearchClientAddress;
  52. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeSearchEvento;
  53. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeSearchGruppo;
  54. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeSearchToken;
  55. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeSearchTokenClient;
  56. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeSearchTrasporto;
  57. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeToken;
  58. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeTokenClient;
  59. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeTokenPDND;
  60. import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeTrasporto;
  61. import org.openspcoop2.generic_project.expression.IPaginatedExpression;
  62. import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
  63. import org.openspcoop2.message.OpenSPCoop2Message;
  64. import org.openspcoop2.message.utils.WWWAuthenticateErrorCode;
  65. import org.openspcoop2.message.utils.WWWAuthenticateGenerator;
  66. import org.openspcoop2.pdd.config.DBTransazioniManager;
  67. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  68. import org.openspcoop2.pdd.config.Resource;
  69. import org.openspcoop2.pdd.config.dynamic.PddPluginLoader;
  70. import org.openspcoop2.pdd.core.AbstractCore;
  71. import org.openspcoop2.pdd.core.PdDContext;
  72. import org.openspcoop2.pdd.core.autenticazione.pa.DatiInvocazionePortaApplicativa;
  73. import org.openspcoop2.pdd.core.autenticazione.pa.EsitoAutenticazionePortaApplicativa;
  74. import org.openspcoop2.pdd.core.autenticazione.pa.IAutenticazionePortaApplicativa;
  75. import org.openspcoop2.pdd.core.autenticazione.pd.DatiInvocazionePortaDelegata;
  76. import org.openspcoop2.pdd.core.autenticazione.pd.EsitoAutenticazionePortaDelegata;
  77. import org.openspcoop2.pdd.core.autenticazione.pd.IAutenticazionePortaDelegata;
  78. import org.openspcoop2.pdd.core.connettori.InfoConnettoreIngresso;
  79. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  80. import org.openspcoop2.pdd.core.state.OpenSPCoopState;
  81. import org.openspcoop2.pdd.core.token.Costanti;
  82. import org.openspcoop2.pdd.core.token.InformazioniToken;
  83. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  84. import org.openspcoop2.protocol.engine.SecurityTokenUtilities;
  85. import org.openspcoop2.protocol.sdk.Context;
  86. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  87. import org.openspcoop2.protocol.sdk.PDNDTokenInfo;
  88. import org.openspcoop2.protocol.sdk.SecurityToken;
  89. import org.openspcoop2.protocol.sdk.constants.ErroriCooperazione;
  90. import org.openspcoop2.protocol.sdk.constants.ErroriIntegrazione;
  91. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  92. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  93. import org.openspcoop2.utils.SemaphoreLock;
  94. import org.openspcoop2.utils.Utilities;
  95. import org.openspcoop2.utils.UtilsException;
  96. import org.openspcoop2.utils.cache.Cache;
  97. import org.openspcoop2.utils.cache.CacheAlgorithm;
  98. import org.openspcoop2.utils.cache.CacheType;
  99. import org.openspcoop2.utils.cache.CacheResponse;
  100. import org.openspcoop2.utils.date.DateManager;
  101. import org.slf4j.Logger;

  102. /**
  103.  * Classe utilizzata per la gestione del processo di autenticazione Buste
  104.  *
  105.  * @author Poli Andrea (apoli@link.it)
  106.  * @author $Author$
  107.  * @version $Rev$, $Date$
  108.  */
  109. public class GestoreAutenticazione {

  110.    
  111.     /** Chiave della cache per l'autenticazione Buste  */
  112.     private static final String AUTENTICAZIONE_CACHE_NAME = "autenticazione";
  113.     /** Cache */
  114.     private static Cache cacheAutenticazione = null;
  115.     //private static final Boolean semaphoreAutenticazionePD = true;
  116.     //private static final Boolean semaphoreAutenticazionePA = true;
  117.     //private static final Boolean semaphoreCredenzialiMittente = true;
  118.    
  119.     private static final Map<String, org.openspcoop2.utils.Semaphore> _lockAutenticazionePD = new HashMap<>();
  120.     private static synchronized org.openspcoop2.utils.Semaphore initLockAutenticazionePD(String tipoAutenticazione){
  121.         org.openspcoop2.utils.Semaphore s = _lockAutenticazionePD.get(tipoAutenticazione);
  122.         if(s==null) {
  123.             Integer permits = OpenSPCoop2Properties.getInstance().getAutenticazioneLockPermits(tipoAutenticazione);
  124.             if(permits==null) {
  125.                 permits = OpenSPCoop2Properties.getInstance().getAutenticazioneLockPermits();
  126.             }
  127.             if(permits!=null && permits.intValue()>1) {
  128.                 s = new org.openspcoop2.utils.Semaphore("GestoreAutenticazioneFruizioni_"+tipoAutenticazione, permits);
  129.             }
  130.             else {
  131.                 s = new org.openspcoop2.utils.Semaphore("GestoreAutenticazioneFruizioni_"+tipoAutenticazione);
  132.             }
  133.             _lockAutenticazionePD.put(tipoAutenticazione, s);
  134.         }
  135.         return s;
  136.     }
  137.     private static org.openspcoop2.utils.Semaphore getLockAutenticazionePD(String tipoAutenticazione){
  138.         org.openspcoop2.utils.Semaphore s = _lockAutenticazionePD.get(tipoAutenticazione);
  139.         if(s==null) {
  140.             s = initLockAutenticazionePD(tipoAutenticazione);
  141.         }
  142.         return s;
  143.     }
  144.    
  145.    
  146.     private static final Map<String, org.openspcoop2.utils.Semaphore> _lockAutenticazionePA = new HashMap<>();
  147.     private static synchronized org.openspcoop2.utils.Semaphore initLockAutenticazionePA(String tipoAutenticazione){
  148.         org.openspcoop2.utils.Semaphore s = _lockAutenticazionePA.get(tipoAutenticazione);
  149.         if(s==null) {
  150.             Integer permits = OpenSPCoop2Properties.getInstance().getAutenticazioneLockPermits(tipoAutenticazione);
  151.             if(permits==null) {
  152.                 permits = OpenSPCoop2Properties.getInstance().getAutenticazioneLockPermits();
  153.             }
  154.             if(permits!=null && permits.intValue()>1) {
  155.                 s = new org.openspcoop2.utils.Semaphore("GestoreAutenticazioneErogazioni_"+tipoAutenticazione, permits);
  156.             }
  157.             else {
  158.                 s = new org.openspcoop2.utils.Semaphore("GestoreAutenticazioneErogazioni_"+tipoAutenticazione);
  159.             }
  160.             _lockAutenticazionePA.put(tipoAutenticazione, s);
  161.         }
  162.         return s;
  163.     }
  164.     private static org.openspcoop2.utils.Semaphore getLockAutenticazionePA(String tipoAutenticazione){
  165.         org.openspcoop2.utils.Semaphore s = _lockAutenticazionePA.get(tipoAutenticazione);
  166.         if(s==null) {
  167.             s = initLockAutenticazionePA(tipoAutenticazione);
  168.         }
  169.         return s;
  170.     }
  171.    
  172.     private static final org.openspcoop2.utils.Semaphore lockCredenzialiMittente = new org.openspcoop2.utils.Semaphore("GestoreCredenziali");
  173.     private static final org.openspcoop2.utils.Semaphore lockCredenzialiMittenteCreazione = new org.openspcoop2.utils.Semaphore("GestoreCredenziali-Creazione");
  174.     private static final org.openspcoop2.utils.Semaphore lockCredenzialiMittenteAggiornamento = new org.openspcoop2.utils.Semaphore("GestoreCredenziali-Aggiornamento");
  175.     /** Logger log */
  176.     private static Logger logger = null;
  177.     private static Logger logConsole = OpenSPCoop2Logger.getLoggerOpenSPCoopConsole();

  178.    
  179.     private static java.util.Random _rnd = null;
  180.     private static synchronized void initRandom() {
  181.         if(_rnd==null) {
  182.             _rnd = new SecureRandom();
  183.         }
  184.     }
  185.     public static java.util.Random getRandom() {
  186.         if(_rnd==null) {
  187.             initRandom();
  188.         }
  189.         return _rnd;
  190.     }
  191.    

  192.     /* --------------- Cache --------------------*/
  193.     public static void resetCache() throws AutenticazioneException{
  194.         if(GestoreAutenticazione.cacheAutenticazione!=null){
  195.             try{
  196.                 GestoreAutenticazione.cacheAutenticazione.clear();
  197.             }catch(Exception e){
  198.                 throw new AutenticazioneException(e.getMessage(),e);
  199.             }
  200.         }
  201.     }
  202.     public static String printStatsCache(String separator) throws AutenticazioneException{
  203.         try{
  204.             if(GestoreAutenticazione.cacheAutenticazione!=null){
  205.                 return GestoreAutenticazione.cacheAutenticazione.printStats(separator);
  206.             }
  207.             else{
  208.                 throw new Exception("Cache non abilitata");
  209.             }
  210.         }catch(Exception e){
  211.             throw new AutenticazioneException("Visualizzazione Statistiche riguardante la cache dell'autenticazione non riuscita: "+e.getMessage(),e);
  212.         }
  213.     }
  214.     public static void abilitaCache() throws AutenticazioneException{
  215.         if(GestoreAutenticazione.cacheAutenticazione!=null)
  216.             throw new AutenticazioneException("Cache gia' abilitata");
  217.         else{
  218.             _abilitaCache();
  219.         }
  220.     }
  221.     private static synchronized void _abilitaCache() throws AutenticazioneException{
  222.         if(GestoreAutenticazione.cacheAutenticazione==null) {
  223.             try{
  224.                 GestoreAutenticazione.cacheAutenticazione = new Cache(CacheType.JCS, GestoreAutenticazione.AUTENTICAZIONE_CACHE_NAME); // lascio JCS come default abilitato via jmx
  225.                 GestoreAutenticazione.cacheAutenticazione.build();
  226.             }catch(Exception e){
  227.                 throw new AutenticazioneException(e.getMessage(),e);
  228.             }
  229.         }
  230.     }
  231.     public static void abilitaCache(Long dimensioneCache,Boolean algoritmoCacheLRU,Long itemIdleTime,Long itemLifeSecond) throws AutenticazioneException{
  232.         if(GestoreAutenticazione.cacheAutenticazione!=null)
  233.             throw new AutenticazioneException("Cache gia' abilitata");
  234.         else{
  235.             try{
  236.                 int dimensioneCacheInt = -1;
  237.                 if(dimensioneCache!=null){
  238.                     dimensioneCacheInt = dimensioneCache.intValue();
  239.                 }
  240.                
  241.                 String algoritmoCache = null;
  242.                 if(algoritmoCacheLRU!=null){
  243.                     if(algoritmoCacheLRU)
  244.                          algoritmoCache = CostantiConfigurazione.CACHE_LRU.toString();
  245.                     else
  246.                          algoritmoCache = CostantiConfigurazione.CACHE_MRU.toString();
  247.                 }else{
  248.                     algoritmoCache = CostantiConfigurazione.CACHE_LRU.toString();
  249.                 }
  250.                
  251.                 long itemIdleTimeLong = -1;
  252.                 if(itemIdleTime!=null){
  253.                     itemIdleTimeLong = itemIdleTime;
  254.                 }
  255.                
  256.                 long itemLifeSecondLong = -1;
  257.                 if(itemLifeSecond!=null){
  258.                     itemLifeSecondLong = itemLifeSecond;
  259.                 }
  260.                
  261.                 GestoreAutenticazione.initCacheAutenticazione(CacheType.JCS, dimensioneCacheInt, algoritmoCache, itemIdleTimeLong, itemLifeSecondLong, null); // lascio JCS come default abilitato via jmx
  262.             }catch(Exception e){
  263.                 throw new AutenticazioneException(e.getMessage(),e);
  264.             }
  265.         }
  266.     }
  267.     public static void disabilitaCache() throws AutenticazioneException{
  268.         if(GestoreAutenticazione.cacheAutenticazione==null)
  269.             throw new AutenticazioneException("Cache gia' disabilitata");
  270.         else{
  271.             _disabilitaCache();
  272.         }
  273.     }
  274.     private static synchronized void _disabilitaCache() throws AutenticazioneException{
  275.         if(GestoreAutenticazione.cacheAutenticazione!=null) {
  276.             try{
  277.                 GestoreAutenticazione.cacheAutenticazione.clear();
  278.                 GestoreAutenticazione.cacheAutenticazione = null;
  279.             }catch(Exception e){
  280.                 throw new AutenticazioneException(e.getMessage(),e);
  281.             }
  282.         }
  283.     }
  284.     public static boolean isCacheAbilitata(){
  285.         return GestoreAutenticazione.cacheAutenticazione != null;
  286.     }
  287.     public static String listKeysCache(String separator) throws AutenticazioneException{
  288.         if(GestoreAutenticazione.cacheAutenticazione!=null){
  289.             try{
  290.                 return GestoreAutenticazione.cacheAutenticazione.printKeys(separator);
  291.             }catch(Exception e){
  292.                 throw new AutenticazioneException(e.getMessage(),e);
  293.             }
  294.         }else{
  295.             throw new AutenticazioneException("Cache non abilitata");
  296.         }
  297.     }
  298.     public static List<String> listKeysCache() throws AutenticazioneException{
  299.         if(GestoreAutenticazione.cacheAutenticazione!=null){
  300.             try{
  301.                 return GestoreAutenticazione.cacheAutenticazione.keys();
  302.             }catch(Exception e){
  303.                 throw new AutenticazioneException(e.getMessage(),e);
  304.             }
  305.         }else{
  306.             throw new AutenticazioneException("Cache non abilitata");
  307.         }
  308.     }
  309.     public static String getObjectCache(String key) throws AutenticazioneException{
  310.         if(GestoreAutenticazione.cacheAutenticazione!=null){
  311.             try{
  312.                 Object o = GestoreAutenticazione.cacheAutenticazione.get(key);
  313.                 if(o!=null){
  314.                     return o.toString();
  315.                 }else{
  316.                     return "oggetto con chiave ["+key+"] non presente";
  317.                 }
  318.             }catch(Exception e){
  319.                 throw new AutenticazioneException(e.getMessage(),e);
  320.             }
  321.         }else{
  322.             throw new AutenticazioneException("Cache non abilitata");
  323.         }
  324.     }
  325.     public static Object getRawObjectCache(String key) throws AutenticazioneException{
  326.         if(GestoreAutenticazione.cacheAutenticazione!=null){
  327.             try{
  328.                 Object o = GestoreAutenticazione.cacheAutenticazione.get(key);
  329.                 if(o!=null){
  330.                     if(o instanceof CacheResponse) {
  331.                         CacheResponse cR = (CacheResponse) o;
  332.                         if(cR.getObject()!=null) {
  333.                             o = cR.getObject();
  334.                         }
  335.                         else if(cR.getException()!=null) {
  336.                             o = cR.getException();
  337.                         }
  338.                     }
  339.                     return o;
  340.                 }else{
  341.                     return null;
  342.                 }
  343.             }catch(Exception e){
  344.                 throw new AutenticazioneException(e.getMessage(),e);
  345.             }
  346.         }else{
  347.             throw new AutenticazioneException("Cache non abilitata");
  348.         }
  349.     }
  350.     public static void removeObjectCache(String key) throws AutenticazioneException{
  351.         if(GestoreAutenticazione.cacheAutenticazione!=null){
  352.             try{
  353.                 GestoreAutenticazione.cacheAutenticazione.remove(key);
  354.             }catch(Exception e){
  355.                 throw new AutenticazioneException(e.getMessage(),e);
  356.             }
  357.         }else{
  358.             throw new AutenticazioneException("Cache non abilitata");
  359.         }
  360.     }
  361.    


  362.     /*----------------- INIZIALIZZAZIONE --------------------*/
  363.     public static void initialize(Logger log) throws Exception{
  364.         GestoreAutenticazione.initialize(null, false, -1,null,-1l,-1l, log);
  365.     }
  366.     public static void initialize(CacheType cacheType, int dimensioneCache,String algoritmoCache,
  367.             long idleTime, long itemLifeSecond, Logger log) throws Exception{
  368.         GestoreAutenticazione.initialize(cacheType, true, dimensioneCache,algoritmoCache,idleTime,itemLifeSecond, log);
  369.     }

  370.     private static void initialize(CacheType cacheType, boolean cacheAbilitata,int dimensioneCache,String algoritmoCache,
  371.             long idleTime, long itemLifeSecond, Logger log) throws Exception{

  372.         // Inizializzo log
  373.         GestoreAutenticazione.logger = log;
  374.        
  375.         // Inizializzazione Cache
  376.         if(cacheAbilitata){
  377.             GestoreAutenticazione.initCacheAutenticazione(cacheType, dimensioneCache, algoritmoCache, idleTime, itemLifeSecond, log);
  378.         }

  379.     }


  380.     public static void initCacheAutenticazione(CacheType cacheType, int dimensioneCache,String algoritmoCache,
  381.             long idleTime, long itemLifeSecond, Logger log) throws Exception {
  382.        
  383.         if(log!=null)
  384.             log.info("Inizializzazione cache Autenticazione");

  385.         GestoreAutenticazione.cacheAutenticazione = new Cache(cacheType, GestoreAutenticazione.AUTENTICAZIONE_CACHE_NAME);

  386.         if( (dimensioneCache>0) ||
  387.                 (algoritmoCache != null) ){

  388.             if( dimensioneCache>0 ){
  389.                 try{
  390.                     String msg = "Dimensione della cache (Autenticazione) impostata al valore: "+dimensioneCache;
  391.                     if(log!=null)
  392.                         log.info(msg);
  393.                     GestoreAutenticazione.logConsole.info(msg);
  394.                     GestoreAutenticazione.cacheAutenticazione.setCacheSize(dimensioneCache);
  395.                 }catch(Exception error){
  396.                     throw new AutenticazioneException("Parametro errato per la dimensione della cache (Gestore Messaggi): "+error.getMessage(),error);
  397.                 }
  398.             }
  399.             if(algoritmoCache != null ){
  400.                 String msg = "Algoritmo di cache (Autenticazione) impostato al valore: "+algoritmoCache;
  401.                 if(log!=null)
  402.                     log.info(msg);
  403.                 GestoreAutenticazione.logConsole.info(msg);
  404.                 if(CostantiConfigurazione.CACHE_MRU.toString().equalsIgnoreCase(algoritmoCache))
  405.                     GestoreAutenticazione.cacheAutenticazione.setCacheAlgoritm(CacheAlgorithm.MRU);
  406.                 else
  407.                     GestoreAutenticazione.cacheAutenticazione.setCacheAlgoritm(CacheAlgorithm.LRU);
  408.             }

  409.         }

  410.         if( idleTime > 0  ){
  411.             try{
  412.                 String msg = "Attributo 'IdleTime' (Autenticazione) impostato al valore: "+idleTime;
  413.                 if(log!=null)
  414.                     log.info(msg);
  415.                 GestoreAutenticazione.logConsole.info(msg);
  416.                 GestoreAutenticazione.cacheAutenticazione.setItemIdleTime(idleTime);
  417.             }catch(Exception error){
  418.                 throw new AutenticazioneException("Parametro errato per l'attributo 'IdleTime' (Gestore Messaggi): "+error.getMessage(),error);
  419.             }
  420.         }

  421.         try{
  422.             String msg = "Attributo 'MaxLifeSecond' (Autenticazione) impostato al valore: "+itemLifeSecond;
  423.             if(log!=null)
  424.                 log.info(msg);
  425.             GestoreAutenticazione.logConsole.info(msg);
  426.             GestoreAutenticazione.cacheAutenticazione.setItemLifeTime(itemLifeSecond);
  427.         }catch(Exception error){
  428.             throw new AutenticazioneException("Parametro errato per l'attributo 'MaxLifeSecond' (Gestore Messaggi): "+error.getMessage(),error);
  429.         }

  430.         GestoreAutenticazione.cacheAutenticazione.build();
  431.     }
  432.    
  433.     @SuppressWarnings("deprecation")
  434.     @Deprecated
  435.     public static void disableSyncronizedGet() throws UtilsException {
  436.         if(GestoreAutenticazione.cacheAutenticazione==null) {
  437.             throw new UtilsException("Cache disabled");
  438.         }
  439.         GestoreAutenticazione.cacheAutenticazione.disableSyncronizedGet();
  440.     }
  441.     @SuppressWarnings("deprecation")
  442.     @Deprecated
  443.     public static boolean isDisableSyncronizedGet() throws UtilsException {
  444.         if(GestoreAutenticazione.cacheAutenticazione==null) {
  445.             throw new UtilsException("Cache disabled");
  446.         }
  447.         return GestoreAutenticazione.cacheAutenticazione.isDisableSyncronizedGet();
  448.     }
  449.    

  450.    
  451.    
  452.    
  453.     /*----------------- CLEANER --------------------*/
  454.    
  455.     public static void removePortaApplicativa(IDPortaApplicativa idPA) throws Exception {
  456.         if(GestoreAutenticazione.isCacheAbilitata()) {
  457.             List<String> keyForClean = new ArrayList<>();
  458.             List<String> keys = GestoreAutenticazione.listKeysCache();
  459.             if(keys!=null && !keys.isEmpty()) {
  460.                 String match = IDPortaApplicativa.PORTA_APPLICATIVA_PREFIX+idPA.getNome()+IDPortaApplicativa.PORTA_APPLICATIVA_SUFFIX;
  461.                 for (String key : keys) {
  462.                     if(key!=null && key.contains(match)) {
  463.                         keyForClean.add(key);
  464.                     }
  465.                 }
  466.             }
  467.             if(keyForClean!=null && !keyForClean.isEmpty()) {
  468.                 for (String key : keyForClean) {
  469.                     removeObjectCache(key);
  470.                 }
  471.             }
  472.         }
  473.     }
  474.    
  475.     public static void removePortaDelegata(IDPortaDelegata idPD) throws Exception {
  476.         if(GestoreAutenticazione.isCacheAbilitata()) {
  477.             List<String> keyForClean = new ArrayList<>();
  478.             List<String> keys = GestoreAutenticazione.listKeysCache();
  479.             if(keys!=null && !keys.isEmpty()) {
  480.                 String match = IDPortaDelegata.PORTA_DELEGATA_PREFIX+idPD.getNome()+IDPortaDelegata.PORTA_DELEGATA_SUFFIX;
  481.                 for (String key : keys) {
  482.                     if(key!=null && key.contains(match)) {
  483.                         keyForClean.add(key);
  484.                     }
  485.                 }
  486.             }
  487.             if(keyForClean!=null && !keyForClean.isEmpty()) {
  488.                 for (String key : keyForClean) {
  489.                     removeObjectCache(key);
  490.                 }
  491.             }
  492.         }
  493.     }
  494.    
  495.     public static void removeSoggetto(IDSoggetto idSoggetto) throws Exception {
  496.         if(GestoreAutenticazione.isCacheAbilitata()) {
  497.             List<String> keyForClean = new ArrayList<>();
  498.             List<String> keys = GestoreAutenticazione.listKeysCache();
  499.             if(keys!=null && !keys.isEmpty()) {
  500.                 for (String key : keys) {
  501.                     if(key!=null) {
  502.                         Object o = GestoreAutenticazione.getRawObjectCache(key);
  503.                         if(o!=null) {
  504.                             if(o instanceof EsitoAutenticazionePortaApplicativa) {
  505.                                 EsitoAutenticazionePortaApplicativa esito = (EsitoAutenticazionePortaApplicativa) o;
  506.                                 if(esito.getIdSoggetto()!=null && esito.getIdSoggetto().equals(idSoggetto)) {
  507.                                     keyForClean.add(key);
  508.                                 }
  509.                             }
  510.                         }
  511.                     }
  512.                 }
  513.             }
  514.             if(keyForClean!=null && !keyForClean.isEmpty()) {
  515.                 for (String key : keyForClean) {
  516.                     removeObjectCache(key);
  517.                 }
  518.             }
  519.         }
  520.     }
  521.    
  522.     public static void removeApplicativo(IDServizioApplicativo idApplicativo) throws Exception {
  523.         if(GestoreAutenticazione.isCacheAbilitata()) {
  524.             List<String> keyForClean = new ArrayList<>();
  525.             List<String> keys = GestoreAutenticazione.listKeysCache();
  526.             if(keys!=null && !keys.isEmpty()) {
  527.                 for (String key : keys) {
  528.                     if(key!=null) {
  529.                         Object o = GestoreAutenticazione.getRawObjectCache(key);
  530.                         if(o!=null) {
  531.                             if(o instanceof EsitoAutenticazionePortaDelegata) {
  532.                                 EsitoAutenticazionePortaDelegata esito = (EsitoAutenticazionePortaDelegata) o;
  533.                                 if(esito.getIdServizioApplicativo()!=null && esito.getIdServizioApplicativo().equals(idApplicativo)) {
  534.                                     keyForClean.add(key);
  535.                                 }
  536.                             }
  537.                             else if(o instanceof EsitoAutenticazionePortaApplicativa) {
  538.                                 EsitoAutenticazionePortaApplicativa esito = (EsitoAutenticazionePortaApplicativa) o;
  539.                                 if(esito.getIdServizioApplicativo()!=null && esito.getIdServizioApplicativo().equals(idApplicativo)) {
  540.                                     keyForClean.add(key);
  541.                                 }
  542.                             }
  543.                         }
  544.                     }
  545.                 }
  546.             }
  547.             if(keyForClean!=null && !keyForClean.isEmpty()) {
  548.                 for (String key : keyForClean) {
  549.                     removeObjectCache(key);
  550.                 }
  551.             }
  552.         }
  553.     }
  554.    
  555.    
  556.    
  557.    
  558.    
  559.     /*----------------- AUTENTICAZIONE --------------------*/
  560.    
  561.     public static EsitoAutenticazionePortaDelegata verificaAutenticazionePortaDelegata(String tipoAutenticazione,
  562.             DatiInvocazionePortaDelegata datiInvocazione, ParametriAutenticazione parametriAutenticazione,
  563.           PdDContext pddContext,IProtocolFactory<?> protocolFactory, OpenSPCoop2Message msg) throws Exception{
  564.         return _verificaAutenticazionePortaDelegata(false, tipoAutenticazione,
  565.                 datiInvocazione, parametriAutenticazione,
  566.                 pddContext, protocolFactory, msg);
  567.     }
  568.     public static EsitoAutenticazionePortaDelegata verificaAutenticazioneMessageBox(String tipoAutenticazione,
  569.             DatiInvocazionePortaDelegata datiInvocazione, ParametriAutenticazione parametriAutenticazione,
  570.           PdDContext pddContext,IProtocolFactory<?> protocolFactory) throws Exception{
  571.         return _verificaAutenticazionePortaDelegata(true, tipoAutenticazione,
  572.                 datiInvocazione, parametriAutenticazione,
  573.                 pddContext, protocolFactory, null);
  574.     }
  575.    
  576.     private static EsitoAutenticazionePortaDelegata _verificaAutenticazionePortaDelegata(boolean messageBox, String tipoAutenticazione,
  577.             DatiInvocazionePortaDelegata datiInvocazione, ParametriAutenticazione parametriAutenticazione,
  578.           PdDContext pddContext,IProtocolFactory<?> protocolFactory, OpenSPCoop2Message msg) throws Exception{
  579.        
  580.         checkDatiPortaDelegata(messageBox,datiInvocazione);
  581.        
  582.         IAutenticazionePortaDelegata auth = newInstanceAuthPortaDelegata(tipoAutenticazione, pddContext, protocolFactory);
  583.         auth.initParametri(parametriAutenticazione);
  584.         if(messageBox) {
  585.             auth.setLogError(false);
  586.         }
  587.        
  588.         try {
  589.             if(GestoreAutenticazione.cacheAutenticazione==null || !auth.saveAuthenticationResultInCache()){
  590.                 return auth.process(datiInvocazione);
  591.             }
  592.             else{
  593.                 String keyCache = buildCacheKey(messageBox, true, tipoAutenticazione, datiInvocazione.getKeyCache(), auth.getSuffixKeyAuthenticationResultInCache(datiInvocazione));
  594.    
  595.                 // Fix: devo prima verificare se ho la chiave in cache prima di mettermi in sincronizzazione.
  596.                 org.openspcoop2.utils.cache.CacheResponse response =
  597.                         (org.openspcoop2.utils.cache.CacheResponse) GestoreAutenticazione.cacheAutenticazione.get(keyCache);
  598.                 if(response != null){
  599.                     if(response.getObject()!=null){
  600.                         GestoreAutenticazione.logger.debug("Oggetto (tipo:"+response.getObject().getClass().getName()+") con chiave ["+keyCache+"] (method:verificaAutenticazionePortaDelegata) in cache.");
  601.                         EsitoAutenticazionePortaDelegata esito = (EsitoAutenticazionePortaDelegata) response.getObject();
  602.                         esito.setEsitoPresenteInCache(true);
  603.                         return esito;
  604.                     }else if(response.getException()!=null){
  605.                         GestoreAutenticazione.logger.debug("Eccezione (tipo:"+response.getException().getClass().getName()+") con chiave ["+keyCache+"] (method:verificaAutenticazionePortaDelegata) in cache.");
  606.                         throw (Exception) response.getException();
  607.                     }else{
  608.                         GestoreAutenticazione.logger.error("In cache non e' presente ne un oggetto ne un'eccezione.");
  609.                     }
  610.                 }
  611.                
  612.                 String idTransazione = (pddContext!=null && pddContext.containsKey(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)) ? PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, pddContext) : null;
  613.                 //synchronized (GestoreAutenticazione.semaphoreAutenticazionePD) {
  614.                 org.openspcoop2.utils.Semaphore lockAutenticazionePD = getLockAutenticazionePD(tipoAutenticazione);
  615.                 SemaphoreLock lock = lockAutenticazionePD.acquire("verificaAutenticazionePortaDelegata", idTransazione);
  616.                 try {
  617.                    
  618.                     response =
  619.                         (org.openspcoop2.utils.cache.CacheResponse) GestoreAutenticazione.cacheAutenticazione.get(keyCache);
  620.                     if(response != null){
  621.                         if(response.getObject()!=null){
  622.                             GestoreAutenticazione.logger.debug("Oggetto (tipo:"+response.getObject().getClass().getName()+") con chiave ["+keyCache+"] (method:verificaAutenticazionePortaDelegata) in cache.");
  623.                             EsitoAutenticazionePortaDelegata esito = (EsitoAutenticazionePortaDelegata) response.getObject();
  624.                             esito.setEsitoPresenteInCache(true);
  625.                             return esito;
  626.                         }else if(response.getException()!=null){
  627.                             GestoreAutenticazione.logger.debug("Eccezione (tipo:"+response.getException().getClass().getName()+") con chiave ["+keyCache+"] (method:verificaAutenticazionePortaDelegata) in cache.");
  628.                             throw (Exception) response.getException();
  629.                         }else{
  630.                             GestoreAutenticazione.logger.error("In cache non e' presente ne un oggetto ne un'eccezione.");
  631.                         }
  632.                     }
  633.    
  634.                     // Effettuo la query
  635.                     GestoreAutenticazione.logger.debug("oggetto con chiave ["+keyCache+"] (method:verificaAutenticazionePortaDelegata) ricerco nella configurazione...");
  636.                     EsitoAutenticazionePortaDelegata esito = auth.process(datiInvocazione);
  637.    
  638.                     // Aggiungo la risposta in cache (se esiste una cache)  
  639.                     // Sempre. Se la risposta non deve essere cachata l'implementazione può in alternativa:
  640.                     // - impostare una eccezione di processamento (che setta automaticamente noCache a true)
  641.                     // - impostare il noCache a true
  642.                     if(esito!=null){
  643.                         if(!esito.isNoCache()){
  644.                             GestoreAutenticazione.logger.info("Aggiungo oggetto ["+keyCache+"] in cache");
  645.                             try{    
  646.                                 org.openspcoop2.utils.cache.CacheResponse responseCache = new org.openspcoop2.utils.cache.CacheResponse();
  647.                                 responseCache.setObject(esito);
  648.                                 GestoreAutenticazione.cacheAutenticazione.put(keyCache,responseCache);
  649.                             }catch(UtilsException e){
  650.                                 GestoreAutenticazione.logger.error("Errore durante l'inserimento in cache ["+keyCache+"]: "+e.getMessage());
  651.                             }
  652.                         }
  653.                         return esito;
  654.                     }else{
  655.                         throw new AutenticazioneException("Metodo (GestoreAutenticazione.autenticazionePortaDelegata.process) ha ritornato un valore di esito null");
  656.                     }
  657.                 }finally{
  658.                     lockAutenticazionePD.release(lock, "verificaAutenticazionePortaDelegata", idTransazione);
  659.                 }
  660.             }
  661.         }finally {
  662.             if(msg!=null) {
  663.                 auth.cleanPostAuth(msg);
  664.             }
  665.         }
  666.     }
  667.    
  668.     public static EsitoAutenticazionePortaApplicativa verificaAutenticazionePortaApplicativa(String tipoAutenticazione,
  669.             DatiInvocazionePortaApplicativa datiInvocazione, ParametriAutenticazione parametriAutenticazione,
  670.             PdDContext pddContext,IProtocolFactory<?> protocolFactory, OpenSPCoop2Message msg) throws Exception{
  671.          
  672.         checkDatiPortaApplicativa(datiInvocazione);
  673.        
  674.         IAutenticazionePortaApplicativa auth = newInstanceAuthPortaApplicativa(tipoAutenticazione, pddContext, protocolFactory);
  675.         auth.initParametri(parametriAutenticazione);
  676.        
  677.         try {
  678.             if(GestoreAutenticazione.cacheAutenticazione==null || !auth.saveAuthenticationResultInCache()){
  679.                 return auth.process(datiInvocazione);
  680.             }
  681.             else{
  682.                 String keyCache = buildCacheKey(false, false, tipoAutenticazione, datiInvocazione.getKeyCache(), auth.getSuffixKeyAuthenticationResultInCache(datiInvocazione));
  683.    
  684.                 // Fix: devo prima verificare se ho la chiave in cache prima di mettermi in sincronizzazione.
  685.                 org.openspcoop2.utils.cache.CacheResponse response =
  686.                         (org.openspcoop2.utils.cache.CacheResponse) GestoreAutenticazione.cacheAutenticazione.get(keyCache);
  687.                 if(response != null){
  688.                     if(response.getObject()!=null){
  689.                         GestoreAutenticazione.logger.debug("Oggetto (tipo:"+response.getObject().getClass().getName()+") con chiave ["+keyCache+"] (method:verificaAutenticazionePortaApplicativa) in cache.");
  690.                         EsitoAutenticazionePortaApplicativa esito = (EsitoAutenticazionePortaApplicativa) response.getObject();
  691.                         esito.setEsitoPresenteInCache(true);
  692.                         return esito;
  693.                     }else if(response.getException()!=null){
  694.                         GestoreAutenticazione.logger.debug("Eccezione (tipo:"+response.getException().getClass().getName()+") con chiave ["+keyCache+"] (method:verificaAutenticazionePortaApplicativa) in cache.");
  695.                         throw (Exception) response.getException();
  696.                     }else{
  697.                         GestoreAutenticazione.logger.error("In cache non e' presente ne un oggetto ne un'eccezione.");
  698.                     }
  699.                 }
  700.                
  701.                 String idTransazione = (pddContext!=null && pddContext.containsKey(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)) ? PdDContext.getValue(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE, pddContext) : null;
  702.                 //synchronized (GestoreAutenticazione.semaphoreAutenticazionePA) {
  703.                 org.openspcoop2.utils.Semaphore lockAutenticazionePA = getLockAutenticazionePA(tipoAutenticazione);
  704.                 SemaphoreLock lock = lockAutenticazionePA.acquire("verificaAutenticazionePortaApplicativa", idTransazione);
  705.                 try {
  706.                    
  707.                     response =
  708.                         (org.openspcoop2.utils.cache.CacheResponse) GestoreAutenticazione.cacheAutenticazione.get(keyCache);
  709.                     if(response != null){
  710.                         if(response.getObject()!=null){
  711.                             GestoreAutenticazione.logger.debug("Oggetto (tipo:"+response.getObject().getClass().getName()+") con chiave ["+keyCache+"] (method:verificaAutenticazionePortaApplicativa) in cache.");
  712.                             EsitoAutenticazionePortaApplicativa esito = (EsitoAutenticazionePortaApplicativa) response.getObject();
  713.                             esito.setEsitoPresenteInCache(true);
  714.                             return esito;
  715.                         }else if(response.getException()!=null){
  716.                             GestoreAutenticazione.logger.debug("Eccezione (tipo:"+response.getException().getClass().getName()+") con chiave ["+keyCache+"] (method:verificaAutenticazionePortaApplicativa) in cache.");
  717.                             throw (Exception) response.getException();
  718.                         }else{
  719.                             GestoreAutenticazione.logger.error("In cache non e' presente ne un oggetto ne un'eccezione.");
  720.                         }
  721.                     }
  722.    
  723.                     // Effettuo la query
  724.                     GestoreAutenticazione.logger.debug("oggetto con chiave ["+keyCache+"] (method:verificaAutenticazionePortaApplicativa) ricerco nella configurazione...");
  725.                     EsitoAutenticazionePortaApplicativa esito = auth.process(datiInvocazione);
  726.    
  727.                     // Aggiungo la risposta in cache (se esiste una cache)  
  728.                     // Sempre. Se la risposta non deve essere cachata l'implementazione può in alternativa:
  729.                     // - impostare una eccezione di processamento (che setta automaticamente noCache a true)
  730.                     // - impostare il noCache a true
  731.                     if(esito!=null){
  732.                         if(!esito.isNoCache()){
  733.                             GestoreAutenticazione.logger.info("Aggiungo oggetto ["+keyCache+"] in cache");
  734.                             try{    
  735.                                 org.openspcoop2.utils.cache.CacheResponse responseCache = new org.openspcoop2.utils.cache.CacheResponse();
  736.                                 responseCache.setObject(esito);
  737.                                 GestoreAutenticazione.cacheAutenticazione.put(keyCache,responseCache);
  738.                             }catch(UtilsException e){
  739.                                 GestoreAutenticazione.logger.error("Errore durante l'inserimento in cache ["+keyCache+"]: "+e.getMessage());
  740.                             }
  741.                         }
  742.                         return esito;
  743.                     }else{
  744.                         throw new AutenticazioneException("Metodo (GestoreAutenticazione.autenticazionePortaApplicativa.process) ha ritornato un valore di esito null");
  745.                     }
  746.                 }finally {
  747.                     lockAutenticazionePA.release(lock, "verificaAutenticazionePortaApplicativa", idTransazione);
  748.                 }
  749.             }
  750.         }finally {
  751.             if(msg!=null) {
  752.                 auth.cleanPostAuth(msg);
  753.             }
  754.         }
  755.     }
  756.        
  757.     private static void checkDatiPortaDelegata(boolean messageBox, DatiInvocazionePortaDelegata datiInvocazione) throws AutenticazioneException{
  758.        
  759.         InfoConnettoreIngresso infoConnettoreIngresso = datiInvocazione.getInfoConnettoreIngresso();
  760.         if(infoConnettoreIngresso==null)
  761.             throw new AutenticazioneException("(Parametri) InfoConnettoreIngresso non definito");
  762.         if(infoConnettoreIngresso.getCredenziali()==null)
  763.             throw new AutenticazioneException("(Parametri) InfoConnettoreIngresso.credenziali non definito");
  764.        
  765.         if(messageBox==false){
  766.             IDPortaDelegata idPD = datiInvocazione.getIdPD();
  767.             if(idPD==null)
  768.                 throw new AutenticazioneException("(Parametri) IDPortaDelegata non definito");
  769.             if(idPD.getNome()==null)
  770.                 throw new AutenticazioneException("(Parametri) IDPortaDelegata.nome non definito");
  771.            
  772.             PortaDelegata pd = datiInvocazione.getPd();
  773.             if(pd==null)
  774.                 throw new AutenticazioneException("(Parametri) PortaDelegata non definito");
  775.         }
  776.        
  777.     }
  778.    
  779.     private static void checkDatiPortaApplicativa(DatiInvocazionePortaApplicativa datiInvocazione) throws AutenticazioneException{
  780.        
  781.         InfoConnettoreIngresso infoConnettoreIngresso = datiInvocazione.getInfoConnettoreIngresso();
  782.         if(infoConnettoreIngresso==null)
  783.             throw new AutenticazioneException("(Parametri) InfoConnettoreIngresso non definito");
  784.         if(infoConnettoreIngresso.getCredenziali()==null)
  785.             throw new AutenticazioneException("(Parametri) InfoConnettoreIngresso.credenziali non definito");

  786.         // Dipende dal ruolo della Busta, se c'e' la porta applicativa o delegata
  787. //      IDPortaApplicativaByNome idPA = datiInvocazione.getIdPA();
  788. //      if(idPA==null)
  789. //          throw new AutenticazioneException("(Parametri) IDPortaApplicativaByNome non definito");
  790. //      if(idPA.getNome()==null)
  791. //          throw new AutenticazioneException("(Parametri) IDPortaApplicativaByNome.nome non definito");
  792. //      IDSoggetto idSoggettoProprietarioPA = idPA.getSoggetto();
  793. //      if(idSoggettoProprietarioPA==null || idSoggettoProprietarioPA.getTipo()==null || idSoggettoProprietarioPA.getNome()==null)
  794. //          throw new AutenticazioneException("(Parametri) IDPortaApplicativaByNome.Soggetto non definito");
  795. //      
  796. //      PortaApplicativa pa = datiInvocazione.getPa();
  797. //      if(pa==null)
  798. //          throw new AutenticazioneException("(Parametri) PortaApplicativa non definito");
  799.        
  800.     }
  801.    
  802.     private static String buildCacheKey(boolean messageBox, boolean portaDelegata, String tipoAutenticazione, String keyCache, String suffixKeyCache) throws AutenticazioneException{
  803.         StringBuilder bf = new StringBuilder();
  804.        
  805.         if(portaDelegata){
  806.             if(messageBox){
  807.                 bf.append("MessageBox ");
  808.             }
  809.             else{
  810.                 bf.append("PD ");
  811.             }
  812.         }else{
  813.             bf.append("PA ");
  814.         }
  815.        
  816.         bf.append(" Auth:").append(tipoAutenticazione).append(" ");
  817.        
  818.         bf.append(keyCache);
  819.        
  820.         if(suffixKeyCache!=null && !"".equals(suffixKeyCache)){
  821.             bf.append(" ");
  822.             bf.append(suffixKeyCache);
  823.         }
  824.        
  825.         return bf.toString();
  826.     }
  827.    
  828.     private static IAutenticazionePortaDelegata newInstanceAuthPortaDelegata(String tipoAutenticazione,PdDContext pddContext, IProtocolFactory<?> protocolFactory) throws AutenticazioneException{
  829.         IAutenticazionePortaDelegata auth = null;
  830.         try{
  831.             PddPluginLoader pluginLoader = PddPluginLoader.getInstance();
  832.             auth = (IAutenticazionePortaDelegata) pluginLoader.newAutenticazionePortaDelegata(tipoAutenticazione);
  833.         }catch(Exception e){
  834.             throw new AutenticazioneException(e.getMessage(),e); // descrizione errore già corretta
  835.         }
  836.         String classType = null;
  837.         try{
  838.             classType = auth.getClass().getName();
  839.             AbstractCore.init(auth, pddContext, protocolFactory);
  840.             return auth;
  841.         }catch(Exception e){
  842.             throw new AutenticazioneException("Riscontrato errore durante l'inizializzazione della classe ["+classType+
  843.                     "] che definisce l'autenticazione della fruizione: "+e.getMessage(),e);
  844.         }
  845.     }
  846.    
  847.     private static IAutenticazionePortaApplicativa newInstanceAuthPortaApplicativa(String tipoAutenticazione,PdDContext pddContext, IProtocolFactory<?> protocolFactory) throws AutenticazioneException{
  848.         IAutenticazionePortaApplicativa auth = null;
  849.         try{
  850.             PddPluginLoader pluginLoader = PddPluginLoader.getInstance();
  851.             auth = (IAutenticazionePortaApplicativa) pluginLoader.newAutenticazionePortaApplicativa(tipoAutenticazione);
  852.         }catch(Exception e){
  853.             throw new AutenticazioneException(e.getMessage(),e); // descrizione errore già corretta
  854.         }
  855.         String classType = null;
  856.         try{
  857.             classType = auth.getClass().getName();
  858.             AbstractCore.init(auth, pddContext, protocolFactory);
  859.             return auth;
  860.         }catch(Exception e){
  861.             throw new AutenticazioneException("Riscontrato errore durante l'inizializzazione della classe ["+classType+
  862.                     "] che definisce l'autenticazione della erogazione: "+e.getMessage(),e);
  863.         }
  864.     }
  865.    
  866.     public static boolean isAutenticazioneTokenEnabled(GestioneTokenAutenticazione gestioneTokenAutenticazione) {
  867.         return
  868.                 StatoFunzionalita.ABILITATO.equals(gestioneTokenAutenticazione.getIssuer()) ||
  869.                 StatoFunzionalita.ABILITATO.equals(gestioneTokenAutenticazione.getClientId()) ||
  870.                 StatoFunzionalita.ABILITATO.equals(gestioneTokenAutenticazione.getSubject()) ||
  871.                 StatoFunzionalita.ABILITATO.equals(gestioneTokenAutenticazione.getUsername()) ||
  872.                 StatoFunzionalita.ABILITATO.equals(gestioneTokenAutenticazione.getEmail());
  873.     }
  874.    
  875.     public static String getLabel(GestioneTokenAutenticazione gestioneTokenAutenticazione) {
  876.         return _getActions(gestioneTokenAutenticazione);
  877.     }
  878.     public static String getActions(GestioneTokenAutenticazione gestioneTokenAutenticazione) {
  879.         return _getActions(gestioneTokenAutenticazione);
  880.     }
  881.     private static String _getActions(GestioneTokenAutenticazione gestioneTokenAutenticazione) {
  882.         StringBuilder bf = new StringBuilder();
  883.         if(StatoFunzionalita.ABILITATO.equals(gestioneTokenAutenticazione.getIssuer())) {
  884.             if(bf.length()>0) {
  885.                 bf.append(",");
  886.             }
  887.             bf.append(Costanti.GESTIONE_TOKEN_AUTENTICAZIONE_ISSUER);
  888.         }
  889.         if(StatoFunzionalita.ABILITATO.equals(gestioneTokenAutenticazione.getClientId())) {
  890.             if(bf.length()>0) {
  891.                 bf.append(",");
  892.             }
  893.             bf.append(Costanti.GESTIONE_TOKEN_AUTENTICAZIONE_CLIENT_ID);
  894.         }
  895.         if(StatoFunzionalita.ABILITATO.equals(gestioneTokenAutenticazione.getSubject())) {
  896.             if(bf.length()>0) {
  897.                 bf.append(",");
  898.             }
  899.             bf.append(Costanti.GESTIONE_TOKEN_AUTENTICAZIONE_SUBJECT);
  900.         }
  901.         if(StatoFunzionalita.ABILITATO.equals(gestioneTokenAutenticazione.getUsername())) {
  902.             if(bf.length()>0) {
  903.                 bf.append(",");
  904.             }
  905.             bf.append(Costanti.GESTIONE_TOKEN_AUTENTICAZIONE_USERNAME);
  906.         }
  907.         if(StatoFunzionalita.ABILITATO.equals(gestioneTokenAutenticazione.getEmail())) {
  908.             if(bf.length()>0) {
  909.                 bf.append(",");
  910.             }
  911.             bf.append(Costanti.GESTIONE_TOKEN_AUTENTICAZIONE_EMAIL);
  912.         }
  913.         return bf.toString();
  914.     }
  915.    
  916.     public static EsitoAutenticazionePortaDelegata verificaAutenticazioneTokenPortaDelegata(GestioneTokenAutenticazione tipoAutenticazione, DatiInvocazionePortaDelegata datiInvocazione,
  917.             PdDContext pddContext,IProtocolFactory<?> protocolFactory, OpenSPCoop2Message msg) throws Exception{
  918.        
  919.         EsitoAutenticazionePortaDelegata esito = new EsitoAutenticazionePortaDelegata();
  920.         esito.setClientAuthenticated(true);
  921.        
  922.         esito = (EsitoAutenticazionePortaDelegata) autenticazioneToken(tipoAutenticazione, esito, pddContext, datiInvocazione);
  923.         if(esito.isClientAuthenticated()==false) {
  924.             esito.setErroreIntegrazione(IntegrationFunctionError.TOKEN_REQUIRED_CLAIMS_NOT_FOUND, ErroriIntegrazione.ERRORE_445_TOKEN_AUTORIZZAZIONE_FALLITA.getErroreIntegrazione());
  925.         }
  926.         return esito;
  927.     }
  928.    
  929.     public static EsitoAutenticazionePortaApplicativa verificaAutenticazioneTokenPortaApplicativa(GestioneTokenAutenticazione tipoAutenticazione, DatiInvocazionePortaApplicativa datiInvocazione,
  930.             PdDContext pddContext,IProtocolFactory<?> protocolFactory, OpenSPCoop2Message msg) throws Exception{
  931.        
  932.         EsitoAutenticazionePortaApplicativa esito = new EsitoAutenticazionePortaApplicativa();
  933.         esito.setClientAuthenticated(true);
  934.        
  935.         esito = (EsitoAutenticazionePortaApplicativa) autenticazioneToken(tipoAutenticazione, esito, pddContext, datiInvocazione);
  936.         if(esito.isClientAuthenticated()==false) {
  937.             esito.setErroreCooperazione(IntegrationFunctionError.TOKEN_REQUIRED_CLAIMS_NOT_FOUND, ErroriCooperazione.TOKEN_AUTORIZZAZIONE_FALLITA.getErroreCooperazione());
  938.         }
  939.         return esito;
  940.        
  941.     }
  942.    
  943.     private static EsitoAutenticazione autenticazioneToken(GestioneTokenAutenticazione tipoAutenticazione, EsitoAutenticazione esito,
  944.             PdDContext pddContext, AbstractDatiInvocazione datiInvocazione) throws Exception {
  945.        
  946.         boolean autenticato = true;
  947.         String errorMessage = null;
  948.         if(tipoAutenticazione!=null) {
  949.            
  950.             boolean issuer = StatoFunzionalita.ABILITATO.equals(tipoAutenticazione.getIssuer());
  951.             boolean clientId = StatoFunzionalita.ABILITATO.equals(tipoAutenticazione.getClientId());
  952.             boolean subject = StatoFunzionalita.ABILITATO.equals(tipoAutenticazione.getSubject());
  953.             boolean username = StatoFunzionalita.ABILITATO.equals(tipoAutenticazione.getUsername());
  954.             boolean email = StatoFunzionalita.ABILITATO.equals(tipoAutenticazione.getEmail());
  955.            
  956.             if(issuer || clientId || subject || username ||email ) {
  957.                    
  958.                 InformazioniToken informazioniTokenNormalizzate = null;
  959.                 Object oInformazioniTokenNormalizzate = pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
  960.                 if(oInformazioniTokenNormalizzate!=null) {
  961.                     informazioniTokenNormalizzate = (InformazioniToken) oInformazioniTokenNormalizzate;
  962.                 }
  963.            
  964.                 if(issuer) {
  965.                     if(informazioniTokenNormalizzate==null || informazioniTokenNormalizzate.getIss()==null || "".equals(informazioniTokenNormalizzate.getIss())) {
  966.                         autenticato = false;
  967.                         errorMessage = "Token without issuer claim";
  968.                     }
  969.                 }
  970.                
  971.                 if(clientId) {
  972.                     if(informazioniTokenNormalizzate==null || informazioniTokenNormalizzate.getClientId()==null || "".equals(informazioniTokenNormalizzate.getClientId())) {
  973.                         autenticato = false;
  974.                         errorMessage = "Token without clientId claim";
  975.                     }
  976.                 }
  977.                
  978.                 if(subject) {
  979.                     if(informazioniTokenNormalizzate==null || informazioniTokenNormalizzate.getSub()==null || "".equals(informazioniTokenNormalizzate.getSub())) {
  980.                         autenticato = false;
  981.                         errorMessage = "Token without subject claim";
  982.                     }
  983.                 }
  984.                
  985.                 if(username) {
  986.                     if(informazioniTokenNormalizzate==null || informazioniTokenNormalizzate.getUsername()==null || "".equals(informazioniTokenNormalizzate.getUsername())) {
  987.                         autenticato = false;
  988.                         errorMessage = "Token without username claim";
  989.                     }
  990.                 }
  991.                
  992.                 if(email) {
  993.                     if(informazioniTokenNormalizzate==null || informazioniTokenNormalizzate.getUserInfo()==null ||
  994.                             informazioniTokenNormalizzate.getUserInfo().getEMail()==null ||
  995.                             "".equals(informazioniTokenNormalizzate.getUserInfo().getEMail())) {
  996.                         autenticato = false;
  997.                         errorMessage = "Token without email claim";
  998.                     }
  999.                 }
  1000.             }
  1001.            
  1002.         }
  1003.        
  1004.         if(!autenticato) {
  1005.            
  1006.             esito.setDetails(errorMessage);
  1007.            
  1008.             String realm = "OpenSPCoop";
  1009.             Object oRealm = pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_REALM);
  1010.             if(oRealm!=null) {
  1011.                 realm = (String) oRealm;
  1012.             }
  1013.            
  1014.             boolean emptyMessage = false;
  1015.             Object oEmptyMessage = pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_MESSAGE_ERROR_BODY_EMPTY);
  1016.             if(oEmptyMessage!=null) {
  1017.                 emptyMessage = (Boolean) oEmptyMessage;
  1018.             }
  1019.            
  1020.             boolean genericMessage = false;
  1021.             Object oGenericMessage = pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_MESSAGE_ERROR_GENERIC_MESSAGE);
  1022.             if(oGenericMessage!=null) {
  1023.                 genericMessage = (Boolean) oGenericMessage;
  1024.             }
  1025.            
  1026.             esito.setClientAuthenticated(false);
  1027.             if(emptyMessage) {
  1028.                 esito.setErrorMessage(WWWAuthenticateGenerator.buildErrorMessage(WWWAuthenticateErrorCode.insufficient_scope, realm, genericMessage, errorMessage));
  1029.             }
  1030.             else {
  1031.                 esito.setWwwAuthenticateErrorHeader(WWWAuthenticateGenerator.buildHeaderValue(WWWAuthenticateErrorCode.insufficient_scope, realm, genericMessage, errorMessage));
  1032.             }
  1033.         }
  1034.        
  1035.        
  1036.         return esito;
  1037.     }
  1038.    
  1039.    
  1040.     public static void updateCredenzialiTrasporto(IDSoggetto dominio, String modulo, String idTransazione,
  1041.             String tipoAutenticazione, String credential, CredenzialiMittente credenzialiMittente,
  1042.             IOpenSPCoopState openspcoopState, String identitaChiamante, RequestInfo requestInfo) throws Exception{
  1043.        
  1044.         CredenzialeSearchTrasporto trasportoSearch = new CredenzialeSearchTrasporto(tipoAutenticazione);
  1045.         trasportoSearch.disableConvertToDBValue();
  1046.         CredenzialeTrasporto trasporto = new CredenzialeTrasporto(tipoAutenticazione, credential);
  1047.         credenzialiMittente.setTrasporto(getCredenzialeMittente(dominio, modulo, idTransazione,
  1048.                 trasportoSearch, trasporto, openspcoopState, identitaChiamante,
  1049.                 null, requestInfo));
  1050.        
  1051.     }
  1052.    
  1053.     public static void updateCredenzialiToken(IDSoggetto dominio, String modulo, String idTransazione,
  1054.             InformazioniToken informazioniTokenNormalizzate, IDServizioApplicativo idApplicativoToken, CredenzialiMittente credenzialiMittente,
  1055.             IOpenSPCoopState openspcoopState, String identitaChiamante, RequestInfo requestInfo,
  1056.             Context context) throws Exception{
  1057.        
  1058.         if(informazioniTokenNormalizzate.getIss()!=null) {
  1059.             CredenzialeSearchToken tokenSearch = new CredenzialeSearchToken(TipoCredenzialeMittente.TOKEN_ISSUER);
  1060.             tokenSearch.disableConvertToDBValue();
  1061.             CredenzialeToken token = new CredenzialeToken(TipoCredenzialeMittente.TOKEN_ISSUER, informazioniTokenNormalizzate.getIss());
  1062.             credenzialiMittente.setTokenIssuer(getCredenzialeMittente(dominio, modulo, idTransazione,
  1063.                     tokenSearch, token, openspcoopState, identitaChiamante,
  1064.                     null, requestInfo));
  1065.         }
  1066.         if(informazioniTokenNormalizzate.getClientId()!=null) {
  1067.             if(idApplicativoToken==null) {
  1068.                 CredenzialeSearchToken tokenSearch = new CredenzialeSearchToken(TipoCredenzialeMittente.TOKEN_CLIENT_ID);
  1069.                 tokenSearch.disableConvertToDBValue();
  1070.                 CredenzialeToken token = new CredenzialeToken(TipoCredenzialeMittente.TOKEN_CLIENT_ID, informazioniTokenNormalizzate.getClientId());
  1071.                 credenzialiMittente.setTokenClientId(getCredenzialeMittente(dominio, modulo, idTransazione,
  1072.                         tokenSearch, token, openspcoopState, identitaChiamante,
  1073.                         null, requestInfo));
  1074.             }
  1075.             else {
  1076.                 CredenzialeSearchTokenClient tokenSearch = new CredenzialeSearchTokenClient(true, true, true);
  1077.                 tokenSearch.disableConvertToDBValue();
  1078.                 CredenzialeTokenClient token = new CredenzialeTokenClient(informazioniTokenNormalizzate.getClientId(), idApplicativoToken);
  1079.                 credenzialiMittente.setTokenClientId(getCredenzialeMittente(dominio, modulo, idTransazione,
  1080.                         tokenSearch, token, openspcoopState, identitaChiamante,
  1081.                         null, requestInfo));
  1082.             }
  1083.         }

  1084.         if(informazioniTokenNormalizzate.getSub()!=null) {
  1085.             CredenzialeSearchToken tokenSearch = new CredenzialeSearchToken(TipoCredenzialeMittente.TOKEN_SUBJECT);
  1086.             tokenSearch.disableConvertToDBValue();
  1087.             CredenzialeToken token = new CredenzialeToken(TipoCredenzialeMittente.TOKEN_SUBJECT, informazioniTokenNormalizzate.getSub());
  1088.             credenzialiMittente.setTokenSubject(getCredenzialeMittente(dominio, modulo, idTransazione,
  1089.                     tokenSearch, token, openspcoopState, identitaChiamante,
  1090.                     null, requestInfo));
  1091.         }
  1092.         if(informazioniTokenNormalizzate.getUsername()!=null) {
  1093.             CredenzialeSearchToken tokenSearch = new CredenzialeSearchToken(TipoCredenzialeMittente.TOKEN_USERNAME);
  1094.             tokenSearch.disableConvertToDBValue();
  1095.             CredenzialeToken token = new CredenzialeToken(TipoCredenzialeMittente.TOKEN_USERNAME, informazioniTokenNormalizzate.getUsername());
  1096.             credenzialiMittente.setTokenUsername(getCredenzialeMittente(dominio, modulo, idTransazione,
  1097.                     tokenSearch, token, openspcoopState, identitaChiamante,
  1098.                     null, requestInfo));
  1099.         }
  1100.         if(informazioniTokenNormalizzate.getUserInfo()!=null && informazioniTokenNormalizzate.getUserInfo().getEMail()!=null) {
  1101.             CredenzialeSearchToken tokenSearch = new CredenzialeSearchToken(TipoCredenzialeMittente.TOKEN_EMAIL);
  1102.             tokenSearch.disableConvertToDBValue();
  1103.             CredenzialeToken token = new CredenzialeToken(TipoCredenzialeMittente.TOKEN_EMAIL, informazioniTokenNormalizzate.getUserInfo().getEMail());
  1104.             credenzialiMittente.setTokenEMail(getCredenzialeMittente(dominio, modulo, idTransazione,
  1105.                     tokenSearch, token, openspcoopState, identitaChiamante,
  1106.                     null, requestInfo));
  1107.         }
  1108.        
  1109.         updateCredenzialiTokenPDND(dominio, modulo, idTransazione,
  1110.                 informazioniTokenNormalizzate, credenzialiMittente,
  1111.                 openspcoopState, identitaChiamante, requestInfo,
  1112.                 context);
  1113.        
  1114.     }
  1115.    
  1116.     public static void updateCredenzialiTokenPDND(IDSoggetto dominio, String modulo, String idTransazione,
  1117.             InformazioniToken informazioniTokenNormalizzate, CredenzialiMittente credenzialiMittente,
  1118.             IOpenSPCoopState openspcoopState, String identitaChiamante, RequestInfo requestInfo,
  1119.             Context context) throws Exception{
  1120.                
  1121.         SecurityToken securityTokenForContext = SecurityTokenUtilities.readSecurityToken(context);
  1122.        
  1123.         Long refClientIdCredenzialieMittente = null;
  1124.         if(credenzialiMittente!=null && credenzialiMittente.getTokenClientId()!=null && credenzialiMittente.getTokenClientId().getId()!=null &&
  1125.                 credenzialiMittente.getTokenClientId().getId()>0) {
  1126.             refClientIdCredenzialieMittente = credenzialiMittente.getTokenClientId().getId();
  1127.         }
  1128.         if(refClientIdCredenzialieMittente==null) {
  1129.             return;
  1130.         }
  1131.        
  1132.         if(
  1133.                 (securityTokenForContext!=null && securityTokenForContext.getPdnd()!=null)
  1134.                 ||
  1135.                 (informazioniTokenNormalizzate.getPdnd()!=null && !informazioniTokenNormalizzate.getPdnd().isEmpty())
  1136.             ) {
  1137.             OpenSPCoop2Properties properties = OpenSPCoop2Properties.getInstance();
  1138.                        
  1139.             if(credenzialiMittente.getTokenPdndClientJson()==null &&
  1140.                     properties.isGestoreChiaviPDNDclientsTraceJsonResponse() &&
  1141.                     (securityTokenForContext!=null && securityTokenForContext.getPdnd()!=null)) {
  1142.                 String clientJson = securityTokenForContext.getPdnd().getClientJson();
  1143.                 if(clientJson!=null && StringUtils.isNotEmpty(clientJson)) {
  1144.                     CredenzialeSearchToken tokenSearch = new CredenzialeSearchToken(TipoCredenzialeMittente.PDND_CLIENT_JSON);
  1145.                     tokenSearch.disableConvertToDBValue();
  1146.                     CredenzialeTokenPDND token = new CredenzialeTokenPDND(TipoCredenzialeMittente.PDND_CLIENT_JSON, clientJson, refClientIdCredenzialieMittente);
  1147.                     credenzialiMittente.setTokenPdndClientJson(getCredenzialeMittente(dominio, modulo, idTransazione,
  1148.                             tokenSearch, token, openspcoopState, identitaChiamante,
  1149.                             null, requestInfo));
  1150.                     /**System.out.println("["+idTransazione+"] PDND_CLIENT_JSON ref["+refClientIdCredenzialieMittente+"] ("+clientJson+") ID CREDENZIALE: "+credenzialiMittente.getTokenPdndClientJson().getId()+
  1151.                             " REFDB: "+credenzialiMittente.getTokenPdndClientJson().getRefCredenziale());*/
  1152.                 }
  1153.             }
  1154.                
  1155.             if(credenzialiMittente.getTokenPdndOrganizationJson()==null &&
  1156.                     properties.isGestoreChiaviPDNDorganizationsTraceJsonResponse() &&
  1157.                     (securityTokenForContext!=null && securityTokenForContext.getPdnd()!=null)) {
  1158.                 String organizationJson = securityTokenForContext.getPdnd().getOrganizationJson();
  1159.                 if(organizationJson!=null && StringUtils.isNotEmpty(organizationJson)) {
  1160.                     CredenzialeSearchToken tokenSearch = new CredenzialeSearchToken(TipoCredenzialeMittente.PDND_ORGANIZATION_JSON);
  1161.                     tokenSearch.disableConvertToDBValue();
  1162.                     CredenzialeTokenPDND token = new CredenzialeTokenPDND(TipoCredenzialeMittente.PDND_ORGANIZATION_JSON, organizationJson, refClientIdCredenzialieMittente);
  1163.                     credenzialiMittente.setTokenPdndOrganizationJson(getCredenzialeMittente(dominio, modulo, idTransazione,
  1164.                             tokenSearch, token, openspcoopState, identitaChiamante,
  1165.                             null, requestInfo));
  1166.                     /**System.out.println("["+idTransazione+"] PDND_ORGANIZATION_JSON ref["+refClientIdCredenzialieMittente+"] ("+organizationJson+") ID CREDENZIALE: "+credenzialiMittente.getTokenPdndOrganizationJson().getId()+
  1167.                             " REFDB: "+credenzialiMittente.getTokenPdndOrganizationJson().getRefCredenziale());*/
  1168.                 }
  1169.             }
  1170.            
  1171.             if(credenzialiMittente.getTokenPdndOrganizationName()==null &&
  1172.                     properties.isGestoreChiaviPDNDorganizationsTraceName()) {
  1173.                
  1174.                 String organizationName = null;
  1175.                 if(securityTokenForContext!=null && securityTokenForContext.getPdnd()!=null){
  1176.                     try {
  1177.                         organizationName = securityTokenForContext.getPdnd().getOrganizationName(logger);
  1178.                     }catch(Exception e) {
  1179.                         // ignore (nel caso non è presente un organizationJson non è possibile recuperarlo)
  1180.                     }
  1181.                 }
  1182.                 if(organizationName==null && informazioniTokenNormalizzate.getPdnd()!=null) {
  1183.                     organizationName = PDNDTokenInfo.readOrganizationNameFromPDNDMap(informazioniTokenNormalizzate.getPdnd());
  1184.                 }
  1185.                 if(organizationName!=null && StringUtils.isNotEmpty(organizationName)) {
  1186.                     CredenzialeSearchToken tokenSearch = new CredenzialeSearchToken(TipoCredenzialeMittente.PDND_ORGANIZATION_NAME);
  1187.                     tokenSearch.disableConvertToDBValue();
  1188.                     CredenzialeTokenPDND token = new CredenzialeTokenPDND(TipoCredenzialeMittente.PDND_ORGANIZATION_NAME, organizationName, refClientIdCredenzialieMittente);
  1189.                     credenzialiMittente.setTokenPdndOrganizationName(getCredenzialeMittente(dominio, modulo, idTransazione,
  1190.                             tokenSearch, token, openspcoopState, identitaChiamante,
  1191.                             null, requestInfo));
  1192.                     /**System.out.println("["+idTransazione+"] PDND_ORGANIZATION_NAME ref["+refClientIdCredenzialieMittente+"] ("+organizationName+") ID CREDENZIALE: "+credenzialiMittente.getTokenPdndOrganizationName().getId()+
  1193.                             " REFDB: "+credenzialiMittente.getTokenPdndOrganizationName().getRefCredenziale());*/
  1194.                 }
  1195.             }
  1196.         }
  1197.        
  1198.     }
  1199.    
  1200.     public static CredenzialeMittente convertGruppiToCredenzialiMittenti(IDSoggetto dominio, String modulo, String idTransazione,
  1201.             List<String> gruppiList, IOpenSPCoopState openspcoopState, String identitaChiamante,
  1202.             StringBuilder sbConflict, RequestInfo requestInfo) throws Exception{
  1203.         if(gruppiList!=null && !gruppiList.isEmpty()) {
  1204.             CredenzialeSearchGruppo gruppiSearch = new CredenzialeSearchGruppo();
  1205.             gruppiSearch.disableConvertToDBValue();
  1206.             CredenzialeGruppi gruppi = new CredenzialeGruppi(gruppiList);
  1207.             return getCredenzialeMittente(dominio, modulo, idTransazione,
  1208.                     gruppiSearch, gruppi, openspcoopState, identitaChiamante,
  1209.                     sbConflict, requestInfo);
  1210.         }
  1211.         return null;
  1212.     }
  1213.    
  1214.     public static CredenzialeMittente convertAPIToCredenzialiMittenti(IDSoggetto dominio, String modulo, String idTransazione,
  1215.             String uriAccordoServizio, IOpenSPCoopState openspcoopState, String identitaChiamante,
  1216.             StringBuilder sbConflict, RequestInfo requestInfo) throws Exception{
  1217.         if(uriAccordoServizio!=null && !"".equals(uriAccordoServizio)) {
  1218.             CredenzialeSearchApi apiSearch = new CredenzialeSearchApi();
  1219.             apiSearch.disableConvertToDBValue();
  1220.             CredenzialeApi api = new CredenzialeApi(uriAccordoServizio);
  1221.             return getCredenzialeMittente(dominio, modulo, idTransazione,
  1222.                     apiSearch, api, openspcoopState, identitaChiamante,
  1223.                     sbConflict, requestInfo);
  1224.         }
  1225.         return null;
  1226.     }
  1227.    
  1228.     public static CredenzialeMittente convertEventiToCredenzialiMittenti(IDSoggetto dominio, String modulo, String idTransazione,
  1229.             List<String> eventiList, IOpenSPCoopState openspcoopState, String identitaChiamante,
  1230.             StringBuilder sbConflict, RequestInfo requestInfo) throws Exception{
  1231.         if(eventiList!=null && !eventiList.isEmpty()) {
  1232.             CredenzialeSearchEvento eventiSearch = new CredenzialeSearchEvento();
  1233.             eventiSearch.disableConvertToDBValue();
  1234.             CredenzialeEventi eventi = new CredenzialeEventi(eventiList);
  1235.             return getCredenzialeMittente(dominio, modulo, idTransazione,
  1236.                     eventiSearch, eventi, openspcoopState, identitaChiamante,
  1237.                     sbConflict, requestInfo);
  1238.         }
  1239.         return null;
  1240.     }
  1241.    
  1242.     public static CredenzialeMittente convertClientCredentialToCredenzialiMittenti(IDSoggetto dominio, String modulo, String idTransazione,
  1243.             String socketAddress, String transportAddress,
  1244.             IOpenSPCoopState openspcoopState, String identitaChiamante,
  1245.             StringBuilder sbConflict, RequestInfo requestInfo) throws Exception{
  1246.         boolean socketAddressDefined = socketAddress!=null && !"".equals(socketAddress);
  1247.         boolean transportAddressDefined = transportAddress!=null && !"".equals(transportAddress);
  1248.         if(socketAddressDefined || transportAddressDefined) {
  1249.             CredenzialeSearchClientAddress clientAddressSearch = new CredenzialeSearchClientAddress(socketAddressDefined, transportAddressDefined, true);
  1250.             clientAddressSearch.disableConvertToDBValue();
  1251.             CredenzialeClientAddress clientAddress = new CredenzialeClientAddress(socketAddress, transportAddress);
  1252.             return getCredenzialeMittente(dominio, modulo, idTransazione,
  1253.                     clientAddressSearch, clientAddress, openspcoopState, identitaChiamante,
  1254.                     sbConflict, requestInfo);
  1255.         }
  1256.         return null;
  1257.     }
  1258.    
  1259.     private static CredenzialeMittente getCredenzialeMittente(IDSoggetto dominio, String modulo, String idTransazione,
  1260.             AbstractSearchCredenziale searchCredential, AbstractCredenziale credentialParam,
  1261.             IOpenSPCoopState openspcoopState, String identitaChiamante,
  1262.             StringBuilder sbConflict, RequestInfo requestInfo) throws Exception{
  1263.        
  1264.         if(dominio==null)
  1265.             throw new AutenticazioneException("(Parametri) dominio non definito");
  1266.         if(modulo==null)
  1267.             throw new AutenticazioneException("(Parametri) modulo non definito");
  1268.         if(idTransazione==null)
  1269.             throw new AutenticazioneException("(Parametri) idTransazione non definito");
  1270.         if(searchCredential==null)
  1271.             throw new AutenticazioneException("(Parametri) searchCredential non definito");
  1272.         if(credentialParam==null)
  1273.             throw new AutenticazioneException("(Parametri) credenziali non definite");
  1274.                
  1275.         String credential = credentialParam.getCredenziale();
  1276.         int maxLengthCredenziali = OpenSPCoop2Properties.getInstance().getTransazioniCredenzialiMittenteMaxLength();
  1277.         if(credential.length()>maxLengthCredenziali) {
  1278.             logger.error("Attenzione: credenziale '"+searchCredential.getTipo()+"' ricevuta supera la dimensione massima consentita '"+maxLengthCredenziali+"'. Verrà salvata troncata a tale dimensione. Credenziale: '"+credential+"'");
  1279.             credential = credential.substring(0,maxLengthCredenziali);
  1280.             try {
  1281.                 credentialParam.updateCredenziale(credential);
  1282.             }catch(Exception e) {
  1283.                 logger.error("Non è possibile troncare la credenziale di tipo '"+searchCredential.getTipo()+"', l'informazione non verrà salvata");
  1284.             }
  1285.         }
  1286.        
  1287.         boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null;
  1288.         String keyCache = buildCacheKey(searchCredential, credential);
  1289.        
  1290.         int maxLifeSeconds = OpenSPCoop2Properties.getInstance().getTransazioniCredenzialiMittenteLifeSeconds();
  1291.         Date scadenzaEntry = new Date(DateManager.getTimeMillis()-(maxLifeSeconds*1000));
  1292.        
  1293.         if(useRequestInfo) {
  1294.             CredenzialeMittente c = requestInfo.getRequestConfig().getCredenzialeMittente(searchCredential.getTipoCredenzialeMittente(), keyCache);
  1295.             if(c!=null && c.getOraRegistrazione().after(scadenzaEntry)) {
  1296.                 return c; // informazione in cache valida
  1297.             }
  1298.         }
  1299.        
  1300.         CredenzialeMittente c = _getCredenzialeMittente(dominio, modulo, idTransazione,
  1301.                 searchCredential, credentialParam,
  1302.                 openspcoopState, identitaChiamante,
  1303.                 sbConflict, requestInfo,
  1304.                 keyCache, scadenzaEntry);
  1305.        
  1306.         if(useRequestInfo) {
  1307.             requestInfo.getRequestConfig().addCredenzialeMittente(searchCredential.getTipoCredenzialeMittente(), keyCache, c, idTransazione, scadenzaEntry);
  1308.         }
  1309.        
  1310.         return c;
  1311.     }
  1312.    
  1313.     private static CredenzialeMittente _getCredenzialeMittente(IDSoggetto dominio, String modulo, String idTransazione,
  1314.             AbstractSearchCredenziale searchCredential, AbstractCredenziale credentialParam,
  1315.             IOpenSPCoopState openspcoopState, String identitaChiamante,
  1316.             StringBuilder sbConflict, RequestInfo requestInfo,
  1317.             String keyCache, Date scadenzaEntry) throws Exception{
  1318.                
  1319.         if(GestoreAutenticazione.cacheAutenticazione==null){
  1320.             return _getCredenzialeMittente(dominio, modulo, idTransazione, scadenzaEntry, searchCredential, credentialParam, openspcoopState, identitaChiamante, sbConflict);
  1321.         }
  1322.         else{
  1323.             // Fix: devo prima verificare se ho la chiave in cache prima di mettermi in sincronizzazione.
  1324.             org.openspcoop2.utils.cache.CacheResponse response =
  1325.                     (org.openspcoop2.utils.cache.CacheResponse) GestoreAutenticazione.cacheAutenticazione.get(keyCache);
  1326.             if(response != null){
  1327.                 if(response.getObject()!=null){
  1328.                     GestoreAutenticazione.logger.debug("Oggetto (tipo:"+response.getObject().getClass().getName()+") con chiave ["+keyCache+"] (method:getCredenzialeMittente) in cache.");
  1329.                     CredenzialeMittente credenziale = (CredenzialeMittente) response.getObject();
  1330.                     if(credenziale.getOraRegistrazione().after(scadenzaEntry)) {
  1331.                         return credenziale; // informazione in cache valida
  1332.                     }
  1333.                 }else if(response.getException()!=null){
  1334.                     GestoreAutenticazione.logger.debug("Eccezione (tipo:"+response.getException().getClass().getName()+") con chiave ["+keyCache+"] (method:getCredenzialeMittente) in cache.");
  1335.                     throw (Exception) response.getException();
  1336.                 }else{
  1337.                     GestoreAutenticazione.logger.error("In cache non e' presente ne un oggetto ne un'eccezione.");
  1338.                 }
  1339.             }
  1340.            
  1341.             //synchronized (GestoreAutenticazione.semaphoreCredenzialiMittente) {
  1342.             SemaphoreLock lock = GestoreAutenticazione.lockCredenzialiMittente.acquire("getCredenzialeMittente", idTransazione);
  1343.             try {
  1344.                 response =
  1345.                     (org.openspcoop2.utils.cache.CacheResponse) GestoreAutenticazione.cacheAutenticazione.get(keyCache);
  1346.                 if(response != null){
  1347.                     if(response.getObject()!=null){
  1348.                         GestoreAutenticazione.logger.debug("Oggetto (tipo:"+response.getObject().getClass().getName()+") con chiave ["+keyCache+"] (method:getCredenzialeMittente) in cache.");
  1349.                         CredenzialeMittente credenziale = (CredenzialeMittente) response.getObject();
  1350.                         if(credenziale.getOraRegistrazione().after(scadenzaEntry)) {
  1351.                             return credenziale; // informazione in cache valida
  1352.                         }
  1353.                     }else if(response.getException()!=null){
  1354.                         GestoreAutenticazione.logger.debug("Eccezione (tipo:"+response.getException().getClass().getName()+") con chiave ["+keyCache+"] (method:getCredenzialeMittente) in cache.");
  1355.                         throw (Exception) response.getException();
  1356.                     }else{
  1357.                         GestoreAutenticazione.logger.error("In cache non e' presente ne un oggetto ne un'eccezione.");
  1358.                     }
  1359.                 }

  1360.                 // Effettuo la query
  1361.                 GestoreAutenticazione.logger.debug("oggetto con chiave ["+keyCache+"] (method:getCredenzialeMittente) ricerco nella configurazione...");
  1362.                 CredenzialeMittente credenziale = _getCredenzialeMittente(dominio, modulo, idTransazione, scadenzaEntry, searchCredential, credentialParam, openspcoopState, identitaChiamante, sbConflict);

  1363.                 // Aggiungo la risposta in cache (se esiste una cache)  
  1364.                 // Sempre. Se la risposta non deve essere cachata l'implementazione può in alternativa:
  1365.                 // - impostare una eccezione di processamento (che setta automaticamente noCache a true)
  1366.                 // - impostare il noCache a true
  1367.                 if(credenziale!=null){
  1368.                     GestoreAutenticazione.logger.info("Aggiungo oggetto ["+keyCache+"] in cache");
  1369.                     try{
  1370.                         org.openspcoop2.utils.cache.CacheResponse responseCache = new org.openspcoop2.utils.cache.CacheResponse();
  1371.                         responseCache.setObject(credenziale);
  1372.                         GestoreAutenticazione.cacheAutenticazione.put(keyCache,responseCache);
  1373.                     }catch(UtilsException e){
  1374.                         GestoreAutenticazione.logger.error("Errore durante l'inserimento in cache ["+keyCache+"]: "+e.getMessage());
  1375.                     }
  1376.                     return credenziale;
  1377.                 }else{
  1378.                     throw new AutenticazioneException("Metodo (GestoreAutenticazione.getCredenzialeMittente) ha ritornato un valore di esito null");
  1379.                 }
  1380.             }finally {
  1381.                 GestoreAutenticazione.lockCredenzialiMittente.release(lock, "getCredenzialeMittente", idTransazione);
  1382.             }
  1383.         }
  1384.     }
  1385.    
  1386.     private static String buildCacheKey(AbstractSearchCredenziale searchCredential, String credential) throws AutenticazioneException{
  1387.         StringBuilder bf = new StringBuilder();

  1388.         bf.append(searchCredential.getTipo()).append(" ");
  1389.        
  1390.         bf.append(credential);
  1391.        
  1392.         return bf.toString();
  1393.     }
  1394.    
  1395.     private static CredenzialeMittente _getCredenzialeMittente(IDSoggetto dominio, String modulo, String idTransazione,
  1396.             Date scadenzaEntry,
  1397.             AbstractSearchCredenziale searchCredential, AbstractCredenziale credential,
  1398.             IOpenSPCoopState openspcoopState, String identitaChiamante,
  1399.             StringBuilder sbConflict) throws Exception {
  1400.         DBTransazioniManager dbManager = null;
  1401.         Resource r = null;
  1402.         boolean useConnectionRuntime = false;
  1403.         try{
  1404.             Connection con = null;
  1405.            
  1406.             OpenSPCoop2Properties openspcoopProperties = OpenSPCoop2Properties.getInstance();
  1407.             if(openspcoopProperties.isTransazioniUsePddRuntimeDatasource()) {
  1408.                 if(openspcoopState!=null) {
  1409.                     if(openspcoopState instanceof OpenSPCoopState) {
  1410.                         OpenSPCoopState s = (OpenSPCoopState) openspcoopState;
  1411.                         if(s.getConnectionDB()!=null && !s.getConnectionDB().isClosed()) {
  1412.                             con = s.getConnectionDB();
  1413.                             useConnectionRuntime = true;
  1414.                         }
  1415.                     }
  1416.                 }
  1417.             }
  1418.            
  1419.             //boolean isNull = (openspcoopState==null);
  1420.             //System.out.println("GET CREDENZIALI MITTENTE useConnectionRuntime["+useConnectionRuntime+"] (isNull:"+isNull+") (identitaChiamante: "+identitaChiamante+") ("+idTransazione+") ...");
  1421.            
  1422.             if(useConnectionRuntime==false){
  1423.                 dbManager = DBTransazioniManager.getInstance();
  1424.                 r = dbManager.getResource(dominio, modulo+".credenzialeMittente", idTransazione);
  1425.                 if(r==null){
  1426.                     throw new Exception("Risorsa al database non disponibile");
  1427.                 }
  1428.                 con = (Connection) r.getResource();
  1429.             }
  1430.            
  1431.             if(con == null)
  1432.                 throw new Exception("Connessione non disponibile");
  1433.             //System.out.println("GET CREDENZIALI MITTENTE useConnectionRuntime["+useConnectionRuntime+"] (isNull:"+isNull+") (identitaChiamante: "+identitaChiamante+") ("+idTransazione+") OK");
  1434.             boolean debug = OpenSPCoop2Properties.getInstance().isTransazioniDebug();
  1435.             Logger logSql =  OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSql(debug);
  1436.             DAOFactory daoFactory = DAOFactory.getInstance(logSql);
  1437.             DAOFactoryProperties daoFactoryProperties = DAOFactoryProperties.getInstance(logSql);
  1438.             ServiceManagerProperties daoFactoryServiceManagerPropertiesTransazioni = daoFactoryProperties.getServiceManagerProperties(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  1439.             daoFactoryServiceManagerPropertiesTransazioni.setShowSql(debug);
  1440.             daoFactoryServiceManagerPropertiesTransazioni.setDatabaseType(DBTransazioniManager.getInstance().getTipoDatabase());
  1441.            
  1442.             org.openspcoop2.core.transazioni.dao.IServiceManager transazioniSM =
  1443.                     (org.openspcoop2.core.transazioni.dao.IServiceManager)
  1444.                         daoFactory.getServiceManager(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance(), con, daoFactoryServiceManagerPropertiesTransazioni, logSql);

  1445.             ICredenzialeMittenteService credenzialiMittenteService = transazioniSM.getCredenzialeMittenteService();
  1446.             boolean ricercaEsatta = true;
  1447.             boolean caseSensitive = true;
  1448.             IPaginatedExpression pagExpression = searchCredential.createExpression(credenzialiMittenteService, credential.getCredenziale(), ricercaEsatta, caseSensitive);
  1449.             List<CredenzialeMittente> list = credenzialiMittenteService.findAll(pagExpression);
  1450.             if(list!=null && !list.isEmpty() && credential instanceof CredenzialeTrasporto) {
  1451.                 CredenzialeTrasporto cTrasporto = (CredenzialeTrasporto) credential;
  1452.                 if(cTrasporto.isSsl()) {
  1453.                     list = CredenzialeSearchTrasporto.filterList(list, credential.getCredenziale(), logSql);
  1454.                 }
  1455.             }

  1456.             if(list==null || list.size()<=0) {
  1457.                 // not exists
  1458.                 return createCredenzialeMittente(credenzialiMittenteService, scadenzaEntry, searchCredential, credential, logSql);
  1459.             }
  1460.             else if(list.size()>1) {
  1461.                 throw new Exception("Trovata più di un'occorrenza di credenziale di tipo '"+searchCredential.getTipo()+"'; credenziale: ["+credential.getCredenziale()+"]");
  1462.             }
  1463.             else {
  1464.                 CredenzialeMittente credenziale = list.get(0);
  1465.                 if(credenziale.getOraRegistrazione().after(scadenzaEntry)) {
  1466.                     return credenziale; // informazione in cache valida
  1467.                 }
  1468.                 else {
  1469.                     return updateDataCredenzialeMittente(credenzialiMittenteService, scadenzaEntry, credenziale, sbConflict);
  1470.                 }
  1471.             }
  1472.            
  1473.         }finally{
  1474.             if(useConnectionRuntime==false) {
  1475.                 try{
  1476.                     if(r!=null)
  1477.                         dbManager.releaseResource(dominio, modulo, r);
  1478.                 }catch(Exception eClose){
  1479.                     // close
  1480.                 }
  1481.             }
  1482.         }
  1483.     }
  1484.    
  1485.     private static CredenzialeMittente createCredenzialeMittente(ICredenzialeMittenteService credenzialeMittentiService,
  1486.             Date scadenzaEntry,
  1487.             AbstractSearchCredenziale searchCredential, AbstractCredenziale credential,
  1488.             Logger log) throws Exception {
  1489.         SemaphoreLock lock = GestoreAutenticazione.lockCredenzialiMittenteCreazione.acquire("createCredenzialeMittente");
  1490.         try {
  1491.             return  GestoreAutenticazione._createCredenzialeMittente(credenzialeMittentiService,
  1492.                     scadenzaEntry,
  1493.                     searchCredential, credential,
  1494.                     log);
  1495.         }finally {
  1496.             GestoreAutenticazione.lockCredenzialiMittenteCreazione.release(lock, "createCredenzialeMittente");
  1497.         }
  1498.     }
  1499. //    private static synchronized CredenzialeMittente createCredenzialeMittente(ICredenzialeMittenteService credenzialeMittentiService,
  1500. //          Date scadenzaEntry,
  1501. //          AbstractSearchCredenziale searchCredential, AbstractCredenziale credential,
  1502. //          Logger log) throws Exception {
  1503.     private static CredenzialeMittente _createCredenzialeMittente(ICredenzialeMittenteService credenzialeMittentiService,
  1504.             Date scadenzaEntry,
  1505.             AbstractSearchCredenziale searchCredential, AbstractCredenziale credential,
  1506.             Logger log) throws Exception {
  1507.         boolean ricercaEsatta = true;
  1508.         boolean caseSensitive = true;
  1509.         IPaginatedExpression pagEpression = searchCredential.createExpression(credenzialeMittentiService, credential.getCredenziale(), ricercaEsatta, caseSensitive);
  1510.         List<CredenzialeMittente> list = credenzialeMittentiService.findAll(pagEpression);
  1511.         if(list!=null && !list.isEmpty() && credential instanceof CredenzialeTrasporto) {
  1512.             CredenzialeTrasporto cTrasporto = (CredenzialeTrasporto) credential;
  1513.             if(cTrasporto.isSsl()) {
  1514.                 list = CredenzialeSearchTrasporto.filterList(list, credential.getCredenziale(), log);
  1515.             }
  1516.         }
  1517.         if(list==null || list.size()<=0) {

  1518.             // not exists
  1519.             CredenzialeMittente credenzialeMittente = new CredenzialeMittente();
  1520.             credenzialeMittente.setTipo(credential.getTipo());
  1521.             credenzialeMittente.setRefCredenziale(credential.getReferenceId());
  1522.             credenzialeMittente.setOraRegistrazione(DateManager.getDate());
  1523.             credenzialeMittente.setCredenziale(credential.getCredenziale());
  1524.             try{
  1525.                 credenzialeMittentiService.create(credenzialeMittente);
  1526.             }catch(Throwable t){
  1527.                 // L'errore potrebbe essere dovuto al fatto che un thread su un altro nodo (dove non può agire la sincronizzazione del metodo) ha già creata la stessa entry
  1528.                 // Si avrebbe un errore simile al seguente: "org.openspcoop2.generic_project.exception.ServiceException: Create not completed: insertAndReturnGeneratedKey failed: ORA-00001: unique constraint (GOVWAY_ENTERPRISE.UNIQUE_CREDENZIALE_MITTENTE_1) violated"
  1529.                 // Provo a vedere se adesso le credenziali esistono
  1530.                
  1531.                 list = credenzialeMittentiService.findAll(pagEpression);
  1532.                 if(list!=null && !list.isEmpty() && credential instanceof CredenzialeTrasporto) {
  1533.                     CredenzialeTrasporto cTrasporto = (CredenzialeTrasporto) credential;
  1534.                     if(cTrasporto.isSsl()) {
  1535.                         list = CredenzialeSearchTrasporto.filterList(list, credential.getCredenziale(), log);
  1536.                     }
  1537.                 }

  1538.                 if(list==null || list.size()<=0) {
  1539.                     // not exists, rilancio eccezione originale
  1540.                     throw new Exception(t.getMessage(),t);
  1541.                 }
  1542.                 else if(list.size()>1) {
  1543.                     throw new Exception("Trovata più di un'occorrenza di credenziale di tipo '"+searchCredential.getTipo()+"'; credenziale: ["+credential.getCredenziale()+"]");
  1544.                 }
  1545.                 else {
  1546.                     CredenzialeMittente credenziale = list.get(0);
  1547.                     return credenziale; // appena creata dall'altro nodo.
  1548.                 }
  1549.             }
  1550.             return credenzialeMittente;
  1551.         }
  1552.         else if(list.size()>1) {
  1553.             throw new Exception("Trovata più di un'occorrenza di credenziale di tipo '"+searchCredential.getTipo()+"'; credenziale: ["+credential.getCredenziale()+"]");
  1554.         }
  1555.         else {
  1556.             CredenzialeMittente credenziale = list.get(0);
  1557.             if(credenziale.getOraRegistrazione().after(scadenzaEntry)) {
  1558.                 return credenziale; // informazione in cache valida
  1559.             }
  1560.             //else {
  1561.                 //return updateDataCredenzialeMittente(credenzialeMittentiService, scadenzaEntry, credenziale);
  1562.                 // ritorno la credenziale trovata sul database, che comunque è sicuramente stata "appena" creata da un altro nodo run. Altrimenti non arriverei a questo else
  1563.                 // il metodo di updateDataCredenzialeMittente imposta un ulteriore lock che non si desidera "pagare"
  1564.                 return credenziale;
  1565.             //}
  1566.         }
  1567.     }
  1568.    
  1569.     private static CredenzialeMittente updateDataCredenzialeMittente(ICredenzialeMittenteService credenzialeMittentiService,
  1570.             Date scadenzaEntry, CredenzialeMittente credenziale,
  1571.             StringBuilder sbConflict) throws Exception {
  1572.        
  1573.         // Il semaforo utilizzato prima di effettuare l'update non basta, la modifica potrebbe essere effettuata da più nodi.
  1574.        
  1575.         long gestioneSerializableDB_AttesaAttiva = OpenSPCoop2Properties.getInstance().getGestioneSerializableDBAttesaAttiva();
  1576.         int gestioneSerializableDB_CheckInterval = OpenSPCoop2Properties.getInstance().getGestioneSerializableDBCheckInterval();
  1577.        
  1578.         long scadenzaWhile = DateManager.getTimeMillis() + gestioneSerializableDB_AttesaAttiva;
  1579.        
  1580.         Throwable lastT = null;
  1581.         while(DateManager.getTimeMillis() < scadenzaWhile){
  1582.        
  1583.             int conflict = 0;
  1584.             try{
  1585.                
  1586.                 SemaphoreLock lock = GestoreAutenticazione.lockCredenzialiMittenteAggiornamento.acquire("updateDataCredenzialeMittente");
  1587.                 try {
  1588.                     CredenzialeMittente c = GestoreAutenticazione._updateDataCredenzialeMittente(credenzialeMittentiService,
  1589.                             scadenzaEntry, credenziale);
  1590.                     if(sbConflict!=null) {
  1591.                         sbConflict.append(conflict);
  1592.                     }
  1593.                     return c;
  1594.                
  1595.                 }finally {
  1596.                     GestoreAutenticazione.lockCredenzialiMittenteAggiornamento.release(lock, "updateDataCredenzialeMittente");
  1597.                 }
  1598.                    
  1599.             } catch(Throwable e) {
  1600.                 lastT = e;
  1601.                 //System.out.println("Serializable error:"+e.getMessage());
  1602.                 //e.printStackTrace(System.out);
  1603.                 conflict++;
  1604.             }
  1605.            
  1606.             // Per aiutare ad evitare conflitti
  1607.             try{
  1608.                 Utilities.sleep((getRandom()).nextInt(gestioneSerializableDB_CheckInterval)); // random da 0ms a checkIntervalms
  1609.             }catch(Exception eRandom){
  1610.                 // ignore
  1611.             }
  1612.         }
  1613.        
  1614.         if(lastT!=null) {
  1615.             throw new Exception("Aggiornamento credenziali non riuscito: "+lastT.getMessage(),lastT);
  1616.         }
  1617.         else {
  1618.             throw new Exception("Aggiornamento credenziali non riuscito");
  1619.         }
  1620.        
  1621.     }
  1622. //    private static synchronized CredenzialeMittente updateDataCredenzialeMittente(ICredenzialeMittenteService credenzialeMittentiService,
  1623. //          Date scadenzaEntry, CredenzialeMittente credenziale) throws Exception {
  1624.     private static CredenzialeMittente _updateDataCredenzialeMittente(ICredenzialeMittenteService credenzialeMittentiService,
  1625.             Date scadenzaEntry, CredenzialeMittente credenziale) throws Exception {
  1626.        
  1627.         IdCredenzialeMittente id = credenzialeMittentiService.convertToId(credenziale);
  1628.         CredenzialeMittente credenzialeCheck = credenzialeMittentiService.get(id);
  1629.         if(credenziale.getOraRegistrazione().after(scadenzaEntry)) {
  1630.             return credenzialeCheck; // informazione in cache già aggiornata da una chiamata concorrente
  1631.         }
  1632.         else {
  1633.             //System.out.println("Update Credenziale '"+id.getTipo()+"'");
  1634.             credenzialeCheck.setOraRegistrazione(DateManager.getDate()); // update
  1635.             credenzialeMittentiService.update(id, credenzialeCheck);
  1636.             return credenzialeCheck;
  1637.         }
  1638.        
  1639.     }
  1640.    
  1641. }