AuditAppender.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.web.lib.audit.appender;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import org.openspcoop2.core.config.GenericProperties;
import org.openspcoop2.core.config.MessageSecurityFlow;
import org.openspcoop2.core.config.MessageSecurityFlowParameter;
import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.PortaDelegata;
import org.openspcoop2.core.config.Property;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.constants.CostantiConnettori;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.core.constants.CostantiProprieta;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.Fruitore;
import org.openspcoop2.core.registry.ProtocolProperty;
import org.openspcoop2.pdd.core.byok.DriverBYOKUtilities;
import org.openspcoop2.utils.UtilsException;
import org.openspcoop2.utils.date.DateManager;
import org.openspcoop2.utils.regexp.RegularExpressionEngine;
import org.openspcoop2.utils.resources.ClassLoaderUtilities;
import org.openspcoop2.utils.serialization.FilteredObject;
import org.openspcoop2.utils.serialization.IDBuilder;
import org.openspcoop2.utils.serialization.SerializationConfig;
import org.openspcoop2.web.lib.audit.AuditException;
import org.openspcoop2.web.lib.audit.costanti.Costanti;
import org.openspcoop2.web.lib.audit.dao.Appender;
import org.openspcoop2.web.lib.audit.dao.Configurazione;
import org.openspcoop2.web.lib.audit.dao.Filtro;
import org.openspcoop2.web.lib.audit.log.Binary;
import org.openspcoop2.web.lib.audit.log.Operation;
import org.openspcoop2.web.lib.audit.log.constants.Stato;
import org.openspcoop2.web.lib.audit.log.constants.Tipologia;

/**
 * Appender per registrare operazione di audit
 * 
 * 
 * @author Andrea Poli (apoli@link.it)
 * @author Stefano Corallo (corallo@link.it)
 * @author Sandra Giangrandi (sandra@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 * 
 */
public class AuditAppender {

	private static final String AUDIT_DISABILITATO = "Audit engine disabilitato";
	private static final String APPENDER_NON_FORNITI = "Appender non forniti";
	
	/* Configurazione */
	private static Configurazione configurazioneAuditing;
	private static IDBuilder idBuilder;
	private static HashMap<String,IAuditAppender> appenders = new HashMap<>();
	
	public void initializeAudit(Configurazione configurazioneAuditing,
			IDBuilder idBuilder) throws AuditException{
		initializeAuditEngine(configurazioneAuditing, idBuilder);
	}
	
	private static synchronized void initializeAuditEngine(Configurazione configurazioneAuditing,
			IDBuilder idBuilder) throws AuditException{
		
		try{
		
			AuditAppender.appenders.clear();	
			
			AuditAppender.configurazioneAuditing= configurazioneAuditing;
			AuditAppender.idBuilder = idBuilder;
			
			for(int i=0; i<AuditAppender.configurazioneAuditing.sizeAppender(); i++){
				
				// Istanzio appender
				Appender appenderConf = AuditAppender.configurazioneAuditing.getAppender(i);
				Class<?> c = Class.forName(appenderConf.getClassName());
				IAuditAppender appender = (IAuditAppender) ClassLoaderUtilities.newInstance(c);
				
				// Inizializzo appender
				Properties propertiesAppender = new Properties();
				for(int j=0; j<appenderConf.sizeProperties(); j++){
					propertiesAppender.put(appenderConf.getProperty(j).getName(), 
							appenderConf.getProperty(j).getValue());
				}
				appender.initAppender(appenderConf.getNome(),propertiesAppender);
				
				AuditAppender.appenders.put(appenderConf.getNome(),appender);
			}
			
		}catch(Exception e){
			throw new AuditException("InizializzazioneFallita: "+e.getMessage(),e);
		}
	}
	
	public void updateConfigurazioneAuditing(Configurazione configurazioneAuditing) throws AuditException{
		try{
			synchronized(AuditAppender.configurazioneAuditing){
			
				AuditAppender.configurazioneAuditing = configurazioneAuditing;
				
				AuditAppender.appenders.clear();
				
				for(int i=0; i<AuditAppender.configurazioneAuditing.sizeAppender(); i++){
					
					// Istanzio appender
					Appender appenderConf = AuditAppender.configurazioneAuditing.getAppender(i);
					Class<?> c = Class.forName(appenderConf.getClassName());
					IAuditAppender appender = (IAuditAppender) ClassLoaderUtilities.newInstance(c);
					
					// Inizializzo appender
					Properties propertiesAppender = new Properties();
					for(int j=0; j<appenderConf.sizeProperties(); j++){
						propertiesAppender.put(appenderConf.getProperty(j).getName(), 
								appenderConf.getProperty(j).getValue());
					}
					appender.initAppender(appenderConf.getNome(),propertiesAppender);
					
					AuditAppender.appenders.put(appenderConf.getNome(),appender);
				}
			}
		}catch(Exception e){
			throw new AuditException("AggiornamentoFallito: "+e.getMessage(),e);
		}
	}

	
	
