InterceptorPolicyUtilities.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.controllo_traffico.policy;

  21. import java.util.ArrayList;
  22. import java.util.List;
  23. import java.util.Map;
  24. import java.util.Properties;

  25. import org.apache.commons.lang.StringUtils;
  26. import org.openspcoop2.core.commons.CoreException;
  27. import org.openspcoop2.core.config.PortaApplicativa;
  28. import org.openspcoop2.core.config.ServizioApplicativo;
  29. import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
  30. import org.openspcoop2.core.constants.Costanti;
  31. import org.openspcoop2.core.constants.TipoPdD;
  32. import org.openspcoop2.core.controllo_traffico.AttivazionePolicyFiltro;
  33. import org.openspcoop2.core.controllo_traffico.AttivazionePolicyRaggruppamento;
  34. import org.openspcoop2.core.controllo_traffico.beans.DatiTransazione;
  35. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
  36. import org.openspcoop2.core.controllo_traffico.constants.RuoloPolicy;
  37. import org.openspcoop2.core.id.IDAccordo;
  38. import org.openspcoop2.core.id.IDPortaApplicativa;
  39. import org.openspcoop2.core.id.IDPortaDelegata;
  40. import org.openspcoop2.core.id.IDServizio;
  41. import org.openspcoop2.core.id.IDServizioApplicativo;
  42. import org.openspcoop2.core.id.IDSoggetto;
  43. import org.openspcoop2.core.registry.AccordoServizioParteComune;
  44. import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
  45. import org.openspcoop2.core.registry.GruppoAccordo;
  46. import org.openspcoop2.core.registry.Soggetto;
  47. import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
  48. import org.openspcoop2.core.registry.driver.IDAccordoFactory;
  49. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  50. import org.openspcoop2.core.transazioni.utils.TipoCredenzialeMittente;
  51. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  52. import org.openspcoop2.pdd.config.CostantiProprieta;
  53. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  54. import org.openspcoop2.pdd.core.CostantiPdD;
  55. import org.openspcoop2.pdd.core.PdDContext;
  56. import org.openspcoop2.pdd.core.handlers.InRequestProtocolContext;
  57. import org.openspcoop2.pdd.core.token.InformazioniToken;
  58. import org.openspcoop2.protocol.engine.SecurityTokenUtilities;
  59. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  60. import org.openspcoop2.protocol.sdk.Context;
  61. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  62. import org.openspcoop2.protocol.sdk.SecurityToken;
  63. import org.openspcoop2.protocol.sdk.state.IState;
  64. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  65. import org.openspcoop2.protocol.sdk.state.URLProtocolContext;
  66. import org.openspcoop2.utils.properties.PropertiesUtilities;
  67. import org.slf4j.Logger;

  68. /**    
  69.  * InterceptorPolicyUtilities
  70.  *
  71.  * @author Poli Andrea (poli@link.it)
  72.  * @author $Author$
  73.  * @version $Rev$, $Date$
  74.  */
  75. public class InterceptorPolicyUtilities {
  76.    
  77.     private InterceptorPolicyUtilities() {}


  78.     public static IDUnivocoGroupByPolicy convertToID(Logger log,DatiTransazione datiTransazione, AttivazionePolicyRaggruppamento policyGroupBy,
  79.             InRequestProtocolContext context) throws Exception{
  80.        
  81.         final String nonDisponibile = "-"; /**"n.d.";*/
  82.        
  83.         IDUnivocoGroupByPolicy groupBy = new IDUnivocoGroupByPolicy();
  84.        
  85.         if(policyGroupBy.isRuoloPorta()){
  86.             groupBy.setRuoloPorta(datiTransazione.getTipoPdD().getTipo());
  87.         }
  88.        
  89.         if(policyGroupBy.isProtocollo()){
  90.             groupBy.setProtocollo(datiTransazione.getProtocollo());
  91.         }
  92.        
  93.         if(policyGroupBy.isFruitore()){
  94.             if(datiTransazione.getSoggettoFruitore()!=null) {
  95.                 groupBy.setFruitore(datiTransazione.getSoggettoFruitore().toString());
  96.             }
  97.             else {
  98.                 groupBy.setFruitore(nonDisponibile);
  99.             }
  100.         }
  101.        
  102.         if(policyGroupBy.isServizioApplicativoFruitore()){
  103.             groupBy.setServizioApplicativoFruitore(datiTransazione.getServizioApplicativoFruitore());
  104.             if(datiTransazione.getIdServizioApplicativoToken()!=null) {
  105.                 groupBy.setServizioApplicativoToken(datiTransazione.getIdServizioApplicativoToken());
  106.             }
  107.         }
  108.                
  109.         if(policyGroupBy.isErogatore()){
  110.             groupBy.setErogatore(datiTransazione.getIdServizio().getSoggettoErogatore().toString());
  111.         }
  112.        
  113.         if(TipoPdD.APPLICATIVA.equals(datiTransazione.getTipoPdD()) &&
  114.             policyGroupBy.isServizioApplicativoErogatore()){
  115.             groupBy.setServizioApplicativoErogatore(datiTransazione.getServiziApplicativiErogatoreAsString());
  116.         }
  117.        
  118.         if(policyGroupBy.isServizio()){
  119.             groupBy.setServizio(datiTransazione.getIdServizio().getTipo()+"/"+datiTransazione.getIdServizio().getNome()+"/"+datiTransazione.getIdServizio().getVersione());
  120.         }
  121.        
  122.         if(policyGroupBy.isAzione()){
  123.             groupBy.setAzione(datiTransazione.getIdServizio().getAzione());
  124.         }
  125.                
  126.         if(policyGroupBy.isInformazioneApplicativaEnabled()){
  127.             String valorePresente = PolicyFiltroApplicativoUtilities.getValore(log, policyGroupBy.getInformazioneApplicativaTipo(),
  128.                     policyGroupBy.getInformazioneApplicativaNome(),
  129.                     context, datiTransazione, false);
  130.             if(valorePresente==null){
  131.                 valorePresente = nonDisponibile;
  132.             }
  133.             groupBy.setTipoKey(policyGroupBy.getInformazioneApplicativaTipo());
  134.             groupBy.setNomeKey(policyGroupBy.getInformazioneApplicativaNome());
  135.             groupBy.setValoreKey(valorePresente);
  136.         }
  137.        
  138.         if(policyGroupBy.isIdentificativoAutenticato()){
  139.             groupBy.setIdentificativoAutenticato(datiTransazione.getIdentificativoAutenticato()!=null ? datiTransazione.getIdentificativoAutenticato() : nonDisponibile);
  140.         }
  141.        
  142.         if(policyGroupBy.getToken()!=null){
  143.             String [] token = null;
  144.             if(policyGroupBy.getToken().contains(",")) {
  145.                 token = policyGroupBy.getToken().split(",");
  146.             }
  147.             else {
  148.                 token = new String[] {policyGroupBy.getToken()};
  149.             }
  150.             if(token!=null && token.length>0) {
  151.                 for (int i = 0; i < token.length; i++) {
  152.                     TipoCredenzialeMittente claim = TipoCredenzialeMittente.toEnumConstant(token[i], true);
  153.                     switch (claim) {
  154.                     case TOKEN_SUBJECT:
  155.                         if(datiTransazione.getTokenSubject()!=null) {
  156.                             groupBy.setTokenSubject(datiTransazione.getTokenSubject());
  157.                         }
  158.                         else {
  159.                             groupBy.setTokenSubject(nonDisponibile);
  160.                         }
  161.                         break;
  162.                     case TOKEN_ISSUER:
  163.                         if(datiTransazione.getTokenIssuer()!=null) {
  164.                             groupBy.setTokenIssuer(datiTransazione.getTokenIssuer());
  165.                         }
  166.                         else {
  167.                             groupBy.setTokenIssuer(nonDisponibile);
  168.                         }
  169.                         break;
  170.                     case TOKEN_CLIENT_ID:
  171.                         if(datiTransazione.getTokenClientId()!=null) {
  172.                             groupBy.setTokenClientId(datiTransazione.getTokenClientId());
  173.                         }
  174.                         else {
  175.                             groupBy.setTokenClientId(nonDisponibile);
  176.                         }
  177.                         break;
  178.                     case TOKEN_USERNAME:
  179.                         if(datiTransazione.getTokenUsername()!=null) {
  180.                             groupBy.setTokenUsername(datiTransazione.getTokenUsername());
  181.                         }
  182.                         else {
  183.                             groupBy.setTokenUsername(nonDisponibile);
  184.                         }
  185.                         break;
  186.                     case TOKEN_EMAIL:
  187.                         if(datiTransazione.getTokenEMail()!=null) {
  188.                             groupBy.setTokenEMail(datiTransazione.getTokenEMail());
  189.                         }
  190.                         else {
  191.                             groupBy.setTokenEMail(nonDisponibile);
  192.                         }
  193.                         break;
  194.                     case PDND_ORGANIZATION_NAME:
  195.                         if(datiTransazione.getPdndOrganizationName()!=null && StringUtils.isNotEmpty(datiTransazione.getPdndOrganizationName())) {
  196.                             groupBy.setPdndOrganizationName(datiTransazione.getPdndOrganizationName());
  197.                         }
  198.                         else {
  199.                             if(abortTransactionPdndOrganizationName(log, context.getPddContext())) {
  200.                                 throw new CoreException("PDND Organization name not available");
  201.                             }
  202.                             else {
  203.                                 groupBy.setPdndOrganizationName(nonDisponibile);
  204.                             }
  205.                         }
  206.                         break;
  207.                     default:
  208.                         break;
  209.                     }
  210.                 }
  211.             }
  212.         }
  213.        
  214.         return groupBy;
  215.     }
  216.    
  217.     private static boolean abortTransactionPdndOrganizationName(Logger log, Context context) throws CoreException {
  218.        
  219.         boolean abort = OpenSPCoop2Properties.getInstance().isGestoreChiaviPDNDRateLimitingInfoNotAvailableAbortTransaction();
  220.        
  221.         RequestInfo requestInfo = null;
  222.         if(context!=null && context.containsKey(Costanti.REQUEST_INFO)) {
  223.             Object o = context.get(Costanti.REQUEST_INFO);
  224.             if(o instanceof RequestInfo) {
  225.                 requestInfo = (RequestInfo) o;
  226.             }
  227.         }
  228.        
  229.         if(requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getInterfaceName()!=null &&
  230.                 StringUtils.isNotEmpty(requestInfo.getProtocolContext().getInterfaceName())) {
  231.             IDPortaApplicativa idPA = new IDPortaApplicativa();
  232.             idPA.setNome(requestInfo.getProtocolContext().getInterfaceName());
  233.             try {
  234.                 PortaApplicativa pa = ConfigurazionePdDManager.getInstance().getPortaApplicativaSafeMethod(idPA, requestInfo);
  235.                 if(pa!=null && pa.sizeProprieta()>0) {
  236.                     abort = CostantiProprieta.isPdndRateLimitingByOrganizationInfoNotAvailableAbortTransaction(pa.getProprieta(), abort);
  237.                 }
  238.             }catch(Exception e) {
  239.                 log.error("Accesso porta applicativa ["+requestInfo.getProtocolContext().getInterfaceName()+"] fallito: "+e.getMessage(),e);
  240.             }
  241.         }
  242.         return abort;
  243.        
  244.     }
  245.    
  246.     public static DatiTransazione readDatiTransazione(InRequestProtocolContext context){
  247.         TipoPdD tipoPdD = context.getTipoPorta();
  248.         String idModulo = context.getIdModulo();
  249.         PdDContext pddContext = context.getPddContext();
  250.         URLProtocolContext urlProtocolContext = null;
  251.         if(context.getConnettore()!=null && context.getConnettore().getUrlProtocolContext()!=null) {
  252.             urlProtocolContext = context.getConnettore().getUrlProtocolContext();
  253.         }
  254.         IProtocolFactory<?> protocolFactory = context.getProtocolFactory();
  255.         IState state = context.getStato();
  256.         Logger log = context.getLogCore();
  257.        
  258.         IDSoggetto idDominio = null;
  259.         IDSoggetto soggettoFruitore = null;
  260.         IDServizio idServizio = null;
  261.         IDAccordo idAccordo = null;
  262.         if(context.getProtocollo()!=null) {
  263.             idDominio = context.getProtocollo().getDominio();
  264.             soggettoFruitore = context.getProtocollo().getFruitore();
  265.            
  266.             IDSoggetto soggettoErogatore = context.getProtocollo().getErogatore();
  267.             String soggettoErogatoreTipo = null;
  268.             String soggettoErogatoreNome = null;
  269.             if(soggettoErogatore!=null) {
  270.                 soggettoErogatoreTipo = soggettoErogatore.getTipo();
  271.                 soggettoErogatoreNome = soggettoErogatore.getNome();
  272.             }
  273.             int versione = 1;
  274.             if(context.getProtocollo().getVersioneServizio()!=null) {
  275.                 versione = context.getProtocollo().getVersioneServizio();
  276.             }
  277.             idServizio = IDServizioFactory.getInstance().getIDServizioFromValuesWithoutCheck(context.getProtocollo().getTipoServizio(),
  278.                     context.getProtocollo().getServizio(),
  279.                     soggettoErogatoreTipo, soggettoErogatoreNome,
  280.                     versione);
  281.             idServizio.setAzione(context.getProtocollo().getAzione());
  282.            
  283.             idAccordo = context.getProtocollo().getIdAccordo();
  284.         }
  285.        
  286.         IDPortaDelegata idPD = null;
  287.         IDPortaApplicativa idPA = null;
  288.         String servizioApplicativoFruitore = null;
  289.         List<String> serviziApplicativiErogatori = null;
  290.         if(context.getIntegrazione()!=null && context.getIntegrazione().getIdPD()!=null){
  291.             idPD = context.getIntegrazione().getIdPD();
  292.             servizioApplicativoFruitore = context.getIntegrazione().getServizioApplicativoFruitore();
  293.         }
  294.         else if(context.getIntegrazione()!=null && context.getIntegrazione().getIdPA()!=null){
  295.             idPA = context.getIntegrazione().getIdPA();
  296.             if(context.getIntegrazione().sizeServiziApplicativiErogatori()>0){
  297.                 serviziApplicativiErogatori = new ArrayList<>();
  298.                 for (int i = 0; i < context.getIntegrazione().sizeServiziApplicativiErogatori(); i++) {
  299.                     serviziApplicativiErogatori.add(context.getIntegrazione().getServizioApplicativoErogatore(i));
  300.                 }
  301.             }
  302.             servizioApplicativoFruitore = context.getIntegrazione().getServizioApplicativoFruitore();
  303.         }
  304.        
  305.         return readDatiTransazione(tipoPdD, idModulo,
  306.                 pddContext, urlProtocolContext,
  307.                 protocolFactory, state, log,
  308.                 idDominio, soggettoFruitore, idServizio, idAccordo,
  309.                 idPD, idPA,
  310.                 servizioApplicativoFruitore, serviziApplicativiErogatori);
  311.     }
  312.     public static DatiTransazione readDatiTransazione(TipoPdD tipoPdD, String idModulo,
  313.             PdDContext pddContext, URLProtocolContext urlProtocolContext,
  314.             IProtocolFactory<?> protocolFactory, IState state, Logger log,
  315.             IDSoggetto idDominio, IDSoggetto soggettoFruitore, IDServizio idServizio, IDAccordo idAccordo,
  316.             IDPortaDelegata idPD, IDPortaApplicativa idPA,
  317.             String servizioApplicativoFruitore, List<String> serviziApplicativiErogatori){
  318.         DatiTransazione datiTransazione = new DatiTransazione();
  319.        
  320.         datiTransazione.setTipoPdD(tipoPdD);
  321.         datiTransazione.setModulo(idModulo);
  322.        
  323.         if(pddContext!=null) {
  324.             String idTransazione = (String) pddContext.getObject(Costanti.ID_TRANSAZIONE);
  325.             datiTransazione.setIdTransazione(idTransazione);
  326.         }
  327.        
  328.         if(urlProtocolContext!=null) {
  329.             datiTransazione.setNomePorta(urlProtocolContext.getInterfaceName());
  330.         }
  331.        
  332.         if(protocolFactory!=null)
  333.             datiTransazione.setProtocollo(protocolFactory.getProtocol());
  334.        
  335.         // Controllo sui dati del Fruitore e del Servizio (Erogatore)
  336.         datiTransazione.setDominio(idDominio);
  337.         datiTransazione.setSoggettoFruitore(soggettoFruitore);
  338.         datiTransazione.setIdServizio(idServizio);
  339.        
  340.         RequestInfo requestInfo = null;
  341.         if(pddContext!=null && pddContext.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
  342.             requestInfo = (RequestInfo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  343.         }
  344.        
  345.         RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(state);
  346.         if(idAccordo!=null) {
  347.             datiTransazione.setIdAccordoServizioParteComune(idAccordo);
  348.         }
  349.         else {
  350.             try {
  351.                 AccordoServizioParteSpecifica asps = registroServiziManager.getAccordoServizioParteSpecifica(idServizio, null, false, requestInfo);
  352.                 datiTransazione.setIdAccordoServizioParteComune(IDAccordoFactory.getInstance().getIDAccordoFromUri(asps.getAccordoServizioParteComune()));
  353.             }catch(Exception e) {
  354.                 /**System.out.println("["+(String) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)+"] Errore: "+e.getMessage());
  355.                 e.printStackTrace(System.out);*/
  356.                 log.debug("Lettura AccordoServizioParteSpecifica ("+idServizio+") non riuscita: "+e.getMessage(),e);
  357.             }              
  358.         }
  359.         if(datiTransazione.getIdAccordoServizioParteComune()!=null) {
  360.             try {
  361.                 AccordoServizioParteComune aspc = registroServiziManager.getAccordoServizioParteComune(datiTransazione.getIdAccordoServizioParteComune(), null, false, false, requestInfo);
  362.                 if(aspc.getGruppi()!=null && aspc.getGruppi().sizeGruppoList()>0) {
  363.                     List<String> tags = new ArrayList<>();
  364.                     for (GruppoAccordo gruppoAccordo : aspc.getGruppi().getGruppoList()) {
  365.                         tags.add(gruppoAccordo.getNome());
  366.                     }
  367.                     datiTransazione.setTagsAccordoServizioParteComune(tags);
  368.                 }
  369.             }catch(Exception e) {
  370.                 /**System.out.println("["+(String) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)+"] Errore: "+e.getMessage());
  371.                 e.printStackTrace(System.out);*/
  372.                 log.debug("Lettura AccordoServizioParteSpecifica ("+idServizio+") non riuscita: "+e.getMessage(),e);
  373.             }  
  374.         }
  375.        
  376.         if(idPD!=null){

  377.             if(servizioApplicativoFruitore!=null){
  378.                 datiTransazione.setServizioApplicativoFruitore(servizioApplicativoFruitore);
  379.             }
  380.             else{
  381.                 datiTransazione.setServizioApplicativoFruitore(CostantiPdD.SERVIZIO_APPLICATIVO_ANONIMO);
  382.             }

  383.         }
  384.         else if(idPA!=null){
  385.            
  386.             if(serviziApplicativiErogatori!=null && !serviziApplicativiErogatori.isEmpty()){
  387.                 for (int i = 0; i < serviziApplicativiErogatori.size(); i++) {
  388.                     datiTransazione.getListServiziApplicativiErogatori().add(serviziApplicativiErogatori.get(i));
  389.                 }
  390.             }
  391.            
  392.             if(servizioApplicativoFruitore!=null){
  393.                 datiTransazione.setServizioApplicativoFruitore(servizioApplicativoFruitore);
  394.             }
  395.            
  396.         }
  397.        
  398.         if(pddContext!=null) {
  399.            
  400.             if(pddContext.containsKey(org.openspcoop2.core.constants.Costanti.IDENTIFICATIVO_AUTENTICATO)) {
  401.                 String id = (String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.IDENTIFICATIVO_AUTENTICATO);
  402.                 datiTransazione.setIdentificativoAutenticato(id);
  403.             }
  404.            
  405.             if(pddContext.containsKey(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE)) {
  406.                 InformazioniToken informazioniTokenNormalizzate = (InformazioniToken) pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
  407.                 if(informazioniTokenNormalizzate!=null) {
  408.                     datiTransazione.setTokenSubject(informazioniTokenNormalizzate.getSub());
  409.                     datiTransazione.setTokenIssuer(informazioniTokenNormalizzate.getIss());
  410.                     datiTransazione.setTokenClientId(informazioniTokenNormalizzate.getClientId());
  411.                     datiTransazione.setTokenUsername(informazioniTokenNormalizzate.getUsername());
  412.                     if(informazioniTokenNormalizzate.getUserInfo()!=null) {
  413.                         datiTransazione.setTokenEMail(informazioniTokenNormalizzate.getUserInfo().getEMail());
  414.                     }
  415.                     datiTransazione.setTokenClaims(informazioniTokenNormalizzate.getClaims());
  416.                    
  417.                     SecurityToken securityToken = SecurityTokenUtilities.readSecurityToken(pddContext);
  418.                     if(securityToken!=null && securityToken.getPdnd()!=null) {
  419.                         datiTransazione.setPdndClientJson(securityToken.getPdnd().getClientJson());
  420.                         datiTransazione.setPdndOrganizationJson(securityToken.getPdnd().getOrganizationJson());
  421.                         try {
  422.                             datiTransazione.setPdndOrganizationName(securityToken.getPdnd().getOrganizationName());
  423.                         }catch(Exception e) {
  424.                             /**System.out.println("["+(String) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)+"] Errore: "+e.getMessage());
  425.                             e.printStackTrace(System.out);*/
  426.                             log.debug("Lettura 'PDND Organization name' non riuscita: "+e.getMessage(),e);
  427.                         }  
  428.                     }
  429.                    
  430.                 }
  431.             }
  432.            
  433.             if(pddContext.containsKey(org.openspcoop2.core.constants.Costanti.ID_APPLICATIVO_TOKEN)) {
  434.                 IDServizioApplicativo servizioApplicativoToken = (IDServizioApplicativo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_APPLICATIVO_TOKEN);
  435.                 datiTransazione.setIdServizioApplicativoToken(servizioApplicativoToken);
  436.             }
  437.            
  438.         }
  439.        
  440.         return datiTransazione;
  441.     }
  442.    
  443.     public static boolean checkRegisterThread(DatiTransazione datiTransazione){
  444.         if(datiTransazione.getDominio()==null ||
  445.                 datiTransazione.getDominio().getTipo()==null ||
  446.                         datiTransazione.getDominio().getNome()==null ||
  447.                         datiTransazione.getDominio().getCodicePorta()==null ){
  448.             return false; // i dati sul dominio ci devono essere
  449.         }
  450.         if(datiTransazione.getModulo()==null){
  451.             return false; // i dati sul modulo ci devono essere
  452.         }
  453.         if(datiTransazione.getIdTransazione()==null){
  454.             return false; // i dati sull'identificativo transazione ci devono essere
  455.         }
  456.         if(datiTransazione.getNomePorta()==null) {
  457.             return false; // i dati sul nome della porta ci deve essere
  458.         }
  459.         if(
  460.                 TipoPdD.DELEGATA.equals(datiTransazione.getTipoPdD())
  461.                 &&
  462.                 (datiTransazione.getSoggettoFruitore()==null
  463.                     ||
  464.                 datiTransazione.getSoggettoFruitore().getTipo()==null
  465.                     ||
  466.                 datiTransazione.getSoggettoFruitore().getNome()==null)
  467.                 ){
  468.             return false; // i dati sul fruitore ci devono essere
  469.         }
  470.         if(datiTransazione.getIdServizio()==null ||
  471.                 datiTransazione.getIdServizio().getSoggettoErogatore()==null ||
  472.                 datiTransazione.getIdServizio().getSoggettoErogatore().getTipo()==null ||
  473.                 datiTransazione.getIdServizio().getSoggettoErogatore().getNome()==null){
  474.             return false; // i dati sull'erogatore ci devono essere
  475.         }
  476.         if(datiTransazione.getIdServizio()==null ||
  477.                 datiTransazione.getIdServizio().getTipo()==null || datiTransazione.getIdServizio().getNome()==null || datiTransazione.getIdServizio().getVersione()==null){
  478.             return false; // i dati sul servizio ci devono essere
  479.         }
  480.         if(datiTransazione.getServizioApplicativoFruitore()==null &&
  481.                 (datiTransazione.getListServiziApplicativiErogatori()==null || datiTransazione.getListServiziApplicativiErogatori().isEmpty())){
  482.             return false; // i dati sul servizio applicativo ci devono essere
  483.         }
  484.         return true;
  485.     }
  486.    
  487.     public static boolean filter(AttivazionePolicyFiltro filtro, DatiTransazione datiTransazione, IState state, RequestInfo requestInfo) throws Exception{
  488.        
  489.         if(filtro.isEnabled()){
  490.                        
  491.             if(filtro.getProtocollo()!=null && !"".equals(filtro.getProtocollo()) &&
  492.                 !filtro.getProtocollo().equals(datiTransazione.getProtocollo())){
  493.                 return false;
  494.             }
  495.            
  496.             if(filtro.getRuoloPorta()!=null && !"".equals(filtro.getRuoloPorta().getValue()) &&
  497.                     !RuoloPolicy.ENTRAMBI.equals(filtro.getRuoloPorta())){
  498.                
  499.                 if(RuoloPolicy.DELEGATA.equals(filtro.getRuoloPorta()) &&
  500.                     !TipoPdD.DELEGATA.equals(datiTransazione.getTipoPdD())){
  501.                     return false;
  502.                 }
  503.                 if(RuoloPolicy.APPLICATIVA.equals(filtro.getRuoloPorta()) &&
  504.                     !TipoPdD.APPLICATIVA.equals(datiTransazione.getTipoPdD())){
  505.                     return false;
  506.                 }
  507.                
  508.             }
  509.            
  510.             boolean policyGlobale = true;
  511.             if(filtro.getNomePorta()!=null && !"".equals(filtro.getNomePorta())){
  512.                 policyGlobale = false;
  513.                 if(datiTransazione.getNomePorta()==null){
  514.                     return false;
  515.                 }
  516.                 if(!filtro.getNomePorta().equals(datiTransazione.getNomePorta())){
  517.                     return false;
  518.                 }
  519.             }
  520.            
  521.             if(filtro.getRuoloFruitore()!=null && !"".equals(filtro.getRuoloFruitore())){
  522.                    
  523.                 /*
  524.                  * Se policyGlobale:
  525.                  *    si controlla sia il fruitore che l'applicativo. Basta che uno sia soddisfatto.
  526.                  * else
  527.                  *    nel caso di delegata si controlla solo l'applicativo.
  528.                  *    nel caso di applicativa entrambi, e basta che uno sia soddisfatto.
  529.                  **/
  530.                
  531.                 // diventa policy richiedente
  532.                
  533.                 boolean ruoloSoggetto = false;
  534.                 boolean ruoloApplicativo = false;
  535.                
  536.                 if(datiTransazione.getSoggettoFruitore()!=null &&
  537.                         datiTransazione.getSoggettoFruitore().getTipo()!=null &&
  538.                         datiTransazione.getSoggettoFruitore().getNome()!=null){
  539.                    
  540.                     IDSoggetto idFruitore = new IDSoggetto(datiTransazione.getSoggettoFruitore().getTipo(), datiTransazione.getSoggettoFruitore().getNome());
  541.                
  542.                     if(policyGlobale || TipoPdD.APPLICATIVA.equals(datiTransazione.getTipoPdD())){
  543.                         RegistroServiziManager registroManager = RegistroServiziManager.getInstance(state);
  544.                         Soggetto soggetto = null;
  545.                         try {
  546.                             soggetto = registroManager.getSoggetto(idFruitore, null, requestInfo);
  547.                         }catch(DriverRegistroServiziNotFound notFound) {
  548.                             // ignore
  549.                         }
  550.                         if(soggetto!=null && soggetto.getRuoli()!=null) {
  551.                             for (int i = 0; i < soggetto.getRuoli().sizeRuoloList(); i++) {
  552.                                 if(soggetto.getRuoli().getRuolo(i).getNome().equals(filtro.getRuoloFruitore())) {
  553.                                     ruoloSoggetto = true;
  554.                                     break;
  555.                                 }
  556.                             }
  557.                         }
  558.                     }
  559.                    
  560.                     if(datiTransazione.getServizioApplicativoFruitore()!=null && !CostantiPdD.SERVIZIO_APPLICATIVO_ANONIMO.equals(datiTransazione.getServizioApplicativoFruitore())) {
  561.                        
  562.                         IDServizioApplicativo idSA = new IDServizioApplicativo();
  563.                         idSA.setIdSoggettoProprietario(idFruitore);
  564.                         idSA.setNome(datiTransazione.getServizioApplicativoFruitore());
  565.                    
  566.                         ConfigurazionePdDManager configPdDManager = ConfigurazionePdDManager.getInstance(state);
  567.                         ServizioApplicativo sa = null;
  568.                         try {
  569.                             sa = configPdDManager.getServizioApplicativo(idSA, requestInfo);
  570.                         }catch(DriverConfigurazioneNotFound nofFound) {
  571.                             // ignore
  572.                         }
  573.                         if(sa!=null && sa.getInvocazionePorta()!=null && sa.getInvocazionePorta().getRuoli()!=null) {
  574.                             for (int i = 0; i < sa.getInvocazionePorta().getRuoli().sizeRuoloList(); i++) {
  575.                                 if(sa.getInvocazionePorta().getRuoli().getRuolo(i).getNome().equals(filtro.getRuoloFruitore())) {
  576.                                     ruoloApplicativo = true;
  577.                                     break;
  578.                                 }
  579.                             }
  580.                         }
  581.                        
  582.                     }

  583.                 }
  584.                
  585.                 if(!ruoloSoggetto && !ruoloApplicativo && datiTransazione.getIdServizioApplicativoToken()!=null) {
  586.                        
  587.                     if(policyGlobale || TipoPdD.APPLICATIVA.equals(datiTransazione.getTipoPdD())){
  588.                         RegistroServiziManager registroManager = RegistroServiziManager.getInstance(state);
  589.                         Soggetto soggetto = null;
  590.                         try {
  591.                             soggetto = registroManager.getSoggetto(datiTransazione.getIdServizioApplicativoToken().getIdSoggettoProprietario(), null, requestInfo);
  592.                         }catch(DriverRegistroServiziNotFound notFound) {
  593.                             // ignore
  594.                         }
  595.                         if(soggetto!=null && soggetto.getRuoli()!=null) {
  596.                             for (int i = 0; i < soggetto.getRuoli().sizeRuoloList(); i++) {
  597.                                 if(soggetto.getRuoli().getRuolo(i).getNome().equals(filtro.getRuoloFruitore())) {
  598.                                     ruoloSoggetto = true;
  599.                                     break;
  600.                                 }
  601.                             }
  602.                         }
  603.                     }
  604.                    
  605.                     ConfigurazionePdDManager configPdDManager = ConfigurazionePdDManager.getInstance(state);
  606.                     ServizioApplicativo sa = null;
  607.                     try {
  608.                         sa = configPdDManager.getServizioApplicativo(datiTransazione.getIdServizioApplicativoToken(), requestInfo);
  609.                     }catch(DriverConfigurazioneNotFound nofFound) {
  610.                         // ignore
  611.                     }
  612.                     if(sa!=null && sa.getInvocazionePorta()!=null && sa.getInvocazionePorta().getRuoli()!=null) {
  613.                         for (int i = 0; i < sa.getInvocazionePorta().getRuoli().sizeRuoloList(); i++) {
  614.                             if(sa.getInvocazionePorta().getRuoli().getRuolo(i).getNome().equals(filtro.getRuoloFruitore())) {
  615.                                 ruoloApplicativo = true;
  616.                                 break;
  617.                             }
  618.                         }
  619.                     }
  620.                        
  621.                 }
  622.                
  623.                 if(!ruoloSoggetto && !ruoloApplicativo) {
  624.                     return false;
  625.                 }
  626.                    
  627.             }
  628.            
  629.             boolean checkDatiFruitore = true;
  630.            
  631.             if(datiTransazione.getIdServizioApplicativoToken()!=null && datiTransazione.getIdServizioApplicativoToken().getIdSoggettoProprietario()!=null &&
  632.                     filtro.getTipoFruitore()!=null && !"".equals(filtro.getTipoFruitore()) &&
  633.                     filtro.getNomeFruitore()!=null && !"".equals(filtro.getNomeFruitore()) &&
  634.                     filtro.getServizioApplicativoFruitore()!=null && !"".equals(filtro.getServizioApplicativoFruitore()) &&
  635.                 filtro.getTipoFruitore().equals(datiTransazione.getIdServizioApplicativoToken().getIdSoggettoProprietario().getTipo()) &&
  636.                 filtro.getNomeFruitore().equals(datiTransazione.getIdServizioApplicativoToken().getIdSoggettoProprietario().getNome()) &&
  637.                 filtro.getServizioApplicativoFruitore().equals(datiTransazione.getIdServizioApplicativoToken().getNome())) {
  638.                 checkDatiFruitore = false; // match con l'applicativo token
  639.             }
  640.            
  641.             if(checkDatiFruitore && filtro.getTipoFruitore()!=null && !"".equals(filtro.getTipoFruitore())){
  642.                 if(datiTransazione.getSoggettoFruitore()==null){
  643.                     return false;
  644.                 }
  645.                 if(!filtro.getTipoFruitore().equals(datiTransazione.getSoggettoFruitore().getTipo())){
  646.                     return false;
  647.                 }
  648.             }
  649.             if(checkDatiFruitore && filtro.getNomeFruitore()!=null && !"".equals(filtro.getNomeFruitore())){
  650.                 if(datiTransazione.getSoggettoFruitore()==null){
  651.                     return false;
  652.                 }
  653.                 if(!filtro.getNomeFruitore().equals(datiTransazione.getSoggettoFruitore().getNome())){
  654.                     return false;
  655.                 }
  656.             }
  657.            
  658.             if(checkDatiFruitore && filtro.getServizioApplicativoFruitore()!=null && !"".equals(filtro.getServizioApplicativoFruitore()) &&
  659.                 !filtro.getServizioApplicativoFruitore().equals(datiTransazione.getServizioApplicativoFruitore())){
  660.                 return false;
  661.             }
  662.                        
  663.             if(filtro.getRuoloErogatore()!=null && !"".equals(filtro.getRuoloErogatore())){
  664.                 if(datiTransazione.getIdServizio() == null ||
  665.                         datiTransazione.getIdServizio().getSoggettoErogatore()==null ||
  666.                         datiTransazione.getIdServizio().getSoggettoErogatore().getTipo()==null ||
  667.                         datiTransazione.getIdServizio().getSoggettoErogatore().getNome()==null){
  668.                     return false;
  669.                 }
  670.                 IDSoggetto idErogatore = new IDSoggetto(datiTransazione.getIdServizio().getSoggettoErogatore().getTipo(), datiTransazione.getIdServizio().getSoggettoErogatore().getNome());
  671.                 RegistroServiziManager registroManager = RegistroServiziManager.getInstance(state);
  672.                 Soggetto soggetto = registroManager.getSoggetto(idErogatore, null, requestInfo);
  673.                 boolean foundRuolo = false;
  674.                 if(soggetto.getRuoli()!=null) {
  675.                     for (int i = 0; i < soggetto.getRuoli().sizeRuoloList(); i++) {
  676.                         if(soggetto.getRuoli().getRuolo(i).getNome().equals(filtro.getRuoloErogatore())) {
  677.                             foundRuolo = true;
  678.                             break;
  679.                         }
  680.                     }
  681.                 }
  682.                 if(!foundRuolo) {
  683.                     return false;
  684.                 }
  685.             }
  686.            
  687.             if(filtro.getTipoErogatore()!=null && !"".equals(filtro.getTipoErogatore())){
  688.                 if(datiTransazione.getIdServizio()==null){
  689.                     return false;
  690.                 }
  691.                 if(datiTransazione.getIdServizio().getSoggettoErogatore()==null){
  692.                     return false;
  693.                 }
  694.                 if(!filtro.getTipoErogatore().equals(datiTransazione.getIdServizio().getSoggettoErogatore().getTipo())){
  695.                     return false;
  696.                 }
  697.             }
  698.             if(filtro.getNomeErogatore()!=null && !"".equals(filtro.getNomeErogatore())){
  699.                 if(datiTransazione.getIdServizio()==null){
  700.                     return false;
  701.                 }
  702.                 if(datiTransazione.getIdServizio().getSoggettoErogatore()==null){
  703.                     return false;
  704.                 }
  705.                 if(!filtro.getNomeErogatore().equals(datiTransazione.getIdServizio().getSoggettoErogatore().getNome())){
  706.                     return false;
  707.                 }
  708.             }
  709.            
  710.             if(filtro.getServizioApplicativoErogatore()!=null && !"".equals(filtro.getServizioApplicativoErogatore())){
  711.                 if(datiTransazione.getListServiziApplicativiErogatori()==null || datiTransazione.getListServiziApplicativiErogatori().isEmpty()){
  712.                     return false;
  713.                 }              
  714.                 if(!datiTransazione.getListServiziApplicativiErogatori().contains(filtro.getServizioApplicativoErogatore())){
  715.                     return false;
  716.                 }
  717.             }
  718.            
  719.             if(filtro.getTag()!=null && !"".equals(filtro.getTag())){
  720.                 if(datiTransazione.getTagsAccordoServizioParteComune()==null || datiTransazione.getTagsAccordoServizioParteComune().isEmpty()){
  721.                     return false;
  722.                 }
  723.                 boolean find = false;
  724.                 for (String tag : datiTransazione.getTagsAccordoServizioParteComune()) {
  725.                     if(filtro.getTag().equals(tag)){
  726.                         find = true;
  727.                         break;
  728.                     }
  729.                 }
  730.                 if(!find){
  731.                     return false;
  732.                 }
  733.             }
  734.            
  735.             if(filtro.getTipoServizio()!=null && !"".equals(filtro.getTipoServizio())){
  736.                 if(datiTransazione.getIdServizio()==null){
  737.                     return false;
  738.                 }
  739.                 if(!filtro.getTipoServizio().equals(datiTransazione.getIdServizio().getTipo())){
  740.                     return false;
  741.                 }
  742.             }
  743.             if(filtro.getNomeServizio()!=null && !"".equals(filtro.getNomeServizio())){
  744.                 if(datiTransazione.getIdServizio()==null){
  745.                     return false;
  746.                 }
  747.                 if(!filtro.getNomeServizio().equals(datiTransazione.getIdServizio().getNome())){
  748.                     return false;
  749.                 }
  750.             }
  751.             if(filtro.getVersioneServizio()!=null){
  752.                 if(datiTransazione.getIdServizio()==null || datiTransazione.getIdServizio().getVersione()==null){
  753.                     return false;
  754.                 }
  755.                 if(filtro.getVersioneServizio().intValue() != datiTransazione.getIdServizio().getVersione().intValue()){
  756.                     return false;
  757.                 }
  758.             }
  759.            
  760.             if(filtro.getAzione()!=null && !"".equals(filtro.getAzione())){
  761.                 if(datiTransazione.getIdServizio()==null){
  762.                     return false;
  763.                 }
  764.                 if(datiTransazione.getIdServizio().getAzione()==null){
  765.                     return false;
  766.                 }
  767.                 String [] tmp = filtro.getAzione().split(",");
  768.                 if(tmp!=null && tmp.length>0) {
  769.                     boolean found = false;
  770.                     for (String az : tmp) {
  771.                         if(az.equals(datiTransazione.getIdServizio().getAzione())){
  772.                             found=true;
  773.                             break;
  774.                         }          
  775.                     }
  776.                     if(!found) {
  777.                         return false;
  778.                     }
  779.                 }
  780.             }
  781.            
  782.             if(filtro.getTokenClaims()!=null && !"".equals(filtro.getTokenClaims())){
  783.                 Properties properties = PropertiesUtilities.convertTextToProperties(filtro.getTokenClaims());
  784.                 boolean isOk = filter(properties, datiTransazione.getTokenClaims());
  785.                 if(!isOk) {
  786.                     return false;
  787.                 }
  788.             }
  789.                        
  790.         }
  791.        
  792.         return true;
  793.        
  794.     }
  795.    
  796.     private static boolean filter(Properties properties, Map<String, String> datiTransazioneClaims) {
  797.         if(properties!=null && properties.size()>0) {
  798.             for (Object o : properties.keySet()) {
  799.                 if(o instanceof String) {
  800.                     String key = (String) o;
  801.                     Boolean v = filterPropertyClaim(key, properties, datiTransazioneClaims);
  802.                     if(v!=null) {
  803.                         return v.booleanValue();
  804.                     }
  805.                 }
  806.             }
  807.         }
  808.         return true;
  809.     }
  810.     private static Boolean filterPropertyClaim(String key, Properties properties, Map<String, String> datiTransazioneClaims) {
  811.         Boolean b = null;
  812.         String value = properties.getProperty(key);
  813.         if(datiTransazioneClaims==null || datiTransazioneClaims.isEmpty()) {
  814.             return false;
  815.         }
  816.         if(!datiTransazioneClaims.containsKey(key)) {
  817.             return false;
  818.         }
  819.         String v = datiTransazioneClaims.get(key);
  820.         if(value==null || "".equals(value)) {
  821.             if (! (v == null || "".equals(v)) ) {
  822.                 return false;
  823.             }
  824.         }
  825.         else {
  826.             if(!value.equals(v)) {
  827.                 return false;
  828.             }
  829.         }
  830.         return b;
  831.     }
  832.    
  833. }