ModIDynamicConfigurationApplicativiUtilities.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.protocol.modipa.properties;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.config.ConfigurazioneMultitenant;
import org.openspcoop2.core.config.GenericProperties;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.config.constants.PortaApplicativaSoggettiFruitori;
import org.openspcoop2.core.config.constants.StatoFunzionalita;
import org.openspcoop2.core.id.IDServizioApplicativo;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.mvc.properties.provider.InputValidationUtils;
import org.openspcoop2.core.registry.Soggetto;
import org.openspcoop2.core.registry.constants.PddTipologia;
import org.openspcoop2.pdd.core.dynamic.DynamicHelperCostanti;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.engine.constants.Costanti;
import org.openspcoop2.protocol.engine.utils.NamingUtils;
import org.openspcoop2.protocol.modipa.constants.ModIConsoleCostanti;
import org.openspcoop2.protocol.modipa.validator.IdentificazioneApplicativoMittenteUtils;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.constants.ConsoleItemType;
import org.openspcoop2.protocol.sdk.constants.ConsoleItemValueType;
import org.openspcoop2.protocol.sdk.constants.ConsoleOperationType;
import org.openspcoop2.protocol.sdk.properties.AbstractConsoleItem;
import org.openspcoop2.protocol.sdk.properties.BaseConsoleItem;
import org.openspcoop2.protocol.sdk.properties.BinaryProperty;
import org.openspcoop2.protocol.sdk.properties.BooleanConsoleItem;
import org.openspcoop2.protocol.sdk.properties.BooleanProperty;
import org.openspcoop2.protocol.sdk.properties.ConsoleConfiguration;
import org.openspcoop2.protocol.sdk.properties.ConsoleItemInfo;
import org.openspcoop2.protocol.sdk.properties.IConsoleHelper;
import org.openspcoop2.protocol.sdk.properties.ProtocolProperties;
import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesFactory;
import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesUtils;
import org.openspcoop2.protocol.sdk.properties.StringConsoleItem;
import org.openspcoop2.protocol.sdk.properties.StringProperty;
import org.openspcoop2.protocol.sdk.registry.IConfigIntegrationReader;
import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
import org.openspcoop2.protocol.sdk.registry.ProtocolFiltroRicercaServiziApplicativi;
import org.openspcoop2.protocol.sdk.registry.RegistryException;
import org.openspcoop2.protocol.sdk.registry.RegistryNotFound;
import org.openspcoop2.utils.certificate.CertificateInfo;

