AbstractAutorizzazioneXacmlPolicy.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.autorizzazione.pd;

  21. import java.util.List;

  22. import org.herasaf.xacml.core.context.impl.DecisionType;
  23. import org.herasaf.xacml.core.context.impl.ResultType;
  24. import org.openspcoop2.core.id.IDServizio;
  25. import org.openspcoop2.core.id.IDSoggetto;
  26. import org.openspcoop2.pdd.core.autorizzazione.AutorizzazioneException;
  27. import org.openspcoop2.pdd.core.autorizzazione.XACMLPolicyUtilities;
  28. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  29. import org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione;
  30. import org.openspcoop2.protocol.sdk.constants.ErroriIntegrazione;
  31. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  32. import org.openspcoop2.utils.SemaphoreLock;
  33. import org.openspcoop2.utils.xacml.MarshallUtilities;
  34. import org.openspcoop2.utils.xacml.ResultCombining;
  35. import org.openspcoop2.utils.xacml.ResultUtilities;
  36. import org.openspcoop2.utils.xacml.XacmlRequest;
  37. import org.slf4j.Logger;

  38. /**
  39.  * Classe che implementa una autorizzazione basata sui ruoli
  40.  *
  41.  * @author Andrea Poli (apoli@link.it)
  42.  * @author $Author$
  43.  * @version $Rev$, $Date$
  44.  */

  45. abstract class AbstractAutorizzazioneXacmlPolicy extends AbstractAutorizzazioneBase {


  46.    
  47.     private boolean checkRuoloRegistro;
  48.     private boolean checkRuoloEsterno;
  49.     private String nomeAutorizzazione;
  50.     private Logger log = null;
  51.    
  52.     protected AbstractAutorizzazioneXacmlPolicy(boolean checkRuoloRegistro, boolean checkRuoloEsterno, String nomeAutorizzazione){
  53.         this.checkRuoloRegistro = checkRuoloRegistro;
  54.         this.checkRuoloEsterno = checkRuoloEsterno;
  55.         this.nomeAutorizzazione = nomeAutorizzazione;
  56.         this.log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
  57.     }
  58.    
  59.    
  60.     private XacmlRequest xacmlRequest = null;
  61.     private String xacmlRequestAsString = null;
  62.     private String policyKey = null;
  63.     private org.openspcoop2.utils.Semaphore semaphore = new org.openspcoop2.utils.Semaphore("AbstractAutorizzazioneXacmlPolicyPD");
  64.     private XacmlRequest getXacmlRequest(DatiInvocazionePortaDelegata datiInvocazione, Logger log) throws AutorizzazioneException{
  65.         if(this.xacmlRequest==null){
  66.             initXacmlRequest(datiInvocazione, log);
  67.         }
  68.         return this.xacmlRequest;
  69.     }
  70.     private void initXacmlRequest(DatiInvocazionePortaDelegata datiInvocazione, Logger log) throws AutorizzazioneException{
  71.         SemaphoreLock lock = this.semaphore.acquireThrowRuntime("initXacmlRequest");
  72.         try {
  73.             if(this.xacmlRequest==null){
  74.                 this.policyKey = "http://govway.org/out/"+datiInvocazione.getIdPD().getNome();
  75.                 this.xacmlRequest = XACMLPolicyUtilities.newXacmlRequest(this.getProtocolFactory(), datiInvocazione,
  76.                         this.checkRuoloRegistro, this.checkRuoloEsterno, this.policyKey);
  77.                 this.xacmlRequestAsString = new String(MarshallUtilities.marshallRequest(this.xacmlRequest));
  78.                 this.log.debug("XACML-Request (idPolicy:"+this.policyKey+"): "+this.xacmlRequestAsString);
  79.             }
  80.         }finally {
  81.             this.semaphore.release(lock, "initXacmlRequest");
  82.         }
  83.     }
  84.    
  85.     @Override
  86.     public String getSuffixKeyAuthorizationResultInCache(DatiInvocazionePortaDelegata datiInvocazione) {
  87.         try{
  88.             initDatiPolicy(datiInvocazione, false);
  89.         }catch(Exception e){
  90.             // Comunque l'errore verrĂ  rilanciato anche durante l'utilizzo della classe vera e propria nel metodo 'process'
  91.             // quando viene effettuata la 'XACMLPolicyUtilities.loadPolicy'.
  92.         }
  93.         return this.xacmlRequestAsString;
  94.     }

  95.     @Override
  96.     public boolean saveAuthorizationResultInCache() {
  97.         return true;
  98.     }
  99.    
  100.     private void initDatiPolicy(DatiInvocazionePortaDelegata datiInvocazione, boolean throwError) throws Exception {
  101.         if(this.xacmlRequestAsString==null){
  102.             try{
  103.                 this.getXacmlRequest(datiInvocazione, this.log);
  104.             }catch(Exception e){
  105.                 this.log.error("Autorizzazione "+this.nomeAutorizzazione+" non riuscita (create XACML-Request)",e);
  106.                 if(throwError) {
  107.                     throw e;
  108.                 }
  109.             }
  110.         }
  111.     }
  112.        
  113.     @Override
  114.     public EsitoAutorizzazionePortaDelegata process(DatiInvocazionePortaDelegata datiInvocazione) throws AutorizzazioneException{

  115.         EsitoAutorizzazionePortaDelegata esito = new EsitoAutorizzazionePortaDelegata();
  116.        
  117.         String servizioApplicativo = null;
  118.         if(datiInvocazione.getIdServizioApplicativo()!=null){
  119.             servizioApplicativo = datiInvocazione.getIdServizioApplicativo().getNome();
  120.         }

  121.        
  122.         // ****** Inizializzazione Policy Key (Serve per la chiave identificativa della policy e anche per la cache) ********
  123.         // Inizializzazione 'policyKey'
  124.         // Questo codice serve per creare la chiave della policy che poi viene utilizzata dal PdD
  125.         // Il codice viene anche usato nel metodo 'getSuffixKeyAuthorizationResultInCache',
  126.         // e quindi in presenza di cache attiva, in questo metodo l'invocazione non effettua nessuna operazione.
  127.         // Se invece la cache non e' attiva, l'invocazione inizializza i dati della policy tra cui la 'policyKey'
  128.         try{
  129.             initDatiPolicy(datiInvocazione,true);
  130.         }catch(Exception e){
  131.             this.log.error("Autorizzazione "+this.nomeAutorizzazione+" ("+this.policyKey+") non riuscita (init XACML-Policy)",e);
  132.             esito.setErroreIntegrazione(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  133.                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE));
  134.             esito.setAutorizzato(false);
  135.             esito.setEccezioneProcessamento(e);
  136.             return esito;
  137.         }
  138.        
  139.        
  140.        
  141.        
  142.         // ****** Raccolta Dati e Policy ********
  143.        
  144.         IDSoggetto fruitore = new IDSoggetto(datiInvocazione.getPd().getTipoSoggettoProprietario(), datiInvocazione.getPd().getNomeSoggettoProprietario());
  145.         IDServizio idServizio = datiInvocazione.getIdServizio();
  146.        
  147.         String xacmlPolicyPorta = null;
  148.         try{
  149.             if(datiInvocazione.getPd()!=null) {
  150.                 xacmlPolicyPorta = datiInvocazione.getPd().getXacmlPolicy();
  151.             }
  152.             XACMLPolicyUtilities.loadPolicy(xacmlPolicyPorta, idServizio, this.policyKey, true, fruitore, this.log);
  153.         }catch(Exception e){
  154.             this.log.error("Autorizzazione "+this.nomeAutorizzazione+" ("+this.policyKey+") non riuscita (load XACML-Policy)",e);
  155.             esito.setErroreIntegrazione(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  156.                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE));
  157.             esito.setAutorizzato(false);
  158.             esito.setEccezioneProcessamento(e);
  159.             return esito;
  160.         }
  161.        
  162.        
  163.        
  164.        
  165.         // ****** Produzione XACMLRequest a partire dai dati ********
  166.        
  167.         XacmlRequest xacmlRequest = null;
  168.         try{
  169.             xacmlRequest = this.getXacmlRequest(datiInvocazione, this.log);
  170.         }catch(Exception e){
  171.             this.log.error("Autorizzazione "+this.nomeAutorizzazione+" ("+this.policyKey+") non riuscita (create XACML-Request)",e);
  172.             esito.setErroreIntegrazione(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  173.                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE));
  174.             esito.setAutorizzato(false);
  175.             esito.setEccezioneProcessamento(e);
  176.             return esito;
  177.         }
  178.    
  179.        
  180.        
  181.        
  182.         // ****** Valutazione XACMLRequest con PdD ********
  183.        
  184.         List<ResultType> results = null;
  185.         try {          
  186.             results = ResultUtilities.evaluate(xacmlRequest, this.log, this.policyKey, XACMLPolicyUtilities.getPolicyDecisionPoint(this.log));
  187.         }catch(Exception e){
  188.             this.log.error("Autorizzazione "+this.nomeAutorizzazione+" ("+this.policyKey+") non riuscita (evaluate XACML-Request)",e);
  189.             esito.setErroreIntegrazione(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  190.                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE));
  191.             esito.setAutorizzato(false);
  192.             esito.setEccezioneProcessamento(e);
  193.             return esito;
  194.         }
  195.        
  196.         DecisionType decision = ResultCombining.combineDenyOverrides(results);
  197.         if(DecisionType.PERMIT.equals(decision)) {
  198.             esito.setAutorizzato(true);
  199.             return esito;
  200.         } else {
  201.             try{
  202.                 String resultAsStringForLog = ResultUtilities.toRawString(results);
  203.                 this.log.error("Autorizzazione con XACMLPolicy fallita ("+this.policyKey+") ;\nrequest: "+this.xacmlRequestAsString+
  204.                         "\npolicy: "+xacmlPolicyPorta+
  205.                         "\nresults (size:"+results.size()+"): \n"+resultAsStringForLog);
  206.                
  207.                 String resultAsString = ResultUtilities.toString(results, decision);
  208.                 esito.setAutorizzato(false);
  209.                 if(servizioApplicativo!=null){
  210.                     esito.setErroreIntegrazione(IntegrationFunctionError.AUTHORIZATION_POLICY_DENY, ErroriIntegrazione.ERRORE_404_AUTORIZZAZIONE_FALLITA_SA.
  211.                             getErrore404_AutorizzazioneFallitaServizioApplicativo(servizioApplicativo,resultAsString));
  212.                 }
  213.                 else{
  214.                     esito.setErroreIntegrazione(IntegrationFunctionError.AUTHORIZATION_POLICY_DENY, ErroriIntegrazione.ERRORE_404_AUTORIZZAZIONE_FALLITA_SA.
  215.                             getErrore404_AutorizzazioneFallitaServizioApplicativoAnonimo(resultAsString));
  216.                 }
  217.                 return esito;
  218.                
  219.             }catch(Exception e){
  220.                 this.log.error("Autorizzazione "+this.nomeAutorizzazione+" ("+this.policyKey+") fallita (read XACML-Results)",e);
  221.                 esito.setErroreIntegrazione(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  222.                         get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE));
  223.                 esito.setAutorizzato(false);
  224.                 esito.setEccezioneProcessamento(e);
  225.                 return esito;
  226.             }
  227.         }
  228.        
  229.     }

  230.    
  231. }