	public IDOperazione registraOperazioneInFaseDiElaborazione(Tipologia tipoOperazione,Object object,String user,String interfaceMsg, boolean registrazioneBinari,
			DriverBYOKUtilities byok) throws AuditException,AuditDisabilitatoException{
		
		if(!AuditAppender.configurazioneAuditing.isAuditEngineEnabled()){
			throw new AuditDisabilitatoException(AUDIT_DISABILITATO);
		}
		
		try{
			
				
			Operation operation = new Operation();
			operation.setTipologia(tipoOperazione);
			operation.setUtente(user);
			operation.setStato(Stato.REQUESTING);
			operation.setTimeRequest(DateManager.getDate());
			operation.setTimeExecute(DateManager.getDate());
			operation.setInterfaceMsg(interfaceMsg);
			
			if(object!=null){
				
				operation.setTipoOggetto(AuditAppender.idBuilder.getSimpleName(object));
				operation.setObjectId(AuditAppender.idBuilder.toID(object));
				operation.setObjectOldId(AuditAppender.idBuilder.toOldID(object));
				operation.setObjectClass(object.getClass().getName());
				
			}else{
				throw new AuditException("Object riguardante l'operazione non definito");
			}

			
			// Filtro operazioni
			org.openspcoop2.utils.serialization.Filter listFilter = new org.openspcoop2.utils.serialization.Filter();
			String objectDetails = filtraOperazione(operation,object,listFilter, registrazioneBinari, byok);
			
			if(objectDetails!=null){
				operation.setObjectDetails(objectDetails);
				
				// Aggiunto binaries filtrati
				for(int i=0; i<listFilter.sizeFilteredObjects(); i++){
					FilteredObject filteredObject = listFilter.getFilteredObject(i);
					
					Binary binary = new Binary();
					binary.setBinaryId(filteredObject.getId());
					binary.setChecksum(filteredObject.getChecksum());
					operation.addBinary(binary);
				}
			}
				
			
			// Appender
			IDOperazione idOperazione = new IDOperazione();
			if(AuditAppender.appenders!=null && AuditAppender.appenders.keySet()!=null){
				Iterator<String> iterator = AuditAppender.appenders.keySet().iterator();
				while(iterator.hasNext()){
					
					String appenderName = iterator.next();
					IAuditAppender appender =  AuditAppender.appenders.get(appenderName);
									
					Object idOperazioneAppender =  appender.registraOperazioneInFaseDiElaborazione(operation);
					idOperazione.addIdOperazione(appenderName, idOperazioneAppender);
				}
				return idOperazione;
			}
			else{
				throw new AuditException(APPENDER_NON_FORNITI);
			}
				
			
		}catch(AuditDisabilitatoException e){
			throw e;
		}catch(Exception e){
			throw new AuditException("registraOperazioneInFaseDiElaborazione error: "+e.getMessage(),e);
		}
		
	}
	
	
	