/**
 * ModIDynamicConfigurationApplicativiUtilities
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class ModIDynamicConfigurationApplicativiUtilities {
	
	private ModIDynamicConfigurationApplicativiUtilities() {}

	private static final String VERIFICARE_CONFIG_ASSOCIAZIONE_APPLICATIVO = "Verificare le configurazioni dove risulta associato l'applicativo.";
	
	private static List<String> getPddOperative(IRegistryReader registryReader) throws RegistryException{
		List<String> pddOperative = null;
		try {
			pddOperative = registryReader.findIdPorteDominio(true);
		}catch(RegistryNotFound notFound) {
			// ignore
		}
		return pddOperative;
	}
	
	static ConsoleConfiguration getDynamicConfigServizioApplicativo(ConsoleOperationType consoleOperationType, IConsoleHelper consoleHelper, IRegistryReader registryReader,
			IConfigIntegrationReader configIntegrationReader, IDServizioApplicativo id) throws ProtocolException {
		
		ConsoleConfiguration configuration = new ConsoleConfiguration();
		
		boolean esterno = false;
		try {
			String dominio = consoleHelper.getParameter(Costanti.CONSOLE_PARAMETRO_SOGGETTO_DOMINIO);
			if( 
					(dominio==null || "".equals(dominio)) 
					&&
					ConsoleOperationType.CHANGE.equals(consoleOperationType)
				) {
				Soggetto soggetto = registryReader.getSoggetto(id.getIdSoggettoProprietario());
				if(soggetto.getPortaDominio()==null || "".equals(soggetto.getPortaDominio())) {
					dominio = PddTipologia.ESTERNO.toString();
				}
				else {
					List<String> pddOperative = getPddOperative(registryReader);
					if(pddOperative==null || pddOperative.isEmpty() || !pddOperative.contains(soggetto.getPortaDominio())) {
						dominio = PddTipologia.ESTERNO.toString();	
					}
					else {
						dominio = PddTipologia.OPERATIVO.toString();
					}
				}
			}
			esterno = PddTipologia.ESTERNO.toString().equals(dominio);
		}catch(Exception e) {
			throw new ProtocolException(e.getMessage(),e);
		}
		
		boolean isClient = true;
		try {
			String client = consoleHelper.getParameter(Costanti.CONSOLE_PARAMETRO_SERVIZI_APPLICATIVI_TIPO_SA);
			isClient = (client==null) || ("".equals(client)) || (CostantiConfigurazione.CLIENT.equals(client)) || (CostantiConfigurazione.CLIENT_OR_SERVER.equals(client));
			if(ConsoleOperationType.CHANGE.equals(consoleOperationType)) {
				ServizioApplicativo sa = configIntegrationReader.getServizioApplicativo(id);
				isClient = CostantiConfigurazione.CLIENT.equals(sa.getTipo()) || sa.isUseAsClient();
			}
		}catch(Exception e) {
			throw new ProtocolException(e.getMessage(),e);
		}
		
		if(isClient) {
			if(!esterno) {
				
				BaseConsoleItem titolo = ProtocolPropertiesFactory.newTitleItem(
						ModIConsoleCostanti.MODIPA_APPLICATIVI_ID, 
						ModIConsoleCostanti.MODIPA_APPLICATIVI_LABEL);
				configuration.addConsoleItem(titolo );
				
				BaseConsoleItem subTitolo = ProtocolPropertiesFactory.newSubTitleItem(
						ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_CERTIFICATO_SUBTITLE_ID, 
						ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_CERTIFICATO_SUBTITLE_LABEL);
				configuration.addConsoleItem(subTitolo );
				
				BooleanConsoleItem booleanConsoleItem = 
						(BooleanConsoleItem) ProtocolPropertiesFactory.newConsoleItem(ConsoleItemValueType.BOOLEAN, ConsoleItemType.CHECKBOX,
								ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_ID, ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_LABEL);
				booleanConsoleItem.setDefaultValue(false);
				booleanConsoleItem.setReloadOnChange(true, true);
				configuration.addConsoleItem(booleanConsoleItem);
				
				ModIDynamicConfigurationKeystoreUtilities.addKeystoreConfig(configuration, false, true, true);
				
				BaseConsoleItem subTitoloModiAUTH = ProtocolPropertiesFactory.newSubTitleItem(
						ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_MODI_AUTH_SUBTITLE_ID, 
						ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_MODI_AUTH_SUBTITLE_LABEL);
				configuration.addConsoleItem(subTitoloModiAUTH);
			}
			
			if(esterno) {
				BaseConsoleItem subTitolo = ProtocolPropertiesFactory.newSubTitleItem(
						ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_CERTIFICATO_SUBTITLE_ID, 
						ModIConsoleCostanti.MODIPA_API_CONFIGURAZIONE_SICUREZZA_MESSAGGIO_MODE_LABEL_PARAMETRI_RISPOSTA);
				configuration.addConsoleItem(subTitolo );
			}
			
			String labelSicurezzaMessaggioAudienceItem = esterno ? 
					ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_INFO_DOMINIO_ESTERNO_LABEL : 
					ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_INFO_DOMINIO_INTERNO_LABEL;
			StringConsoleItem profiloSicurezzaMessaggioAudienceItem = (StringConsoleItem) 
					ProtocolPropertiesFactory.newConsoleItem(ConsoleItemValueType.STRING,
					ConsoleItemType.TEXT_AREA,
					ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_ID, 
					labelSicurezzaMessaggioAudienceItem);
			profiloSicurezzaMessaggioAudienceItem.setRows(2);
			profiloSicurezzaMessaggioAudienceItem.setNote(esterno ? 
					ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_INFO_DOMINIO_ESTERNO_NOTE:
					ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_INFO_DOMINIO_INTERNO_NOTE);
			ConsoleItemInfo infoAud = new ConsoleItemInfo(labelSicurezzaMessaggioAudienceItem);
			if(esterno) {
				infoAud.setHeaderBody(ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_INFO_DOMINIO_ESTERNO);
			}
			else {
				infoAud.setHeaderBody(ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_INFO_DOMINIO_INTERNO);
			}
			profiloSicurezzaMessaggioAudienceItem.setInfo(infoAud);
			profiloSicurezzaMessaggioAudienceItem.setRequired(false);
			configuration.addConsoleItem(profiloSicurezzaMessaggioAudienceItem);
			
			if(!esterno) {
				StringConsoleItem profiloSicurezzaMessaggioX5UItem = (StringConsoleItem) 
					ProtocolPropertiesFactory.newConsoleItem(ConsoleItemValueType.STRING,
					ConsoleItemType.TEXT_AREA,
					ModIConsoleCostanti.MODIPA_APPLICATIVI_PROFILO_SICUREZZA_MESSAGGIO_REST_X5U_URL_ID, 
					ModIConsoleCostanti.MODIPA_APPLICATIVI_PROFILO_SICUREZZA_MESSAGGIO_REST_X5U_URL_LABEL);
				profiloSicurezzaMessaggioX5UItem.setRows(2);
				profiloSicurezzaMessaggioX5UItem.setNote(ModIConsoleCostanti.MODIPA_APPLICATIVI_PROFILO_SICUREZZA_MESSAGGIO_REST_X5U_URL_NOTE);
				ConsoleItemInfo infoX5U = new ConsoleItemInfo(ModIConsoleCostanti.MODIPA_APPLICATIVI_PROFILO_SICUREZZA_MESSAGGIO_REST_X5U_URL_LABEL);
				infoX5U.setHeaderBody(ModIConsoleCostanti.MODIPA_APPLICATIVI_PROFILO_SICUREZZA_MESSAGGIO_REST_X5U_URL_INFO);
				profiloSicurezzaMessaggioX5UItem.setInfo(infoX5U);
				profiloSicurezzaMessaggioX5UItem.setRequired(false);
				configuration.addConsoleItem(profiloSicurezzaMessaggioX5UItem);
			}
						
			if(!esterno) {
				BaseConsoleItem subTitolo = ProtocolPropertiesFactory.newSubTitleItem(
						ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_SUBTITLE_ID, 
						ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_SUBTITLE_LABEL);
				configuration.addConsoleItem(subTitolo );
				
				BooleanConsoleItem booleanConsoleItem = 
						(BooleanConsoleItem) ProtocolPropertiesFactory.newConsoleItem(ConsoleItemValueType.BOOLEAN, ConsoleItemType.CHECKBOX,
								ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_ID, ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_LABEL);
				booleanConsoleItem.setDefaultValue(false);
				booleanConsoleItem.setReloadOnChange(true, true);
				configuration.addConsoleItem(booleanConsoleItem);
				
				StringConsoleItem tokenPolicyItem = (StringConsoleItem) 
						ProtocolPropertiesFactory.newConsoleItem(ConsoleItemValueType.STRING,
						ConsoleItemType.SELECT,
						ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_POLICY_ID, 
						ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_POLICY_LABEL);
				
				List<GenericProperties> gestorePolicyTokenList = null;
				try {
					gestorePolicyTokenList = configIntegrationReader.getTokenPolicyValidazione();
				}catch(Exception e) {
					throw new ProtocolException(e.getMessage(),e);
				}
				
				String [] policyLabels = null;
				String [] policyValues = null;
				boolean tokenPolicyUndefined = true; // !ConsoleOperationType.CHANGE.equals(consoleOperationType)
				if(tokenPolicyUndefined){
					policyLabels = new String[gestorePolicyTokenList.size() + 1];
					policyValues = new String[gestorePolicyTokenList.size() + 1];
					
					policyLabels[0] = ModIConsoleCostanti.MODIPA_VALUE_UNDEFINED;
					policyValues[0] = ModIConsoleCostanti.MODIPA_VALUE_UNDEFINED;
				}
				else {
					policyLabels = new String[gestorePolicyTokenList.size()];
					policyValues = new String[gestorePolicyTokenList.size()];
				}
				
				for (int i = 0; i < gestorePolicyTokenList.size(); i++) {
					GenericProperties genericProperties = gestorePolicyTokenList.get(i);
					if(tokenPolicyUndefined){
						policyLabels[(i+1)] = genericProperties.getNome();
						policyValues[(i+1)] = genericProperties.getNome();
					}
					else {
						policyLabels[i] = genericProperties.getNome();
						policyValues[i] = genericProperties.getNome();
					}
				}
				
				for (int i = 0; i < policyValues.length; i++) {
					tokenPolicyItem.addLabelValue(policyLabels[i],policyValues[i]);
				}
				if(!ConsoleOperationType.CHANGE.equals(consoleOperationType)){
					tokenPolicyItem.setDefaultValue(ModIConsoleCostanti.MODIPA_VALUE_UNDEFINED);
				}
				tokenPolicyItem.setReloadOnChange(false, true);
				configuration.addConsoleItem(tokenPolicyItem);
				
				StringConsoleItem tokenClientIdItem = (StringConsoleItem) 
						ProtocolPropertiesFactory.newConsoleItem(ConsoleItemValueType.STRING,
						ConsoleItemType.TEXT_AREA,
						ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_ID, 
						ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_LABEL);
				tokenClientIdItem.setRows(ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_ROWS);
				tokenClientIdItem.setRequired(true);
				configuration.addConsoleItem(tokenClientIdItem);
				
				StringConsoleItem tokenKIDItem = (StringConsoleItem) 
						ProtocolPropertiesFactory.newConsoleItem(ConsoleItemValueType.STRING,
						ConsoleItemType.TEXT_AREA,
						ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_KID_ID, 
						ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_KID_LABEL);
				tokenKIDItem.setRows(ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_KID_ROWS);
				tokenKIDItem.setRequired(false);
				ConsoleItemInfo info = new ConsoleItemInfo(ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_KID_LABEL);
				info.setHeaderBody(DynamicHelperCostanti.LABEL_PARAMETRO_MODIPA_API_IMPL_PROFILO_SICUREZZA_OAUTH_INFO);
				info.setListBody(DynamicHelperCostanti.LABEL_PARAMETRO_MODIPA_API_IMPL_PROFILO_SICUREZZA_OAUTH_REST_INFO_VALORI_REQUEST); // uso rest volutamente
				tokenKIDItem.setInfo(info);
				configuration.addConsoleItem(tokenKIDItem);
			}
			
			return configuration;
		}
		else {
			return null;
		}
		
	}
	
	static void updateDynamicConfigServizioApplicativo(ConsoleConfiguration consoleConfiguration,
			ConsoleOperationType consoleOperationType, IConsoleHelper consoleHelper, 
			ProtocolProperties properties,
			IConfigIntegrationReader configIntegrationReader, IDServizioApplicativo id) throws ProtocolException {
		
		boolean esterno = false;
		try {
			String dominio = consoleHelper.getParameter(Costanti.CONSOLE_PARAMETRO_SOGGETTO_DOMINIO);
			esterno = PddTipologia.ESTERNO.toString().equals(dominio);
		}catch(Exception e) {
			throw new ProtocolException(e.getMessage(),e);
		}
		
		boolean isClient = true;
		try {
			String client = consoleHelper.getParameter(Costanti.CONSOLE_PARAMETRO_SERVIZI_APPLICATIVI_TIPO_SA);
			isClient = (client==null) || ("".equals(client)) || (CostantiConfigurazione.CLIENT.equals(client)) || (CostantiConfigurazione.CLIENT_OR_SERVER.equals(client));
			if(ConsoleOperationType.CHANGE.equals(consoleOperationType)) {
				ServizioApplicativo sa = configIntegrationReader.getServizioApplicativo(id);
				isClient = CostantiConfigurazione.CLIENT.equals(sa.getTipo()) || sa.isUseAsClient();
			}
		}catch(Exception e) {
			throw new ProtocolException(e.getMessage(),e);
		}
		
		
		if(!esterno && isClient) {
			
			ConfigurazioneMultitenant configurazioneMultitenant = null;
						
			BooleanProperty booleanModeItemValue = (BooleanProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_ID);
			if(booleanModeItemValue!=null && booleanModeItemValue.getValue()!=null && booleanModeItemValue.getValue().booleanValue()) {
				boolean hideSceltaArchivioFilePath = false;
				try {
					configurazioneMultitenant = configIntegrationReader.getConfigurazioneMultitenant();
				}
				catch(RegistryNotFound notFound) {
					// ignore
				}
				catch(Exception e) {
					throw new ProtocolException(e.getMessage(),e);
				}
				/**
				if(configurazioneMultitenant!=null &&
						StatoFunzionalita.ABILITATO.equals(configurazioneMultitenant.getStato()) &&
						!PortaApplicativaSoggettiFruitori.SOGGETTI_ESTERNI.equals(configurazioneMultitenant.getErogazioneSceltaSoggettiFruitori())) {
					hideSceltaArchivioFilePath = true;
				}
				FIX: visualizzo sempre: ho aggiunto un commento. Altrimenti se poi uno modifica la configurazione multitenat, gli applicativi gia' configurati con modalita 'path' vanno in errore
				*/			
				boolean addHiddenSubjectIssuer = true;
				boolean rest = true; // un applicativo può essere utilizzato sia da API REST che da API SOAP
				ModIDynamicConfigurationKeystoreUtilities.updateKeystoreConfig(consoleConfiguration, properties, false, 
						hideSceltaArchivioFilePath, addHiddenSubjectIssuer,
						true, configurazioneMultitenant,
						rest);
				
				BaseConsoleItem subTitoloModIAuth = ProtocolPropertiesUtils.getBaseConsoleItem(consoleConfiguration.getConsoleItem(), ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_MODI_AUTH_SUBTITLE_ID);
				if(subTitoloModIAuth!=null) {
					subTitoloModIAuth.setType(ConsoleItemType.SUBTITLE);
				}

			}
			else {

				// devo annullare eventuale archivio caricato
				BinaryProperty archiveItemValue = (BinaryProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_ARCHIVE_ID);
				if(archiveItemValue!=null) {
					archiveItemValue.setValue(null);
					archiveItemValue.setFileName(null);
					archiveItemValue.setClearContent(true);
				}
				
				// devo annullare eventuale certificato caricato
				BinaryProperty certificateItemValue = (BinaryProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_CERTIFICATO_ID);
				if(certificateItemValue!=null) {
					certificateItemValue.setValue(null);
					certificateItemValue.setFileName(null);
					certificateItemValue.setClearContent(true);
				}
				
				StringProperty keyAliasMODIItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEY_ALIAS_ID);
				if(keyAliasMODIItemValue!=null) {
					keyAliasMODIItemValue.setValue(null);
				}
				
				StringProperty keyPasswordMODIItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEY_PASSWORD_ID);
				if(keyPasswordMODIItemValue!=null) {
					keyPasswordMODIItemValue.setValue(null);
				}
				
				StringProperty keyCNIssuerMODIItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEY_CN_ISSUER_ID);
				if(keyCNIssuerMODIItemValue!=null) {
					keyCNIssuerMODIItemValue.setValue(null);
				}
				
				StringProperty keyCNSubjectMODIItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEY_CN_SUBJECT_ID);
				if(keyCNSubjectMODIItemValue!=null) {
					keyCNSubjectMODIItemValue.setValue(null);
				}
				
				StringProperty keystoreModeMODIItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_MODE_ID);
				if(keystoreModeMODIItemValue!=null) {
					keystoreModeMODIItemValue.setValue(null);
				}
				
				StringProperty keystorePasswordMODIItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_PASSWORD_ID);
				if(keystorePasswordMODIItemValue!=null) {
					keystorePasswordMODIItemValue.setValue(null);
				}
				
				StringProperty keystorePathMODIItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_PATH_ID);
				if(keystorePathMODIItemValue!=null) {
					keystorePathMODIItemValue.setValue(null);
				}
				
				StringProperty keystorePathPublicKeyMODIItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_PATH_PUBLIC_KEY_ID);
				if(keystorePathPublicKeyMODIItemValue!=null) {
					keystorePathPublicKeyMODIItemValue.setValue(null);
				}
				
				StringProperty keystoreKeyAlgoMODIItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_KEY_ALGORITHM_ID);
				if(keystoreKeyAlgoMODIItemValue!=null) {
					keystoreKeyAlgoMODIItemValue.setValue(null);
				}
				
				StringProperty keystoreTypeMODIItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_TYPE_ID);
				if(keystoreTypeMODIItemValue!=null) {
					keystoreTypeMODIItemValue.setValue(null);
				}
				
				StringProperty keystoreByokPolicyMODIItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_BYOK_POLICY_ID);
				if(keystoreByokPolicyMODIItemValue!=null) {
					keystoreByokPolicyMODIItemValue.setValue(null);
				}
				
				AbstractConsoleItem<?> profiloSicurezzaMessaggioAudienceItem = ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(), ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_ID);
				if(profiloSicurezzaMessaggioAudienceItem!=null) {
					profiloSicurezzaMessaggioAudienceItem.setType(ConsoleItemType.HIDDEN);
				}
				StringProperty profiloSicurezzaMessaggioAudienceItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_ID);
				if(profiloSicurezzaMessaggioAudienceItemValue!=null) {
					profiloSicurezzaMessaggioAudienceItemValue.setValue(null);
				}
				
				AbstractConsoleItem<?> profiloSicurezzaMessaggioX5UItem = ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(), ModIConsoleCostanti.MODIPA_APPLICATIVI_PROFILO_SICUREZZA_MESSAGGIO_REST_X5U_URL_ID);
				if(profiloSicurezzaMessaggioX5UItem!=null) {
					profiloSicurezzaMessaggioX5UItem.setType(ConsoleItemType.HIDDEN);
				}
				StringProperty profiloSicurezzaMessaggioX5UItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_APPLICATIVI_PROFILO_SICUREZZA_MESSAGGIO_REST_X5U_URL_ID);
				if(profiloSicurezzaMessaggioX5UItemValue!=null) {
					profiloSicurezzaMessaggioX5UItemValue.setValue(null);
				}
				
				BaseConsoleItem subTitoloModIAuth = ProtocolPropertiesUtils.getBaseConsoleItem(consoleConfiguration.getConsoleItem(), ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_MODI_AUTH_SUBTITLE_ID);
				if(subTitoloModIAuth!=null) {
					subTitoloModIAuth.setType(ConsoleItemType.HIDDEN);
				}
				
			}
		
			
			BooleanProperty booleanModeItemTokenValue = (BooleanProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_ID);
			if(booleanModeItemTokenValue!=null && booleanModeItemTokenValue.getValue()!=null && booleanModeItemTokenValue.getValue().booleanValue()) {
				
				StringProperty tokenPolicyItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_POLICY_ID);
				
				AbstractConsoleItem<?> tokenPolicyItem = ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(), ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_POLICY_ID);
				boolean tokenPolicyDefined = false;
				if(tokenPolicyItem!=null) {
					if(configurazioneMultitenant==null) {
						try {
							configurazioneMultitenant = configIntegrationReader.getConfigurazioneMultitenant();
						}
						catch(RegistryNotFound notFound) {
							// ignore
						}
						catch(Exception e) {
							throw new ProtocolException(e.getMessage(),e);
						}
					}
					
					if(configurazioneMultitenant!=null &&
							StatoFunzionalita.ABILITATO.equals(configurazioneMultitenant.getStato()) &&
							!PortaApplicativaSoggettiFruitori.SOGGETTI_ESTERNI.equals(configurazioneMultitenant.getErogazioneSceltaSoggettiFruitori())) {
						if(tokenPolicyItemValue==null || tokenPolicyItemValue.getValue()==null || StringUtils.isEmpty(tokenPolicyItemValue.getValue()) || 
								ModIConsoleCostanti.MODIPA_VALUE_UNDEFINED.equals(tokenPolicyItemValue.getValue())) {
							tokenPolicyItem.setNote(ModIConsoleCostanti.MODIPASICUREZZA_TOKEN_POLICY_NOTE);
						}
						else {
							tokenPolicyDefined = true;
						}
						tokenPolicyItem.setType(ConsoleItemType.SELECT);
						tokenPolicyItem.setRequired(false);
						tokenPolicyItem.setReloadOnChange(true, true);
					}
					else {
						tokenPolicyItem.setNote(null);
						tokenPolicyItem.setType(ConsoleItemType.HIDDEN);
						tokenPolicyItem.setRequired(false);
					}
				}
				
				AbstractConsoleItem<?> tokenClientIdItem = ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(), ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_ID);
				if(tokenClientIdItem!=null) {
					tokenClientIdItem.setType(ConsoleItemType.TEXT_AREA);
					tokenClientIdItem.setRequired(true);
					if(tokenPolicyDefined) {
						tokenClientIdItem.setInfo(null);
					}
					else {
						ConsoleItemInfo info = new ConsoleItemInfo(ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_LABEL);
						info.setHeaderBody(DynamicHelperCostanti.LABEL_PARAMETRO_MODIPA_API_IMPL_PROFILO_SICUREZZA_OAUTH_INFO);
						info.setListBody(DynamicHelperCostanti.LABEL_PARAMETRO_MODIPA_API_IMPL_PROFILO_SICUREZZA_OAUTH_REST_INFO_VALORI_REQUEST); // uso rest volutamente
						tokenClientIdItem.setInfo(info);
					}
				}
				
				AbstractConsoleItem<?> tokenKidItem = ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(), ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_KID_ID);
				if(tokenKidItem!=null) {
					// verifico se abilitato il certificato
					if(booleanModeItemValue!=null && booleanModeItemValue.getValue()!=null && booleanModeItemValue.getValue().booleanValue()) {
						tokenKidItem.setType(ConsoleItemType.TEXT_AREA);
					}
					else {
						tokenKidItem.setType(ConsoleItemType.HIDDEN);
					}
				}
			}
			else {
				
				StringProperty tokenPolicyItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_POLICY_ID);
				if(tokenPolicyItemValue!=null) {
					tokenPolicyItemValue.setValue(null);
				}
								
				AbstractConsoleItem<?> tokenPolicyItem = ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(), ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_POLICY_ID);
				if(tokenPolicyItem!=null) {
					tokenPolicyItem.setType(ConsoleItemType.HIDDEN);
					tokenPolicyItem.setRequired(false);
					tokenPolicyItem.setNote(null);
				}
				
				
				AbstractConsoleItem<?> tokenClientIdItem = ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(), ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_ID);
				if(tokenClientIdItem!=null) {
					tokenClientIdItem.setType(ConsoleItemType.HIDDEN);
					tokenClientIdItem.setRequired(false);
				}
				
				StringProperty tokenClientIdItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_ID);
				if(tokenClientIdItemValue!=null) {
					tokenClientIdItemValue.setValue(null);
				}
				
				AbstractConsoleItem<?> tokenKidItem = ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(), ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_KID_ID);
				if(tokenKidItem!=null) {
					tokenKidItem.setType(ConsoleItemType.HIDDEN);
				}
				
				StringProperty tokenKidItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_KID_ID);
				if(tokenKidItemValue!=null) {
					tokenKidItemValue.setValue(null);
				}
				
			}

		}
		
	}
	
	static void validateDynamicConfigServizioApplicativo(ConsoleConfiguration consoleConfiguration,
			ConsoleOperationType consoleOperationType, IConsoleHelper consoleHelper, ProtocolProperties properties, 
			IConfigIntegrationReader configIntegrationReader, IDServizioApplicativo id) throws ProtocolException {
		
		boolean esterno = false;
		try {
			String dominio = consoleHelper.getParameter(Costanti.CONSOLE_PARAMETRO_SOGGETTO_DOMINIO);
			esterno = PddTipologia.ESTERNO.toString().equals(dominio);
		}catch(Exception e) {
			throw new ProtocolException(e.getMessage(),e);
		}
		
		boolean isClient = true;
		try {
			String client = consoleHelper.getParameter(Costanti.CONSOLE_PARAMETRO_SERVIZI_APPLICATIVI_TIPO_SA);
			isClient = (client==null) || ("".equals(client)) || (CostantiConfigurazione.CLIENT.equals(client)) || (CostantiConfigurazione.CLIENT_OR_SERVER.equals(client));
			if(ConsoleOperationType.CHANGE.equals(consoleOperationType)) {
				ServizioApplicativo sa = configIntegrationReader.getServizioApplicativo(id);
				isClient = CostantiConfigurazione.CLIENT.equals(sa.getTipo()) || sa.isUseAsClient();
			}
		}catch(Exception e) {
			throw new ProtocolException(e.getMessage(),e);
		}
		
		if(isClient) {
						
			boolean verifyKeystoreConfig = false;
			boolean verifyCertificateConfig = false;
			boolean changeBinary = false;
			if(ConsoleOperationType.CHANGE.equals(consoleOperationType)) {
				try {
					String p = consoleHelper.getParameter(Costanti.CONSOLE_PARAMETRO_PP_CHANGE_BINARY);
					if(Costanti.CONSOLE_PARAMETRO_PP_CHANGE_BINARY_VALUE_TRUE.equalsIgnoreCase(p)) {
						verifyKeystoreConfig = true;
						
						changeBinary = true;
						
						StringProperty selectModeItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_MODE_ID);
						if(selectModeItemValue!=null && selectModeItemValue.getValue()!=null && !"".equals(selectModeItemValue.getValue())) {
							String modalita = selectModeItemValue.getValue();
							if(ModIConsoleCostanti.MODIPA_KEYSTORE_MODE_VALUE_ARCHIVE.equals(modalita)) {
								verifyKeystoreConfig = true;
							}
							else {
								verifyCertificateConfig = true;
								verifyKeystoreConfig = false;
							}
						}
						
						if(verifyKeystoreConfig) {
							BinaryProperty archiveItemValue = (BinaryProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_ARCHIVE_ID);
							if(archiveItemValue==null || archiveItemValue.getValue()==null) {
								throw new ProtocolException("Archivio non fornito");
							}
						}
						else if(verifyCertificateConfig) {
							BinaryProperty certificateItemValue = (BinaryProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_CERTIFICATO_ID);
							if(certificateItemValue==null || certificateItemValue.getValue()==null) {
								throw new ProtocolException("Certificato non fornito");
							}
						}
					}
					else {
						// devo verificare se c'e' stato un cambio nella modalita
						StringProperty selectModeItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_MODE_ID);
						if(selectModeItemValue!=null && selectModeItemValue.getValue()!=null && !"".equals(selectModeItemValue.getValue())) {
							String modalita = selectModeItemValue.getValue();
							if(ModIConsoleCostanti.MODIPA_KEYSTORE_MODE_VALUE_ARCHIVE.equals(modalita)) {
								verifyKeystoreConfig = true;
							}
							else {
								verifyCertificateConfig = true;
							}
						}
					}
				}catch(Exception e) {
					throw new ProtocolException(e.getMessage(),e);
				}
			}
			else if(ConsoleOperationType.ADD.equals(consoleOperationType)) {
				
				StringProperty selectModeItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_MODE_ID);
				if(selectModeItemValue!=null && selectModeItemValue.getValue()!=null && !"".equals(selectModeItemValue.getValue())) {
					String modalita = selectModeItemValue.getValue();
					if(ModIConsoleCostanti.MODIPA_KEYSTORE_MODE_VALUE_ARCHIVE.equals(modalita)) {
						verifyKeystoreConfig = true;
					}
					else {
						verifyCertificateConfig = true;
					}
				}

			}
	
			CertificateInfo cert = null;
			if(!esterno) {
			
				if(verifyKeystoreConfig) {
					// NOTA: se si attiva anche la validazione durante il change binary, poi non si riesce a modificarlo poiche' la password o l'alis, o qualche parametro non è compatibile con il nuovo archivio.
					
					try {
						cert = ModIDynamicConfigurationKeystoreUtilities.readKeystoreConfig(properties, false);
					}catch(Exception e) {
						throw new ProtocolException("Verificare i parametri indicati per il keystore in "+ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_CERTIFICATO_SUBTITLE_LABEL_MSG_ERROR+": "+e.getMessage(),e);
					}
				}
				else if(verifyCertificateConfig) {
					try {
						cert = ModIDynamicConfigurationKeystoreUtilities.readKeystoreConfig(properties, true);
					}catch(Exception e) {
						throw new ProtocolException("Verificare il certificato caricato in "+ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_CERTIFICATO_SUBTITLE_LABEL_MSG_ERROR+": "+e.getMessage(),e);
					}
				
				}
					
				if(verifyCertificateConfig &&
					// il controllo lo devo fare solamente se definisco una modalità per cui consente di fornire a parte il certificato
					// la modalita 'verifyKeystoreConfig' è associata alla modalità archivio dove si carica il PKCS12.
					// in questo caso se abilito la validazione sotto indicata, non posso definire 2 applicativi con lo stesso PKCS12, che invece potrebbe dover servire.
					// Serve in una fase di fruizione, nella fase di erogazione con multitenant, poi verrà identificato uno a casa ma non è evitabile.
					// In questi casi si consiglia di usare anzi una modalità filesyste o HSM dove si fornirà il certificato in più solo per l'applicativo che deve essere identificato lato erogazione
					cert!=null && cert.getSubject()!=null) {
						
					ProtocolFiltroRicercaServiziApplicativi filtro = IdentificazioneApplicativoMittenteUtils.createFilter(cert.getSubject().toString(), 
							cert.getIssuer().toString());
					
					List<IDServizioApplicativo> list = null;
					try {
						list = configIntegrationReader.findIdServiziApplicativi(filtro);
					}catch(RegistryNotFound notFound) {
						// ignore
					}
					catch(Exception t) {
						throw new ProtocolException("Errore non atteso durante la verfica del certificato caricato in "+ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_CERTIFICATO_SUBTITLE_LABEL_MSG_ERROR+": "+t.getMessage(),t);
					}
					if(list!=null) {
						for (IDServizioApplicativo idServizioApplicativoSubjectIssuerCheck : list) {
							// Possono esistere piu' sil che hanno un CN con subject e issuer.
							
							java.security.cert.Certificate certificatoCheck = null;
							try {
								ServizioApplicativo sa = configIntegrationReader.getServizioApplicativo(idServizioApplicativoSubjectIssuerCheck);
								certificatoCheck = IdentificazioneApplicativoMittenteUtils.readServizioApplicativoByCertificate(sa, null);
							}catch(Exception t) {
								throw new ProtocolException("Errore non atteso durante la verfica del certificato caricato in "+ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_CERTIFICATO_SUBTITLE_LABEL_MSG_ERROR+": "+t.getMessage(),t);
							}
							
							if(certificatoCheck instanceof java.security.cert.X509Certificate &&
								cert.equals(((java.security.cert.X509Certificate)certificatoCheck),true) &&
								(ConsoleOperationType.ADD.equals(consoleOperationType) || !idServizioApplicativoSubjectIssuerCheck.equals(id))
							){
								throw new ProtocolException("Il certificato caricato in "+ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_CERTIFICATO_SUBTITLE_LABEL_MSG_ERROR+" risulta già assegnato all'applicativo '"+idServizioApplicativoSubjectIssuerCheck.getNome()+"'");
							}
							
						}
					}
					
				}
				
				if(changeBinary) {
					try {
						if(cert!=null && cert.getSubject()!=null) {
							StringProperty subjectItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEY_CN_SUBJECT_ID);
							subjectItemValue.setValue(cert.getSubject().toString());
							
							StringProperty issuerItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEY_CN_ISSUER_ID);
							if(cert.getIssuer()!=null) {
								issuerItemValue.setValue(cert.getIssuer().toString());
							}
							else {
								if(issuerItemValue!=null) {
									issuerItemValue.setValue(null);
								}
							}
						}
					}catch(Exception e) {
						// errore sollevato in validazione
					}
				}
				
			}
			
			// Audience Risposta
			AbstractConsoleItem<?> audienceRispostaItem = 	
					ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(),
							ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_ID
							);
			if(audienceRispostaItem!=null) {
				StringProperty audienceRispostaItemValue = 
						(StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_ID);
				if(audienceRispostaItemValue!=null && audienceRispostaItemValue.getValue()!=null && !"".equals(audienceRispostaItemValue.getValue())) {
					try {
						String labelSicurezzaMessaggioAudienceItem = esterno ? 
								ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_INFO_DOMINIO_ESTERNO_LABEL : 
								ModIConsoleCostanti.MODIPA_APPLICATIVI_AUDIENCE_RISPOSTA_INFO_DOMINIO_INTERNO_LABEL;
						InputValidationUtils.validateTextAreaInput(audienceRispostaItemValue.getValue(), 
								labelSicurezzaMessaggioAudienceItem);
					}catch(Exception e) {
						throw new ProtocolException(e.getMessage(),e);
					}
				}
			}
			
			// Public X5U URL
			if(!esterno) {
				
				AbstractConsoleItem<?> x5uUrlItem = 	
						ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(),
								ModIConsoleCostanti.MODIPA_APPLICATIVI_PROFILO_SICUREZZA_MESSAGGIO_REST_X5U_URL_ID
								);
				if(x5uUrlItem!=null) {
					StringProperty x5uUrlItemValue = 
							(StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_APPLICATIVI_PROFILO_SICUREZZA_MESSAGGIO_REST_X5U_URL_ID);
					if(x5uUrlItemValue!=null && x5uUrlItemValue.getValue()!=null && !"".equals(x5uUrlItemValue.getValue())) {
						try {
							InputValidationUtils.validateTextAreaInput(x5uUrlItemValue.getValue(), 
									ModIConsoleCostanti.MODIPA_APPLICATIVI_PROFILO_SICUREZZA_MESSAGGIO_REST_X5U_URL_LABEL);
						}catch(Exception e) {
							throw new ProtocolException(e.getMessage(),e);
						}
					}
				}
			}
			
			// Keystore Path
			AbstractConsoleItem<?> keystorePathItem = 	
					ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(),
							ModIConsoleCostanti.MODIPA_KEYSTORE_PATH_ID
							);
			if(keystorePathItem!=null) {
				StringProperty keystorePathItemValue = 
						(StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_PATH_ID);
				if(keystorePathItemValue!=null && keystorePathItemValue.getValue()!=null && !"".equals(keystorePathItemValue.getValue())) {
					try {
						String keystoreType = null;
						StringProperty keystoreTypeItemValue = 
								(StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_TYPE_ID);
						if(keystoreTypeItemValue!=null && keystoreTypeItemValue.getValue()!=null) {
							keystoreType = keystoreTypeItemValue.getValue();
						}
						
						InputValidationUtils.validateTextAreaInput(keystorePathItemValue.getValue(), 
								ModIConsoleCostanti.MODIPA_API_IMPL_PROFILO_SICUREZZA_MESSAGGIO_RICHIESTA_LABEL +" - "+
								((ModIConsoleCostanti.MODIPA_KEYSTORE_TYPE_VALUE_KEY_PAIR.equals(keystoreType))? ModIConsoleCostanti.MODIPA_KEYSTORE_PATH_PRIVATE_KEY_LABEL : ModIConsoleCostanti.MODIPA_KEYSTORE_PATH_LABEL));
					}catch(Exception e) {
						throw new ProtocolException(e.getMessage(),e);
					}
				}
			}
			
			// Keystore Path 'PublicKey'
			AbstractConsoleItem<?> keystorePathPublicKeyItem = 	
					ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(),
							ModIConsoleCostanti.MODIPA_KEYSTORE_PATH_PUBLIC_KEY_ID
							);
			if(keystorePathPublicKeyItem!=null) {
				StringProperty keystorePathPublicKeyItemValue = 
						(StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_PATH_PUBLIC_KEY_ID);
				if(keystorePathPublicKeyItemValue!=null && keystorePathPublicKeyItemValue.getValue()!=null && !"".equals(keystorePathPublicKeyItemValue.getValue())) {
					try {
						InputValidationUtils.validateTextAreaInput(keystorePathPublicKeyItemValue.getValue(), 
								ModIConsoleCostanti.MODIPA_API_IMPL_PROFILO_SICUREZZA_MESSAGGIO_RICHIESTA_LABEL +" - "+
								ModIConsoleCostanti.MODIPA_KEYSTORE_PATH_PUBLIC_KEY_LABEL);
					}catch(Exception e) {
						throw new ProtocolException(e.getMessage(),e);
					}
				}
			}
			
			// Keystore password
			AbstractConsoleItem<?> keystorePasswordItem = 	
					ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(),
							ModIConsoleCostanti.MODIPA_KEYSTORE_PASSWORD_ID
							);
			if(keystorePasswordItem!=null) {
				StringProperty keystoreItemValue = 
						(StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEYSTORE_PASSWORD_ID);
				if(keystoreItemValue!=null && keystoreItemValue.getValue()!=null && !"".equals(keystoreItemValue.getValue())) {
					try {
						InputValidationUtils.validateTextInput(keystoreItemValue.getValue(), 
								ModIConsoleCostanti.MODIPA_API_IMPL_PROFILO_SICUREZZA_MESSAGGIO_CERTIFICATI_KEYSTORE_LABEL +" - "+
								ModIConsoleCostanti.MODIPA_KEYSTORE_PASSWORD_LABEL);
					}catch(Exception e) {
						throw new ProtocolException(e.getMessage(),e);
					}
				}
			}
			
			// Key password
			AbstractConsoleItem<?> keyPasswordItem = 	
					ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(),
							ModIConsoleCostanti.MODIPA_KEY_PASSWORD_ID
							);
			if(keyPasswordItem!=null) {
				StringProperty keystoreItemValue = 
						(StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEY_PASSWORD_ID);
				if(keystoreItemValue!=null && keystoreItemValue.getValue()!=null && !"".equals(keystoreItemValue.getValue())) {
					try {
						InputValidationUtils.validateTextInput(keystoreItemValue.getValue(), 
								ModIConsoleCostanti.MODIPA_API_IMPL_PROFILO_SICUREZZA_MESSAGGIO_CERTIFICATI_KEYSTORE_LABEL +" - "+
								ModIConsoleCostanti.MODIPA_KEY_PASSWORD_LABEL);
					}catch(Exception e) {
						throw new ProtocolException(e.getMessage(),e);
					}
				}
			}
			// Key alias
			AbstractConsoleItem<?> keyAliasItem = 	
					ProtocolPropertiesUtils.getAbstractConsoleItem(consoleConfiguration.getConsoleItem(),
							ModIConsoleCostanti.MODIPA_KEY_ALIAS_ID
							);
			if(keyAliasItem!=null) {
				StringProperty keystoreItemValue = 
						(StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_KEY_ALIAS_ID);
				if(keystoreItemValue!=null && keystoreItemValue.getValue()!=null && !"".equals(keystoreItemValue.getValue())) {
					try {
						InputValidationUtils.validateTextInput(keystoreItemValue.getValue(), 
								ModIConsoleCostanti.MODIPA_API_IMPL_PROFILO_SICUREZZA_MESSAGGIO_CERTIFICATI_KEYSTORE_LABEL +" - "+
								ModIConsoleCostanti.MODIPA_KEY_ALIAS_LABEL);
					}catch(Exception e) {
						throw new ProtocolException(e.getMessage(),e);
					}
				}
			}
			
			String tokenPolicyName = null;
			if(!esterno) {
				
				BooleanProperty booleanModeItemTokenValue = (BooleanProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_ID);
				if(booleanModeItemTokenValue!=null && booleanModeItemTokenValue.getValue()!=null && booleanModeItemTokenValue.getValue().booleanValue()) {
					
					StringProperty tokenPolicyItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_POLICY_ID);
					if(tokenPolicyItemValue==null || tokenPolicyItemValue.getValue()==null || StringUtils.isEmpty(tokenPolicyItemValue.getValue()) || 
							ModIConsoleCostanti.MODIPA_VALUE_UNDEFINED.equals(tokenPolicyItemValue.getValue())) {
						/** NON e' OBBLIGATORIA!
						//throw new ProtocolException("Deve essere selezionata una "+ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_POLICY_LABEL);*/
					}
					else {
						tokenPolicyName = tokenPolicyItemValue.getValue();
					}
					
					// Altrimenti la select list è valorizzata con quelli esistenti
					if(tokenPolicyName!=null) {
						GenericProperties gp = null;
						try {
							gp = configIntegrationReader.getTokenPolicyValidazione(tokenPolicyName);
						}
						catch(RegistryNotFound notFound) {
							// ignore
						}
						catch(RegistryException e) {
							throw new ProtocolException(ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_POLICY_LABEL+" indicata '"+tokenPolicyName+"' non esiste? (errore: "+e.getMessage()+")",e);
						}
						if(gp==null) {
							throw new ProtocolException(ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_POLICY_LABEL+" indicata '"+tokenPolicyName+"' non esiste");
						}
					}
										
					StringProperty tokenClientIdItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_ID);
					if(tokenClientIdItemValue==null || tokenClientIdItemValue.getValue()==null || StringUtils.isEmpty(tokenClientIdItemValue.getValue())) {
						throw new ProtocolException("Deve essere indicato un "+ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_LABEL);
					}
					try {
						InputValidationUtils.validateTextAreaInput(tokenClientIdItemValue.getValue(), 
								ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_CLIENT_LABEL);
					}catch(Exception e) {
						throw new ProtocolException(e.getMessage(),e);
					}
					
					StringProperty tokenKidItemValue = (StringProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_KID_ID);
					if(tokenKidItemValue!=null && tokenKidItemValue.getValue()!=null && StringUtils.isNotEmpty(tokenKidItemValue.getValue())) {
						try {
							InputValidationUtils.validateTextAreaInput(tokenKidItemValue.getValue(), 
								ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_KID_LABEL);
						}catch(Exception e) {
							throw new ProtocolException(e.getMessage(),e);
						}
					}
					
					boolean tokenWithHttpsEnabled = false;
					// basta un protocollo che lo supporta per doverli cercare anche con la funzionalita' abilitata
					for(IProtocolFactory<?> protocolFactory: ProtocolFactoryManager.getInstance().getProtocolFactories().values()) {
						if(protocolFactory.createProtocolConfiguration().isSupportatoAutenticazioneApplicativiHttpsConToken()) {
							tokenWithHttpsEnabled = true;
							break;
						}
					}
					
					ServizioApplicativo sa = null;
					if(tokenPolicyName!=null) {
						try {
							sa = configIntegrationReader.getServizioApplicativoByCredenzialiToken(tokenPolicyName, tokenClientIdItemValue.getValue(), tokenWithHttpsEnabled);
							boolean alreadyExists = false;
							if(sa!=null) {
								if(ConsoleOperationType.ADD.equals(consoleOperationType)) {
									alreadyExists=true;
								}
								else {
									IDServizioApplicativo idSAFind = new IDServizioApplicativo();
									idSAFind.setIdSoggettoProprietario(new IDSoggetto(sa.getTipoSoggettoProprietario(), sa.getNomeSoggettoProprietario()));
									idSAFind.setNome(sa.getNome());
									if(!id.equals(idSAFind)) {
										alreadyExists=true;
									}
								}
							}
							if(alreadyExists) {
								String labelSoggetto = NamingUtils.getLabelSoggetto(new IDSoggetto(sa.getTipoSoggettoProprietario(), sa.getNomeSoggettoProprietario()));
								throw new ProtocolException("L'applicativo "+sa.getNome()+" (soggetto: "+labelSoggetto+") possiede già l'identificativo client indicato");
							}
						}catch(RegistryNotFound notFound) {
							// ignore
						}
						catch(Exception e) {
							throw new ProtocolException(e.getMessage(),e);
						}
					}
				}
				
				if(ConsoleOperationType.CHANGE.equals(consoleOperationType)) {
					
					BooleanProperty booleanModeItemSicurezzaMessaggioValue = (BooleanProperty) ProtocolPropertiesUtils.getAbstractPropertyById(properties, ModIConsoleCostanti.MODIPA_SICUREZZA_MESSAGGIO_ID);
					boolean sicurezzaMessaggio = false;
					if(booleanModeItemSicurezzaMessaggioValue!=null && booleanModeItemSicurezzaMessaggioValue.getValue()!=null) {
						sicurezzaMessaggio = booleanModeItemSicurezzaMessaggioValue.getValue();
					}
					
					ServizioApplicativo sa = null;
					try {
						sa = configIntegrationReader.getServizioApplicativo(id);
					}catch(Exception t) {
						// ignore
					}
					if(sa!=null) {
						String oldTokenPolicyName = null;
						String oldCnSubject = null;
						/**String oldCnIssuer = null;*/
						if(sa.sizeProtocolPropertyList()>0) {
							for (org.openspcoop2.core.config.ProtocolProperty pp : sa.getProtocolPropertyList()) {
								if(ModIConsoleCostanti.MODIPA_SICUREZZA_TOKEN_POLICY_ID.equals(pp.getName())) {
									oldTokenPolicyName = pp.getValue();
								}
								else if(ModIConsoleCostanti.MODIPA_KEY_CN_SUBJECT_ID.equals(pp.getName())) {
									oldCnSubject = pp.getValue();
								}
								/**else if(ModIConsoleCostanti.MODIPA_KEY_CN_ISSUER_ID.equals(pp.getName())) {
									oldCnIssuer = pp.getValue();
								}*/
							}
						}
						
						StringBuilder sbWarningChange = new StringBuilder();
						if(oldTokenPolicyName!=null && StringUtils.isNotEmpty(oldTokenPolicyName) && !"-".equals(oldTokenPolicyName)) {
							if(tokenPolicyName==null || StringUtils.isEmpty(tokenPolicyName)) {
								sbWarningChange.append("L'applicativo potrebbe essere stato associato ad una erogazione o fruizione che richiede la token policy '"+oldTokenPolicyName+"' eliminata.");
								sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
								sbWarningChange.append(VERIFICARE_CONFIG_ASSOCIAZIONE_APPLICATIVO);
							}
							else if(!oldTokenPolicyName.equals(tokenPolicyName)) {
								sbWarningChange.append("L'applicativo potrebbe essere stato associato ad una erogazione o fruizione che richiede la precedente token policy '"+oldTokenPolicyName+"' modificata in '"+tokenPolicyName+"'.");
								sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
								sbWarningChange.append(VERIFICARE_CONFIG_ASSOCIAZIONE_APPLICATIVO);
							}
						}
						
						if(oldCnSubject!=null && StringUtils.isNotEmpty(oldCnSubject) &&
							!sicurezzaMessaggio) {
							if(sbWarningChange.length()>0) {
								sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
								sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
							}
							sbWarningChange.append("L'applicativo potrebbe essere stato associato ad una erogazione o fruizione che richiede il certificato eliminato ("+oldCnSubject+").");
							sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
							sbWarningChange.append(VERIFICARE_CONFIG_ASSOCIAZIONE_APPLICATIVO);
						}
						
						/**
						boolean certWarning = false;
						if(oldCnSubject!=null && StringUtils.isNotEmpty(oldCnSubject)) {
							if(cert==null || cert.getSubject()==null) {
								if(sbWarningChange.length()>0) {
									sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
									sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
								}
								sbWarningChange.append("L'applicativo potrebbe essere stato associato ad una erogazione o fruizione che richiede il certificato eliminato ("+oldCnSubject+").");
								sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
								sbWarningChange.append(VERIFICARE_CONFIG_ASSOCIAZIONE_APPLICATIVO);
								certWarning = true;
							}
							else if(!oldCnSubject.equals(cert.getSubject().toString())) {
								if(sbWarningChange.length()>0) {
									sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
									sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
								}
								sbWarningChange.append("L'applicativo potrebbe essere stato associato ad una erogazione o fruizione che richiede il precedente certificato ("+oldCnSubject+").");
								sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
								sbWarningChange.append(VERIFICARE_CONFIG_ASSOCIAZIONE_APPLICATIVO);
								certWarning = true;
							}
						}
						
						if(!certWarning && oldCnIssuer!=null && StringUtils.isNotEmpty(oldCnIssuer)) {
							if(cert==null || cert.getIssuer()==null) {
								if(sbWarningChange.length()>0) {
									sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
									sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
								}
								sbWarningChange.append("L'applicativo potrebbe essere stato associato ad una erogazione o fruizione che richiede il certificato eliminato (subject["+oldCnSubject+"] issuer["+oldCnIssuer+"]).");
								sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
								sbWarningChange.append(VERIFICARE_CONFIG_ASSOCIAZIONE_APPLICATIVO);
							}
							else if(!oldCnIssuer.equals(cert.getIssuer().toString())) {
								if(sbWarningChange.length()>0) {
									sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
									sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
								}
								sbWarningChange.append("L'applicativo potrebbe essere stato associato ad una erogazione o fruizione che richiede il precedente certificato (subject["+oldCnSubject+"] issuer["+oldCnIssuer+"]).");
								sbWarningChange.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
								sbWarningChange.append(VERIFICARE_CONFIG_ASSOCIAZIONE_APPLICATIVO);
							}
						}
						*/
						
						if(sbWarningChange.length()>0) {
							try {
								consoleHelper.setMessage(sbWarningChange.toString(), true, "warn");
							}catch(Exception t) {
								// ignore
							}
						}
					}
					
				}
			}
		}
	}
}