GestoreAutorizzazioni.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2025 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.ctrlstat.servlet.login;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.driver.DriverControlStationException;
import org.openspcoop2.web.ctrlstat.servlet.ac.AccordiCooperazioneCostanti;
import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneCostanti;
import org.openspcoop2.web.ctrlstat.servlet.apc.api.ApiCostanti;
import org.openspcoop2.web.ctrlstat.servlet.aps.AccordiServizioParteSpecificaCostanti;
import org.openspcoop2.web.ctrlstat.servlet.aps.erogazioni.ErogazioniCostanti;
import org.openspcoop2.web.ctrlstat.servlet.archivi.ArchiviCostanti;
import org.openspcoop2.web.ctrlstat.servlet.config.ConfigurazioneCostanti;
import org.openspcoop2.web.ctrlstat.servlet.connettori.ConnettoriCostanti;
import org.openspcoop2.web.ctrlstat.servlet.gruppi.GruppiCostanti;
import org.openspcoop2.web.ctrlstat.servlet.monitor.MonitorCostanti;
import org.openspcoop2.web.ctrlstat.servlet.pa.PorteApplicativeCostanti;
import org.openspcoop2.web.ctrlstat.servlet.pd.PorteDelegateCostanti;
import org.openspcoop2.web.ctrlstat.servlet.pdd.PddCostanti;
import org.openspcoop2.web.ctrlstat.servlet.protocol_properties.ProtocolPropertiesCostanti;
import org.openspcoop2.web.ctrlstat.servlet.remote_stores.RemoteStoresCostanti;
import org.openspcoop2.web.ctrlstat.servlet.ruoli.RuoliCostanti;
import org.openspcoop2.web.ctrlstat.servlet.sa.ServiziApplicativiCostanti;
import org.openspcoop2.web.ctrlstat.servlet.scope.ScopeCostanti;
import org.openspcoop2.web.ctrlstat.servlet.soggetti.SoggettiCostanti;
import org.openspcoop2.web.ctrlstat.servlet.utenti.UtentiCore;
import org.openspcoop2.web.ctrlstat.servlet.utenti.UtentiCostanti;
import org.openspcoop2.web.ctrlstat.servlet.utils.UtilsCostanti;
import org.openspcoop2.web.lib.audit.web.AuditCostanti;
import org.openspcoop2.web.lib.mvc.ServletUtils;
import org.openspcoop2.web.lib.mvc.security.Validatore;
import org.openspcoop2.web.lib.users.dao.PermessiUtente;
import org.openspcoop2.web.lib.users.dao.User;
import org.slf4j.Logger;