	public void registraOperazioneAccesso(Tipologia tipoOperazione,String user,String interfaceMsg, boolean registrazioneBinari,
			DriverBYOKUtilities byok) throws AuditException,AuditDisabilitatoException{
		
		if(!AuditAppender.configurazioneAuditing.isAuditEngineEnabled()){
			throw new AuditDisabilitatoException(AUDIT_DISABILITATO);
		}
		
		try{
			
				
			Operation operation = new Operation();
			operation.setTipologia(tipoOperazione);
			operation.setUtente(user);
			operation.setStato(Stato.COMPLETED);
			operation.setTimeRequest(DateManager.getDate());
			operation.setTimeExecute(DateManager.getDate());
			operation.setInterfaceMsg(interfaceMsg);
					
			
			// Filtro operazioni
			filtraOperazione(operation, registrazioneBinari, byok);
			
			
			// Appender
			IDOperazione idOperazione = new IDOperazione();
			if(AuditAppender.appenders!=null && AuditAppender.appenders.keySet()!=null){
				Iterator<String> iterator = AuditAppender.appenders.keySet().iterator();
				while(iterator.hasNext()){
					
					String appenderName = iterator.next();
					IAuditAppender appender =  AuditAppender.appenders.get(appenderName);
									
					Object idOperazioneAppender =  appender.registraOperazioneInFaseDiElaborazione(operation);
					idOperazione.addIdOperazione(appenderName, idOperazioneAppender);
				}
			}
			else{
				throw new AuditException(APPENDER_NON_FORNITI);
			}
				
			
		}catch(AuditDisabilitatoException e){
			throw e;
		}catch(Exception e){
			throw new AuditException("registraOperazioneInFaseDiElaborazione error: "+e.getMessage(),e);
		}
		
	}
	
	
	
	public void registraOperazioneCompletataConSuccesso(IDOperazione idOperazione,String interfaceMsg) throws AuditException,AuditDisabilitatoException{
		
		if(!AuditAppender.configurazioneAuditing.isAuditEngineEnabled()){
			throw new AuditDisabilitatoException(AUDIT_DISABILITATO);
		}
		
		try{
			
			if(idOperazione==null){
				throw new AuditException("Identificativo dell'operazione per cui cambiare stato non fornito");
			}
			
			if(AuditAppender.appenders!=null && AuditAppender.appenders.keySet()!=null){
				Iterator<String> iterator = AuditAppender.appenders.keySet().iterator();
				while(iterator.hasNext()){
					
					String appenderName = iterator.next();
					IAuditAppender appender =  AuditAppender.appenders.get(appenderName);
					Object id = idOperazione.getIdOperazione(appenderName);
					if(id==null){
						throw new AuditException("Identificativo dell'operazione per l'appender["+appenderName+"] non fornito");
					}
					if(id instanceof Operation){
						Operation op = (Operation) id;
						op.setInterfaceMsg(interfaceMsg);
					}
					
					appender.registraOperazioneCompletataConSuccesso(id);
				}
			}
			else{
				throw new AuditException(APPENDER_NON_FORNITI);
			}
				
			
		}catch(Exception e){
			throw new AuditException("registraOperazioneCompletataConSuccesso error: "+e.getMessage(),e);
		}
	}
	
	
	
	
	
