InterceptorPolicyUtilities.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.pdd.core.controllo_traffico.policy;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.commons.CoreException;
import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
import org.openspcoop2.core.constants.Costanti;
import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.core.controllo_traffico.AttivazionePolicyFiltro;
import org.openspcoop2.core.controllo_traffico.AttivazionePolicyRaggruppamento;
import org.openspcoop2.core.controllo_traffico.beans.DatiTransazione;
import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
import org.openspcoop2.core.controllo_traffico.constants.RuoloPolicy;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDPortaApplicativa;
import org.openspcoop2.core.id.IDPortaDelegata;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDServizioApplicativo;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.GruppoAccordo;
import org.openspcoop2.core.registry.Soggetto;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.core.transazioni.utils.TipoCredenzialeMittente;
import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
import org.openspcoop2.pdd.config.CostantiProprieta;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.core.CostantiPdD;
import org.openspcoop2.pdd.core.PdDContext;
import org.openspcoop2.pdd.core.handlers.InRequestProtocolContext;
import org.openspcoop2.pdd.core.token.InformazioniToken;
import org.openspcoop2.protocol.engine.SecurityTokenUtilities;
import org.openspcoop2.protocol.registry.RegistroServiziManager;
import org.openspcoop2.protocol.sdk.Context;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.SecurityToken;
import org.openspcoop2.protocol.sdk.state.IState;
import org.openspcoop2.protocol.sdk.state.RequestInfo;
import org.openspcoop2.protocol.sdk.state.URLProtocolContext;
import org.openspcoop2.utils.properties.PropertiesUtilities;
import org.slf4j.Logger;
/**
* InterceptorPolicyUtilities
*
* @author Poli Andrea (poli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class InterceptorPolicyUtilities {
private InterceptorPolicyUtilities() {}
public static IDUnivocoGroupByPolicy convertToID(Logger log,DatiTransazione datiTransazione, AttivazionePolicyRaggruppamento policyGroupBy,
InRequestProtocolContext context) throws Exception{
final String nonDisponibile = "-"; /**"n.d.";*/
IDUnivocoGroupByPolicy groupBy = new IDUnivocoGroupByPolicy();
if(policyGroupBy.isRuoloPorta()){
groupBy.setRuoloPorta(datiTransazione.getTipoPdD().getTipo());
}
if(policyGroupBy.isProtocollo()){
groupBy.setProtocollo(datiTransazione.getProtocollo());
}
if(policyGroupBy.isFruitore()){
if(datiTransazione.getSoggettoFruitore()!=null) {
groupBy.setFruitore(datiTransazione.getSoggettoFruitore().toString());
}
else {
groupBy.setFruitore(nonDisponibile);
}
}
if(policyGroupBy.isServizioApplicativoFruitore()){
groupBy.setServizioApplicativoFruitore(datiTransazione.getServizioApplicativoFruitore());
if(datiTransazione.getIdServizioApplicativoToken()!=null) {
groupBy.setServizioApplicativoToken(datiTransazione.getIdServizioApplicativoToken());
}
}
if(policyGroupBy.isErogatore()){
groupBy.setErogatore(datiTransazione.getIdServizio().getSoggettoErogatore().toString());
}
if(TipoPdD.APPLICATIVA.equals(datiTransazione.getTipoPdD()) &&
policyGroupBy.isServizioApplicativoErogatore()){
groupBy.setServizioApplicativoErogatore(datiTransazione.getServiziApplicativiErogatoreAsString());
}
if(policyGroupBy.isServizio()){
groupBy.setServizio(datiTransazione.getIdServizio().getTipo()+"/"+datiTransazione.getIdServizio().getNome()+"/"+datiTransazione.getIdServizio().getVersione());
}
if(policyGroupBy.isAzione()){
groupBy.setAzione(datiTransazione.getIdServizio().getAzione());
}
if(policyGroupBy.isInformazioneApplicativaEnabled()){
String valorePresente = PolicyFiltroApplicativoUtilities.getValore(log, policyGroupBy.getInformazioneApplicativaTipo(),
policyGroupBy.getInformazioneApplicativaNome(),
context, datiTransazione, false);
if(valorePresente==null){
valorePresente = nonDisponibile;
}
groupBy.setTipoKey(policyGroupBy.getInformazioneApplicativaTipo());
groupBy.setNomeKey(policyGroupBy.getInformazioneApplicativaNome());
groupBy.setValoreKey(valorePresente);
}
if(policyGroupBy.isIdentificativoAutenticato()){
groupBy.setIdentificativoAutenticato(datiTransazione.getIdentificativoAutenticato()!=null ? datiTransazione.getIdentificativoAutenticato() : nonDisponibile);
}
if(policyGroupBy.getToken()!=null){
String [] token = null;
if(policyGroupBy.getToken().contains(",")) {
token = policyGroupBy.getToken().split(",");
}
else {
token = new String[] {policyGroupBy.getToken()};
}
if(token!=null && token.length>0) {
for (int i = 0; i < token.length; i++) {
TipoCredenzialeMittente claim = TipoCredenzialeMittente.toEnumConstant(token[i], true);
switch (claim) {
case TOKEN_SUBJECT:
if(datiTransazione.getTokenSubject()!=null) {
groupBy.setTokenSubject(datiTransazione.getTokenSubject());
}
else {
groupBy.setTokenSubject(nonDisponibile);
}
break;
case TOKEN_ISSUER:
if(datiTransazione.getTokenIssuer()!=null) {
groupBy.setTokenIssuer(datiTransazione.getTokenIssuer());
}
else {
groupBy.setTokenIssuer(nonDisponibile);
}
break;
case TOKEN_CLIENT_ID:
if(datiTransazione.getTokenClientId()!=null) {
groupBy.setTokenClientId(datiTransazione.getTokenClientId());
}
else {
groupBy.setTokenClientId(nonDisponibile);
}
break;
case TOKEN_USERNAME:
if(datiTransazione.getTokenUsername()!=null) {
groupBy.setTokenUsername(datiTransazione.getTokenUsername());
}
else {
groupBy.setTokenUsername(nonDisponibile);
}
break;
case TOKEN_EMAIL:
if(datiTransazione.getTokenEMail()!=null) {
groupBy.setTokenEMail(datiTransazione.getTokenEMail());
}
else {
groupBy.setTokenEMail(nonDisponibile);
}
break;
case PDND_ORGANIZATION_NAME:
if(datiTransazione.getPdndOrganizationName()!=null && StringUtils.isNotEmpty(datiTransazione.getPdndOrganizationName())) {
groupBy.setPdndOrganizationName(datiTransazione.getPdndOrganizationName());
}
else {
if(abortTransactionPdndOrganizationName(log, context.getPddContext())) {
throw new CoreException("PDND Organization name not available");
}
else {
groupBy.setPdndOrganizationName(nonDisponibile);
}
}
break;
default:
break;
}
}
}
}
return groupBy;
}
private static boolean abortTransactionPdndOrganizationName(Logger log, Context context) throws CoreException {
boolean abort = OpenSPCoop2Properties.getInstance().isGestoreChiaviPDNDRateLimitingInfoNotAvailableAbortTransaction();
RequestInfo requestInfo = null;
if(context!=null && context.containsKey(Costanti.REQUEST_INFO)) {
Object o = context.get(Costanti.REQUEST_INFO);
if(o instanceof RequestInfo) {
requestInfo = (RequestInfo) o;
}
}
if(requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getInterfaceName()!=null &&
StringUtils.isNotEmpty(requestInfo.getProtocolContext().getInterfaceName())) {
IDPortaApplicativa idPA = new IDPortaApplicativa();
idPA.setNome(requestInfo.getProtocolContext().getInterfaceName());
try {
PortaApplicativa pa = ConfigurazionePdDManager.getInstance().getPortaApplicativaSafeMethod(idPA, requestInfo);
if(pa!=null && pa.sizeProprieta()>0) {
abort = CostantiProprieta.isPdndRateLimitingByOrganizationInfoNotAvailableAbortTransaction(pa.getProprieta(), abort);
}
}catch(Exception e) {
log.error("Accesso porta applicativa ["+requestInfo.getProtocolContext().getInterfaceName()+"] fallito: "+e.getMessage(),e);
}
}
return abort;
}
public static DatiTransazione readDatiTransazione(InRequestProtocolContext context){
TipoPdD tipoPdD = context.getTipoPorta();
String idModulo = context.getIdModulo();
PdDContext pddContext = context.getPddContext();
URLProtocolContext urlProtocolContext = null;
if(context.getConnettore()!=null && context.getConnettore().getUrlProtocolContext()!=null) {
urlProtocolContext = context.getConnettore().getUrlProtocolContext();
}
IProtocolFactory<?> protocolFactory = context.getProtocolFactory();
IState state = context.getStato();
Logger log = context.getLogCore();
IDSoggetto idDominio = null;
IDSoggetto soggettoFruitore = null;
IDServizio idServizio = null;
IDAccordo idAccordo = null;
if(context.getProtocollo()!=null) {
idDominio = context.getProtocollo().getDominio();
soggettoFruitore = context.getProtocollo().getFruitore();
IDSoggetto soggettoErogatore = context.getProtocollo().getErogatore();
String soggettoErogatoreTipo = null;
String soggettoErogatoreNome = null;
if(soggettoErogatore!=null) {
soggettoErogatoreTipo = soggettoErogatore.getTipo();
soggettoErogatoreNome = soggettoErogatore.getNome();
}
int versione = 1;
if(context.getProtocollo().getVersioneServizio()!=null) {
versione = context.getProtocollo().getVersioneServizio();
}
idServizio = IDServizioFactory.getInstance().getIDServizioFromValuesWithoutCheck(context.getProtocollo().getTipoServizio(),
context.getProtocollo().getServizio(),
soggettoErogatoreTipo, soggettoErogatoreNome,
versione);
idServizio.setAzione(context.getProtocollo().getAzione());
idAccordo = context.getProtocollo().getIdAccordo();
}
IDPortaDelegata idPD = null;
IDPortaApplicativa idPA = null;
String servizioApplicativoFruitore = null;
List<String> serviziApplicativiErogatori = null;
if(context.getIntegrazione()!=null && context.getIntegrazione().getIdPD()!=null){
idPD = context.getIntegrazione().getIdPD();
servizioApplicativoFruitore = context.getIntegrazione().getServizioApplicativoFruitore();
}
else if(context.getIntegrazione()!=null && context.getIntegrazione().getIdPA()!=null){
idPA = context.getIntegrazione().getIdPA();
if(context.getIntegrazione().sizeServiziApplicativiErogatori()>0){
serviziApplicativiErogatori = new ArrayList<>();
for (int i = 0; i < context.getIntegrazione().sizeServiziApplicativiErogatori(); i++) {
serviziApplicativiErogatori.add(context.getIntegrazione().getServizioApplicativoErogatore(i));
}
}
servizioApplicativoFruitore = context.getIntegrazione().getServizioApplicativoFruitore();
}
return readDatiTransazione(tipoPdD, idModulo,
pddContext, urlProtocolContext,
protocolFactory, state, log,
idDominio, soggettoFruitore, idServizio, idAccordo,
idPD, idPA,
servizioApplicativoFruitore, serviziApplicativiErogatori);
}
public static DatiTransazione readDatiTransazione(TipoPdD tipoPdD, String idModulo,
PdDContext pddContext, URLProtocolContext urlProtocolContext,
IProtocolFactory<?> protocolFactory, IState state, Logger log,
IDSoggetto idDominio, IDSoggetto soggettoFruitore, IDServizio idServizio, IDAccordo idAccordo,
IDPortaDelegata idPD, IDPortaApplicativa idPA,
String servizioApplicativoFruitore, List<String> serviziApplicativiErogatori){
DatiTransazione datiTransazione = new DatiTransazione();
datiTransazione.setTipoPdD(tipoPdD);
datiTransazione.setModulo(idModulo);
if(pddContext!=null) {
String idTransazione = (String) pddContext.getObject(Costanti.ID_TRANSAZIONE);
datiTransazione.setIdTransazione(idTransazione);
}
if(urlProtocolContext!=null) {
datiTransazione.setNomePorta(urlProtocolContext.getInterfaceName());
}
if(protocolFactory!=null)
datiTransazione.setProtocollo(protocolFactory.getProtocol());
// Controllo sui dati del Fruitore e del Servizio (Erogatore)
datiTransazione.setDominio(idDominio);
datiTransazione.setSoggettoFruitore(soggettoFruitore);
datiTransazione.setIdServizio(idServizio);
RequestInfo requestInfo = null;
if(pddContext!=null && pddContext.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
requestInfo = (RequestInfo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
}
RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(state);
if(idAccordo!=null) {
datiTransazione.setIdAccordoServizioParteComune(idAccordo);
}
else {
try {
AccordoServizioParteSpecifica asps = registroServiziManager.getAccordoServizioParteSpecifica(idServizio, null, false, requestInfo);
datiTransazione.setIdAccordoServizioParteComune(IDAccordoFactory.getInstance().getIDAccordoFromUri(asps.getAccordoServizioParteComune()));
}catch(Exception e) {
/**System.out.println("["+(String) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)+"] Errore: "+e.getMessage());
e.printStackTrace(System.out);*/
log.debug("Lettura AccordoServizioParteSpecifica ("+idServizio+") non riuscita: "+e.getMessage(),e);
}
}
if(datiTransazione.getIdAccordoServizioParteComune()!=null) {
try {
AccordoServizioParteComune aspc = registroServiziManager.getAccordoServizioParteComune(datiTransazione.getIdAccordoServizioParteComune(), null, false, false, requestInfo);
if(aspc.getGruppi()!=null && aspc.getGruppi().sizeGruppoList()>0) {
List<String> tags = new ArrayList<>();
for (GruppoAccordo gruppoAccordo : aspc.getGruppi().getGruppoList()) {
tags.add(gruppoAccordo.getNome());
}
datiTransazione.setTagsAccordoServizioParteComune(tags);
}
}catch(Exception e) {
/**System.out.println("["+(String) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)+"] Errore: "+e.getMessage());
e.printStackTrace(System.out);*/
log.debug("Lettura AccordoServizioParteSpecifica ("+idServizio+") non riuscita: "+e.getMessage(),e);
}
}
if(idPD!=null){
if(servizioApplicativoFruitore!=null){
datiTransazione.setServizioApplicativoFruitore(servizioApplicativoFruitore);
}
else{
datiTransazione.setServizioApplicativoFruitore(CostantiPdD.SERVIZIO_APPLICATIVO_ANONIMO);
}
}
else if(idPA!=null){
if(serviziApplicativiErogatori!=null && !serviziApplicativiErogatori.isEmpty()){
for (int i = 0; i < serviziApplicativiErogatori.size(); i++) {
datiTransazione.getListServiziApplicativiErogatori().add(serviziApplicativiErogatori.get(i));
}
}
if(servizioApplicativoFruitore!=null){
datiTransazione.setServizioApplicativoFruitore(servizioApplicativoFruitore);
}
}
if(pddContext!=null) {
if(pddContext.containsKey(org.openspcoop2.core.constants.Costanti.IDENTIFICATIVO_AUTENTICATO)) {
String id = (String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.IDENTIFICATIVO_AUTENTICATO);
datiTransazione.setIdentificativoAutenticato(id);
}
if(pddContext.containsKey(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE)) {
InformazioniToken informazioniTokenNormalizzate = (InformazioniToken) pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
if(informazioniTokenNormalizzate!=null) {
datiTransazione.setTokenSubject(informazioniTokenNormalizzate.getSub());
datiTransazione.setTokenIssuer(informazioniTokenNormalizzate.getIss());
datiTransazione.setTokenClientId(informazioniTokenNormalizzate.getClientId());
datiTransazione.setTokenUsername(informazioniTokenNormalizzate.getUsername());
if(informazioniTokenNormalizzate.getUserInfo()!=null) {
datiTransazione.setTokenEMail(informazioniTokenNormalizzate.getUserInfo().getEMail());
}
datiTransazione.setTokenClaims(informazioniTokenNormalizzate.getClaims());
SecurityToken securityToken = SecurityTokenUtilities.readSecurityToken(pddContext);
if(securityToken!=null && securityToken.getPdnd()!=null) {
datiTransazione.setPdndClientJson(securityToken.getPdnd().getClientJson());
datiTransazione.setPdndOrganizationJson(securityToken.getPdnd().getOrganizationJson());
try {
datiTransazione.setPdndOrganizationName(securityToken.getPdnd().getOrganizationName());
}catch(Exception e) {
/**System.out.println("["+(String) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)+"] Errore: "+e.getMessage());
e.printStackTrace(System.out);*/
log.debug("Lettura 'PDND Organization name' non riuscita: "+e.getMessage(),e);
}
}
}
}
if(pddContext.containsKey(org.openspcoop2.core.constants.Costanti.ID_APPLICATIVO_TOKEN)) {
IDServizioApplicativo servizioApplicativoToken = (IDServizioApplicativo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_APPLICATIVO_TOKEN);
datiTransazione.setIdServizioApplicativoToken(servizioApplicativoToken);
}
}
return datiTransazione;
}
public static boolean checkRegisterThread(DatiTransazione datiTransazione){
if(datiTransazione.getDominio()==null ||
datiTransazione.getDominio().getTipo()==null ||
datiTransazione.getDominio().getNome()==null ||
datiTransazione.getDominio().getCodicePorta()==null ){
return false; // i dati sul dominio ci devono essere
}
if(datiTransazione.getModulo()==null){
return false; // i dati sul modulo ci devono essere
}
if(datiTransazione.getIdTransazione()==null){
return false; // i dati sull'identificativo transazione ci devono essere
}
if(datiTransazione.getNomePorta()==null) {
return false; // i dati sul nome della porta ci deve essere
}
if(
TipoPdD.DELEGATA.equals(datiTransazione.getTipoPdD())
&&
(datiTransazione.getSoggettoFruitore()==null
||
datiTransazione.getSoggettoFruitore().getTipo()==null
||
datiTransazione.getSoggettoFruitore().getNome()==null)
){
return false; // i dati sul fruitore ci devono essere
}
if(datiTransazione.getIdServizio()==null ||
datiTransazione.getIdServizio().getSoggettoErogatore()==null ||
datiTransazione.getIdServizio().getSoggettoErogatore().getTipo()==null ||
datiTransazione.getIdServizio().getSoggettoErogatore().getNome()==null){
return false; // i dati sull'erogatore ci devono essere
}
if(datiTransazione.getIdServizio()==null ||
datiTransazione.getIdServizio().getTipo()==null || datiTransazione.getIdServizio().getNome()==null || datiTransazione.getIdServizio().getVersione()==null){
return false; // i dati sul servizio ci devono essere
}
if(datiTransazione.getServizioApplicativoFruitore()==null &&
(datiTransazione.getListServiziApplicativiErogatori()==null || datiTransazione.getListServiziApplicativiErogatori().isEmpty())){
return false; // i dati sul servizio applicativo ci devono essere
}
return true;
}
public static boolean filter(AttivazionePolicyFiltro filtro, DatiTransazione datiTransazione, IState state, RequestInfo requestInfo) throws Exception{
if(filtro.isEnabled()){
if(filtro.getProtocollo()!=null && !"".equals(filtro.getProtocollo()) &&
!filtro.getProtocollo().equals(datiTransazione.getProtocollo())){
return false;
}
if(filtro.getRuoloPorta()!=null && !"".equals(filtro.getRuoloPorta().getValue()) &&
!RuoloPolicy.ENTRAMBI.equals(filtro.getRuoloPorta())){
if(RuoloPolicy.DELEGATA.equals(filtro.getRuoloPorta()) &&
!TipoPdD.DELEGATA.equals(datiTransazione.getTipoPdD())){
return false;
}
if(RuoloPolicy.APPLICATIVA.equals(filtro.getRuoloPorta()) &&
!TipoPdD.APPLICATIVA.equals(datiTransazione.getTipoPdD())){
return false;
}
}
boolean policyGlobale = true;
if(filtro.getNomePorta()!=null && !"".equals(filtro.getNomePorta())){
policyGlobale = false;
if(datiTransazione.getNomePorta()==null){
return false;
}
if(!filtro.getNomePorta().equals(datiTransazione.getNomePorta())){
return false;
}
}
if(filtro.getRuoloFruitore()!=null && !"".equals(filtro.getRuoloFruitore())){
/*
* Se policyGlobale:
* si controlla sia il fruitore che l'applicativo. Basta che uno sia soddisfatto.
* else
* nel caso di delegata si controlla solo l'applicativo.
* nel caso di applicativa entrambi, e basta che uno sia soddisfatto.
**/
// diventa policy richiedente
boolean ruoloSoggetto = false;
boolean ruoloApplicativo = false;
if(datiTransazione.getSoggettoFruitore()!=null &&
datiTransazione.getSoggettoFruitore().getTipo()!=null &&
datiTransazione.getSoggettoFruitore().getNome()!=null){
IDSoggetto idFruitore = new IDSoggetto(datiTransazione.getSoggettoFruitore().getTipo(), datiTransazione.getSoggettoFruitore().getNome());
if(policyGlobale || TipoPdD.APPLICATIVA.equals(datiTransazione.getTipoPdD())){
RegistroServiziManager registroManager = RegistroServiziManager.getInstance(state);
Soggetto soggetto = null;
try {
soggetto = registroManager.getSoggetto(idFruitore, null, requestInfo);
}catch(DriverRegistroServiziNotFound notFound) {
// ignore
}
if(soggetto!=null && soggetto.getRuoli()!=null) {
for (int i = 0; i < soggetto.getRuoli().sizeRuoloList(); i++) {
if(soggetto.getRuoli().getRuolo(i).getNome().equals(filtro.getRuoloFruitore())) {
ruoloSoggetto = true;
break;
}
}
}
}
if(datiTransazione.getServizioApplicativoFruitore()!=null && !CostantiPdD.SERVIZIO_APPLICATIVO_ANONIMO.equals(datiTransazione.getServizioApplicativoFruitore())) {
IDServizioApplicativo idSA = new IDServizioApplicativo();
idSA.setIdSoggettoProprietario(idFruitore);
idSA.setNome(datiTransazione.getServizioApplicativoFruitore());
ConfigurazionePdDManager configPdDManager = ConfigurazionePdDManager.getInstance(state);
ServizioApplicativo sa = null;
try {
sa = configPdDManager.getServizioApplicativo(idSA, requestInfo);
}catch(DriverConfigurazioneNotFound nofFound) {
// ignore
}
if(sa!=null && sa.getInvocazionePorta()!=null && sa.getInvocazionePorta().getRuoli()!=null) {
for (int i = 0; i < sa.getInvocazionePorta().getRuoli().sizeRuoloList(); i++) {
if(sa.getInvocazionePorta().getRuoli().getRuolo(i).getNome().equals(filtro.getRuoloFruitore())) {
ruoloApplicativo = true;
break;
}
}
}
}
}
if(!ruoloSoggetto && !ruoloApplicativo && datiTransazione.getIdServizioApplicativoToken()!=null) {
if(policyGlobale || TipoPdD.APPLICATIVA.equals(datiTransazione.getTipoPdD())){
RegistroServiziManager registroManager = RegistroServiziManager.getInstance(state);
Soggetto soggetto = null;
try {
soggetto = registroManager.getSoggetto(datiTransazione.getIdServizioApplicativoToken().getIdSoggettoProprietario(), null, requestInfo);
}catch(DriverRegistroServiziNotFound notFound) {
// ignore
}
if(soggetto!=null && soggetto.getRuoli()!=null) {
for (int i = 0; i < soggetto.getRuoli().sizeRuoloList(); i++) {
if(soggetto.getRuoli().getRuolo(i).getNome().equals(filtro.getRuoloFruitore())) {
ruoloSoggetto = true;
break;
}
}
}
}
ConfigurazionePdDManager configPdDManager = ConfigurazionePdDManager.getInstance(state);
ServizioApplicativo sa = null;
try {
sa = configPdDManager.getServizioApplicativo(datiTransazione.getIdServizioApplicativoToken(), requestInfo);
}catch(DriverConfigurazioneNotFound nofFound) {
// ignore
}
if(sa!=null && sa.getInvocazionePorta()!=null && sa.getInvocazionePorta().getRuoli()!=null) {
for (int i = 0; i < sa.getInvocazionePorta().getRuoli().sizeRuoloList(); i++) {
if(sa.getInvocazionePorta().getRuoli().getRuolo(i).getNome().equals(filtro.getRuoloFruitore())) {
ruoloApplicativo = true;
break;
}
}
}
}
if(!ruoloSoggetto && !ruoloApplicativo) {
return false;
}
}
boolean checkDatiFruitore = true;
if(datiTransazione.getIdServizioApplicativoToken()!=null && datiTransazione.getIdServizioApplicativoToken().getIdSoggettoProprietario()!=null &&
filtro.getTipoFruitore()!=null && !"".equals(filtro.getTipoFruitore()) &&
filtro.getNomeFruitore()!=null && !"".equals(filtro.getNomeFruitore()) &&
filtro.getServizioApplicativoFruitore()!=null && !"".equals(filtro.getServizioApplicativoFruitore()) &&
filtro.getTipoFruitore().equals(datiTransazione.getIdServizioApplicativoToken().getIdSoggettoProprietario().getTipo()) &&
filtro.getNomeFruitore().equals(datiTransazione.getIdServizioApplicativoToken().getIdSoggettoProprietario().getNome()) &&
filtro.getServizioApplicativoFruitore().equals(datiTransazione.getIdServizioApplicativoToken().getNome())) {
checkDatiFruitore = false; // match con l'applicativo token
}
if(checkDatiFruitore && filtro.getTipoFruitore()!=null && !"".equals(filtro.getTipoFruitore())){
if(datiTransazione.getSoggettoFruitore()==null){
return false;
}
if(!filtro.getTipoFruitore().equals(datiTransazione.getSoggettoFruitore().getTipo())){
return false;
}
}
if(checkDatiFruitore && filtro.getNomeFruitore()!=null && !"".equals(filtro.getNomeFruitore())){
if(datiTransazione.getSoggettoFruitore()==null){
return false;
}
if(!filtro.getNomeFruitore().equals(datiTransazione.getSoggettoFruitore().getNome())){
return false;
}
}
if(checkDatiFruitore && filtro.getServizioApplicativoFruitore()!=null && !"".equals(filtro.getServizioApplicativoFruitore()) &&
!filtro.getServizioApplicativoFruitore().equals(datiTransazione.getServizioApplicativoFruitore())){
return false;
}
if(filtro.getRuoloErogatore()!=null && !"".equals(filtro.getRuoloErogatore())){
if(datiTransazione.getIdServizio() == null ||
datiTransazione.getIdServizio().getSoggettoErogatore()==null ||
datiTransazione.getIdServizio().getSoggettoErogatore().getTipo()==null ||
datiTransazione.getIdServizio().getSoggettoErogatore().getNome()==null){
return false;
}
IDSoggetto idErogatore = new IDSoggetto(datiTransazione.getIdServizio().getSoggettoErogatore().getTipo(), datiTransazione.getIdServizio().getSoggettoErogatore().getNome());
RegistroServiziManager registroManager = RegistroServiziManager.getInstance(state);
Soggetto soggetto = registroManager.getSoggetto(idErogatore, null, requestInfo);
boolean foundRuolo = false;
if(soggetto.getRuoli()!=null) {
for (int i = 0; i < soggetto.getRuoli().sizeRuoloList(); i++) {
if(soggetto.getRuoli().getRuolo(i).getNome().equals(filtro.getRuoloErogatore())) {
foundRuolo = true;
break;
}
}
}
if(!foundRuolo) {
return false;
}
}
if(filtro.getTipoErogatore()!=null && !"".equals(filtro.getTipoErogatore())){
if(datiTransazione.getIdServizio()==null){
return false;
}
if(datiTransazione.getIdServizio().getSoggettoErogatore()==null){
return false;
}
if(!filtro.getTipoErogatore().equals(datiTransazione.getIdServizio().getSoggettoErogatore().getTipo())){
return false;
}
}
if(filtro.getNomeErogatore()!=null && !"".equals(filtro.getNomeErogatore())){
if(datiTransazione.getIdServizio()==null){
return false;
}
if(datiTransazione.getIdServizio().getSoggettoErogatore()==null){
return false;
}
if(!filtro.getNomeErogatore().equals(datiTransazione.getIdServizio().getSoggettoErogatore().getNome())){
return false;
}
}
if(filtro.getServizioApplicativoErogatore()!=null && !"".equals(filtro.getServizioApplicativoErogatore())){
if(datiTransazione.getListServiziApplicativiErogatori()==null || datiTransazione.getListServiziApplicativiErogatori().isEmpty()){
return false;
}
if(!datiTransazione.getListServiziApplicativiErogatori().contains(filtro.getServizioApplicativoErogatore())){
return false;
}
}
if(filtro.getTag()!=null && !"".equals(filtro.getTag())){
if(datiTransazione.getTagsAccordoServizioParteComune()==null || datiTransazione.getTagsAccordoServizioParteComune().isEmpty()){
return false;
}
boolean find = false;
for (String tag : datiTransazione.getTagsAccordoServizioParteComune()) {
if(filtro.getTag().equals(tag)){
find = true;
break;
}
}
if(!find){
return false;
}
}
if(filtro.getTipoServizio()!=null && !"".equals(filtro.getTipoServizio())){
if(datiTransazione.getIdServizio()==null){
return false;
}
if(!filtro.getTipoServizio().equals(datiTransazione.getIdServizio().getTipo())){
return false;
}
}
if(filtro.getNomeServizio()!=null && !"".equals(filtro.getNomeServizio())){
if(datiTransazione.getIdServizio()==null){
return false;
}
if(!filtro.getNomeServizio().equals(datiTransazione.getIdServizio().getNome())){
return false;
}
}
if(filtro.getVersioneServizio()!=null){
if(datiTransazione.getIdServizio()==null || datiTransazione.getIdServizio().getVersione()==null){
return false;
}
if(filtro.getVersioneServizio().intValue() != datiTransazione.getIdServizio().getVersione().intValue()){
return false;
}
}
if(filtro.getAzione()!=null && !"".equals(filtro.getAzione())){
if(datiTransazione.getIdServizio()==null){
return false;
}
if(datiTransazione.getIdServizio().getAzione()==null){
return false;
}
String [] tmp = filtro.getAzione().split(",");
if(tmp!=null && tmp.length>0) {
boolean found = false;
for (String az : tmp) {
if(az.equals(datiTransazione.getIdServizio().getAzione())){
found=true;
break;
}
}
if(!found) {
return false;
}
}
}
if(filtro.getTokenClaims()!=null && !"".equals(filtro.getTokenClaims())){
Properties properties = PropertiesUtilities.convertTextToProperties(filtro.getTokenClaims());
boolean isOk = filter(properties, datiTransazione.getTokenClaims());
if(!isOk) {
return false;
}
}
}
return true;
}
private static boolean filter(Properties properties, Map<String, String> datiTransazioneClaims) {
if(properties!=null && properties.size()>0) {
for (Object o : properties.keySet()) {
if(o instanceof String) {
String key = (String) o;
Boolean v = filterPropertyClaim(key, properties, datiTransazioneClaims);
if(v!=null) {
return v.booleanValue();
}
}
}
}
return true;
}
private static Boolean filterPropertyClaim(String key, Properties properties, Map<String, String> datiTransazioneClaims) {
Boolean b = null;
String value = properties.getProperty(key);
if(datiTransazioneClaims==null || datiTransazioneClaims.isEmpty()) {
return false;
}
if(!datiTransazioneClaims.containsKey(key)) {
return false;
}
String v = datiTransazioneClaims.get(key);
if(value==null || "".equals(value)) {
if (! (v == null || "".equals(v)) ) {
return false;
}
}
else {
if(!value.equals(v)) {
return false;
}
}
return b;
}
}