XACMLPolicyUtilities.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;

  21. import java.io.File;
  22. import java.io.Serializable;
  23. import java.net.URL;
  24. import java.util.ArrayList;
  25. import java.util.Collections;
  26. import java.util.Iterator;
  27. import java.util.List;
  28. import java.util.Map;

  29. import javax.servlet.http.HttpServletRequest;

  30. import org.openspcoop2.core.config.ServizioApplicativo;
  31. import org.openspcoop2.core.config.constants.TipoAutenticazione;
  32. import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
  33. import org.openspcoop2.core.id.IDRuolo;
  34. import org.openspcoop2.core.id.IDServizio;
  35. import org.openspcoop2.core.id.IDServizioApplicativo;
  36. import org.openspcoop2.core.id.IDSoggetto;
  37. import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
  38. import org.openspcoop2.core.registry.Documento;
  39. import org.openspcoop2.core.registry.Ruolo;
  40. import org.openspcoop2.core.registry.constants.RuoloContesto;
  41. import org.openspcoop2.core.registry.constants.RuoloTipologia;
  42. import org.openspcoop2.core.registry.constants.TipiDocumentoSicurezza;
  43. import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
  44. import org.openspcoop2.core.registry.driver.FiltroRicercaRuoli;
  45. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  46. import org.openspcoop2.pdd.core.PdDContext;
  47. import org.openspcoop2.pdd.core.autorizzazione.container.AutorizzazioneHttpServletRequest;
  48. import org.openspcoop2.pdd.core.autorizzazione.pa.DatiInvocazionePortaApplicativa;
  49. import org.openspcoop2.pdd.core.autorizzazione.pd.DatiInvocazionePortaDelegata;
  50. import org.openspcoop2.pdd.core.token.EsitoGestioneToken;
  51. import org.openspcoop2.pdd.core.token.InformazioniToken;
  52. import org.openspcoop2.pdd.core.token.InformazioniTokenUserInfo;
  53. import org.openspcoop2.pdd.core.token.TokenUtilities;
  54. import org.openspcoop2.pdd.core.token.attribute_authority.InformazioniAttributi;
  55. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  56. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  57. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  58. import org.openspcoop2.protocol.sdk.state.URLProtocolContext;
  59. import org.openspcoop2.utils.MapKey;
  60. import org.openspcoop2.utils.json.JSONUtils;
  61. import org.openspcoop2.utils.resources.FileSystemUtilities;
  62. import org.openspcoop2.utils.transport.http.HttpUtilities;
  63. import org.openspcoop2.utils.xacml.CachedMapBasedSimplePolicyRepository;
  64. import org.openspcoop2.utils.xacml.MarshallUtilities;
  65. import org.openspcoop2.utils.xacml.PolicyDecisionPoint;
  66. import org.openspcoop2.utils.xacml.PolicyException;
  67. import org.openspcoop2.utils.xacml.XacmlRequest;
  68. import org.slf4j.Logger;


  69. /**
  70.  * XACMLPolicyUtilities
  71.  *
  72.  * @author Andrea Poli (apoli@link.it)
  73.  * @author $Author$
  74.  * @version $Rev$, $Date$
  75.  */
  76. public class XACMLPolicyUtilities {

  77.     private static PolicyDecisionPoint pdp;
  78.     private static synchronized void initPdD(Logger log) throws PolicyException{
  79.         if(XACMLPolicyUtilities.pdp == null) {
  80.             XACMLPolicyUtilities.pdp = new PolicyDecisionPoint(log);
  81.         }
  82.     }  
  83.     public static PolicyDecisionPoint getPolicyDecisionPoint(Logger log) throws PolicyException{
  84.         if(XACMLPolicyUtilities.pdp == null) {
  85.             XACMLPolicyUtilities.initPdD(log);
  86.         }
  87.         return XACMLPolicyUtilities.pdp;
  88.     }

  89.     // Workaround: Serve nel caso di Porta Delegata per poter utilizzare una policy differente da quella utilizzata nell'erogazione
  90.     private static final String  NOME_POLICY_FRUIZIONE = "fruizioneXacmlPolicy.xml";

  91.     public static void loadPolicy(String xacmlPolicyPorta, IDServizio idServizio, String key,
  92.             boolean portaDelegata,IDSoggetto fruitore, // fruitore is null se non e' portaDelegata
  93.             Logger log) throws PolicyException{
  94.         byte[] policy = null;
  95.         if(xacmlPolicyPorta!=null) {
  96.             policy = xacmlPolicyPorta.getBytes();
  97.         }
  98.         else {
  99.             @SuppressWarnings("unused")
  100.             String nomePolicy = null;
  101.             int numeroPolicy = 0;
  102.             @SuppressWarnings("unused")
  103.             boolean numeroPolicyFruizione = false;
  104.             try{
  105.                 AccordoServizioParteSpecifica asps = RegistroServiziManager.getInstance().getAccordoServizioParteSpecifica(idServizio, null, true, null); // requestInfo non serve poichè devono essere caricati gli allegati
  106.                 for (int i = 0; i < asps.sizeSpecificaSicurezzaList(); i++) {
  107.                     Documento d = asps.getSpecificaSicurezza(i);
  108.                     if(TipiDocumentoSicurezza.XACML_POLICY.getNome().equals(d.getTipo())){
  109.    
  110.                         if(policy == null || (portaDelegata && (fruitore.getNome()+"_"+NOME_POLICY_FRUIZIONE).equals(d.getFile()))){
  111.                             if(NOME_POLICY_FRUIZIONE.equals(d.getFile())){
  112.                                 numeroPolicyFruizione = true;
  113.                             }
  114.                             else{
  115.                                 numeroPolicy++;
  116.                             }
  117.                             if(d.getByteContenuto()!=null){
  118.                                 policy = d.getByteContenuto();
  119.                                 nomePolicy = d.getFile();
  120.                             }
  121.                             else if(d.getFile()!=null){
  122.                                 if(d.getFile().startsWith("http://") || d.getFile().startsWith("file://")){
  123.                                     URL url = new URL(d.getFile());
  124.                                     policy = HttpUtilities.requestHTTPFile(url.toString());
  125.                                 }
  126.                                 else{
  127.                                     File f = new File(d.getFile());
  128.                                     policy = FileSystemUtilities.readBytesFromFile(f);
  129.                                 }
  130.                             }
  131.                         }
  132.                     }
  133.                 }
  134.                 if(numeroPolicy>1){
  135.                     throw new PolicyException("Piu di una xacml policy trovata per il servizio "+idServizio.toString());
  136.                 }
  137.             }catch(Exception e){
  138.                 throw new PolicyException("Errore durante la ricerca delle policies xacml per il servizio "+idServizio.toString()+": "+e.getMessage(),e);
  139.             }
  140.             if(policy== null){
  141.                 throw new PolicyException("Nessuna xacml policy trovata trovata per il servizio "+idServizio.toString());
  142.             }
  143.         }

  144.         try{
  145.             // Caricamento in PdP vedendo che la policy non sia gia stata caricata ....
  146.             XACMLPolicyUtilities.getPolicyDecisionPoint(log).addPolicy(MarshallUtilities.unmarshallPolicy(policy), key);
  147.         }catch(Exception e){
  148.             throw new PolicyException("Errore durante il caricamento della xacml policy sul PdD (servizio "+idServizio.toString()+"): "+e.getMessage(),e);
  149.         }
  150.     }

  151.     public static XacmlRequest newXacmlRequest(IProtocolFactory<?> protocolFactory, AbstractDatiInvocazione datiInvocazione,
  152.             boolean checkRuoloRegistro, boolean checkRuoloEsterno,
  153.             String policyKey) throws AutorizzazioneException{

  154.         XacmlRequest xacmlRequest = new XacmlRequest();
  155.         URLProtocolContext urlProtocolContext = null;
  156.         if(datiInvocazione.getInfoConnettoreIngresso()==null ||
  157.                 datiInvocazione.getInfoConnettoreIngresso().getUrlProtocolContext()==null){
  158.             throw new AutorizzazioneException("UrlProtocolContext non disponibile; risorsa richiesta dall'autorizzazione");
  159.         }
  160.         urlProtocolContext = datiInvocazione.getInfoConnettoreIngresso().getUrlProtocolContext();

  161.         if(datiInvocazione.getIdServizio()==null ||
  162.                 datiInvocazione.getIdServizio().getSoggettoErogatore()==null ||
  163.                 datiInvocazione.getIdServizio().getSoggettoErogatore().getTipo()==null ||
  164.                 datiInvocazione.getIdServizio().getSoggettoErogatore().getNome()==null ||
  165.                 datiInvocazione.getIdServizio().getTipo()==null ||
  166.                 datiInvocazione.getIdServizio().getNome() == null){
  167.             throw new AutorizzazioneException("DatiServizio non disponibile; risorsa richiesta dall'autorizzazione");
  168.         }
  169.         String tipoSoggettoErogatore = datiInvocazione.getIdServizio().getSoggettoErogatore().getTipo();
  170.         String nomeSoggettoErogatore = datiInvocazione.getIdServizio().getSoggettoErogatore().getNome();
  171.         String tipoServizio = datiInvocazione.getIdServizio().getTipo();
  172.         String nomeServizio = datiInvocazione.getIdServizio().getNome();
  173.         String azione = datiInvocazione.getIdServizio().getAzione() != null ? datiInvocazione.getIdServizio().getAzione() : "";

  174.         DatiInvocazionePortaDelegata datiPD = null;
  175.         if(datiInvocazione instanceof DatiInvocazionePortaDelegata){
  176.             datiPD = (DatiInvocazionePortaDelegata) datiInvocazione;
  177.         }

  178.         DatiInvocazionePortaApplicativa datiPA = null;
  179.         if(datiInvocazione instanceof DatiInvocazionePortaApplicativa){
  180.             datiPA = (DatiInvocazionePortaApplicativa) datiInvocazione;
  181.         }
  182.    
  183.         PdDContext pddContext = datiInvocazione.getPddContext();
  184.        
  185.         InformazioniToken informazioniTokenNormalizzate = null;
  186.         InformazioniTokenUserInfo informazioniTokenUserInfoNormalizzate = null;
  187.         Map<String, Serializable> jwtClaims = null;
  188.         Map<String, Serializable> introspectionClaims = null;
  189.         Map<String, Serializable> userInfoClaims = null;
  190.         Object oInformazioniTokenNormalizzate = pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
  191.         if(oInformazioniTokenNormalizzate!=null) {
  192.             informazioniTokenNormalizzate = (InformazioniToken) oInformazioniTokenNormalizzate;
  193.             informazioniTokenUserInfoNormalizzate = informazioniTokenNormalizzate.getUserInfo();
  194.         }
  195.         Object oTmp = pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_ESITO_VALIDAZIONE);
  196.         if(oTmp!=null) {
  197.             EsitoGestioneToken esito = (EsitoGestioneToken) oTmp;
  198.             if(esito.getInformazioniToken()!=null &&
  199.                     esito.getInformazioniToken().getClaims()!=null &&
  200.                     esito.getInformazioniToken().getClaims().size()>0) {
  201.                 jwtClaims = esito.getInformazioniToken().getClaims();
  202.             }
  203.         }
  204.         oTmp = pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_ESITO_INTROSPECTION);
  205.         if(oTmp!=null) {
  206.             EsitoGestioneToken esito = (EsitoGestioneToken) oTmp;
  207.             if(esito.getInformazioniToken()!=null &&
  208.                     esito.getInformazioniToken().getClaims()!=null &&
  209.                     esito.getInformazioniToken().getClaims().size()>0) {
  210.                 introspectionClaims = esito.getInformazioniToken().getClaims();
  211.             }
  212.         }
  213.         oTmp = pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_ESITO_USER_INFO);
  214.         if(oTmp!=null) {
  215.             EsitoGestioneToken esito = (EsitoGestioneToken) oTmp;
  216.             if(esito.getInformazioniToken()!=null &&
  217.                     esito.getInformazioniToken().getClaims()!=null &&
  218.                     esito.getInformazioniToken().getClaims().size()>0) {
  219.                 userInfoClaims = esito.getInformazioniToken().getClaims();
  220.             }
  221.         }
  222.         List<String> tokenRoles = null;
  223.         if(informazioniTokenNormalizzate!=null) {
  224.             tokenRoles = informazioniTokenNormalizzate.getRoles();
  225.         }
  226.        
  227.         List<String> attributeNames = null;
  228.         Map<String, Serializable> attributes = null;
  229.         boolean multipleAA = false;
  230.         InformazioniAttributi informazioniAttributiNormalizzati = null;
  231.         Object oInformazioniAttributiNormalizzati = pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_ATTRIBUTI_INFORMAZIONI_NORMALIZZATE);
  232.         if(oInformazioniAttributiNormalizzati!=null) {
  233.             informazioniAttributiNormalizzati = (InformazioniAttributi) oInformazioniAttributiNormalizzati;
  234.         }
  235.         if(informazioniAttributiNormalizzati!=null) {
  236.             attributeNames = informazioniAttributiNormalizzati.getAttributesNames();
  237.             attributes = informazioniAttributiNormalizzati.getAttributes();
  238.             multipleAA = informazioniAttributiNormalizzati.isMultipleAttributeAuthorities()!=null &&
  239.                     informazioniAttributiNormalizzati.isMultipleAttributeAuthorities().getValue()!=null &&
  240.                     informazioniAttributiNormalizzati.isMultipleAttributeAuthorities().getValue();
  241.         }

  242.         Map<String, String> apiImplConfig = readConfig(pddContext, org.openspcoop2.core.constants.Costanti.PROPRIETA_CONFIGURAZIONE);
  243.         Map<String, String> applicativoConfig = readConfig(pddContext, org.openspcoop2.core.constants.Costanti.PROPRIETA_APPLICATIVO);
  244.         Map<String, String> soggettoFruitoreConfig = readConfig(pddContext, org.openspcoop2.core.constants.Costanti.PROPRIETA_SOGGETTO_FRUITORE);
  245.         Map<String, String> soggettoErogatoreConfig = readConfig(pddContext, org.openspcoop2.core.constants.Costanti.PROPRIETA_SOGGETTO_EROGATORE);
  246.                        
  247.         HttpServletRequest httpServletRequest = null;
  248.         if(checkRuoloEsterno){
  249.             if(datiInvocazione.getInfoConnettoreIngresso().getUrlProtocolContext().getHttpServletRequest()==null){
  250.                 if(tokenRoles==null) {
  251.                     throw new AutorizzazioneException("HttpServletRequest non disponibile; risorsa richiesta dall'autorizzazione");
  252.                 }
  253.             }
  254.             httpServletRequest = datiInvocazione.getInfoConnettoreIngresso().getUrlProtocolContext().getHttpServletRequest();
  255.         }

  256.        


  257.         // Action

  258.         String azioneId = urlProtocolContext.getRequestURI();
  259.         xacmlRequest.addAction(azioneId); // namespace standard xacml

  260.         xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_PROVIDER_ATTRIBUTE_ID, tipoSoggettoErogatore+"/"+nomeSoggettoErogatore);
  261.         if(soggettoErogatoreConfig!=null && !soggettoErogatoreConfig.isEmpty()) {
  262.             Iterator<String> keys = soggettoErogatoreConfig.keySet().iterator();
  263.             while (keys.hasNext()) {
  264.                 String key = (String) keys.next();
  265.                 String value = soggettoErogatoreConfig.get(key);
  266.                 xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_PROVIDER_CONFIG_ATTRIBUTE_PREFIX+key, value);
  267.             }
  268.         }

  269.         xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_SERVICE_ATTRIBUTE_ID, tipoServizio+"/"+nomeServizio);  
  270.         if(apiImplConfig!=null && !apiImplConfig.isEmpty()) {
  271.             Iterator<String> keys = apiImplConfig.keySet().iterator();
  272.             while (keys.hasNext()) {
  273.                 String key = (String) keys.next();
  274.                 String value = apiImplConfig.get(key);
  275.                 xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_SERVICE_CONFIG_ATTRIBUTE_PREFIX+key, value);
  276.             }
  277.         }

  278.         if(azione!=null){
  279.             xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_ACTION_ATTRIBUTE_ID, azione);
  280.         }

  281.         xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_URL_ATTRIBUTE_ID, urlProtocolContext.getRequestURI());      

  282.         if(urlProtocolContext.getParameters()!=null && urlProtocolContext.getParameters().size()>0){
  283.             Iterator<String> keys = urlProtocolContext.getParameters().keySet().iterator();
  284.             while (keys.hasNext()) {
  285.                 String key = (String) keys.next();
  286.                 List<String> values = urlProtocolContext.getParameterValues(key);
  287.                 if(key!=null && !key.contains(" ") && values!=null && !values.isEmpty()){
  288.                     if(values.size()==1) {
  289.                         xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_URL_PARAMETER_ATTRIBUTE_ID+key, values.get(0));
  290.                     }
  291.                     else {
  292.                         xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_URL_PARAMETER_ATTRIBUTE_ID+key, values);
  293.                     }
  294.                 }
  295.             }
  296.         }

  297.         if(urlProtocolContext.getHeaders()!=null && urlProtocolContext.getHeaders().size()>0){
  298.             Iterator<String> keys = urlProtocolContext.getHeaders().keySet().iterator();
  299.             while (keys.hasNext()) {
  300.                 String key = (String) keys.next();
  301.                 List<String> values = urlProtocolContext.getHeaderValues(key);
  302.                 if(key!=null && !key.contains(" ") && values!=null && !values.isEmpty()){
  303.                     if(values.size()==1) {
  304.                         xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_TRANSPORT_HEADER_ATTRIBUTE_ID+key, values.get(0));
  305.                     }
  306.                     else {
  307.                         xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_TRANSPORT_HEADER_ATTRIBUTE_ID+key, values);
  308.                     }
  309.                 }
  310.             }
  311.         }

  312.         if(urlProtocolContext.getFunction()!=null){
  313.             xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_PDD_SERVICE_ATTRIBUTE_ID, urlProtocolContext.getFunction());    
  314.         }

  315.         if(datiInvocazione.getInfoConnettoreIngresso().getSoapAction()!=null){
  316.             xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_SOAP_ACTION_ATTRIBUTE_ID, datiInvocazione.getInfoConnettoreIngresso().getSoapAction());      
  317.         }

  318.         if(protocolFactory!=null){
  319.             xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_PROTOCOL_ATTRIBUTE_ID, protocolFactory.getProtocol());      
  320.         }
  321.        
  322.         if(informazioniTokenNormalizzate!=null) {
  323.             if(informazioniTokenNormalizzate.getAud()!=null) {
  324.                 xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_TOKEN_AUDIENCE_ATTRIBUTE_ID, informazioniTokenNormalizzate.getAud());
  325.             }
  326.             if(informazioniTokenNormalizzate.getScopes()!=null && informazioniTokenNormalizzate.getScopes().size()>0) {
  327.                 xacmlRequest.addActionAttribute(XACMLCostanti.XACML_REQUEST_ACTION_TOKEN_SCOPE_ATTRIBUTE_ID, informazioniTokenNormalizzate.getScopes());
  328.             }
  329.         }
  330.        
  331.         if(jwtClaims!=null && jwtClaims.size()>0) {
  332.             Iterator<?> it = jwtClaims.keySet().iterator();
  333.             while (it.hasNext()) {
  334.                 String key = (String) it.next();
  335.                 Object value = jwtClaims.get(key);
  336.                 key = normalizeKeyClaim(key);
  337.                 setActionAttribute(xacmlRequest, value,
  338.                         XACMLCostanti.XACML_REQUEST_ACTION_TOKEN_JWT_CLAIMS_PREFIX+key);
  339.             }
  340.         }
  341.        
  342.         if(introspectionClaims!=null && introspectionClaims.size()>0) {
  343.             Iterator<?> it = introspectionClaims.keySet().iterator();
  344.             while (it.hasNext()) {
  345.                 String key = (String) it.next();
  346.                 Object value = introspectionClaims.get(key);
  347.                 key = normalizeKeyClaim(key);
  348.                 setActionAttribute(xacmlRequest, value,
  349.                         XACMLCostanti.XACML_REQUEST_ACTION_TOKEN_INTROSPECTION_CLAIMS_PREFIX+key);
  350.             }
  351.         }

  352.        

  353.         // Subject

  354.         String nomeServizioApplicativo = null;
  355.         IDSoggetto soggettoFruitore = null;
  356.         if(datiPD!=null){
  357.             if(datiPD.getIdServizioApplicativo()!=null){
  358.                 nomeServizioApplicativo = datiPD.getIdServizioApplicativo().getNome();
  359.                 soggettoFruitore = datiPD.getIdServizioApplicativo().getIdSoggettoProprietario();
  360.             }
  361.             else if(datiPD.getIdPD()!=null && datiPD.getIdPD().getIdentificativiFruizione()!=null &&
  362.                     datiPD.getIdPD().getIdentificativiFruizione().getSoggettoFruitore()!=null){
  363.                 soggettoFruitore = datiPD.getIdPD().getIdentificativiFruizione().getSoggettoFruitore();
  364.             }
  365.         }
  366.         else if(datiPA!=null){
  367.             if(datiPA.getIdSoggettoFruitore()!=null){
  368.                 soggettoFruitore = datiPA.getIdSoggettoFruitore();
  369.             }
  370.             if(datiPA.getIdentitaServizioApplicativoFruitore()!=null){
  371.                 nomeServizioApplicativo = datiPA.getIdentitaServizioApplicativoFruitore().getNome();
  372.                 if(soggettoFruitore==null){
  373.                     soggettoFruitore = datiPA.getIdentitaServizioApplicativoFruitore().getIdSoggettoProprietario();
  374.                 }
  375.             }
  376.         }
  377.        
  378.         String credential = null;
  379.         TipoAutenticazione autenticazione = null;
  380.         if(datiPD!=null){
  381.             if(datiPD.getPd()!=null){
  382.                 autenticazione = TipoAutenticazione.toEnumConstant(datiPD.getPd().getAutenticazione());
  383.             }
  384.         }
  385.         else if(datiPA!=null){
  386.             if(datiPA.getPa()!=null){
  387.                 autenticazione = TipoAutenticazione.toEnumConstant(datiPA.getPa().getAutenticazione());
  388.             }
  389.         }
  390.         if(datiInvocazione.getInfoConnettoreIngresso().getCredenziali()!=null){
  391.            
  392.             if(autenticazione!=null){
  393.                 if(TipoAutenticazione.BASIC.equals(autenticazione)){
  394.                     if(datiInvocazione.getInfoConnettoreIngresso().getCredenziali().getUsername()!=null){
  395.                         credential = datiInvocazione.getInfoConnettoreIngresso().getCredenziali().getUsername();
  396.                     }
  397.                 }
  398.                 else if(TipoAutenticazione.SSL.equals(autenticazione)){
  399.                     if(datiInvocazione.getInfoConnettoreIngresso().getCredenziali().getSubject()!=null){
  400.                         credential = datiInvocazione.getInfoConnettoreIngresso().getCredenziali().getSubject();
  401.                     }
  402.                 }
  403.                 else if(TipoAutenticazione.PRINCIPAL.equals(autenticazione)){
  404.                     if(datiInvocazione.getInfoConnettoreIngresso().getCredenziali().getPrincipal()!=null){
  405.                         credential = datiInvocazione.getInfoConnettoreIngresso().getCredenziali().getPrincipal();
  406.                     }
  407.                 }
  408.             }
  409.                        
  410.             if(credential == null){
  411.                 if(datiInvocazione.getInfoConnettoreIngresso().getCredenziali().getPrincipal()!=null){
  412.                     credential = datiInvocazione.getInfoConnettoreIngresso().getCredenziali().getPrincipal();
  413.                 }
  414.                 else if(datiInvocazione.getInfoConnettoreIngresso().getCredenziali().getSubject()!=null){
  415.                     credential = datiInvocazione.getInfoConnettoreIngresso().getCredenziali().getSubject();
  416.                 }
  417.                 else if(datiInvocazione.getInfoConnettoreIngresso().getCredenziali().getUsername()!=null){
  418.                     credential = datiInvocazione.getInfoConnettoreIngresso().getCredenziali().getUsername();
  419.                 }
  420.             }
  421.         }
  422.        
  423.         List<String> roles = new ArrayList<>();
  424.         if(checkRuoloRegistro){
  425.             if(datiPD!=null){
  426.                 if(datiPD.getServizioApplicativo()==null && !checkRuoloEsterno &&
  427.                         informazioniTokenNormalizzate==null){
  428.                     throw new AutorizzazioneException("Identità servizio applicativo non disponibile; tale informazione è richiesta dall'autorizzazione");
  429.                 }
  430.                 if(datiPD.getServizioApplicativo()!=null) {
  431.                     if(datiPD.getServizioApplicativo().getInvocazionePorta()!=null &&
  432.                             datiPD.getServizioApplicativo().getInvocazionePorta().getRuoli()!=null &&
  433.                             datiPD.getServizioApplicativo().getInvocazionePorta().getRuoli().sizeRuoloList()>0){
  434.                         for (int i = 0; i < datiPD.getServizioApplicativo().getInvocazionePorta().getRuoli().sizeRuoloList(); i++) {
  435.                             roles.add(datiPD.getServizioApplicativo().getInvocazionePorta().getRuoli().getRuolo(i).getNome());
  436.                         }
  437.                     }
  438.                 }
  439.             }
  440.             else if(datiPA!=null){
  441.                 if(datiPA.getSoggettoFruitore()==null && !checkRuoloEsterno &&
  442.                         informazioniTokenNormalizzate==null){
  443.                     throw new AutorizzazioneException("Identità soggetto fruitore non disponibile; tale informazione è richiesta dall'autorizzazione");
  444.                 }
  445.                 if(datiPA.getSoggettoFruitore()!=null) {
  446.                     if(datiPA.getSoggettoFruitore().getRuoli()!=null &&
  447.                             datiPA.getSoggettoFruitore().getRuoli().sizeRuoloList()>0){
  448.                         for (int i = 0; i < datiPA.getSoggettoFruitore().getRuoli().sizeRuoloList(); i++) {
  449.                             roles.add(datiPA.getSoggettoFruitore().getRuoli().getRuolo(i).getNome());
  450.                         }
  451.                     }
  452.                 }
  453.             }
  454.         }
  455.         if(checkRuoloEsterno){
  456.             try{
  457.                 FiltroRicercaRuoli filtroRicerca = new FiltroRicercaRuoli();
  458.                 if(datiPD!=null){
  459.                     filtroRicerca.setContesto(RuoloContesto.PORTA_DELEGATA);
  460.                 }
  461.                 else if(datiPA!=null){
  462.                     filtroRicerca.setContesto(RuoloContesto.PORTA_APPLICATIVA);
  463.                 }
  464.                 filtroRicerca.setTipologia(RuoloTipologia.ESTERNO);
  465.                 RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(datiInvocazione.getState());
  466.                 List<IDRuolo> list = registroServiziManager.getAllIdRuoli(filtroRicerca, null);
  467.                 if(list==null || list.size()<=0){
  468.                     throw new DriverRegistroServiziNotFound();
  469.                 }
  470.                 for (IDRuolo idRuolo : list) {
  471.                     String nomeRuoloDaVerificare = idRuolo.getNome();
  472.                     try {
  473.                         Ruolo ruoloRegistro = registroServiziManager.getRuolo(idRuolo.getNome(), null, datiInvocazione.getRequestInfo());
  474.                         if(ruoloRegistro.getNomeEsterno()!=null && !"".equals(ruoloRegistro.getNomeEsterno())) {
  475.                             nomeRuoloDaVerificare = ruoloRegistro.getNomeEsterno();
  476.                         }
  477.                     }catch(Exception e) {
  478.                         throw new Exception("Recupero del ruolo '"+idRuolo.getNome()+"' fallito: "+e.getMessage(),e);
  479.                     }
  480.                     if(httpServletRequest.isUserInRole(nomeRuoloDaVerificare)){
  481.                         roles.add(idRuolo.getNome()); // nella xacml policy comunque inserisco l'identificativo del ruolo nel registro della PdD
  482.                     }
  483.                 }
  484.                 if(tokenRoles!=null && tokenRoles.size()>0) {
  485.                     roles.addAll(tokenRoles);
  486.                 }
  487.             }
  488.             catch(DriverRegistroServiziNotFound notFound){
  489.                 if(!checkRuoloRegistro) {
  490.                     throw new AutorizzazioneException("Non sono stati registrati ruoli utilizzabili con un'autorizzazione esterna");
  491.                 }
  492.             }
  493.             catch(Exception e){
  494.                 throw new AutorizzazioneException("E' avvenuto un errore durante la ricerca dei ruoli: "+e.getMessage(),e);
  495.             }
  496.         }
  497.        
  498.         oTmp = pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_APPLICATIVO_TOKEN);
  499.         IDServizioApplicativo idApplicativoToken = null;
  500.         Map<String, String> applicativoTokenConfig = null;
  501.         Map<String, String> soggettoProprietarioApplicativoTokenConfig = null;
  502.         List<String> applicativoTokenRoles = new ArrayList<>();
  503.         if(oTmp!=null && oTmp instanceof IDServizioApplicativo) {
  504.             idApplicativoToken = (IDServizioApplicativo) oTmp;
  505.             applicativoTokenConfig = readConfig(pddContext, org.openspcoop2.core.constants.Costanti.PROPRIETA_APPLICATIVO_TOKEN);
  506.             soggettoProprietarioApplicativoTokenConfig = readConfig(pddContext, org.openspcoop2.core.constants.Costanti.PROPRIETA_SOGGETTO_PROPRIETARIO_APPLICATIVO_TOKEN);
  507.            
  508.             ServizioApplicativo saToken = null;
  509.             if(checkRuoloRegistro || checkRuoloEsterno) {
  510.                 try {
  511.                     saToken = ConfigurazionePdDManager.getInstance().getServizioApplicativo(idApplicativoToken, datiInvocazione.getRequestInfo());
  512.                 }catch(DriverConfigurazioneNotFound notFound) {}
  513.                 catch(Exception e){
  514.                     throw new AutorizzazioneException("E' avvenuto un errore durante la ricerca dell'applicativo token '"+idApplicativoToken+"': "+e.getMessage(),e);
  515.                 }
  516.             }
  517.             if(checkRuoloRegistro){
  518.                 if(saToken!=null) {
  519.                     if(saToken.getInvocazionePorta()!=null &&
  520.                             saToken.getInvocazionePorta().getRuoli()!=null &&
  521.                                     saToken.getInvocazionePorta().getRuoli().sizeRuoloList()>0){
  522.                         for (int i = 0; i < saToken.getInvocazionePorta().getRuoli().sizeRuoloList(); i++) {
  523.                             applicativoTokenRoles.add(saToken.getInvocazionePorta().getRuoli().getRuolo(i).getNome());
  524.                         }
  525.                     }
  526.                 }
  527.             }
  528.         }
  529.         if(checkRuoloEsterno && informazioniTokenNormalizzate!=null && tokenRoles!=null &&
  530.                 !tokenRoles.isEmpty()){
  531.             try{
  532.                 FiltroRicercaRuoli filtroRicerca = new FiltroRicercaRuoli();
  533.                 if(datiPD!=null){
  534.                     filtroRicerca.setContesto(RuoloContesto.PORTA_DELEGATA);
  535.                 }
  536.                 else if(datiPA!=null){
  537.                     filtroRicerca.setContesto(RuoloContesto.PORTA_APPLICATIVA);
  538.                 }
  539.                 filtroRicerca.setTipologia(RuoloTipologia.ESTERNO);
  540.                 RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(datiInvocazione.getState());
  541.                 List<IDRuolo> list = registroServiziManager.getAllIdRuoli(filtroRicerca, null);
  542.                 if(list==null || list.size()<=0){
  543.                     throw new DriverRegistroServiziNotFound();
  544.                 }
  545.                 for (IDRuolo idRuolo : list) {
  546.                     String nomeRuoloDaVerificare = idRuolo.getNome();
  547.                     try {
  548.                         Ruolo ruoloRegistro = registroServiziManager.getRuolo(idRuolo.getNome(), null, datiInvocazione.getRequestInfo());
  549.                         if(ruoloRegistro.getNomeEsterno()!=null && !"".equals(ruoloRegistro.getNomeEsterno())) {
  550.                             nomeRuoloDaVerificare = ruoloRegistro.getNomeEsterno();
  551.                         }
  552.                     }catch(Exception e) {
  553.                         throw new Exception("Recupero del ruolo '"+idRuolo.getNome()+"' fallito: "+e.getMessage(),e);
  554.                     }
  555.                     if(informazioniTokenNormalizzate.getRoles().contains(nomeRuoloDaVerificare)) {
  556.                         applicativoTokenRoles.add(idRuolo.getNome()); // nella xacml policy comunque inserisco l'identificativo del ruolo nel registro della PdD
  557.                     }
  558.                 }
  559.                 for (String role : tokenRoles) {
  560.                     if(!applicativoTokenRoles.contains(role)) {
  561.                         applicativoTokenRoles.addAll(tokenRoles); // inserisco anche i nomi originali
  562.                     }
  563.                 }
  564.             }
  565.             catch(DriverRegistroServiziNotFound notFound){
  566.                 if(!checkRuoloRegistro) {
  567.                     throw new AutorizzazioneException("Non sono stati registrati ruoli utilizzabili con un'autorizzazione esterna");
  568.                 }
  569.             }
  570.             catch(Exception e){
  571.                 throw new AutorizzazioneException("E' avvenuto un errore durante la ricerca dei ruoli: "+e.getMessage(),e);
  572.             }
  573.         }

  574.         if(soggettoFruitore!=null){
  575.             String subjectId = soggettoFruitore.toString();
  576.             if(nomeServizioApplicativo!=null){
  577.                 subjectId = nomeServizioApplicativo + "." +subjectId;
  578.             }
  579.             xacmlRequest.addSubject(subjectId); // namespace standard xacml
  580.         }
  581.         else if(credential!=null){
  582.             String subjectId = credential;
  583.             xacmlRequest.addSubject(subjectId); // namespace standard xacml
  584.         }

  585.         if(soggettoFruitore!=null){
  586.             xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_ORGANIZATION_ATTRIBUTE_ID, soggettoFruitore.toString());
  587.         }
  588.         if(soggettoFruitoreConfig!=null && !soggettoFruitoreConfig.isEmpty()) {
  589.             Iterator<String> keys = soggettoFruitoreConfig.keySet().iterator();
  590.             while (keys.hasNext()) {
  591.                 String key = (String) keys.next();
  592.                 String value = soggettoFruitoreConfig.get(key);
  593.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_ORGANIZATION_CONFIG_ATTRIBUTE_PREFIX+key, value);
  594.             }
  595.         }
  596.        
  597.         if(nomeServizioApplicativo!=null){
  598.             xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_CLIENT_ATTRIBUTE_ID, nomeServizioApplicativo);
  599.         }
  600.         if(applicativoConfig!=null && !applicativoConfig.isEmpty()) {
  601.             Iterator<String> keys = applicativoConfig.keySet().iterator();
  602.             while (keys.hasNext()) {
  603.                 String key = (String) keys.next();
  604.                 String value = applicativoConfig.get(key);
  605.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_CLIENT_CONFIG_ATTRIBUTE_PREFIX+key, value);
  606.             }
  607.         }
  608.        
  609.         if(credential!=null){
  610.             xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_CREDENTIAL_ATTRIBUTE_ID, credential);
  611.         }
  612.        
  613.         if(roles!=null && roles.size()>0){
  614.             xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_ROLE_ATTRIBUTE_ID, roles);
  615.         }
  616.                
  617.         if(informazioniTokenUserInfoNormalizzate!=null) {
  618.             if(informazioniTokenUserInfoNormalizzate.getFullName()!=null) {
  619.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_USER_INFO_FULL_NAME_ATTRIBUTE_ID, informazioniTokenUserInfoNormalizzate.getFullName());
  620.             }
  621.             if(informazioniTokenUserInfoNormalizzate.getFirstName()!=null) {
  622.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_USER_INFO_FIRST_NAME_ATTRIBUTE_ID, informazioniTokenUserInfoNormalizzate.getFirstName());
  623.             }
  624.             if(informazioniTokenUserInfoNormalizzate.getMiddleName()!=null) {
  625.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_USER_INFO_MIDDLE_NAME_ATTRIBUTE_ID, informazioniTokenUserInfoNormalizzate.getMiddleName());
  626.             }
  627.             if(informazioniTokenUserInfoNormalizzate.getFamilyName()!=null) {
  628.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_USER_INFO_FAMILY_NAME_ATTRIBUTE_ID, informazioniTokenUserInfoNormalizzate.getFamilyName());
  629.             }
  630.             if(informazioniTokenUserInfoNormalizzate.getEMail()!=null) {
  631.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_USER_INFO_EMAIL_NAME_ATTRIBUTE_ID, informazioniTokenUserInfoNormalizzate.getEMail());
  632.             }
  633.         }
  634.         if(informazioniTokenNormalizzate!=null) {
  635.             if(informazioniTokenNormalizzate.getIss()!=null) {
  636.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_TOKEN_ISSUER_ATTRIBUTE_ID, informazioniTokenNormalizzate.getIss());
  637.             }
  638.             if(informazioniTokenNormalizzate.getSub()!=null) {
  639.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_TOKEN_SUBJECT_ATTRIBUTE_ID, informazioniTokenNormalizzate.getSub());
  640.             }
  641.             if(informazioniTokenNormalizzate.getUsername()!=null) {
  642.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_TOKEN_USERNAME_ATTRIBUTE_ID, informazioniTokenNormalizzate.getUsername());
  643.             }
  644.             if(informazioniTokenNormalizzate.getClientId()!=null) {
  645.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_TOKEN_CLIENT_ID_ATTRIBUTE_ID, informazioniTokenNormalizzate.getClientId());
  646.             }
  647.         }
  648.        
  649.         if(userInfoClaims!=null && userInfoClaims.size()>0) {
  650.             Iterator<?> it = userInfoClaims.keySet().iterator();
  651.             while (it.hasNext()) {
  652.                 String key = (String) it.next();
  653.                 Object value = userInfoClaims.get(key);
  654.                 key = normalizeKeyClaim(key);
  655.                 setSubjectAttribute(xacmlRequest, value,
  656.                         XACMLCostanti.XACML_REQUEST_SUBJECT_TOKEN_USERINFO_CLAIMS_PREFIX+key);
  657.             }
  658.         }
  659.        
  660.         if(attributeNames!=null && !attributeNames.isEmpty()) {
  661.             setSubjectAttribute(xacmlRequest, attributeNames,
  662.                     XACMLCostanti.XACML_REQUEST_SUBJECT_ATTRIBUTE_ATTRIBUTE_NAMES_ID);
  663.         }
  664.         if(attributes!=null && attributes.size()>0){
  665.             addAttributes(xacmlRequest, attributes, multipleAA);
  666.         }
  667.        
  668.         if(idApplicativoToken!=null) {
  669.             if(idApplicativoToken.getNome()!=null) {
  670.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_TOKEN_CLIENT_APPLICATION_ATTRIBUTE_ID, idApplicativoToken.getNome());
  671.             }
  672.             if(applicativoTokenConfig!=null && !applicativoTokenConfig.isEmpty()) {
  673.                 Iterator<String> keys = applicativoTokenConfig.keySet().iterator();
  674.                 while (keys.hasNext()) {
  675.                     String key = (String) keys.next();
  676.                     String value = applicativoTokenConfig.get(key);
  677.                     xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_TOKEN_CLIENT_CONFIG_ATTRIBUTE_PREFIX+key, value);
  678.                 }
  679.             }
  680.            
  681.             if(idApplicativoToken.getIdSoggettoProprietario()!=null) {
  682.                 xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_TOKEN_CLIENT_ORGANIZATION_ATTRIBUTE_ID, idApplicativoToken.getIdSoggettoProprietario().toString());
  683.             }
  684.             if(soggettoProprietarioApplicativoTokenConfig!=null && !soggettoProprietarioApplicativoTokenConfig.isEmpty()) {
  685.                 Iterator<String> keys = soggettoProprietarioApplicativoTokenConfig.keySet().iterator();
  686.                 while (keys.hasNext()) {
  687.                     String key = (String) keys.next();
  688.                     String value = soggettoProprietarioApplicativoTokenConfig.get(key);
  689.                     xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_TOKEN_CLIENT_ORGANIZATION_CONFIG_ATTRIBUTE_PREFIX+key, value);
  690.                 }
  691.             }
  692.            
  693.         }
  694.        
  695.         if(applicativoTokenRoles!=null && applicativoTokenRoles.size()>0){
  696.             xacmlRequest.addSubjectAttribute(XACMLCostanti.XACML_REQUEST_SUBJECT_TOKEN_CLIENT_ROLE_ATTRIBUTE_ID, applicativoTokenRoles);
  697.         }

  698.        
  699.        
  700.         // Environment
  701.        
  702.         xacmlRequest.createEnvironment();
  703.        
  704.        
  705.        
  706.         // Resource
  707.        
  708.         //solo in caso di pdp locale inizializzo la resource __resource_id___ con il nome del servizio in modo da consentire l'identificazione della policy
  709.        
  710.         xacmlRequest.addResourceAttribute(CachedMapBasedSimplePolicyRepository.RESOURCE_ATTRIBUTE_ID_TO_MATCH, policyKey);
  711.        
  712.        
  713.         // Fill XAML
  714.         if(httpServletRequest!=null && httpServletRequest instanceof AutorizzazioneHttpServletRequest) {
  715.             AutorizzazioneHttpServletRequest authHttpServletRequest = (AutorizzazioneHttpServletRequest) httpServletRequest;
  716.             authHttpServletRequest.fillXacmlRequest(xacmlRequest);
  717.         }
  718.        
  719.         return xacmlRequest;


  720.     }
  721.    
  722.     @SuppressWarnings("unchecked")
  723.     private static Map<String,String> readConfig(PdDContext pddContext, MapKey<String> pName){
  724.         Object o = pddContext.getObject(pName);
  725.         if(o!=null && o instanceof Map<?, ?>) {
  726.             return (Map<String, String>) o;
  727.         }
  728.         return null;
  729.     }
  730.    
  731.     private static void addAttributes(XacmlRequest xacmlRequest, Map<String, Serializable> attributesParam, boolean multipleAA) {
  732.         if(attributesParam!=null && !attributesParam.isEmpty()) {
  733.             String logAA = "";
  734.             if(multipleAA) {
  735.                 // informazioni normalizzate, devo scendere di un livello, senno al primo degli attributi ci sono le attribute authority
  736.                 for (String attrAuthName : attributesParam.keySet()) {
  737.                     Object o = attributesParam.get(attrAuthName);
  738.                     if(o instanceof Map) {
  739.                         try {
  740.                             List<String> attributesNames = new ArrayList<>();
  741.                             @SuppressWarnings("unchecked")
  742.                             Map<String, Serializable> attributes = (Map<String, Serializable>) o;
  743.                             if(attributes!=null && !attributes.isEmpty()) {
  744.                                 for (String attrName : attributes.keySet()) {
  745.                                     if(!attributesNames.contains(attrName)) {
  746.                                         attributesNames.add(attrName);
  747.                                     }
  748.                                 }
  749.                             }
  750.                             Collections.sort(attributesNames);
  751.                             String xacmlIdPrefix = XACMLCostanti.XACML_REQUEST_SUBJECT_ATTRIBUTE_AUTHORITY_ATTRIBUTE_PREFIX+
  752.                                     attrAuthName+
  753.                                     XACMLCostanti._XACML_REQUEST_SUBJECT_ATTRIBUTE_ATTRIBUTE_PREFIX;
  754.                             JSONUtils jsonUtils = JSONUtils.getInstance();
  755.                             logAA = " (A.A. "+attrAuthName+")";
  756.                             for (String attributeName : attributesNames) {
  757.                                 addAttribute(xacmlRequest, xacmlIdPrefix, attributes, attributeName,
  758.                                         jsonUtils, logAA);
  759.                             }
  760.                         }catch(Throwable t) {
  761.                             OpenSPCoop2Logger.getLoggerOpenSPCoopCore().error("addAttributes failed (A.A. "+attrAuthName+"): "+t.getMessage(),t);
  762.                         }
  763.                     }
  764.                 }
  765.                
  766.             }
  767.             else {
  768.                 List<String> attributesNames = new ArrayList<>();
  769.                 for (String attrName : attributesParam.keySet()) {
  770.                     attributesNames.add(attrName);
  771.                 }
  772.                 Collections.sort(attributesNames);
  773.                 String xacmlIdPrefix = XACMLCostanti.XACML_REQUEST_SUBJECT_ATTRIBUTE_ATTRIBUTE_PREFIX;
  774.                 JSONUtils jsonUtils = JSONUtils.getInstance();
  775.                 for (String attributeName : attributesNames) {
  776.                     addAttribute(xacmlRequest, xacmlIdPrefix, attributesParam, attributeName,
  777.                             jsonUtils, logAA);
  778.                 }
  779.             }
  780.         }
  781.     }
  782.     private static void addAttribute(XacmlRequest xacmlRequest, String xacmlIdPrefix, Map<String, Serializable> attributes, String attributeName,
  783.             JSONUtils jsonUtils, String logAA) {
  784.         Object oValue = attributes.get(attributeName);
  785.         if(oValue!=null) {
  786.             try {
  787.                 String key = normalizeKeyClaim(attributeName);
  788.                 setSubjectAttribute(xacmlRequest, oValue,
  789.                         xacmlIdPrefix+key);
  790.                
  791. //              //System.out.println("TIPO: "+oValue.getClass().getName());
  792. //              if(oValue instanceof String) {
  793. //                  String value = (String) oValue;
  794. //                  xacmlRequest.addSubjectAttribute(xacmlIdPrefix+attributeName, value);
  795. //              }
  796. //              else if(oValue instanceof List<?>) {
  797. //                  List<?> list = (List<?>) oValue;
  798. //                  if(list!=null && !list.isEmpty()) {
  799. //                      List<String> lValues = new ArrayList<>();
  800. //                      for (Object object : list) {
  801. //                          if(object!=null && object instanceof String) {
  802. //                              lValues.add((String)object);
  803. //                          }
  804. //                      }
  805. //                      if(!lValues.isEmpty()) {
  806. //                          xacmlRequest.addSubjectAttribute(xacmlIdPrefix+attributeName, lValues);
  807. //                      }
  808. //                  }
  809. //              }
  810. //              else {
  811. //                  throw new Exception("type '"+oValue.getClass().getName()+"' unmanaged");
  812. //              }
  813.             }catch(Throwable t) {
  814.                 OpenSPCoop2Logger.getLoggerOpenSPCoopCore().error("addAttribute '"+attributeName+"' failed"+logAA+": "+t.getMessage(),t);
  815.             }
  816.         }
  817.     }
  818.    
  819.     private static String normalizeKeyClaim(String keyParam) {
  820.         String key = keyParam;
  821.         while(key.contains(".")) {
  822.             key = key.replace(".", ":");
  823.         }
  824.         return key;
  825.     }
  826.    
  827.     private static void setActionAttribute(XacmlRequest xacmlRequest, Object value, String claim) {
  828.         setAttribute(xacmlRequest, value, claim, true);
  829.     }
  830.     private static void setSubjectAttribute(XacmlRequest xacmlRequest, Object value, String claim) {
  831.         setAttribute(xacmlRequest, value, claim, false);
  832.     }
  833.     private static void setAttribute(XacmlRequest xacmlRequest, Object value, String claim, boolean action) {
  834.         if(value!=null) {
  835.             List<String> l = TokenUtilities.getClaimValues(value);
  836.             if(l!=null && !l.isEmpty()) {
  837.                 if(l.size()>1) {
  838.                     if(action) {
  839.                         xacmlRequest.addActionAttribute(claim, l);
  840.                     }
  841.                     else {
  842.                         xacmlRequest.addSubjectAttribute(claim, l);
  843.                     }
  844.                 }
  845.                 else {
  846.                     if(action) {
  847.                         xacmlRequest.addActionAttribute(claim, l.get(0));
  848.                     }
  849.                     else {
  850.                         xacmlRequest.addSubjectAttribute(claim, l.get(0));
  851.                     }
  852.                 }
  853.             }
  854.         }
  855.     }

  856. }