/**
 * Mapping delle autorizzazioni necessarie per invocare una servlet
 * 
 * @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 GestoreAutorizzazioni {
	
	private static GestoreAutorizzazioni permessi = null;
	
	private static ControlStationCore core = null;
	public static ControlStationCore getCore() {
		return core;
	}
	public static void setCore(ControlStationCore core) {
		GestoreAutorizzazioni.core = core;
	}

	private static UtentiCore utentiCore = null;
	private static synchronized void init(boolean singlePdD) throws DriverControlStationException{
		if(GestoreAutorizzazioni.permessi==null){
			GestoreAutorizzazioni.permessi = new GestoreAutorizzazioni(singlePdD);
			core = new ControlStationCore();
			utentiCore = new UtentiCore(core);
		}
	}
	public static boolean autorizzazioneUtente(boolean singlePdD,Logger log,String nomeServlet,LoginHelper loginHelper, StringBuilder bfError) throws DriverControlStationException {
		if(GestoreAutorizzazioni.permessi==null)
			GestoreAutorizzazioni.init(singlePdD);
		
		
		return GestoreAutorizzazioni.permessi.permettiVisualizzazione(log, nomeServlet,loginHelper, bfError);
	}
	
	// Raccolta servlet in funzionalita
	List<String> servletPdDSinglePdD = null;
	List<String> servletSoggetti = null;
	List<String> servletAccordiServizio = null;
	List<String> servletAccordiCooperazione = null;
	List<String> servletServizi = null;
	List<String> servletRuoli = null;
	List<String> servletScope = null;
	List<String> servletPorteDelegate = null;
	List<String> servletPorteApplicative = null;
	List<String> servletServiziApplicativi = null;
	List<String> servletConnettoriCustom = null;
	List<String> servletPackage = null;
	List<String> servletAuditing = null;
	List<String> servletConfigurazione = null;
	List<String> servletGestioneUtenti = null;
	List<String> servletTracciamento = null;
	List<String> servletDiagnostica = null;
	List<String> servletMonitoraggioApplicativo = null;
	List<String> servletLibraryVersion = null;
	List<String> servletChangePwdModalita = null;
	List<String> servletProtocolProperties = null;
	List<String> servletGruppi = null;
	List<String> servletRegistro = null;
	
	// Associazione diritti alle funzionalita'
	PermessiUtente permessiPdDSinglePdD = null;
	PermessiUtente permessiSoggetti = null;
	PermessiUtente permessiAccordiServizio = null;
	PermessiUtente permessiAccordiCooperazione = null;
	PermessiUtente permessiServizi = null;
	PermessiUtente permessiRuoli = null;
	PermessiUtente permessiScope = null;
	PermessiUtente permessiPorteDelegate = null;
	PermessiUtente permessiPorteApplicative = null;
	PermessiUtente permessiServiziApplicativi = null;
	PermessiUtente permessiConnettoriCustom = null;
	PermessiUtente permessiPackage = null;
	PermessiUtente permessiAuditing = null;
	PermessiUtente permessiConfigurazione = null;
	PermessiUtente permessiGestioneUtenti = null;
	PermessiUtente permessiTracciamento = null;
	PermessiUtente permessiDiagnostica = null;
	PermessiUtente permessiMonitoraggioApplicativo = null;
	PermessiUtente permessiMonitoraggioApplicativoSinglePdD = null;
	PermessiUtente permessiLibraryVersion = null;
	PermessiUtente permessiChangePwdModalita = null;
	PermessiUtente permessiProtocolProperties = null;
	PermessiUtente permessiGruppi = null;
	PermessiUtente permessiRegistro = null;

	
	private boolean singlePdD = false;
	public GestoreAutorizzazioni(boolean singlePdD){
		this.singlePdD = singlePdD;
			
		/** Gruppo di servlet che gestiscono le porte di dominio */
		this.servletPdDSinglePdD = new ArrayList<>();
		if(this.singlePdD){
			this.servletPdDSinglePdD.addAll(PddCostanti.getServletPddSinglepdd());
			this.servletPdDSinglePdD.addAll(PddCostanti.getServletPddSoggetti());
		}
		/** Permessi associati alla gestione delle porte di dominio */
		this.permessiPdDSinglePdD = new PermessiUtente();
		this.permessiPdDSinglePdD.setServizi(true);
		
		/** Gruppo di servlet che gestiscono i soggetti */
		this.servletSoggetti = new ArrayList<>();
		this.servletSoggetti.addAll(SoggettiCostanti.getServletSoggetti());
		this.servletSoggetti.addAll(SoggettiCostanti.getServletSoggettiRuoli());
		this.servletSoggetti.addAll(SoggettiCostanti.getServletSoggettiCredenziali());
		this.servletSoggetti.addAll(SoggettiCostanti.getServletSoggettiProprieta());
		this.servletSoggetti.add(SoggettiCostanti.SERVLET_NAME_SOGGETTI_VERIFICA_CERTIFICATI);
		/** Permessi associati alla gestione dei soggetti */
		this.permessiSoggetti = new PermessiUtente();
		this.permessiSoggetti.setServizi(true);
		
		/** Gruppo di servlet che gestiscono gli Accordi di Servizio */
		this.servletAccordiServizio = new ArrayList<>();
		this.servletAccordiServizio.addAll(AccordiServizioParteComuneCostanti.SERVLET_APC);
		this.servletAccordiServizio.addAll(AccordiServizioParteComuneCostanti.SERVLET_APC_AZIONI);
		this.servletAccordiServizio.addAll(AccordiServizioParteComuneCostanti.SERVLET_APC_PORT_TYPES);
		this.servletAccordiServizio.addAll(AccordiServizioParteComuneCostanti.SERVLET_APC_PORT_TYPE_OPERATIONS);
		this.servletAccordiServizio.addAll(AccordiServizioParteComuneCostanti.SERVLET_APC_PORT_TYPE_OPERATIONS_MESSAGE);
		this.servletAccordiServizio.addAll(AccordiServizioParteComuneCostanti.SERVLET_APC_ALLEGATI);
		this.servletAccordiServizio.addAll(AccordiServizioParteComuneCostanti.SERVLET_APC_EROGATORI);
		this.servletAccordiServizio.addAll(AccordiServizioParteComuneCostanti.SERVLET_APC_COMPONENTI);
		this.servletAccordiServizio.addAll(AccordiServizioParteComuneCostanti.SERVLET_APC_RESOURCES);
		this.servletAccordiServizio.addAll(AccordiServizioParteComuneCostanti.SERVLET_APC_RESOURCES_RISPOSTE);
		this.servletAccordiServizio.addAll(AccordiServizioParteComuneCostanti.SERVLET_APC_RESOURCES_REPRESENTATIONS);
		this.servletAccordiServizio.addAll(AccordiServizioParteComuneCostanti.SERVLET_APC_RESOURCES_PARAMETERS);
		this.servletAccordiServizio.add(ArchiviCostanti.SERVLET_NAME_DOCUMENTI_EXPORT);
		this.servletAccordiServizio.addAll(ApiCostanti.getServletApcApi());
		/** Permessi associati alla gestione degli accordi di servizio */
		this.permessiAccordiServizio = new PermessiUtente();
		this.permessiAccordiServizio.setServizi(true);
		this.permessiAccordiServizio.setAccordiCooperazione(true);
				
		/** Gruppo di servlet che gestiscono gli Accordi di Cooperazione */
		this.servletAccordiCooperazione = new ArrayList<>();
		this.servletAccordiCooperazione.addAll(AccordiCooperazioneCostanti.getServletAccordiCooperazione());
		this.servletAccordiCooperazione.addAll(AccordiCooperazioneCostanti.getServletAcAllegati());
		this.servletAccordiCooperazione.addAll(AccordiCooperazioneCostanti.getServletAcPartecipanti());
		/** Permessi associati alla gestione degli accordi di cooperazione */
		this.permessiAccordiCooperazione = new PermessiUtente();
		this.permessiAccordiCooperazione.setAccordiCooperazione(true);

		/** Gruppo di servlet che gestiscono i servizi */
		this.servletServizi = new ArrayList<>();
		this.servletServizi.addAll(AccordiServizioParteSpecificaCostanti.getServletAps());
		this.servletServizi.addAll(AccordiServizioParteSpecificaCostanti.getServletApsAllegati());
		this.servletServizi.addAll(AccordiServizioParteSpecificaCostanti.getServletApsFruitori());
		this.servletServizi.addAll(AccordiServizioParteSpecificaCostanti.getServletApsFruitoriPorteDelegate());
		this.servletServizi.addAll(AccordiServizioParteSpecificaCostanti.getServletApsPorteApplicative());
		this.servletServizi.add(ArchiviCostanti.SERVLET_NAME_DOCUMENTI_EXPORT);
		this.servletServizi.addAll(ErogazioniCostanti.getServletAspsErogazioni());
		this.servletServizi.add(ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_VERIFICA_CERTIFICATI);
		/** Permessi associati alla gestione dei servizi */
		this.permessiServizi = new PermessiUtente();
		this.permessiServizi.setServizi(true);
		
		/** Gruppo di servlet che gestiscono i ruoli */
		this.servletRuoli = new ArrayList<>();
		this.servletRuoli.addAll(RuoliCostanti.getServletRuoli());
		/** Permessi associati alla gestione dei ruoli */
		this.permessiRuoli = new PermessiUtente();
		this.permessiRuoli.setServizi(true);
		
		/** Gruppo di servlet che gestiscono gli scope */
		this.servletScope = new ArrayList<>();
		this.servletScope.addAll(ScopeCostanti.getServletScope());
		/** Permessi associati alla gestione degli scope */
		this.permessiScope = new PermessiUtente();
		this.permessiScope.setServizi(true);
		
		/** Gruppo di servlet che gestiscono le porte delegate */
		this.servletPorteDelegate = new ArrayList<>();
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegate());
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_MESSAGE_SECURITY);
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateMessageSecurityRequest());
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateMessageSecurityResponse());
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateServizioApplicativo());
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateRuoli());
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateScope());
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CORRELAZIONE_APPLICATIVA);
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateCorrelazioneApplicativaRequest());
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateCorrelazioneApplicativaResponse());
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_MTOM);
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateMtomRequest());
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateMtomResponse());
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CONTROLLO_ACCESSI);
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateAzione());
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_VALIDAZIONE_CONTENUTI);
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_ABILITAZIONE);
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateProprietaProtocollo());
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CONNETTORE_DEFAULT);
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CONNETTORE_RIDEFINITO);
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_DUMP_CONFIGURAZIONE);
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateMessageSecurityPropertiesConfig());
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateConfigurazioneChange());
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_GESTIONE_CORS);
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_GESTIONE_CANALE);
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_VERIFICA_CONNETTORE);
		this.servletPorteDelegate.add(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_RESPONSE_CACHING);
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateResponseCachingConfigurazioneRegola());
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateTrasformazioni());
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateAutenticazioneCustomProperties());
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateAutorizzazioneCustomProperties());
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateAutorizzazioneContenutiCustomProperties());
		this.servletPorteDelegate.addAll(PorteDelegateCostanti.getServletPorteDelegateExtended());
		
		/** Permessi associati alla gestione delle porte delegate */
		this.permessiPorteDelegate = new PermessiUtente();
		this.permessiPorteDelegate.setServizi(true);
		
		/** Gruppo di servlet che gestiscono le porte applicative */
		this.servletPorteApplicative = new ArrayList<>();
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicative());
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_MESSAGE_SECURITY);
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeMessageSecurityRequest());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeMessageSecurityResponse());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeServizioApplicativo());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeRuoli());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeScope());
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CORRELAZIONE_APPLICATIVA);
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeCorrelazioneApplicativaRequest());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeCorrelazioneApplicativaResponse());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeProprietaProtocollo());
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_MTOM);
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeMtomRequest());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeMtomResponse());
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONTROLLO_ACCESSI);
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeAzione());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeSoggetto());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeServizioApplicativoAutorizzato());
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_VALIDAZIONE_CONTENUTI);
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_ABILITAZIONE);
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONNETTORE_DEFAULT);
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONNETTORE_RIDEFINITO);
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_DUMP_CONFIGURAZIONE);
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeMessageSecurityPropertiesConfig());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeConfigurazioneChange());
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_GESTIONE_CORS);
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_GESTIONE_CANALE);
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_VERIFICA_CONNETTORE);
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_RESPONSE_CACHING);
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeResponseCachingConfigurazioneRegola());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeTrasformazioni());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeAutenticazioneCustomProperties());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeAutorizzazioneCustomProperties());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeAutorizzazioneContenutiCustomProperties());
		this.servletPorteApplicative.add(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONFIGURAZIONE_CONNETTORI_MULTIPLI);
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeConnettoriMultipli());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeConnettoriMultipliConfigProperties());
		this.servletPorteApplicative.addAll(PorteApplicativeCostanti.getServletPorteApplicativeExtended());
		
		/** Permessi associati alla gestione delle porte applicative */
		this.permessiPorteApplicative = new PermessiUtente();
		this.permessiPorteApplicative.setServizi(true);
		
		/** Gruppo di servlet che gestiscono i servizi applicativi */
		this.servletServiziApplicativi = new ArrayList<>();
		this.servletServiziApplicativi.addAll(ServiziApplicativiCostanti.getServletServiziApplicativi());
		this.servletServiziApplicativi.addAll(ServiziApplicativiCostanti.getServletServiziApplicativiRuoli());
		this.servletServiziApplicativi.addAll(ServiziApplicativiCostanti.getServletServiziApplicativiCredenziali());
		this.servletServiziApplicativi.addAll(ServiziApplicativiCostanti.getServletServiziApplicativiProprieta());
		this.servletServiziApplicativi.add(ServiziApplicativiCostanti.SERVLET_NAME_SERVIZI_APPLICATIVI_VERIFICA_CERTIFICATI);
		/** Permessi associati alla gestione i servizi applicativi */
		this.permessiServiziApplicativi = new PermessiUtente();
		this.permessiServiziApplicativi.setServizi(true);
		
		/** Gruppo di servlet che gestiscono i connettori custom (condivisi tra soggetti e servizi) */
		this.servletConnettoriCustom = new ArrayList<>();
		this.servletConnettoriCustom.addAll(ConnettoriCostanti.getServletConnettoriCustomProperties());
		/** Permessi associati alla gestione dei connettori custom (condivisi tra soggetti e servizi) */
		this.permessiConnettoriCustom = new PermessiUtente();
		this.permessiConnettoriCustom.setServizi(true);
		
		/** Gruppo di servlet che gestiscono l'importazioni/esportazione delle configurazioni in package */
		this.servletPackage = new ArrayList<>();
		this.servletPackage.addAll(ArchiviCostanti.getServletArchiviExport());
		this.servletPackage.addAll(ArchiviCostanti.getServletArchiviImport());
		/** Permessi associati alla gestione import/export dei package */
		this.permessiPackage = new PermessiUtente();
		this.permessiPackage.setServizi(true);
		
		/** Gruppo di servlet che gestiscono la visualizzazione dei risultati di auditing */
		this.servletAuditing = new ArrayList<>();
		this.servletAuditing.addAll(AuditCostanti.SERVLET_AUDITING);
		this.servletAuditing.addAll(AuditCostanti.SERVLET_AUDITING_DETTAGLIO);
		/** Permessi associati alla visualizzazione dell'auditing */
		this.permessiAuditing = new PermessiUtente();
		this.permessiAuditing.setAuditing(true);
		
		/** Gruppo di servlet che gestiscono la configurazione */
		this.servletConfigurazione = new ArrayList<>();
		this.servletConfigurazione.addAll(AuditCostanti.SERVLET_AUDIT);
		this.servletConfigurazione.addAll(AuditCostanti.SERVLET_AUDIT_FILTRI);
		if(this.singlePdD){
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.getServletConfigurazioneGenerale());
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.getServletConfigurazioneGeneraleListExtended());
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.getServletConfigurazioneDiagnosticaAppender());
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.getServletConfigurazioneDiagnosticaAppenderProperties());
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.getServletConfigurazioneDiagnosticaDatasource());
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.getServletConfigurazioneDiagnosticaDatasourceProperties());
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_TRACCIAMENTO_APPENDER);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_TRACCIAMENTO_APPENDER_PROPERTIES);
			this.servletConfigurazione.add(ConfigurazioneCostanti.SERVLET_NAME_CONFIGURAZIONE_TRACCIAMENTO_TRANSAZIONI);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_TRACCIAMENTO_DATASOURCE);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_TRACCIAMENTO_DATASOURCE_PROPERTIES);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_ROUTING);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_ROTTE_ROUTING);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_ACCESSO_REGISTRO_SERVIZI);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_REGISTRI);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_SYSTEM_PROPERTIES);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_DUMP_APPENDER);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_DUMP_APPENDER_PROPERTIES);
			this.servletConfigurazione.add(ConfigurazioneCostanti.SERVLET_NAME_CONFIGURAZIONE_DUMP_CONFIGURAZIONE);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_CONTROLLO_TRAFFICO);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_POLICY_GESTIONE_TOKEN);
			this.servletConfigurazione.add(ConfigurazioneCostanti.SERVLET_NAME_CONFIGURAZIONE_POLICY_GESTIONE_TOKEN_VERIFICA_CERTIFICATI);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_RESPONSE_CACHING_CONFIGURAZIONE_REGOLA);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_PROXY_PASS_REGOLA);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_CANALI);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_CANALI_NODI);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_PLUGINS_ARCHIVI);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_PLUGINS_ARCHIVI_JAR);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_PLUGINS_CLASSI);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_ALLARMI);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_HANDLERS_RICHIESTA);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_HANDLERS_RISPOSTA);
			this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_HANDLERS_SERVIZIO);
			this.servletConfigurazione.addAll(RemoteStoresCostanti.getServletRuoli());
		}
		this.servletConfigurazione.addAll(ConfigurazioneCostanti.SERVLET_CONFIGURAZIONE_SISTEMA);
		this.servletConfigurazione.add(ConfigurazioneCostanti.SERVLET_NAME_CONFIGURAZIONE_SISTEMA_EXPORTER);
		this.servletConfigurazione.add(ArchiviCostanti.SERVLET_NAME_RESOCONTO_EXPORT);
		/** Permessi associati alla gestione della configurazione */
		this.permessiConfigurazione = new PermessiUtente();
		this.permessiConfigurazione.setSistema(true);
		
		/** Gruppo di servlet che visualizzano la gestione degli utenti */
		this.servletGestioneUtenti = new ArrayList<>();
		this.servletGestioneUtenti.addAll(LoginCostanti.getServletLoginAsSu());
		this.servletGestioneUtenti.addAll(UtentiCostanti.getServletUtenti());
		this.servletGestioneUtenti.addAll(UtentiCostanti.getServletUtentiServizi());
		this.servletGestioneUtenti.addAll(UtentiCostanti.getServletUtentiSoggetti());
		/** Permessi associati alla gestione degli utenti */
		this.permessiGestioneUtenti = new PermessiUtente();
		this.permessiGestioneUtenti.setUtenti(true);
		
		/** Gruppo di servlet che gestiscono la tracciatura */
		this.servletTracciamento = new ArrayList<>();
		this.servletTracciamento.addAll(ArchiviCostanti.getServletArchiviTracciamento());
		this.servletTracciamento.add(ArchiviCostanti.SERVLET_NAME_TRACCE_EXPORT);
		/** Permessi associati alla gestione la tracciatura */
		this.permessiTracciamento = new PermessiUtente();
		this.permessiTracciamento.setDiagnostica(true);
		
		/** Gruppo di servlet che gestiscono la diagnostica */
		this.servletDiagnostica = new ArrayList<>();
		this.servletTracciamento.addAll(ArchiviCostanti.getServletArchiviDiagnostica());
		this.servletDiagnostica.add(ArchiviCostanti.SERVLET_NAME_MESSAGGI_DIAGNOSTICI_EXPORT);
		/** Permessi associati alla gestione la diagnostica */
		this.permessiDiagnostica = new PermessiUtente();
		this.permessiDiagnostica.setDiagnostica(true);
		
		/** Gruppo di servlet che gestiscono il monitoraggio applicativo */
		this.servletMonitoraggioApplicativo = new ArrayList<>();
		this.servletMonitoraggioApplicativo.addAll(MonitorCostanti.getServletMonitor());
		/** Permessi associati alla gestione il monitoraggio applicativo */
		this.permessiMonitoraggioApplicativo = new PermessiUtente();
		this.permessiMonitoraggioApplicativo.setCodeMessaggi(true);
		
		/** Gruppo di servlet che visualizzano la versione delle librerie installate */
		this.servletLibraryVersion = new ArrayList<>();
		this.servletLibraryVersion.add("libInfo.do");
		/** Permessi associati alla visualizzazione delle info sulle librerie installate */
		this.permessiLibraryVersion = new PermessiUtente();
		this.permessiLibraryVersion.setSistema(true);
		
		/** Gruppo di servlet che gestiscono l'utente (password e modalita' di interfaccia) */
		this.servletChangePwdModalita = new ArrayList<>();
		this.servletChangePwdModalita.addAll(UtentiCostanti.getServletUtente());
		/** Permessi associati alla gestione della configurazione */
		this.permessiChangePwdModalita = new PermessiUtente();
		this.permessiChangePwdModalita.setSistema(true);
		this.permessiChangePwdModalita.setAuditing(true);
		this.permessiChangePwdModalita.setCodeMessaggi(true);
		this.permessiChangePwdModalita.setDiagnostica(true);
		this.permessiChangePwdModalita.setServizi(true);
		this.permessiChangePwdModalita.setAccordiCooperazione(true);
		// permettere anche agli utenti che gestiscono altri utenti di modificare la propria password
		this.permessiChangePwdModalita.setUtenti(true);
				
		/** Gruppo di servlet che gestiscono le protocolproperties */
		this.servletProtocolProperties = new ArrayList<>();
		this.servletProtocolProperties.addAll(ProtocolPropertiesCostanti.getServletPp());
		/** Permessi Associati alla gestione delle protocol properties */
		this.permessiProtocolProperties = new PermessiUtente();
		this.permessiProtocolProperties.setServizi(true);
		
		/** Gruppo di servlet che gestiscono i gruppi */
		this.servletGruppi = new ArrayList<>();
		this.servletGruppi.addAll(GruppiCostanti.getServletGruppi());
		/** Permessi associati alla gestione dei gruppi */
		this.permessiGruppi = new PermessiUtente();
		this.permessiGruppi.setSistema(true);
		
		/** Gruppo di servlet che gestiscono il supporto delle funzionalita' di registro */
		this.servletRegistro = new ArrayList<>();
		this.servletRegistro.addAll(UtilsCostanti.getServletUtils());
		/** Permessi Associati al supporto delle funzionalita' di registro */
		this.permessiRegistro = new PermessiUtente();
		this.permessiRegistro.setServizi(true);
	}
	
	
	public boolean permettiVisualizzazione(Logger log,String nomeServlet,LoginHelper loginHelper, StringBuilder bfError) throws DriverControlStationException {
		
		String login = ServletUtils.getUserLoginFromSession(loginHelper.getSession());
		User user = null;
		try{
			if(utentiCore==null) {
				if(bfError!=null) {
					bfError.append("Utenti Core is null");
				}
				return false;
			}
			user = utentiCore.getUser(login);
		}catch(Exception e){
			ControlStationCore.logError(e.getMessage(), e);
			if(bfError!=null) {
				bfError.append("Utente non recuperato: "+e.getMessage());
			}
			return false;
		}
		
		// Se sono loginAsSu guardo che abbia i diritti di utente.
		// Tanto se li possiedo posso in teoria modificare anche i miei fornendomi tutti quelli necessari 
		
		// Check appartenenza
		if(this.singlePdD && this.servletPdDSinglePdD.contains(nomeServlet)){
			boolean p = this.permessiPdDSinglePdD.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione singlePdD");
			}
			return p;
		}else if(this.servletSoggetti.contains(nomeServlet)){
			boolean p = this.permessiSoggetti.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione dei soggetti");
			}
			return p;
		}else if(this.servletAccordiCooperazione.contains(nomeServlet)){
			boolean p = this.permessiAccordiCooperazione.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione degli accordi di cooperazione");
			}
			return p;
		}else if(this.servletAccordiServizio.contains(nomeServlet)){
			//controllo che la servlet richiesta sia consentita per il profilo dell'utente
			boolean servletOk = this.permessiAccordiServizio.or(user.getPermessi());
			
			String tipoAccordo = loginHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO); 
			
			if(StringUtils.isEmpty(tipoAccordo)) { // puo' essere null perche' non presente o vuoto perche' e' stato filtrato dall'utility di sicurezza
				String tipoAccordoOriginale = Validatore.getInstance().getParametroOriginale(loginHelper.getRequest(), AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO);
				
				if(tipoAccordoOriginale != null) { // se il valore originale non e' null lancio l'errore.
					tipoAccordo = tipoAccordoOriginale; // forzo il fallimento della validazione.
				}
			}
			
			//se la richiesta fa parte di un gruppo di servlet consentite 
			//controllo se viene passato un parametro con nome tipo accordo 
			if(servletOk && tipoAccordo != null){
				// per gli accordi parte comune servono i diritti 'S'
				if(tipoAccordo.equals(AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE)){
					if(!user.getPermessi().isServizi()) {
						if(bfError!=null) {
							bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione delle API");
						}
						return false;
					}
				} else 
					// per gli accordi di servizio composti servono i diritti 'P'
					if(tipoAccordo.equals(AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_SERVIZIO_COMPOSTO)){
						if(!user.getPermessi().isAccordiCooperazione()) {
							if(bfError!=null) {
								bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione degli accordi di cooperazione (servizi composti)");
							}
							return false;
						}
				} else {
					// tipo accordo con valore non buono
					if(bfError!=null) {
						bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione delle API (tipoAccordo '"+tipoAccordo+"' non valido)");
					}
					return false;
				}
			}
			
			return servletOk;
		}else if(this.servletServizi.contains(nomeServlet)){
			boolean p = this.permessiServizi.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione dei servizi");
			}
			return p;
		}else if(this.servletRuoli.contains(nomeServlet)){
			boolean p = this.permessiRuoli.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione dei ruoli");
			}
			return p;
		}else if(this.servletScope.contains(nomeServlet)){
			boolean p = this.permessiScope.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione degli scope");
			}
			return p;
		}else if(this.servletPorteDelegate.contains(nomeServlet)){
			boolean p = this.permessiPorteDelegate.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione delle porte delegate");
			}
			return p;
		}else if(this.servletPorteApplicative.contains(nomeServlet)){
			boolean p = this.permessiPorteApplicative.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione delle porte applicativa");
			}
			return p;
		}else if(this.servletServiziApplicativi.contains(nomeServlet)){
			boolean p = this.permessiServiziApplicativi.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione dei servizi applicativi");
			}
			return p;
		}else if(this.servletConnettoriCustom.contains(nomeServlet)){
			boolean p = this.permessiConnettoriCustom.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione dei connettori custom");
			}
			return p;
		}else if(this.servletPackage.contains(nomeServlet)){
			boolean p = this.permessiPackage.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione dei packages");
			}
			return p;
		}else if(this.servletAuditing.contains(nomeServlet)){
			boolean p = this.permessiAuditing.or(user.getPermessi());if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione dell'auditing");
			}
			return p;
		}else if(this.servletConfigurazione.contains(nomeServlet)){
			boolean p = this.permessiConfigurazione.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione delle pagine di configurazione");
			}
			return p;
		}else if(this.servletGestioneUtenti.contains(nomeServlet)){
			boolean p = this.permessiGestioneUtenti.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione per gli utenti");
			}
			return p;
		}else if(this.singlePdD && this.servletTracciamento.contains(nomeServlet)){
			boolean p = this.permessiTracciamento.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione per il tracciamento");
			}
			return p;
		}else if(this.singlePdD && this.servletDiagnostica.contains(nomeServlet)){
			boolean p = this.permessiDiagnostica.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione per la diagnostica");
			}
			return p;
		}else if(this.servletMonitoraggioApplicativo.contains(nomeServlet)){
			boolean p = this.permessiMonitoraggioApplicativo.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione per la coda messaggi");
			}
			return p;
		}else if(this.servletLibraryVersion.contains(nomeServlet)){
			boolean p = this.permessiLibraryVersion.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione per la versione delle librerie");
			}
			return p;
		}else if(this.servletChangePwdModalita.contains(nomeServlet)){
			boolean p = this.permessiChangePwdModalita.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione per il cambio password");
			}
			return p;
		}else if(this.servletProtocolProperties.contains(nomeServlet)){
			boolean p = this.permessiProtocolProperties.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione per le proprietà dei protocolli");
			}
			return p;
		}else if(this.servletGruppi.contains(nomeServlet)){
			boolean p = this.permessiGruppi.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione dei gruppi");
			}
			return p;
		}else if(this.servletRegistro.contains(nomeServlet)){
			boolean p = this.permessiRegistro.or(user.getPermessi());
			if(!p && bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; censita nella lista di autorizzazione del registro");
			}
			return p;
		}else{
			if(bfError!=null) {
				bfError.append("servlet richiesta non autorizzata; non risulta censita");
			}
			String error = "Servlet richiesta non gestita: "+nomeServlet;
			log.error(error);
			return false;
		}
	}
}