	public void registraOperazioneTerminataConErrore(IDOperazione idOperazione,String motivoErrore,String interfaceMsg) throws AuditException,AuditDisabilitatoException{
		
		if(!AuditAppender.configurazioneAuditing.isAuditEngineEnabled()){
			throw new AuditDisabilitatoException(AUDIT_DISABILITATO);
		}
		
		try{
			
			if(idOperazione==null){
				throw new AuditException("Identificativo dell'operazione per cui cambiare stato non fornito");
			}
						
			if(AuditAppender.appenders!=null && AuditAppender.appenders.keySet()!=null){
				Iterator<String> iterator = AuditAppender.appenders.keySet().iterator();
				while(iterator.hasNext()){
					
					String appenderName = iterator.next();
					IAuditAppender appender =  AuditAppender.appenders.get(appenderName);
					Object id = idOperazione.getIdOperazione(appenderName);
					if(id==null){
						throw new AuditException("Identificativo dell'operazione per l'appender["+appenderName+"] non fornito");
					}		
					if(id instanceof Operation){
						Operation op = (Operation) id;
						op.setInterfaceMsg(interfaceMsg);
					}
									
					appender.registraOperazioneTerminataConErrore(id,motivoErrore);
				}
			}
			else{
				throw new AuditException(APPENDER_NON_FORNITI);
			}
				
			
		}catch(Exception e){
			throw new AuditException("registraOperazioneCompletataConSuccesso error: "+e.getMessage(),e);
		}
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	// -------------- UTILITY -------------------
	
	private String serializeJsonObject(Object o,org.openspcoop2.utils.serialization.Filter listFilter, boolean registrazioneBinari) throws AuditException{
		try{
			if(!registrazioneBinari) {
				listFilter.addFilterByValue(byte[].class);
			}
			SerializationConfig config = new SerializationConfig();
			config.setFilter(listFilter);
			config.setIdBuilder(AuditAppender.idBuilder);
			config.setPrettyPrint(true);
			// Deprecato
/**			org.openspcoop2.utils.serialization.JSonSerializer serializer = 
				new org.openspcoop2.utils.serialization.JSonSerializer(config);*/
			org.openspcoop2.utils.serialization.JsonJacksonSerializer serializer = 
				new org.openspcoop2.utils.serialization.JsonJacksonSerializer(config);
			return  serializer.getObject(o);		
		}catch(Exception e){
			throw new AuditException("serializeJsonObject error: "+e.getMessage(),e);
		}
	}
	
	private String serializeXMLObject(Object o,org.openspcoop2.utils.serialization.Filter listFilter, boolean registrazioneBinari) throws AuditException{
		try{
			if(!registrazioneBinari) {
				listFilter.addFilterByValue(byte[].class);
			}
			SerializationConfig config = new SerializationConfig();
			config.setFilter(listFilter);
			config.setIdBuilder(AuditAppender.idBuilder);
			config.setPrettyPrint(true);
			org.openspcoop2.utils.serialization.XMLSerializer serializer = 
				new org.openspcoop2.utils.serialization.XMLSerializer(config);
			return  serializer.getObject(o);		
		}catch(Exception e){
			throw new AuditException("serializeXMLObject error: "+e.getMessage(),e);
		}
	}
	
	private void filtraOperazione(Operation operation, boolean registrazioneBinari,
			DriverBYOKUtilities byok) throws AuditException,AuditDisabilitatoException{
		this.filtraOperazione(operation, null, null, registrazioneBinari,
				byok);
	}
	private String filtraOperazione(Operation operation,Object object,org.openspcoop2.utils.serialization.Filter listFilter, boolean registrazioneBinari,
			DriverBYOKUtilities byok) throws AuditException,AuditDisabilitatoException{
		
		try{
		
			ArrayList<Filtro> filtri = AuditAppender.configurazioneAuditing.getFiltri();
			boolean auditEnabledDefault = AuditAppender.configurazioneAuditing.isAuditEnabled();
			boolean dumpEnabledDefault = AuditAppender.configurazioneAuditing.isDumpEnabled();
			String objectDetails = null;
			
			for(int i=0; i<filtri.size(); i++){
				
				Filtro filtro = filtri.get(i);
				
				/**System.out.println("ANALIZZO FILTRO["+i+"]: "+filtro.toString());*/
				
				if(filtro.getUsername()==null &&
						filtro.getTipoOperazione()==null &&
						filtro.getTipoOggettoInModifica()==null &&
						filtro.getStatoOperazione()==null &&
						filtro.getDump()==null){
					throw new AuditException("Filtro("+i+1+") non valido: nessun meccanismo di filtro definito");
				}
				
				if(filtro.getUsername()!=null &&
					// Se e' definito un username nel filtro controllo che corrisponda
					!filtro.getUsername().equals(operation.getUtente())){
					continue;
				}
				
				if(filtro.getTipoOperazione()!=null &&
					// Se e' definito un tipo di operazione nel filtro controllo che corrisponda
					!filtro.getTipoOperazione().equals(operation.getTipologia())){
					continue;
				}
				
				if(filtro.getTipoOggettoInModifica()!=null &&
					// Se e' definito un TipoOggettoInModifica nel filtro controllo che corrisponda
					!filtro.getTipoOggettoInModifica().equals(operation.getTipoOggetto())){
					continue;
				}
				
				if(filtro.getStatoOperazione()!=null &&
					// Se e' definito uno stato dell'operazione nel filtro controllo che corrisponda
					!filtro.getStatoOperazione().equals(operation.getStato())){
					continue;
				}
				
				if(filtro.getDump()!=null){
					
					if(object==null){
						continue; // Questo filtro per essere matchato deve essere controllato con un oggetto
					}
					
					if(objectDetails==null){
						// Serializzo l'oggetto
						objectDetails = this.serialize(object, listFilter, registrazioneBinari, byok);
					}
					
					// Se e' definito un filtro sul contenuto dell'operazione nel filtro controllo che corrisponda
					if(filtro.isDumpExprRegular()){
						if(RegularExpressionEngine.getStringMatchPattern(objectDetails, filtro.getDump())==null){
							continue;
						}
					}else{
						if(!objectDetails.contains(filtro.getDump())){
							continue;
						}
					}
				}
								
				// Se arriviamo a questo punto significa che l'operazione soddisfa il filtro.
				if(!filtro.isAuditEnabled()){
					throw new AuditDisabilitatoException("Audit disabilitato, criterio adottato in base al filtro numero "+(i+1));
				}
				if(filtro.isDumpEnabled()){
					if(object!=null &&
						// Se non avevo gia' serializzato prima per la ricerca tramite contenuto
						objectDetails==null){
						// Serializzo l'oggetto
						objectDetails = this.serialize(object, listFilter, registrazioneBinari, byok);
					}
				}else{
					if(objectDetails!=null){
						objectDetails=null; // era stato utilizzato per effettuare filtro sui contenuti ma non deve essere dumpato
					}
				}
								
				return objectDetails; // regola matcha
			}
			
			// Se nessun filtro sopra viene matchato, si applica il criterio di default
			if(!auditEnabledDefault){
				throw new AuditDisabilitatoException("Audit disabilitato nella configurazione generale (Non vi sono filtri che creano eccezioni)");
			}
			if(dumpEnabledDefault){
				if(object!=null &&
					// Se non avevo gia' serializzato prima per la ricerca tramite contenuto
					objectDetails==null){
					// Serializzo l'oggetto
					objectDetails = this.serialize(object, listFilter, registrazioneBinari, byok);
				}
			}else{
				if(objectDetails!=null){
					objectDetails=null; // era stato utilizzato per effettuare filtro sui contenuti ma non deve essere dumpato
				}
			}
			
			return objectDetails;
			
		}catch(AuditDisabilitatoException e){
			throw e;
		}catch(Exception e){
			throw new AuditException("filtraOperazione error: "+e.getMessage(),e);
		}
	}
	
	private Object byok(DriverBYOKUtilities byok, Object object) throws UtilsException {
		if (object instanceof org.openspcoop2.core.config.Soggetto) {
			org.openspcoop2.core.config.Soggetto sCloned = (org.openspcoop2.core.config.Soggetto) ((org.openspcoop2.core.config.Soggetto) object).clone();
			if(sCloned.getConnettore()!=null && !sCloned.getConnettore().isEmpty()) {
				for (org.openspcoop2.core.config.Connettore connettore : sCloned.getConnettore()) {
					byokConnettore(byok, connettore);		
				}
			}
			return sCloned;
		}
		else if (object instanceof org.openspcoop2.core.registry.Soggetto) {
			org.openspcoop2.core.registry.Soggetto sCloned = (org.openspcoop2.core.registry.Soggetto) ((org.openspcoop2.core.registry.Soggetto) object).clone();
			if(sCloned.getConnettore()!=null) {
				byokConnettore(byok, sCloned.getConnettore());
			}
			return sCloned;
		}
		else if (object instanceof ServizioApplicativo) {
			ServizioApplicativo sCloned = (ServizioApplicativo) ((ServizioApplicativo) object).clone();
			return byok(byok, sCloned);
		}
		else if (object instanceof PortaDelegata) {
			PortaDelegata pdCloned = (PortaDelegata) ((PortaDelegata) object).clone();
			return byok(byok, pdCloned);
		}
		else if (object instanceof PortaApplicativa) {
			PortaApplicativa paCloned = (PortaApplicativa) ((PortaApplicativa) object).clone();
			return byok(byok, paCloned);
		}
		else if(object instanceof GenericProperties) {
			GenericProperties gpCloned = (GenericProperties) ((GenericProperties) object).clone();
			return byok(byok, gpCloned);
		}
		else if(object instanceof AccordoServizioParteSpecifica) {
			AccordoServizioParteSpecifica aspsCloned = (AccordoServizioParteSpecifica) ((AccordoServizioParteSpecifica) object).clone();
			return byok(byok, aspsCloned);
		}
		
		return object;
	}
	private Object byok(DriverBYOKUtilities byok, ServizioApplicativo sCloned) throws UtilsException {
		if(sCloned.getInvocazioneServizio()!=null && sCloned.getInvocazioneServizio().getConnettore()!=null) {
			byokConnettore(byok, sCloned.getInvocazioneServizio().getConnettore());
		}
		if(sCloned.getInvocazioneServizio()!=null && sCloned.getInvocazioneServizio().getAutenticazione()!=null &&
				org.openspcoop2.core.config.constants.InvocazioneServizioTipoAutenticazione.BASIC.equals(sCloned.getInvocazioneServizio().getAutenticazione()) &&
				sCloned.getInvocazioneServizio().getCredenziali()!=null) {
			byokCredenzialiConnettore(byok, sCloned.getInvocazioneServizio().getCredenziali());
		}
		if(sCloned.getRispostaAsincrona()!=null && sCloned.getRispostaAsincrona().getConnettore()!=null) {
			byokConnettore(byok, sCloned.getRispostaAsincrona().getConnettore());
		}
		if(sCloned.getRispostaAsincrona()!=null && sCloned.getRispostaAsincrona().getAutenticazione()!=null &&
				org.openspcoop2.core.config.constants.InvocazioneServizioTipoAutenticazione.BASIC.equals(sCloned.getRispostaAsincrona().getAutenticazione()) &&
				sCloned.getRispostaAsincrona().getCredenziali()!=null) {
			byokCredenzialiConnettore(byok, sCloned.getRispostaAsincrona().getCredenziali());
		}
		if(sCloned.sizeProtocolPropertyList()>0) {
			for (org.openspcoop2.core.config.ProtocolProperty p : sCloned.getProtocolProperty()) {
				if(isConfidentialProtocolProperties(p.getName())) {
					p.setValue(byok.wrap(p.getValue()));
				}
			}
		}
		return sCloned;
	}
	private void byokCredenzialiConnettore(DriverBYOKUtilities byok, org.openspcoop2.core.config.InvocazioneCredenziali credenziale) throws UtilsException {
		if(credenziale.getPassword()!=null) {
			credenziale.setPassword(byok.wrap(credenziale.getPassword()));
		}
	}
	private void byokConnettore(DriverBYOKUtilities byok, org.openspcoop2.core.config.Connettore connettore) throws UtilsException {
		if(connettore.sizePropertyList()>0) {
			for (org.openspcoop2.core.config.Property p : connettore.getPropertyList()) {
				if(isConfidentialConnettore(p.getNome())) {
					p.setValore(byok.wrap(p.getValore()));
				}
			}
		}	
	}
	private void byokConnettore(DriverBYOKUtilities byok, org.openspcoop2.core.registry.Connettore connettore) throws UtilsException {
		if(connettore.sizePropertyList()>0) {
			for (org.openspcoop2.core.registry.Property p : connettore.getPropertyList()) {
				if(isConfidentialConnettore(p.getNome())) {
					p.setValore(byok.wrap(p.getValore()));
				}
			}
		}	
	}
	private boolean isConfidentialConnettore(String nomeProprieta) {
		for (String nomeProprietaConfidential : CostantiConnettori.getConfidentials()) {
			if(nomeProprieta.equals(nomeProprietaConfidential)) {
				return true;
			}
		}
		return false;
	}
	private Object byok(DriverBYOKUtilities byok, PortaDelegata pdCloned) throws UtilsException {
		if(pdCloned.getMessageSecurity()!=null) {
			if(pdCloned.getMessageSecurity().getRequestFlow()!=null) {
				byok(byok, pdCloned.getMessageSecurity().getRequestFlow());
			}
			if(pdCloned.getMessageSecurity().getResponseFlow()!=null) {
				byok(byok, pdCloned.getMessageSecurity().getResponseFlow());
			}
		}
		return pdCloned;
	}
	private Object byok(DriverBYOKUtilities byok, PortaApplicativa paCloned) throws UtilsException {
		if(paCloned.getMessageSecurity()!=null) {
			if(paCloned.getMessageSecurity().getRequestFlow()!=null) {
				byok(byok, paCloned.getMessageSecurity().getRequestFlow());
			}
			if(paCloned.getMessageSecurity().getResponseFlow()!=null) {
				byok(byok, paCloned.getMessageSecurity().getResponseFlow());
			}
		}
		return paCloned;
	}
	private void byok(DriverBYOKUtilities byok, MessageSecurityFlow flow) throws UtilsException {
		if(flow.sizeParameterList()>0) {
			for (MessageSecurityFlowParameter p : flow.getParameterList()) {
				if(isConfidentialSecurity(p.getNome())) {
					p.setValore(byok.wrap(p.getValore()));
				}
			}
		}
	}
	private boolean isConfidentialSecurity(String nomeProprieta) {
		List<String> messageSecurityIds = CostantiProprieta.getMessageSecurityIds();
		if(messageSecurityIds!=null && !messageSecurityIds.isEmpty()) {
			for (String id : messageSecurityIds) {
				List<String> l =  CostantiProprieta.getMessageSecurityProperties(id);
				for (String nomeProprietaCheck : l) {
					if(nomeProprietaCheck.equals(nomeProprieta)) {
						return true;
					}
				}
			}
		}
		return false;
	}
	
	private Object byok(DriverBYOKUtilities byok, GenericProperties gp) throws UtilsException {
		if(gp.sizePropertyList()>0) {
			for (Property p : gp.getPropertyList()) {
				if(isConfidentialToken(gp.getTipo(), p.getNome())) {
					p.setValore(byok.wrap(p.getValore()));
				}
			}
		}
		return gp;
	}
	private boolean isConfidentialToken(String tipo, String nomeProprieta) {
		List<String> l = null;
		if(CostantiProprieta.TOKEN_VALIDATION_ID.equals(tipo)) {
			l = CostantiProprieta.getTokenValidationProperties();
		}
		else if(CostantiProprieta.TOKEN_NEGOZIAZIONE_ID.equals(tipo)) {
			l = CostantiProprieta.getTokenRetrieveProperties();
		}
		else if(CostantiProprieta.ATTRIBUTE_AUTHORITY_ID.equals(tipo)) {
			l = CostantiProprieta.getAttributeAuthorityProperties();
		}
		if(l!=null) {
			for (String nomeProprietaCheck : l) {
				if(nomeProprietaCheck.equals(nomeProprieta)) {
					return true;
				}
			}
		}
		return false;
	}
	private Object byok(DriverBYOKUtilities byok, AccordoServizioParteSpecifica asps) throws UtilsException {
		if(asps.sizeProtocolPropertyList()>0) {
			for (ProtocolProperty p : asps.getProtocolProperty()) {
				if(isConfidentialProtocolProperties(p.getName())) {
					p.setValue(byok.wrap(p.getValue()));
				}
			}
		}
		if(asps.sizeFruitoreList()>0) {
			for (Fruitore fruitore : asps.getFruitoreList()) {
				byok(byok, fruitore);
			}
		}
		if(asps.getConfigurazioneServizio()!=null && asps.getConfigurazioneServizio().getConnettore()!=null) {
			byokConnettore(byok, asps.getConfigurazioneServizio().getConnettore());
		}
		return asps;
	}
	private Object byok(DriverBYOKUtilities byok, Fruitore fruitore) throws UtilsException {
		if(fruitore.sizeProtocolPropertyList()>0) {
			for (ProtocolProperty p : fruitore.getProtocolProperty()) {
				if(isConfidentialProtocolProperties(p.getName())) {
					p.setValue(byok.wrap(p.getValue()));
				}
			}
		}
		if(fruitore.getConnettore()!=null) {
			byokConnettore(byok, fruitore.getConnettore());
		}
		return fruitore;
	}
	private boolean isConfidentialProtocolProperties(String nomeProprieta) {
		return CostantiDB.MODIPA_KEYSTORE_PASSWORD.equals(nomeProprieta) ||
				CostantiDB.MODIPA_KEY_PASSWORD.equals(nomeProprieta) ||
				CostantiDB.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_CERTIFICATI_TRUSTSTORE_PASSWORD.equals(nomeProprieta) ||
				CostantiDB.MODIPA_PROFILO_SICUREZZA_MESSAGGIO_SSL_TRUSTSTORE_PASSWORD.equals(nomeProprieta);
	}
	
	
	private String serialize(Object object,org.openspcoop2.utils.serialization.Filter listFilter, boolean registrazioneBinari,
			DriverBYOKUtilities byok)throws AuditException{
		if(byok!=null) {
			try {
				object = byok(byok, object);
			}catch(Exception e) {
				throw new AuditException(e.getMessage(),e);
			}
		}
		if(Costanti.DUMP_JSON_FORMAT.equals(AuditAppender.configurazioneAuditing.getDumpFormat())){
			return this.serializeJsonObject(object, listFilter, registrazioneBinari);
		}
		else if(Costanti.DUMP_XML_FORMAT.equals(AuditAppender.configurazioneAuditing.getDumpFormat())){
			return this.serializeXMLObject(object, listFilter, registrazioneBinari);
		}else {
			throw new AuditException("Tipo di formattazione non conosciuta: "+AuditAppender.configurazioneAuditing.getDumpFormat());
		}
	}
}