TokenProvider.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */


  20. package org.openspcoop2.pdd.core.token;

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

  25. import org.apache.commons.lang.StringUtils;
  26. import org.openspcoop2.core.config.constants.CostantiConfigurazione;
  27. import org.openspcoop2.core.constants.CostantiConnettori;
  28. import org.openspcoop2.core.mvc.properties.Item;
  29. import org.openspcoop2.core.mvc.properties.constants.ItemType;
  30. import org.openspcoop2.core.mvc.properties.provider.ExternalResources;
  31. import org.openspcoop2.core.mvc.properties.provider.IProvider;
  32. import org.openspcoop2.core.mvc.properties.provider.InputValidationUtils;
  33. import org.openspcoop2.core.mvc.properties.provider.ProviderException;
  34. import org.openspcoop2.core.mvc.properties.provider.ProviderInfo;
  35. import org.openspcoop2.core.mvc.properties.provider.ProviderValidationException;
  36. import org.openspcoop2.core.plugins.constants.TipoPlugin;
  37. import org.openspcoop2.pdd.core.dynamic.DynamicHelperCostanti;
  38. import org.openspcoop2.pdd.core.token.parser.ITokenParser;
  39. import org.openspcoop2.pdd.core.token.parser.TipologiaClaims;
  40. import org.openspcoop2.security.message.constants.SecurityConstants;
  41. import org.openspcoop2.security.message.jose.JOSECostanti;
  42. import org.openspcoop2.security.message.jose.SecurityProvider;
  43. import org.openspcoop2.security.message.utils.AbstractSecurityProvider;
  44. import org.openspcoop2.utils.UtilsRuntimeException;
  45. import org.openspcoop2.utils.certificate.byok.BYOKProvider;
  46. import org.openspcoop2.utils.certificate.hsm.HSMUtils;
  47. import org.openspcoop2.utils.certificate.ocsp.OCSPProvider;
  48. import org.openspcoop2.utils.transport.http.HttpRequestMethod;
  49. import org.openspcoop2.utils.transport.http.SSLUtilities;

  50. /**    
  51.  * TokenProvider
  52.  *
  53.  * @author Poli Andrea (poli@link.it)
  54.  * @author $Author$
  55.  * @version $Rev$, $Date$
  56.  */
  57. public class TokenProvider implements IProvider {

  58.    
  59.     private OCSPProvider ocspProvider;
  60.     private BYOKProvider byokProvider;

  61.     public TokenProvider() {
  62.         this.ocspProvider = new OCSPProvider();
  63.         try {
  64.             this.byokProvider = BYOKProvider.getUnwrapInstance();
  65.         }catch(Exception e) {
  66.             throw new UtilsRuntimeException(e.getMessage(),e);
  67.         }
  68.     }

  69.     private static final String SCONOSCIUTO = "Sconosciuto";
  70.     private static final String NON_SUPPORTATA = "non è supportata";
  71.     private static final String NESSUN_TIPO_CONSEGNA = "Nessuna tipo di consegna (header/url), delle informazioni raccolte, indicata";
  72.     private static final String getPrefixParserType(String parserType) {
  73.         return "È stato indicato un parser '"+parserType+"'";
  74.     }
  75.     private static final String getPrefixTipo(String tipo) {
  76.         return "È stato indicato un tipo '"+tipo+"'";
  77.     }
  78.    
  79.     @Override
  80.     public void validate(Map<String, Properties> mapProperties) throws ProviderException, ProviderValidationException {
  81.        
  82.         Properties pDefault = TokenUtilities.getDefaultProperties(mapProperties);
  83.        
  84.         validateTokenSource(pDefault);
  85.        
  86.         String tokenType = validateTokenType(pDefault);
  87.        
  88.         boolean validazione = TokenUtilities.isValidazioneEnabled(pDefault);
  89.         boolean introspection = TokenUtilities.isIntrospectionEnabled(pDefault);
  90.         boolean userInfo = TokenUtilities.isUserInfoEnabled(pDefault);
  91.         boolean forward = TokenUtilities.isTokenForwardEnabled(pDefault);
  92.                
  93.         if(!validazione &&  !introspection && !userInfo && !forward) {
  94.             throw new ProviderValidationException("Almeno una modalità di elaborazione del token deve essere selezionata");
  95.         }
  96.        
  97.         boolean dynamicDiscovery = TokenUtilities.isDynamicDiscoveryEnabled(pDefault);
  98.         if(dynamicDiscovery) {
  99.             validateDynamicDiscovery(mapProperties, pDefault, validazione, introspection, userInfo);
  100.         }
  101.        
  102.         if(validazione) {
  103.             validateValidazioneJWT(mapProperties, pDefault, tokenType, dynamicDiscovery);
  104.         }
  105.        
  106.         boolean endpointSSL = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_ENDPOINT_HTTPS_STATO);
  107.         if(endpointSSL) {
  108.             validateEndpointSsl(mapProperties);
  109.         }
  110.        
  111.         if(introspection) {
  112.             validateIntrospection(mapProperties, pDefault, dynamicDiscovery);
  113.         }
  114.        
  115.         if(userInfo) {
  116.             validateUserInfo(mapProperties, pDefault, dynamicDiscovery);
  117.         }
  118.                
  119.         if(forward) {
  120.             validateInformazioniRaccolte(mapProperties, pDefault);
  121.         }
  122.     }
  123.     private void validateTokenSource(Properties pDefault) throws ProviderValidationException {
  124.         String position = pDefault.getProperty(Costanti.POLICY_TOKEN_SOURCE);
  125.         if(position==null) {
  126.             throw new ProviderValidationException("Non è stata indicata la posizione del token");
  127.         }
  128.         if(!Costanti.POLICY_TOKEN_SOURCE_RFC6750.equals(position) &&
  129.                 !Costanti.POLICY_TOKEN_SOURCE_RFC6750_HEADER.equals(position) &&
  130.                 !Costanti.POLICY_TOKEN_SOURCE_RFC6750_FORM.equals(position) &&
  131.                 !Costanti.POLICY_TOKEN_SOURCE_RFC6750_URL.equals(position) &&
  132.                 !Costanti.POLICY_TOKEN_SOURCE_CUSTOM_HEADER.equals(position) &&
  133.                 !Costanti.POLICY_TOKEN_SOURCE_CUSTOM_URL.equals(position) ) {
  134.             throw new ProviderValidationException("La posizione del token indicata '"+position+"' "+NON_SUPPORTATA);
  135.         }
  136.        
  137.         if(Costanti.POLICY_TOKEN_SOURCE_CUSTOM_HEADER.equals(position)) {
  138.             String headerName = pDefault.getProperty(Costanti.POLICY_TOKEN_SOURCE_CUSTOM_HEADER_NAME);
  139.             if(headerName==null || "".equals(headerName)) {
  140.                 throw new ProviderValidationException("Non è stato indicato il nome dell'header http che deve contenere il token");
  141.             }
  142.             if(headerName.contains(" ")) {
  143.                 throw new ProviderValidationException("Il nome fornito per l'header http che deve contenere il token non deve possedere spazi");
  144.             }
  145.         }
  146.         else if(Costanti.POLICY_TOKEN_SOURCE_CUSTOM_URL.equals(position)) {
  147.             String pName = pDefault.getProperty(Costanti.POLICY_TOKEN_SOURCE_CUSTOM_URL_PROPERTY_NAME);
  148.             if(pName==null) {
  149.                 throw new ProviderValidationException("Non è stato indicato il nome della proprietà della URL che deve contenere il token");
  150.             }
  151.             if(pName.contains(" ")) {
  152.                 throw new ProviderValidationException("Il nome fornito per la proprietà della URL che deve contenere il token non deve possedere spazi");
  153.             }
  154.         }
  155.     }
  156.     private String validateTokenType(Properties pDefault) throws ProviderValidationException {
  157.         String tokenType = pDefault.getProperty(Costanti.POLICY_TOKEN_TYPE);
  158.         if(tokenType==null) {
  159.             throw new ProviderValidationException("Non è stata indicato il tipo del token");
  160.         }
  161.         if(!Costanti.POLICY_TOKEN_TYPE_OPAQUE.equals(tokenType) &&
  162.                 !Costanti.POLICY_TOKEN_TYPE_JWS.equals(tokenType) &&
  163.                 !Costanti.POLICY_TOKEN_TYPE_JWE.equals(tokenType)) {
  164.             throw new ProviderValidationException("Il tipo di token indicato '"+tokenType+"' non è supportato");
  165.         }
  166.        
  167.         return tokenType;
  168.     }
  169.     private void validateDynamicDiscovery(Map<String, Properties> mapProperties, Properties pDefault,
  170.             boolean validazione, boolean introspection, boolean userInfo) throws ProviderValidationException {
  171.        
  172.         String url = pDefault.getProperty(Costanti.POLICY_DISCOVERY_URL);
  173.         InputValidationUtils.validateTextAreaInput(url, "Discovery Document - URL");
  174.         try{
  175.             org.openspcoop2.utils.regexp.RegExpUtilities.validateUrl(url);
  176.         }catch(Exception e){
  177.             throw new ProviderValidationException("La URL fornita per il servizio 'Discovery Document' non è valida: "+e.getMessage());
  178.         }
  179.        
  180.         String dType = pDefault.getProperty(Costanti.POLICY_DISCOVERY_CLAIMS_PARSER_TYPE);
  181.         if(dType==null) {
  182.             throw new ProviderValidationException("Discovery Document URL- non è stata indicato il tipo");
  183.         }
  184.         TipologiaClaims tc = null;
  185.         try {
  186.             tc = TipologiaClaims.valueOf(dType);
  187.         }catch(Exception e) {
  188.             throw new ProviderValidationException("Discovery Document URL- tipo non valido");
  189.         }
  190.         if(TipologiaClaims.MAPPING.equals(tc)) {
  191.            
  192.             Properties p = mapProperties.get(Costanti.DYNAMIC_DISCOVERY_PARSER_COLLECTION_ID);
  193.             if(p==null || p.size()<=0) {
  194.                 throw new ProviderValidationException("Non è stata fornita una configurazione per effettuare il parser personalizzato per il servizio di discovery document");
  195.             }
  196.            
  197.             if(validazione) {
  198.                 String custom = p.getProperty(Costanti.POLICY_DISCOVERY_JWK_CUSTOM);
  199.                 InputValidationUtils.validateTextAreaInput(custom, "Discovery Document URL - JWK Set");
  200.             }
  201.             if(introspection) {
  202.                 String custom = p.getProperty(Costanti.POLICY_DISCOVERY_INTROSPECTION_CUSTOM);
  203.                 InputValidationUtils.validateTextAreaInput(custom, "Discovery Document URL - Introspection");
  204.             }
  205.             if(userInfo) {
  206.                 String custom = p.getProperty(Costanti.POLICY_DISCOVERY_USERINFO_CUSTOM);
  207.                 InputValidationUtils.validateTextAreaInput(custom, "Discovery Document URL - UserInfo");
  208.             }
  209.         }
  210.     }
  211.     private void validateValidazioneJWT(Map<String, Properties> mapProperties, Properties pDefault, String tokenType, boolean dynamicDiscovery) throws ProviderValidationException {
  212.         if(!Costanti.POLICY_TOKEN_TYPE_JWS.equals(tokenType) &&
  213.                 !Costanti.POLICY_TOKEN_TYPE_JWE.equals(tokenType)) {
  214.             throw new ProviderValidationException("Il tipo di token indicato '"+tokenType+"' non è utilizzabile con una validazione JWT");
  215.         }
  216.        
  217.         if(Costanti.POLICY_TOKEN_TYPE_JWS.equals(tokenType)) {
  218.             validateValidazioneJws(mapProperties, pDefault, dynamicDiscovery);
  219.         }
  220.         else { /**if(Costanti.POLICY_TOKEN_TYPE_JWE.equals(tokenType)) {*/
  221.             validateValidazioneJwe(mapProperties, dynamicDiscovery);
  222.         }
  223.        
  224.         String parserType = pDefault.getProperty(Costanti.POLICY_VALIDAZIONE_CLAIMS_PARSER_TYPE);
  225.         if(parserType==null) {
  226.             throw new ProviderValidationException("Non è stato indicato il parser per i claims da utilizzare dopo la validazione JWT");
  227.         }
  228.         TipologiaClaims tipologiaClaims = null;
  229.         try {
  230.             tipologiaClaims = TipologiaClaims.valueOf(parserType);
  231.             if(tipologiaClaims==null) {
  232.                 throw new ProviderValidationException(SCONOSCIUTO);
  233.             }
  234.         }catch(Exception e) {
  235.             throw new ProviderValidationException(getPrefixParserType(parserType)+", per i claims da utilizzare dopo la validazione JWT, sconosciuto");
  236.         }
  237.         if(TipologiaClaims.CUSTOM.name().equals(parserType)) {
  238.             validateValidazioneJwtCustomParser(pDefault);
  239.         }
  240.     }
  241.     private void validateValidazioneJws(Map<String, Properties> mapProperties, Properties pDefault, boolean dynamicDiscovery) throws ProviderValidationException {
  242.         Properties p = mapProperties.get(Costanti.POLICY_VALIDAZIONE_JWS_VERIFICA_PROP_REF_ID);
  243.         if(p==null || p.size()<=0) {
  244.             throw new ProviderValidationException("Non è stata fornita una configurazione per effettuare la validazione JWS");
  245.         }
  246.        
  247.         if(!p.containsKey(SecurityConstants.JOSE_KEYSTORE) && !p.containsKey(SecurityConstants.JOSE_KEYSTORE_JWKSET)) {
  248.             // altrimenti è stato fatto inject del keystore
  249.             if(!dynamicDiscovery) {
  250.                 String file = p.getProperty(SecurityConstants.JOSE_KEYSTORE_FILE);
  251.                 InputValidationUtils.validateTextAreaInput(file, "Validazione JWT - TrustStore - Location");
  252.             }
  253.            
  254.             String crl = pDefault.getProperty(SecurityConstants.SIGNATURE_CRL);
  255.             if(crl!=null && StringUtils.isNotEmpty(crl)) {
  256.                 InputValidationUtils.validateTextAreaInput(crl, "Validazione JWT - TrustStore - CRL File(s)");
  257.             }
  258.         }
  259.     }
  260.     private void validateValidazioneJwe(Map<String, Properties> mapProperties, boolean dynamicDiscovery) throws ProviderValidationException {
  261.         Properties p = mapProperties.get(Costanti.POLICY_VALIDAZIONE_JWE_DECRYPT_PROP_REF_ID);
  262.         if(p==null || p.size()<=0) {
  263.             throw new ProviderValidationException("Non è stata fornita una configurazione per effettuare la validazione JWE");
  264.         }
  265.        
  266.         if(!p.containsKey(SecurityConstants.JOSE_KEYSTORE) && !p.containsKey(SecurityConstants.JOSE_KEYSTORE_JWKSET) &&
  267.             // altrimenti è stato fatto inject del keystore
  268.             !dynamicDiscovery) {
  269.             String file = p.getProperty(SecurityConstants.JOSE_KEYSTORE_FILE);
  270.             InputValidationUtils.validateTextAreaInput(file, "Validazione JWT - KeyStore - Location");
  271.         }
  272.     }
  273.     private void validateValidazioneJwtCustomParser(Properties pDefault) throws ProviderValidationException {
  274.         String pluginType = pDefault.getProperty(Costanti.POLICY_VALIDAZIONE_CLAIMS_PARSER_PLUGIN_TYPE);
  275.         if(pluginType!=null && StringUtils.isNotEmpty(pluginType) && CostantiConfigurazione.POLICY_ID_NON_DEFINITA.equals(pluginType)) {
  276.             String className = pDefault.getProperty(Costanti.POLICY_VALIDAZIONE_CLAIMS_PARSER_CLASS_NAME);
  277.             if(CostantiConfigurazione.POLICY_ID_NON_DEFINITA.equals(className)) {
  278.                 throw new ProviderValidationException("Deve essere selezionato un plugin per il parser dei claims del token JWT");
  279.             }
  280.             else {
  281.                 if(className==null || "".equals(className)) {
  282.                     throw new ProviderValidationException("Non è stata fornita la classe del parser dei claims da utilizzare dopo la validazione JWT");
  283.                 }
  284.                 if(className.contains(" ")) {
  285.                     throw new ProviderValidationException("Non indicare spazi nella classe del parser dei claims da utilizzare dopo la validazione JWT");
  286.                 }
  287.             }
  288.         }
  289.     }
  290.     private void validateEndpointSsl(Map<String, Properties> mapProperties) throws ProviderValidationException {
  291.         Properties p = mapProperties.get(Costanti.POLICY_ENDPOINT_SSL_CONFIG);
  292.         if(p==null || p.size()<=0) {
  293.             throw new ProviderValidationException("Nonostante sia stato indicato un endpoint 'https', non è stata fornita una configurazione dei parametri ssl da utilizzare");
  294.         }
  295.        
  296.         String trustAllCerts = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_ALL_CERTS);
  297.         boolean trustAll = false;
  298.         if(trustAllCerts!=null && StringUtils.isNotEmpty(trustAllCerts)) {
  299.             trustAll = Boolean.valueOf(trustAllCerts);
  300.         }
  301.        
  302.         if(!trustAll) {
  303.             String location = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_STORE_LOCATION);
  304.             InputValidationUtils.validateTextAreaInput(location, "Https - Autenticazione Server - File (TrustStore per l'autenticazione server)");
  305.            
  306.             String algo = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_MANAGEMENT_ALGORITHM);
  307.             if(algo==null || "".equals(algo)) {
  308.                 throw new ProviderValidationException("Indicare un algoritmo per l'autenticazione server");
  309.             }
  310.             if(algo.contains(" ")) {
  311.                 throw new ProviderValidationException("Non indicare spazi nell'algoritmo per l'autenticazione server");
  312.             }
  313.            
  314.             String locationCRL = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_STORE_CRLS);
  315.             if(locationCRL!=null && !"".equals(locationCRL)) {
  316.                 InputValidationUtils.validateTextAreaInput(locationCRL, "Https - Autenticazione Server - CRL File(s)");
  317.             }
  318.         }
  319.     }
  320.     private void validateIntrospection(Map<String, Properties> mapProperties, Properties pDefault, boolean dynamicDiscovery) throws ProviderValidationException {
  321.        
  322.         if(!dynamicDiscovery) {
  323.             String url = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_URL);
  324.             InputValidationUtils.validateTextAreaInput(url, "Token Introspection - URL");
  325.             try{
  326.                 org.openspcoop2.utils.regexp.RegExpUtilities.validateUrl(url);
  327.             }catch(Exception e){
  328.                 throw new ProviderValidationException("La URL fornita per il servizio 'Introspection' non è valida: "+e.getMessage());
  329.             }
  330.         }
  331.        
  332.         TipoTokenRequest tipoTokenRequestEnum = validateIntrospectionTipoToken(pDefault);
  333.        
  334.         HttpRequestMethod httpRequestMethodEnum = validateIntrospectionHttpRequestMethod(pDefault);
  335.        
  336.         validateIntrospectionContentType(pDefault, tipoTokenRequestEnum, httpRequestMethodEnum);
  337.        
  338.         validateIntrospectionParser(pDefault);
  339.        
  340.         boolean basic = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_INTROSPECTION_AUTH_BASIC_STATO);
  341.         if(basic) {
  342.             validateIntrospectionBasicCredentials(pDefault);
  343.         }
  344.        
  345.         boolean bearer = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_INTROSPECTION_AUTH_BEARER_STATO);
  346.         if(bearer) {
  347.             String token = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_AUTH_BEARER_TOKEN);
  348.             InputValidationUtils.validateTextAreaInput(token, "Token Introspection - Autenticazione Bearer - Token");
  349.         }
  350.        
  351.         boolean ssl = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_INTROSPECTION_AUTH_SSL_STATO);
  352.         if(ssl) {
  353.             validateIntrospectionSslCredentials(mapProperties);
  354.         }
  355.     }
  356.     private TipoTokenRequest validateIntrospectionTipoToken(Properties pDefault) throws ProviderValidationException {
  357.         String tipoTokenRequest = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_REQUEST_TOKEN_POSITION);
  358.         if(tipoTokenRequest==null) {
  359.             throw new ProviderValidationException("Non è stato indicato il tipo di spedizione del token da inoltrare al servizio di Introspection");
  360.         }
  361.         TipoTokenRequest tipoTokenRequestEnum = null;
  362.         try {
  363.             tipoTokenRequestEnum = TipoTokenRequest.valueOf(tipoTokenRequest);
  364.             if(tipoTokenRequestEnum==null) {
  365.                 throw new ProviderValidationException(SCONOSCIUTO);
  366.             }
  367.         }catch(Exception e) {
  368.             throw new ProviderValidationException(getPrefixTipo(tipoTokenRequest)+" di spedizione del token da inoltrare al servizio di Introspection sconosciuto");
  369.         }
  370.         validateIntrospectionTipoToken(tipoTokenRequestEnum, pDefault);
  371.         return tipoTokenRequestEnum;
  372.     }
  373.     private void validateIntrospectionTipoToken(TipoTokenRequest tipoTokenRequestEnum, Properties pDefault) throws ProviderValidationException {
  374.         switch (tipoTokenRequestEnum) {
  375.         case authorization:
  376.             break;
  377.         case header:
  378.             validateIntrospectionTipoTokenHeader(pDefault);
  379.             break;
  380.         case url:
  381.             validateIntrospectionTipoTokenUrl(pDefault);
  382.             break;
  383.         case form:
  384.             validateIntrospectionTipoTokenForm(pDefault);
  385.             break;
  386.         }
  387.     }
  388.     private void validateIntrospectionTipoTokenHeader(Properties pDefault) throws ProviderValidationException {
  389.         String tmp = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_REQUEST_TOKEN_POSITION_HEADER_NAME);
  390.         if(tmp==null || "".equals(tmp)) {
  391.             throw new ProviderValidationException("Non è stato indicato il nome dell'header http su cui inoltrare il token al servizio di Introspection");
  392.         }
  393.         if(tmp.contains(" ")) {
  394.             throw new ProviderValidationException("Non indicare spazi nel nome dell'header http su cui inoltrare il token al servizio di Introspection");
  395.         }
  396.     }
  397.     private void validateIntrospectionTipoTokenUrl(Properties pDefault) throws ProviderValidationException {
  398.         String tmp = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_REQUEST_TOKEN_POSITION_URL_PROPERTY_NAME);
  399.         if(tmp==null || "".equals(tmp)) {
  400.             throw new ProviderValidationException("Non è stato indicato il nome della proprietà della URL su cui inoltrare il token al servizio di Introspection");
  401.         }
  402.         if(tmp.contains(" ")) {
  403.             throw new ProviderValidationException("Non indicare spazi nel nome della proprietà della URL su cui inoltrare il token al servizio di Introspection");
  404.         }
  405.     }
  406.     private void validateIntrospectionTipoTokenForm(Properties pDefault) throws ProviderValidationException {
  407.         String tmp = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_REQUEST_TOKEN_POSITION_FORM_PROPERTY_NAME);
  408.         if(tmp==null || "".equals(tmp)) {
  409.             throw new ProviderValidationException("Non è stato indicato il nome della proprietà della FORM su cui inoltrare il token al servizio di Introspection");
  410.         }
  411.         if(tmp.contains(" ")) {
  412.             throw new ProviderValidationException("Non indicare spazi nel nome della proprietà della FORM su cui inoltrare il token al servizio di Introspection");
  413.         }
  414.     }
  415.     private HttpRequestMethod validateIntrospectionHttpRequestMethod(Properties pDefault) throws ProviderValidationException {
  416.         String httpRequestMethod = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_HTTP_METHOD);
  417.         if(httpRequestMethod==null) {
  418.             throw new ProviderValidationException("Non è stato indicato il tipo di richiesta HTTP da utilizzare per inoltrare il token al servizio di Introspection");
  419.         }
  420.         HttpRequestMethod httpRequestMethodEnum = null;
  421.         try {
  422.             httpRequestMethodEnum = HttpRequestMethod.valueOf(httpRequestMethod);
  423.             if(httpRequestMethodEnum==null) {
  424.                 throw new ProviderValidationException(SCONOSCIUTO);
  425.             }
  426.         }catch(Exception e) {
  427.             throw new ProviderValidationException(getPrefixTipo(httpRequestMethod)+" di richiesta HTTP da utilizzare per inoltrare il token al servizio di Introspection sconosciuto");
  428.         }
  429.         return httpRequestMethodEnum;
  430.     }
  431.     private void validateIntrospectionContentType(Properties pDefault, TipoTokenRequest tipoTokenRequestEnum, HttpRequestMethod httpRequestMethodEnum) throws ProviderValidationException {
  432.         String contentType = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_CONTENT_TYPE);
  433.         if(!TipoTokenRequest.form.equals(tipoTokenRequestEnum) &&
  434.             (  
  435.                 HttpRequestMethod.POST.equals(httpRequestMethodEnum) ||
  436.                 HttpRequestMethod.PUT.equals(httpRequestMethodEnum) ||
  437.                 HttpRequestMethod.PATCH.equals(httpRequestMethodEnum) ||
  438.                 HttpRequestMethod.LINK.equals(httpRequestMethodEnum) ||
  439.                 HttpRequestMethod.UNLINK.equals(httpRequestMethodEnum)
  440.             ) &&
  441.             (contentType==null || "".equals(contentType))
  442.         ) {
  443.             throw new ProviderValidationException("Non è stato indicato il ContentType da utilizzare nella richiesta HTTP prodotta per inoltrare il token al servizio di Introspection");
  444.                 /**                 if(contentType.contains(" ")) {
  445. //                  throw new ProviderValidationException("Non indicare spazi nel ContentType da utilizzare nella richiesta HTTP prodotta per inoltrare il token al servizio di Introspection");
  446. //              }*/
  447.         }
  448.     }
  449.     private void validateIntrospectionParser(Properties pDefault) throws ProviderValidationException {
  450.         String parserType = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_CLAIMS_PARSER_TYPE);
  451.         if(parserType==null) {
  452.             throw new ProviderValidationException("Non è stato indicato il parser per i claims da utilizzare dopo la validazione tramite il servizio di Introspection");
  453.         }
  454.         TipologiaClaims tipologiaClaims = null;
  455.         try {
  456.             tipologiaClaims = TipologiaClaims.valueOf(parserType);
  457.             if(tipologiaClaims==null) {
  458.                 throw new ProviderValidationException(SCONOSCIUTO);
  459.             }
  460.         }catch(Exception e) {
  461.             throw new ProviderValidationException(getPrefixParserType(parserType)+", per i claims da utilizzare dopo la validazione del servizio di Introspection, sconosciuto");
  462.         }
  463.         if(TipologiaClaims.CUSTOM.name().equals(parserType)) {
  464.             validateIntrospectionCustomParser(pDefault);
  465.         }
  466.     }
  467.     private void validateIntrospectionCustomParser(Properties pDefault) throws ProviderValidationException {
  468.         String pluginType = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_CLAIMS_PARSER_PLUGIN_TYPE);
  469.         if(pluginType!=null && StringUtils.isNotEmpty(pluginType) && CostantiConfigurazione.POLICY_ID_NON_DEFINITA.equals(pluginType)) {
  470.             String className = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_CLAIMS_PARSER_CLASS_NAME);
  471.             if(CostantiConfigurazione.POLICY_ID_NON_DEFINITA.equals(className)) {
  472.                 throw new ProviderValidationException("Deve essere selezionato un plugin per il parser dei claims della risposta del servizio Introspection");
  473.             }
  474.             else {
  475.                 if(className==null || "".equals(className)) {
  476.                     throw new ProviderValidationException("Non è stata fornita la classe del parser dei claims da utilizzare dopo la validazione del servizio di Introspection");
  477.                 }
  478.                 if(className.contains(" ")) {
  479.                     throw new ProviderValidationException("Non indicare spazi nella classe del parser dei claims da utilizzare dopo la validazione del servizio di Introspection");
  480.                 }
  481.             }
  482.         }
  483.     }
  484.     private void validateIntrospectionBasicCredentials(Properties pDefault) throws ProviderValidationException {
  485.         String username = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_AUTH_BASIC_USERNAME);
  486.         if(username==null || "".equals(username)) {
  487.             throw new ProviderValidationException("Nonostante sia richiesta una autenticazione 'HttpBasic', non è stato fornito un username da utilizzare durante la connessione verso il servizio di Introspection");
  488.         }
  489.         if(username.contains(" ")) {
  490.             throw new ProviderValidationException("Non indicare spazi nell'username da utilizzare durante la connessione verso il servizio di Introspection");
  491.         }
  492.         String password = pDefault.getProperty(Costanti.POLICY_INTROSPECTION_AUTH_BASIC_PASSWORD);
  493.         if(password==null || "".equals(password)) {
  494.             throw new ProviderValidationException("Nonostante sia richiesta una autenticazione 'HttpBasic', non è stato fornita una password da utilizzare durante la connessione verso il servizio di Introspection");
  495.         }
  496.         if(password.contains(" ")) {
  497.             throw new ProviderValidationException("Non indicare spazi nella password da utilizzare durante la connessione verso il servizio di Introspection");
  498.         }
  499.     }
  500.     private void validateIntrospectionSslCredentials(Map<String, Properties> mapProperties) throws ProviderValidationException {
  501.         Properties p = mapProperties.get(Costanti.POLICY_ENDPOINT_SSL_CLIENT_CONFIG);
  502.         if(p==null || p.size()<=0) {
  503.             throw new ProviderValidationException("Nonostante sia richiesta una autenticazione 'Https', non sono stati forniti i parametri di connessione ssl client da utilizzare verso il servizio di Introspection");
  504.         }
  505.        
  506.         String location = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_KEY_STORE_LOCATION);
  507.         if(location!=null && !"".equals(location)) {
  508.             InputValidationUtils.validateTextAreaInput(location, "Https - Autenticazione Client - File (KeyStore per l'autenticazione client)");
  509.         }
  510.        
  511.         String algo = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_KEY_MANAGEMENT_ALGORITHM);
  512.         if(algo==null || "".equals(algo)) {
  513.             throw new ProviderValidationException("Indicare un algoritmo per l'autenticazione client");
  514.         }
  515.         if(algo.contains(" ")) {
  516.             throw new ProviderValidationException("Non indicare spazi nell'algoritmo per l'autenticazione client");
  517.         }
  518.     }
  519.    
  520.     private void validateUserInfo(Map<String, Properties> mapProperties, Properties pDefault, boolean dynamicDiscovery) throws ProviderValidationException {
  521.        
  522.         if(!dynamicDiscovery) {
  523.             String url = pDefault.getProperty(Costanti.POLICY_USER_INFO_URL);
  524.             InputValidationUtils.validateTextAreaInput(url, "OIDC - UserInfo - URL");
  525.             try{
  526.                 org.openspcoop2.utils.regexp.RegExpUtilities.validateUrl(pDefault.getProperty(Costanti.POLICY_USER_INFO_URL));
  527.             }catch(Exception e){
  528.                 throw new ProviderValidationException("La URL fornita per il servizio 'OIDC UserInfo' non è valida: "+e.getMessage());
  529.             }
  530.         }
  531.        
  532.         TipoTokenRequest tipoTokenRequestEnum = validateUserInfoTipoToken(pDefault);
  533.        
  534.         HttpRequestMethod httpRequestMethodEnum = validateUserInfoHttpRequestMethod(pDefault);
  535.        
  536.         validateUserInfoContentType(pDefault, tipoTokenRequestEnum, httpRequestMethodEnum);
  537.        
  538.         validateUserInfoParser(pDefault);
  539.        
  540.         boolean basic = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_USER_INFO_AUTH_BASIC_STATO);
  541.         if(basic) {
  542.             validateUserInfoBasicCredentials(pDefault);
  543.         }
  544.        
  545.         boolean bearer = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_USER_INFO_AUTH_BEARER_STATO);
  546.         if(bearer) {
  547.             String token = pDefault.getProperty(Costanti.POLICY_USER_INFO_AUTH_BEARER_TOKEN);
  548.             InputValidationUtils.validateTextAreaInput(token, "OIDC - UserInfo - Autenticazione Bearer - Token");
  549.         }
  550.        
  551.         boolean ssl = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_USER_INFO_AUTH_SSL_STATO);
  552.         if(ssl) {
  553.             validateUserInfoSslCredentials(mapProperties);
  554.         }
  555.     }
  556.     private TipoTokenRequest validateUserInfoTipoToken(Properties pDefault) throws ProviderValidationException {
  557.         String tipoTokenRequest = pDefault.getProperty(Costanti.POLICY_USER_INFO_REQUEST_TOKEN_POSITION);
  558.         if(tipoTokenRequest==null) {
  559.             throw new ProviderValidationException("Non è stato indicato il tipo di spedizione del token da inoltrare al servizio di UserInfo");
  560.         }
  561.         TipoTokenRequest tipoTokenRequestEnum = null;
  562.         try {
  563.             tipoTokenRequestEnum = TipoTokenRequest.valueOf(tipoTokenRequest);
  564.             if(tipoTokenRequestEnum==null) {
  565.                 throw new ProviderValidationException(SCONOSCIUTO);
  566.             }
  567.         }catch(Exception e) {
  568.             throw new ProviderValidationException(getPrefixTipo(tipoTokenRequest)+" di spedizione del token da inoltrare al servizio di UserInfo sconosciuto");
  569.         }
  570.         validateUserInfoTipoToken(tipoTokenRequestEnum, pDefault);
  571.         return tipoTokenRequestEnum;
  572.     }
  573.     private void validateUserInfoTipoToken(TipoTokenRequest tipoTokenRequestEnum, Properties pDefault) throws ProviderValidationException {
  574.         switch (tipoTokenRequestEnum) {
  575.         case authorization:
  576.             break;
  577.         case header:
  578.             validateUserInfoTipoTokenHeader(pDefault);
  579.             break;
  580.         case url:
  581.             validateUserInfoTipoTokenUrl(pDefault);
  582.             break;
  583.         case form:
  584.             validateUserInfoTipoTokenFrom(pDefault);
  585.             break;
  586.         }
  587.     }
  588.     private void validateUserInfoTipoTokenHeader(Properties pDefault) throws ProviderValidationException {
  589.         String tmp = pDefault.getProperty(Costanti.POLICY_USER_INFO_REQUEST_TOKEN_POSITION_HEADER_NAME);
  590.         if(tmp==null || "".equals(tmp)) {
  591.             throw new ProviderValidationException("Non è stato indicato il nome dell'header http su cui inoltrare il token al servizio di UserInfo");
  592.         }
  593.         if(tmp.contains(" ")) {
  594.             throw new ProviderValidationException("Non indicare spazi nel nome dell'header http su cui inoltrare il token al servizio di UserInfo");
  595.         }
  596.     }
  597.     private void validateUserInfoTipoTokenUrl(Properties pDefault) throws ProviderValidationException {
  598.         String tmp = pDefault.getProperty(Costanti.POLICY_USER_INFO_REQUEST_TOKEN_POSITION_URL_PROPERTY_NAME);
  599.         if(tmp==null || "".equals(tmp)) {
  600.             throw new ProviderValidationException("Non è stato indicato il nome della proprietà della URL su cui inoltrare il token al servizio di UserInfo");
  601.         }
  602.         if(tmp.contains(" ")) {
  603.             throw new ProviderValidationException("Non indicare spazi nel nome della proprietà della URL su cui inoltrare il token al servizio di UserInfo");
  604.         }
  605.     }
  606.     private void validateUserInfoTipoTokenFrom(Properties pDefault) throws ProviderValidationException {
  607.         String tmp = pDefault.getProperty(Costanti.POLICY_USER_INFO_REQUEST_TOKEN_POSITION_FORM_PROPERTY_NAME);
  608.         if(tmp==null || "".equals(tmp)) {
  609.             throw new ProviderValidationException("Non è stato indicato il nome della proprietà della FORM su cui inoltrare il token al servizio di UserInfo");
  610.         }
  611.         if(tmp.contains(" ")) {
  612.             throw new ProviderValidationException("Non indicare spazi nel nome della proprietà della FORM su cui inoltrare il token al servizio di UserInfo");
  613.         }
  614.     }
  615.     private HttpRequestMethod validateUserInfoHttpRequestMethod(Properties pDefault) throws ProviderValidationException {
  616.         String httpRequestMethod = pDefault.getProperty(Costanti.POLICY_USER_INFO_HTTP_METHOD);
  617.         if(httpRequestMethod==null) {
  618.             throw new ProviderValidationException("Non è stato indicato il tipo di richiesta HTTP da utilizzare per inoltrare il token al servizio di UserInfo");
  619.         }
  620.         HttpRequestMethod httpRequestMethodEnum = null;
  621.         try {
  622.             httpRequestMethodEnum = HttpRequestMethod.valueOf(httpRequestMethod);
  623.             if(httpRequestMethodEnum==null) {
  624.                 throw new ProviderValidationException(SCONOSCIUTO);
  625.             }
  626.         }catch(Exception e) {
  627.             throw new ProviderValidationException(getPrefixTipo(httpRequestMethod)+" di richiesta HTTP da utilizzare per inoltrare il token al servizio di UserInfo sconosciuto");
  628.         }
  629.         return httpRequestMethodEnum;
  630.     }
  631.     private void validateUserInfoContentType(Properties pDefault, TipoTokenRequest tipoTokenRequestEnum, HttpRequestMethod httpRequestMethodEnum) throws ProviderValidationException {
  632.         String contentType = pDefault.getProperty(Costanti.POLICY_USER_INFO_CONTENT_TYPE);
  633.         if(!TipoTokenRequest.form.equals(tipoTokenRequestEnum) &&
  634.             (
  635.                 HttpRequestMethod.POST.equals(httpRequestMethodEnum) ||
  636.                 HttpRequestMethod.PUT.equals(httpRequestMethodEnum) ||
  637.                 HttpRequestMethod.PATCH.equals(httpRequestMethodEnum) ||
  638.                 HttpRequestMethod.LINK.equals(httpRequestMethodEnum) ||
  639.                 HttpRequestMethod.UNLINK.equals(httpRequestMethodEnum)
  640.             ) &&
  641.             (contentType==null || "".equals(contentType))
  642.             ) {
  643.             throw new ProviderValidationException("Non è stato indicato il ContentType da utilizzare nella richiesta HTTP prodotta per inoltrare il token al servizio di UserInfo");
  644.                 /**                 if(contentType.contains(" ")) {
  645. //                  throw new ProviderValidationException("Non indicare spazi nel ContentType da utilizzare nella richiesta HTTP prodotta per inoltrare il token al servizio di UserInfo");
  646. //              }*/
  647.         }
  648.     }
  649.     private void validateUserInfoParser(Properties pDefault) throws ProviderValidationException {
  650.         String parserType = pDefault.getProperty(Costanti.POLICY_USER_INFO_CLAIMS_PARSER_TYPE);
  651.         if(parserType==null) {
  652.             throw new ProviderValidationException("Non è stato indicato il parser per i claims da utilizzare dopo la validazione tramite il servizio di UserInfo");
  653.         }
  654.         TipologiaClaims tipologiaClaims = null;
  655.         try {
  656.             tipologiaClaims = TipologiaClaims.valueOf(parserType);
  657.             if(tipologiaClaims==null) {
  658.                 throw new ProviderValidationException(SCONOSCIUTO);
  659.             }
  660.         }catch(Exception e) {
  661.             throw new ProviderValidationException(getPrefixParserType(parserType)+", per i claims da utilizzare dopo la validazione del servizio di UserInfo, sconosciuto");
  662.         }
  663.         if(TipologiaClaims.CUSTOM.name().equals(parserType)) {
  664.             validateUserInfoCustomParser(pDefault);
  665.         }
  666.     }
  667.     private void validateUserInfoCustomParser(Properties pDefault) throws ProviderValidationException {
  668.         String pluginType = pDefault.getProperty(Costanti.POLICY_USER_INFO_CLAIMS_PARSER_PLUGIN_TYPE);
  669.         if(pluginType!=null && StringUtils.isNotEmpty(pluginType) && CostantiConfigurazione.POLICY_ID_NON_DEFINITA.equals(pluginType)) {
  670.             String className = pDefault.getProperty(Costanti.POLICY_USER_INFO_CLAIMS_PARSER_CLASS_NAME);
  671.             if(CostantiConfigurazione.POLICY_ID_NON_DEFINITA.equals(className)) {
  672.                 throw new ProviderValidationException("Deve essere selezionato un plugin per il parser dei claims della risposta del servizio UserInfo");
  673.             }
  674.             else {
  675.                 if(className==null || "".equals(className)) {
  676.                     throw new ProviderValidationException("Non è stata fornita la classe del parser dei claims da utilizzare dopo la validazione del servizio di UserInfo");
  677.                 }
  678.                 if(className.contains(" ")) {
  679.                     throw new ProviderValidationException("Non indicare spazi nella classe del parser dei claims da utilizzare dopo la validazione del servizio di UserInfo");
  680.                 }
  681.             }
  682.         }
  683.     }
  684.     private void validateUserInfoBasicCredentials(Properties pDefault) throws ProviderValidationException {
  685.         String username = pDefault.getProperty(Costanti.POLICY_USER_INFO_AUTH_BASIC_USERNAME);
  686.         if(username==null || "".equals(username)) {
  687.             throw new ProviderValidationException("Nonostante sia richiesta una autenticazione 'HttpBasic', non è stato fornito un username da utilizzare durante la connessione verso il servizio di UserInfo");
  688.         }
  689.         if(username.contains(" ")) {
  690.             throw new ProviderValidationException("Non indicare spazi nell'username da utilizzare durante la connessione verso il servizio di UserInfo");
  691.         }
  692.         String password = pDefault.getProperty(Costanti.POLICY_USER_INFO_AUTH_BASIC_PASSWORD);
  693.         if(password==null || "".equals(password)) {
  694.             throw new ProviderValidationException("Nonostante sia richiesta una autenticazione 'HttpBasic', non è stato fornita una password da utilizzare durante la connessione verso il servizio di UserInfo");
  695.         }
  696.         if(password.contains(" ")) {
  697.             throw new ProviderValidationException("Non indicare spazi nella password da utilizzare durante la connessione verso il servizio di UserInfo");
  698.         }
  699.     }
  700.     private void validateUserInfoSslCredentials(Map<String, Properties> mapProperties) throws ProviderValidationException {
  701.         Properties p = mapProperties.get(Costanti.POLICY_ENDPOINT_SSL_CLIENT_CONFIG);
  702.         if(p==null || p.size()<=0) {
  703.             throw new ProviderValidationException("Nonostante sia richiesta una autenticazione 'Https', non sono stati forniti i parametri di connessione ssl client da utilizzare verso il servizio di UserInfo");
  704.         }
  705.        
  706.         String location = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_KEY_STORE_LOCATION);
  707.         if(location!=null && !"".equals(location)) {
  708.             InputValidationUtils.validateTextAreaInput(location, "Https - Autenticazione Client - File (KeyStore per l'autenticazione client)");
  709.         }
  710.        
  711.         String algo = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_KEY_MANAGEMENT_ALGORITHM);
  712.         if(algo==null || "".equals(algo)) {
  713.             throw new ProviderValidationException("Indicare un algoritmo per l'autenticazione client");
  714.         }
  715.         if(algo.contains(" ")) {
  716.             throw new ProviderValidationException("Non indicare spazi nell'algoritmo per l'autenticazione client");
  717.         }
  718.     }
  719.    
  720.     private void validateInformazioniRaccolte(Map<String, Properties> mapProperties, Properties pDefault) throws ProviderValidationException {
  721.         boolean forwardTrasparente = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_TOKEN_FORWARD_TRASPARENTE_STATO);
  722.         boolean forwardInformazioniRaccolte = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_STATO);

  723.         if(!forwardTrasparente && !forwardInformazioniRaccolte) {
  724.             throw new ProviderValidationException("Almeno una modalità di forward del token deve essere selezionata");
  725.         }
  726.        
  727.         if(forwardTrasparente) {
  728.             validateInformazioniRaccolteForwardTrasparente(pDefault);
  729.         }
  730.        
  731.         if(forwardInformazioniRaccolte) {
  732.             validateInformazioniRaccolteForward(mapProperties, pDefault);      
  733.         }
  734.     }
  735.     private void validateInformazioniRaccolteForwardTrasparente(Properties pDefault) throws ProviderValidationException {
  736.         String mode = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_TRASPARENTE_MODE);
  737.         if(mode==null) {
  738.             throw new ProviderValidationException("Nessuna modalità di forward trasparente indicata");
  739.         }
  740.         if(!Costanti.POLICY_TOKEN_FORWARD_TRASPARENTE_MODE_AS_RECEIVED.equals(mode) &&
  741.                 !Costanti.POLICY_TOKEN_FORWARD_TRASPARENTE_MODE_RFC6750_HEADER.equals(mode) &&
  742.                 !Costanti.POLICY_TOKEN_FORWARD_TRASPARENTE_MODE_RFC6750_URL.equals(mode) &&
  743.                 !Costanti.POLICY_TOKEN_FORWARD_TRASPARENTE_MODE_CUSTOM_HEADER.equals(mode) &&
  744.                 !Costanti.POLICY_TOKEN_FORWARD_TRASPARENTE_MODE_CUSTOM_URL.equals(mode)
  745.                 ) {
  746.             throw new ProviderValidationException("La modalità di forward trasparente indicata '"+mode+"' "+NON_SUPPORTATA);    
  747.         }
  748.         if(Costanti.POLICY_TOKEN_FORWARD_TRASPARENTE_MODE_CUSTOM_HEADER.equals(mode)) {
  749.             String hdr = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_TRASPARENTE_MODE_CUSTOM_HEADER_NAME);
  750.             if(hdr==null || "".equals(hdr)) {
  751.                 throw new ProviderValidationException("La modalità di forward trasparente indicata prevede l'indicazione del nome di un header http");
  752.             }
  753.             if(hdr.contains(" ")) {
  754.                 throw new ProviderValidationException("Non indicare spazi nel nome dell'header HTTP indicato per la modalità di forward trasparente");
  755.             }
  756.         }
  757.         else if(Costanti.POLICY_TOKEN_FORWARD_TRASPARENTE_MODE_CUSTOM_URL.equals(mode)) {
  758.             String url = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_TRASPARENTE_MODE_CUSTOM_URL_PARAMETER_NAME);
  759.             if(url==null || "".equals(url)) {
  760.                 throw new ProviderValidationException("La modalità di forward trasparente indicata prevede l'indicazione del nome di una proprietà della url");
  761.             }
  762.             if(url.contains(" ")) {
  763.                 throw new ProviderValidationException("Non indicare spazi nel nome della proprietà della url indicata per la modalità di forward trasparente");
  764.             }
  765.         }
  766.     }
  767.     private void validateInformazioniRaccolteForward(Map<String, Properties> mapProperties, Properties pDefault) throws ProviderValidationException {
  768.         String mode = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE);
  769.         if(mode==null) {
  770.             throw new ProviderValidationException("Nessuna modalità di forward, delle informazioni raccolte, indicata");
  771.         }
  772.         if(!Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_OP2_HEADERS.equals(mode) &&
  773.                 !Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_OP2_JSON.equals(mode) &&
  774.                 !Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_OP2_JWS.equals(mode) &&
  775.                 !Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_JWS.equals(mode) &&
  776.                 !Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_JWE.equals(mode) &&
  777.                 !Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_JSON.equals(mode)
  778.                 ) {
  779.             throw new ProviderValidationException("La modalità di forward, delle informazioni raccolte, indicata '"+mode+"' "+NON_SUPPORTATA);  
  780.         }
  781.         if(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_OP2_JSON.equals(mode) ||
  782.             Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_JSON.equals(mode)
  783.                 ) {
  784.             String base64 = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_ENCODE_BASE64);
  785.             if(base64==null) {
  786.                 throw new ProviderValidationException("Nessuna indicazione sull'encoding 'Base64' fornito; Tale indicazione è richiesta dalla modalità di forward, delle informazioni raccolte, indicata: "+mode);
  787.             }
  788.         }
  789.         if(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_JWS.equals(mode) ||
  790.                 Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_JWE.equals(mode) ||
  791.                 Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_JSON.equals(mode)
  792.                     ) {
  793.             validateInformazioniRaccolteForwardJson(pDefault, mode);
  794.         }
  795.         if(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_OP2_JWS.equals(mode) ||
  796.                 Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_JWS.equals(mode)
  797.                     ) {
  798.             validateInformazioniRaccolteForwardJws(mapProperties);
  799.         }
  800.         if(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_JWE.equals(mode)
  801.                     ) {
  802.             validateInformazioniRaccolteForwardJwe(mapProperties);
  803.         }
  804.     }
  805.     private void validateInformazioniRaccolteForwardJson(Properties pDefault, String mode) throws ProviderValidationException {
  806.         boolean forwardValidazioneJWT = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_VALIDAZIONE_JWT);    
  807.         boolean forwardIntrospection = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_INTROSPECTION);
  808.         boolean forwardUserInfo = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_USER_INFO);
  809.         if(!forwardValidazioneJWT && !forwardIntrospection && !forwardUserInfo) {
  810.             throw new ProviderValidationException("Almeno una scelta tra 'Validazione JWT', 'Introspection' o 'OIDC UserInfo' deve essere selezionata per inoltrare le informazioni raccolte all'applicativo erogatore tramite la modalità scelta: "+mode);
  811.         }
  812.        
  813.         String indicataModalitaSconosciuta = ", indicata per le informazioni raccolte, sconosciuta";
  814.        
  815.         if(forwardValidazioneJWT) {
  816.             validateInformazioniRaccolteForwardJsonValidazioneJWT(pDefault, indicataModalitaSconosciuta);
  817.         }
  818.        
  819.         if(forwardIntrospection) {
  820.             validateInformazioniRaccolteForwardJsonIntrospection(pDefault, indicataModalitaSconosciuta);
  821.         }
  822.        
  823.         if(forwardUserInfo) {
  824.             validateInformazioniRaccolteForwardJsonUserInfo(pDefault, indicataModalitaSconosciuta);
  825.         }
  826.     }
  827.     private void validateInformazioniRaccolteForwardJsonValidazioneJWT(Properties pDefault, String indicataModalitaSconosciuta) throws ProviderValidationException {
  828.         String modeForward = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_VALIDAZIONE_JWT_MODE);
  829.         if(modeForward==null) {
  830.             throw new ProviderValidationException(NESSUN_TIPO_CONSEGNA);
  831.         }
  832.         if(!Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_NO_OPENSPCOOP_CUSTOM_HEADER.equals(modeForward) &&
  833.                 !Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_NO_OPENSPCOOP_CUSTOM_URL.equals(modeForward)
  834.                     ) {
  835.             throw new ProviderValidationException("(Validazione JWT) Tipo di consegna '"+modeForward+"'"+indicataModalitaSconosciuta);
  836.         }
  837.         if(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_NO_OPENSPCOOP_CUSTOM_HEADER.equals(modeForward)) {
  838.             String name = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_VALIDAZIONE_JWT_MODE_HEADER_NAME);
  839.             if(name==null || "".equals(name)) {
  840.                 throw new ProviderValidationException("(Validazione JWT) Il tipo di consegna (header), delle informazioni raccolte, richiede la definizione di un nome di un header http");
  841.             }
  842.             if(name.contains(" ")) {
  843.                 throw new ProviderValidationException("Non indicare spazi nel nome dell'header http (Forward ValidazioneJWT-Header)");
  844.             }
  845.         }
  846.         else { /** if(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_NO_OPENSPCOOP_CUSTOM_URL.equals(modeForward)) {*/
  847.             String name = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_VALIDAZIONE_JWT_MODE_URL_PARAMETER_NAME);
  848.             if(name==null || "".equals(name)) {
  849.                 throw new ProviderValidationException("(Validazione JWT) Il tipo di consegna (url), delle informazioni raccolte, richiede la definizione di un nome di un parametro della URL");
  850.             }
  851.             if(name.contains(" ")) {
  852.                 throw new ProviderValidationException("Non indicare spazi nel nome del parametro della url (Forward ValidazioneJWT-ParametroURL)");
  853.             }
  854.         }
  855.     }
  856.     private void validateInformazioniRaccolteForwardJsonIntrospection(Properties pDefault, String indicataModalitaSconosciuta) throws ProviderValidationException {
  857.         String modeForward = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_INTROSPECTION_MODE);
  858.         if(modeForward==null) {
  859.             throw new ProviderValidationException(NESSUN_TIPO_CONSEGNA);
  860.         }
  861.         if(!Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_NO_OPENSPCOOP_CUSTOM_HEADER.equals(modeForward) &&
  862.                 !Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_NO_OPENSPCOOP_CUSTOM_URL.equals(modeForward)
  863.                     ) {
  864.             throw new ProviderValidationException("(Introspection) Tipo di consegna '"+modeForward+"'"+indicataModalitaSconosciuta);
  865.         }
  866.         if(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_NO_OPENSPCOOP_CUSTOM_HEADER.equals(modeForward)) {
  867.             String name = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_INTROSPECTION_MODE_HEADER_NAME);
  868.             if(name==null || "".equals(name)) {
  869.                 throw new ProviderValidationException("(Introspection) Il tipo di consegna (header), delle informazioni raccolte, richiede la definizione di un nome di un header http");
  870.             }
  871.             if(name.contains(" ")) {
  872.                 throw new ProviderValidationException("Non indicare spazi nel nome dell'header http (Forward Introspection-Header)");
  873.             }
  874.         }
  875.         else { /** if(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_NO_OPENSPCOOP_CUSTOM_URL.equals(modeForward)) { */
  876.             String name = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_INTROSPECTION_MODE_URL_PARAMETER_NAME);
  877.             if(name==null || "".equals(name)) {
  878.                 throw new ProviderValidationException("(Introspection) Il tipo di consegna (url), delle informazioni raccolte, richiede la definizione di un nome di un parametro della URL");
  879.             }
  880.             if(name.contains(" ")) {
  881.                 throw new ProviderValidationException("Non indicare spazi nel nome del parametro della url (Forward Introspection-ParametroURL)");
  882.             }
  883.         }
  884.     }
  885.     private void validateInformazioniRaccolteForwardJsonUserInfo(Properties pDefault, String indicataModalitaSconosciuta) throws ProviderValidationException {
  886.         String modeForward = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_USER_INFO_MODE);
  887.         if(modeForward==null) {
  888.             throw new ProviderValidationException(NESSUN_TIPO_CONSEGNA);
  889.         }
  890.         if(!Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_NO_OPENSPCOOP_CUSTOM_HEADER.equals(modeForward) &&
  891.                 !Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_NO_OPENSPCOOP_CUSTOM_URL.equals(modeForward)
  892.                     ) {
  893.             throw new ProviderValidationException("(UserInfo) Tipo di consegna '"+modeForward+"'"+indicataModalitaSconosciuta);
  894.         }
  895.         if(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_NO_OPENSPCOOP_CUSTOM_HEADER.equals(modeForward)) {
  896.             String name = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_USER_INFO_MODE_HEADER_NAME);
  897.             if(name==null || "".equals(name)) {
  898.                 throw new ProviderValidationException("(UserInfo) Il tipo di consegna (header), delle informazioni raccolte, richiede la definizione di un nome di un header http");
  899.             }
  900.             if(name.contains(" ")) {
  901.                 throw new ProviderValidationException("Non indicare spazi nel nome dell'header http (Forward UserInfo-Header)");
  902.             }
  903.         }
  904.         else { /** if(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_NO_OPENSPCOOP_CUSTOM_URL.equals(modeForward)) {*/
  905.             String name = pDefault.getProperty(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_USER_INFO_MODE_URL_PARAMETER_NAME);
  906.             if(name==null || "".equals(name)) {
  907.                 throw new ProviderValidationException("(UserInfo) Il tipo di consegna (url), delle informazioni raccolte, richiede la definizione di un nome di un parametro della URL");
  908.             }
  909.             if(name.contains(" ")) {
  910.                 throw new ProviderValidationException("Non indicare spazi nel nome del parametro della url (Forward UserInfo-ParametroURL)");
  911.             }
  912.         }
  913.     }
  914.     private void validateInformazioniRaccolteForwardJws(Map<String, Properties> mapProperties) throws ProviderValidationException {
  915.         Properties p = mapProperties.get(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_SIGNATURE_PROP_REF_ID);
  916.         if(p==null || p.size()<=0) {
  917.             throw new ProviderValidationException("La modalità di forward, delle informazioni raccolte, selezionata richiede una configurazione per poter attuare la firma JWS; configurazione non riscontrata");
  918.         }
  919.        
  920.         if(!p.containsKey(SecurityConstants.JOSE_KEYSTORE) && !p.containsKey(SecurityConstants.JOSE_KEYSTORE_JWKSET)) {
  921.             // altrimenti è stato fatto inject del keystore
  922.             String file = p.getProperty(SecurityConstants.JOSE_KEYSTORE_FILE);
  923.             InputValidationUtils.validateTextAreaInput(file, "Token Forward - JWS KeyStore - File");
  924.            
  925.             String fileChiavePubblica = p.getProperty(SecurityConstants.JOSE_KEYSTORE_PUBLIC_KEY);
  926.             if(fileChiavePubblica!=null && StringUtils.isNotEmpty(fileChiavePubblica)) {
  927.                 InputValidationUtils.validateTextAreaInput(file, "Token Forward - JWS KeyStore - Chiave Pubblica");
  928.             }
  929.         }
  930.     }
  931.     private void validateInformazioniRaccolteForwardJwe(Map<String, Properties> mapProperties) throws ProviderValidationException {
  932.         Properties p = mapProperties.get(Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_ENCRYP_PROP_REF_ID);
  933.         if(p==null || p.size()<=0) {
  934.             throw new ProviderValidationException("La modalità di forward, delle informazioni raccolte, selezionata richiede una configurazione per poter attuare la cifratura JWE; configurazione non riscontrata");
  935.         }
  936.        
  937.         if(!p.containsKey(SecurityConstants.JOSE_KEYSTORE) && !p.containsKey(SecurityConstants.JOSE_KEYSTORE_JWKSET)) {
  938.             // altrimenti è stato fatto inject del keystore
  939.             String file = p.getProperty(SecurityConstants.JOSE_KEYSTORE_FILE);
  940.             InputValidationUtils.validateTextAreaInput(file, "Token Forward - JWE KeyStore - File");
  941.         }
  942.     }
  943.    
  944.     @Override
  945.     public List<String> getValues(String id) throws ProviderException {
  946.         return this.getValues(id, null);
  947.     }
  948.     @Override
  949.     public List<String> getValues(String id, ExternalResources externalResources) throws ProviderException{
  950.         if(Costanti.ID_INTROSPECTION_HTTP_METHOD.equals(id) ||
  951.                 Costanti.ID_USER_INFO_HTTP_METHOD.equals(id)) {
  952.             return getHttpRequestMethodValues();
  953.         }
  954.         else if(Costanti.ID_TIPOLOGIA_HTTPS.equals(id)) {
  955.             return getTipologiaHttpsValues();
  956.         }
  957.         else if(JOSECostanti.ID_ENCRYPT_KEY_ALGORITHM.equals(id) ||
  958.                 JOSECostanti.ID_ENCRYPT_CONTENT_ALGORITHM.equals(id) ||
  959.                 Costanti.ID_JWS_SIGNATURE_ALGORITHM.equals(id) ||
  960.                 Costanti.ID_JWS_ENCRYPT_KEY_ALGORITHM.equals(id) ||
  961.                 Costanti.ID_JWS_ENCRYPT_CONTENT_ALGORITHM.equals(id)) {
  962.             return getSecProviderValues(id);
  963.         }
  964.         else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE.equals(id) ||
  965.                 Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_TYPE.equals(id) ||
  966.                 Costanti.ID_HTTPS_TRUSTSTORE_TYPE.equals(id) ||
  967.                 Costanti.ID_HTTPS_KEYSTORE_TYPE.equals(id)  ||
  968.                 Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_TYPE.equals(id)  ||
  969.                 Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_TYPE.equals(id)) {
  970.             return getStoreType(id,true);
  971.         }
  972.         else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE.equals(id)) {
  973.             return Costanti.getIdValidazioneJwtTruststoreTypeSelectCertificateValues();
  974.         }
  975.         else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_JWK_PUBLIC_KEY.equals(id)) {
  976.             return Costanti.getIdValidazioneJwtTruststoreTypeSelectJwkPublicKeyValues();
  977.         }
  978.         else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_OCSP_POLICY.equals(id) ||
  979.                 Costanti.ID_HTTPS_TRUSTSTORE_OCSP_POLICY.equals(id)) {
  980.             return this.ocspProvider.getValues();
  981.         }
  982.         else if(Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_BYOK_POLICY.equals(id) ||
  983.                 Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_BYOK_POLICY.equals(id) ||
  984.                 Costanti.ID_HTTPS_KEYSTORE_BYOK_POLICY.equals(id) ||
  985.                 Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_BYOK_POLOCY.equals(id) ) {
  986.             return this.byokProvider.getValues();
  987.         }
  988.         else {
  989.             return getValuesContinue1(id, externalResources);
  990.         }
  991.     }
  992.     private List<String> getValuesContinue1(String id, ExternalResources externalResources) throws ProviderException{
  993.         List<String> l = null;
  994.         if(Costanti.ID_DYNAMIC_DISCOVERY_CUSTOM_PARSER_PLUGIN_CHOICE.equals(id)) {
  995.             return TokenUtilities.getTokenPluginValues(externalResources, TipoPlugin.TOKEN_DYNAMIC_DISCOVERY);
  996.         }
  997.         else if(Costanti.ID_VALIDAZIONE_JWT_CUSTOM_PARSER_PLUGIN_CHOICE.equals(id)
  998.                 ||
  999.                 Costanti.ID_INTROSPECTION_CUSTOM_PARSER_PLUGIN_CHOICE.equals(id)
  1000.                 ||
  1001.                 Costanti.ID_USER_INFO_CUSTOM_PARSER_PLUGIN_CHOICE.equals(id)) {
  1002.             return TokenUtilities.getTokenPluginValues(externalResources, TipoPlugin.TOKEN_VALIDAZIONE);
  1003.         }
  1004.         return l;
  1005.     }
  1006.     private List<String> getHttpRequestMethodValues() {
  1007.         List<String> methodsList = new ArrayList<>();
  1008.         HttpRequestMethod [] methods = HttpRequestMethod.values();
  1009.         for (int i = 0; i < methods.length; i++) {
  1010.             methodsList.add(methods[i].name());
  1011.         }
  1012.         return methodsList;
  1013.     }
  1014.     private List<String> getTipologiaHttpsValues() {
  1015.         List<String> tipologie = null;
  1016.         try{
  1017.             tipologie = SSLUtilities.getSSLSupportedProtocols();
  1018.         }catch(Exception e){
  1019.             tipologie = SSLUtilities.getAllSslProtocol();
  1020.         }
  1021.         return tipologie;
  1022.     }
  1023.     private List<String> getSecProviderValues(String id) throws ProviderException {
  1024.         SecurityProvider secProvider = new SecurityProvider();
  1025.         if(Costanti.ID_JWS_SIGNATURE_ALGORITHM.equals(id)) {
  1026.             return secProvider.getValues(JOSECostanti.ID_SIGNATURE_ALGORITHM);
  1027.         }
  1028.         else if(Costanti.ID_JWS_ENCRYPT_KEY_ALGORITHM.equals(id) || JOSECostanti.ID_ENCRYPT_KEY_ALGORITHM.equals(id)) {
  1029.             return secProvider.getValues(JOSECostanti.ID_ENCRYPT_KEY_ALGORITHM);
  1030.         }
  1031.         else{/**else if(Costanti.ID_JWS_ENCRYPT_CONTENT_ALGORITHM.equals(id) || JOSECostanti.ID_ENCRYPT_CONTENT_ALGORITHM.equals(id)) {*/
  1032.             return secProvider.getValues(JOSECostanti.ID_ENCRYPT_CONTENT_ALGORITHM);
  1033.         }
  1034.     }

  1035.     @Override
  1036.     public List<String> getLabels(String id) throws ProviderException {
  1037.         return this.getLabels(id, null);
  1038.     }
  1039.     @Override
  1040.     public List<String> getLabels(String id, ExternalResources externalResources) throws ProviderException{
  1041.         if(JOSECostanti.ID_ENCRYPT_KEY_ALGORITHM.equals(id) ||
  1042.                 JOSECostanti.ID_ENCRYPT_CONTENT_ALGORITHM.equals(id) ||
  1043.                 Costanti.ID_JWS_SIGNATURE_ALGORITHM.equals(id) ||
  1044.                 Costanti.ID_JWS_ENCRYPT_KEY_ALGORITHM.equals(id) ||
  1045.                 Costanti.ID_JWS_ENCRYPT_CONTENT_ALGORITHM.equals(id)) {
  1046.             return getLabelsEncryption(id);
  1047.         }
  1048.         else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE.equals(id) ||
  1049.                 Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_TYPE.equals(id) ||
  1050.                 Costanti.ID_HTTPS_TRUSTSTORE_TYPE.equals(id) ||
  1051.                 Costanti.ID_HTTPS_KEYSTORE_TYPE.equals(id) ||
  1052.                 Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_TYPE.equals(id) ||
  1053.                 Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_TYPE.equals(id)) {
  1054.             return getStoreType(id,false);
  1055.         }
  1056.         else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE.equals(id)) {
  1057.             return Costanti.getIdValidazioneJwtTruststoreTypeSelectCertificateLabels();
  1058.         }
  1059.         else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_JWK_PUBLIC_KEY.equals(id)) {
  1060.             return Costanti.getIdValidazioneJwtTruststoreTypeSelectJwkPublicKeyLabels();
  1061.         }
  1062.         else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_OCSP_POLICY.equals(id) ||
  1063.                 Costanti.ID_HTTPS_TRUSTSTORE_OCSP_POLICY.equals(id)) {
  1064.             return this.ocspProvider.getLabels();
  1065.         }
  1066.         else if(Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_BYOK_POLICY.equals(id) ||
  1067.                 Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_BYOK_POLICY.equals(id) ||
  1068.                 Costanti.ID_HTTPS_KEYSTORE_BYOK_POLICY.equals(id) ||
  1069.                 Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_BYOK_POLOCY.equals(id)) {
  1070.             return this.byokProvider.getLabels();
  1071.         }
  1072.         else {
  1073.             return getLabelsContinue1(id, externalResources);
  1074.         }
  1075.     }
  1076.     private List<String> getLabelsEncryption(String id) throws ProviderException{
  1077.         SecurityProvider secProvider = new SecurityProvider();
  1078.         if(Costanti.ID_JWS_SIGNATURE_ALGORITHM.equals(id)) {
  1079.             return secProvider.getLabels(JOSECostanti.ID_SIGNATURE_ALGORITHM);
  1080.         }
  1081.         else if(Costanti.ID_JWS_ENCRYPT_KEY_ALGORITHM.equals(id) || JOSECostanti.ID_ENCRYPT_KEY_ALGORITHM.equals(id)) {
  1082.             return secProvider.getLabels(JOSECostanti.ID_ENCRYPT_KEY_ALGORITHM);
  1083.         }
  1084.         else{/**else if(Costanti.ID_JWS_ENCRYPT_CONTENT_ALGORITHM.equals(id) || JOSECostanti.ID_ENCRYPT_CONTENT_ALGORITHM.equals(id)) {*/
  1085.             return secProvider.getLabels(JOSECostanti.ID_ENCRYPT_CONTENT_ALGORITHM);
  1086.         }
  1087.     }
  1088.     private List<String> getLabelsContinue1(String id, ExternalResources externalResources) throws ProviderException{
  1089.         if(Costanti.ID_DYNAMIC_DISCOVERY_CUSTOM_PARSER_PLUGIN_CHOICE.equals(id)) {
  1090.             return TokenUtilities.getTokenPluginLabels(externalResources, TipoPlugin.TOKEN_DYNAMIC_DISCOVERY);
  1091.         }
  1092.         else if(Costanti.ID_VALIDAZIONE_JWT_CUSTOM_PARSER_PLUGIN_CHOICE.equals(id)
  1093.                 ||
  1094.                 Costanti.ID_INTROSPECTION_CUSTOM_PARSER_PLUGIN_CHOICE.equals(id)
  1095.                 ||
  1096.                 Costanti.ID_USER_INFO_CUSTOM_PARSER_PLUGIN_CHOICE.equals(id)) {
  1097.             return TokenUtilities.getTokenPluginLabels(externalResources, TipoPlugin.TOKEN_VALIDAZIONE);
  1098.         }
  1099.         return this.getValues(id); // torno uguale ai valori negli altri casi
  1100.     }
  1101.    
  1102.     private List<String> getStoreType(String id,boolean value){
  1103.         boolean trustStore = true;
  1104.         boolean secret = false;
  1105.         List<String> l = new ArrayList<>();
  1106.         l.add(value ? SecurityConstants.KEYSTORE_TYPE_JKS_VALUE : SecurityConstants.KEYSTORE_TYPE_JKS_LABEL);
  1107.         l.add(value ? SecurityConstants.KEYSTORE_TYPE_PKCS12_VALUE : SecurityConstants.KEYSTORE_TYPE_PKCS12_LABEL);
  1108.         addStoreTypeJWK(id, l, value);
  1109.         addStoreTypePrivatePubliKey(id, l, value);
  1110.         if(Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_TYPE.equals(id) ||
  1111.                 Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_TYPE.equals(id)) {
  1112.             l.add(value ? SecurityConstants.KEYSTORE_TYPE_JCEKS_VALUE : SecurityConstants.KEYSTORE_TYPE_JCEKS_LABEL);
  1113.             secret = true;
  1114.         }
  1115.        
  1116.         if(Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_TYPE.equals(id) ||
  1117.                 Costanti.ID_HTTPS_KEYSTORE_TYPE.equals(id) ||
  1118.                 Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_TYPE.equals(id) ||
  1119.                 Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_TYPE.equals(id)) {
  1120.             trustStore = false;
  1121.         }
  1122.         HSMUtils.fillTipologieKeystore(trustStore, false, l);
  1123.        
  1124.         if(secret) {
  1125.             // aggiunto info mancanti come secret
  1126.             addStoreTypeSecret(l);
  1127.         }
  1128.         return l;
  1129.     }
  1130.     private void addStoreTypeJWK(String id, List<String> l, boolean value) {
  1131.         if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE.equals(id) ||
  1132.                 Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_TYPE.equals(id) ||
  1133.                 Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_TYPE.equals(id) ||
  1134.                 Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_TYPE.equals(id)) {
  1135.             l.add(value ? SecurityConstants.KEYSTORE_TYPE_JWK_VALUE: SecurityConstants.KEYSTORE_TYPE_JWK_LABEL);
  1136.         }
  1137.     }
  1138.     private void addStoreTypePrivatePubliKey(String id, List<String> l, boolean value) {
  1139.         if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE.equals(id)) {
  1140.             l.add(value ? SecurityConstants.KEYSTORE_TYPE_PUBLIC_KEY_VALUE: SecurityConstants.KEYSTORE_TYPE_PUBLIC_KEY_LABEL);
  1141.         }
  1142.         if(Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_TYPE.equals(id)) {
  1143.             l.add(value ? SecurityConstants.KEYSTORE_TYPE_KEY_PAIR_VALUE: SecurityConstants.KEYSTORE_TYPE_KEY_PAIR_LABEL);
  1144.         }
  1145.     }
  1146.     private void addStoreTypeSecret(List<String> l) {
  1147.         List<String> lSecret = new ArrayList<>();
  1148.         HSMUtils.fillTipologieKeystore(false, true, lSecret);
  1149.         if(!lSecret.isEmpty()) {
  1150.             for (String type : lSecret) {
  1151.                 if(!l.contains(type)) {
  1152.                     l.add(type);
  1153.                 }
  1154.             }
  1155.         }
  1156.     }

  1157.     @Override
  1158.     public String getNote(String id, String actualValue) throws ProviderException{
  1159.         if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE.equals(id)) {
  1160.             if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE_VALUE_ALIAS.equals(actualValue)) {
  1161.                 return Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE_NOTE_ALIAS;
  1162.             }
  1163.             else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE_VALUE_X5C.equals(actualValue)) {
  1164.                 return Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE_NOTE_X5C;
  1165.             }
  1166.             else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE_VALUE_X5T256.equals(actualValue)) {
  1167.                 return Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE_NOTE_X5T256;
  1168.             }
  1169.             else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE_VALUE_X5C_X5T256.equals(actualValue)) {
  1170.                 return Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE_NOTE_X5C_X5T256;
  1171.             }
  1172.             else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE_VALUE_KID.equals(actualValue)) {
  1173.                 return Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE_NOTE_KID;
  1174.             }
  1175.             else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE_VALUE_X5U.equals(actualValue)) {
  1176.                 return Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_CERTIFICATE_NOTE_X5U;
  1177.             }
  1178.         }
  1179.         else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_JWK_PUBLIC_KEY.equals(id)) {
  1180.             if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_JWK_PUBLIC_KEY_VALUE_ALIAS.equals(actualValue)) {
  1181.                 return Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_JWK_PUBLIC_KEY_NOTE_ALIAS;
  1182.             }
  1183.             else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_JWK_PUBLIC_KEY_VALUE_KID.equals(actualValue)) {
  1184.                 return Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE_SELECT_JWK_PUBLIC_KEY_NOTE_KID;
  1185.             }
  1186.         }
  1187.         return null;
  1188.     }
  1189.    
  1190.     @Override
  1191.     public String getDefault(String id) throws ProviderException {
  1192.         return getDefault(id, null);
  1193.     }
  1194.     @Override
  1195.     public String getDefault(String id, ExternalResources externalResources) throws ProviderException {
  1196.         if(Costanti.ID_INTROSPECTION_HTTP_METHOD.equals(id) ||
  1197.                 Costanti.ID_USER_INFO_HTTP_METHOD.equals(id)) {
  1198.             return HttpRequestMethod.GET.name();
  1199.         }
  1200.         else if(Costanti.ID_TIPOLOGIA_HTTPS.equals(id)) {
  1201.             return SSLUtilities.getSafeDefaultProtocol();
  1202.         }
  1203.         else if(JOSECostanti.ID_ENCRYPT_KEY_ALGORITHM.equals(id) ||
  1204.                 JOSECostanti.ID_ENCRYPT_CONTENT_ALGORITHM.equals(id) ||
  1205.                 Costanti.ID_JWS_SIGNATURE_ALGORITHM.equals(id) ||
  1206.                 Costanti.ID_JWS_ENCRYPT_KEY_ALGORITHM.equals(id) ||
  1207.                 Costanti.ID_JWS_ENCRYPT_CONTENT_ALGORITHM.equals(id)) {
  1208.             SecurityProvider secProvider = new SecurityProvider();
  1209.             if(Costanti.ID_JWS_SIGNATURE_ALGORITHM.equals(id)) {
  1210.                 return secProvider.getDefault(JOSECostanti.ID_SIGNATURE_ALGORITHM);
  1211.             }
  1212.             else if(Costanti.ID_JWS_ENCRYPT_KEY_ALGORITHM.equals(id) || JOSECostanti.ID_ENCRYPT_KEY_ALGORITHM.equals(id)) {
  1213.                 return secProvider.getDefault(JOSECostanti.ID_ENCRYPT_KEY_ALGORITHM);
  1214.             }
  1215.             else{/**else if(Costanti.ID_JWS_ENCRYPT_CONTENT_ALGORITHM.equals(id) || JOSECostanti.ID_ENCRYPT_CONTENT_ALGORITHM.equals(id)) {*/
  1216.                 return secProvider.getDefault(JOSECostanti.ID_ENCRYPT_CONTENT_ALGORITHM);
  1217.             }
  1218.         }
  1219.         return null;
  1220.     }

  1221.     @Override
  1222.     public String dynamicUpdate(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {
  1223.         return dynamicUpdate(items, mapNameValue, item, actualValue, null);
  1224.     }
  1225.     @Override
  1226.     public String dynamicUpdate(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue, ExternalResources externalResources) {
  1227.    
  1228.         if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_FILE.equals(item.getName()) ||
  1229.                 Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_FILE.equals(item.getName()) ||
  1230.                 Costanti.ID_HTTPS_TRUSTSTORE_FILE.equals(item.getName()) ||
  1231.                 Costanti.ID_HTTPS_KEYSTORE_FILE.equals(item.getName()) ||
  1232.                 Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_FILE.equals(item.getName()) ||
  1233.                 Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_FILE.equals(item.getName())) {
  1234.            
  1235.             return dynamicUpdateFile(items, mapNameValue, item, actualValue);
  1236.         }
  1237.         else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_PASSWORD.equals(item.getName()) ||
  1238.                 Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_PASSWORD.equals(item.getName()) ||
  1239.                 Costanti.ID_HTTPS_TRUSTSTORE_PASSWORD.equals(item.getName()) ||
  1240.                 Costanti.ID_HTTPS_KEYSTORE_PASSWORD.equals(item.getName()) ||
  1241.                 Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_PASSWORD.equals(item.getName()) ||
  1242.                 Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_PASSWORD.equals(item.getName())
  1243.             ) {
  1244.             return dynamicUpdateStorePassword(items, mapNameValue, item, actualValue);
  1245.         }
  1246.         else if(Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_PASSWORD_PRIVATE_KEY.equals(item.getName()) ||
  1247.                 Costanti.ID_HTTPS_KEYSTORE_PASSWORD_PRIVATE_KEY.equals(item.getName()) ||
  1248.                 Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_PASSWORD_PRIVATE_KEY.equals(item.getName()) ||
  1249.                 Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_PASSWORD_PRIVATE_KEY.equals(item.getName())
  1250.                 ) {
  1251.             return dynamicUpdateStoreKeyPassword(items, mapNameValue, item, actualValue);
  1252.         }
  1253.         else if(Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_OCSP_POLICY.equals(item.getName()) ||
  1254.                 Costanti.ID_HTTPS_TRUSTSTORE_OCSP_POLICY.equals(item.getName())) {
  1255.             if(!this.ocspProvider.isOcspEnabled()) {
  1256.                 item.setValue("");
  1257.                 item.setType(ItemType.HIDDEN);
  1258.             }
  1259.             return actualValue;
  1260.         }
  1261.         else if(Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_BYOK_POLICY.equals(item.getName()) ||
  1262.                 Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_BYOK_POLICY.equals(item.getName()) ||
  1263.                 Costanti.ID_HTTPS_KEYSTORE_BYOK_POLICY.equals(item.getName()) ||
  1264.                 Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_BYOK_POLOCY.equals(item.getName())) {
  1265.             return dynamicUpdateByok(items, mapNameValue, item, actualValue);
  1266.         }
  1267.         else {
  1268.             return dynamicUpdateContinue1(items, mapNameValue, item, actualValue, externalResources);
  1269.         }
  1270.     }
  1271.     public String dynamicUpdateContinue1(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue, ExternalResources externalResources) {
  1272.         if(Costanti.ID_DYNAMIC_DISCOVERY_CUSTOM_PARSER_PLUGIN_CHOICE.equals(item.getName())
  1273.             ) {
  1274.             return TokenUtilities.dynamicUpdateTokenPluginChoice(externalResources, TipoPlugin.TOKEN_DYNAMIC_DISCOVERY, item, actualValue);
  1275.         }
  1276.         else if(Costanti.ID_VALIDAZIONE_JWT_CUSTOM_PARSER_PLUGIN_CHOICE.equals(item.getName())
  1277.                 ||
  1278.                 Costanti.ID_INTROSPECTION_CUSTOM_PARSER_PLUGIN_CHOICE.equals(item.getName())
  1279.                 ||
  1280.                 Costanti.ID_USER_INFO_CUSTOM_PARSER_PLUGIN_CHOICE.equals(item.getName())
  1281.             ) {
  1282.             return TokenUtilities.dynamicUpdateTokenPluginChoice(externalResources, TipoPlugin.TOKEN_VALIDAZIONE, item, actualValue);
  1283.         }
  1284.         else if(Costanti.ID_DYNAMIC_DISCOVERY_CUSTOM_PARSER_PLUGIN_CLASSNAME.equals(item.getName())
  1285.             ) {
  1286.             return dynamicUpdateTokenDynamicDiscoveryPluginClassName(items, mapNameValue, item, actualValue, externalResources);
  1287.         }
  1288.         else if(Costanti.ID_VALIDAZIONE_JWT_CUSTOM_PARSER_PLUGIN_CLASSNAME.equals(item.getName()) ||
  1289.                 Costanti.ID_INTROSPECTION_CUSTOM_PARSER_PLUGIN_CLASSNAME.equals(item.getName()) ||
  1290.                 Costanti.ID_USER_INFO_CUSTOM_PARSER_PLUGIN_CLASSNAME.equals(item.getName())
  1291.             ) {
  1292.             return dynamicUpdateTokenPluginClassName(items, mapNameValue, item, actualValue, externalResources);
  1293.         }
  1294.         return actualValue;
  1295.     }
  1296.     private String dynamicUpdateFile(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {
  1297.         String type = Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE;
  1298.         if(Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_FILE.equals(item.getName())) {
  1299.             type = Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_TYPE;
  1300.         }
  1301.         else if(Costanti.ID_HTTPS_TRUSTSTORE_FILE.equals(item.getName())) {
  1302.             type = Costanti.ID_HTTPS_TRUSTSTORE_TYPE;
  1303.         }
  1304.         else if(Costanti.ID_HTTPS_KEYSTORE_FILE.equals(item.getName())) {
  1305.             type = Costanti.ID_HTTPS_KEYSTORE_TYPE;
  1306.         }
  1307.         else if(Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_FILE.equals(item.getName())) {
  1308.             type = Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_TYPE;
  1309.         }
  1310.         else if(Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_FILE.equals(item.getName())) {
  1311.             type = Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_TYPE;
  1312.         }
  1313.        
  1314.         return AbstractSecurityProvider.processStoreFile(type, items, mapNameValue, item, actualValue);
  1315.     }
  1316.     private String dynamicUpdateStorePassword(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {
  1317.         String type = Costanti.ID_VALIDAZIONE_JWT_TRUSTSTORE_TYPE;
  1318.         boolean keystore = true;
  1319.         if(Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_PASSWORD.equals(item.getName())) {
  1320.             type = Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_TYPE;
  1321.         }
  1322.         else if(Costanti.ID_HTTPS_TRUSTSTORE_PASSWORD.equals(item.getName())) {
  1323.             type = Costanti.ID_HTTPS_TRUSTSTORE_TYPE;
  1324.             keystore = false;
  1325.         }
  1326.         else if(Costanti.ID_HTTPS_KEYSTORE_PASSWORD.equals(item.getName())) {
  1327.             type = Costanti.ID_HTTPS_KEYSTORE_TYPE;
  1328.         }
  1329.         else if(Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_PASSWORD.equals(item.getName())) {
  1330.             type = Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_TYPE;
  1331.         }
  1332.         else if(Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_PASSWORD.equals(item.getName())) {
  1333.             type = Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_TYPE;
  1334.         }
  1335.        
  1336.         return AbstractSecurityProvider.processStorePassword(keystore, type, items, mapNameValue, item, actualValue);
  1337.     }
  1338.     private String dynamicUpdateStoreKeyPassword(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {
  1339.         String type = Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_TYPE;
  1340.         if(Costanti.ID_HTTPS_KEYSTORE_PASSWORD_PRIVATE_KEY.equals(item.getName())) {
  1341.             type = Costanti.ID_HTTPS_KEYSTORE_TYPE;
  1342.         }
  1343.         else if(Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_PASSWORD_PRIVATE_KEY.equals(item.getName())) {
  1344.             type = Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_TYPE;
  1345.         }
  1346.         else if(Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_PASSWORD_PRIVATE_KEY.equals(item.getName())) {
  1347.             type = Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_TYPE;
  1348.         }
  1349.        
  1350.         return AbstractSecurityProvider.processStoreKeyPassword(type, items, mapNameValue, item, actualValue);
  1351.     }
  1352.     private String dynamicUpdateByok(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {
  1353.         if(!this.byokProvider.isByokEnabled()) {
  1354.             item.setValue("");
  1355.             item.setType(ItemType.HIDDEN);
  1356.             return actualValue;
  1357.         }
  1358.         else {
  1359.             return dynamicUpdateByokPolicy(items, mapNameValue, item, actualValue);
  1360.         }
  1361.     }
  1362.     private String dynamicUpdateByokPolicy(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {
  1363.         String type = null;
  1364.         if(Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_BYOK_POLICY.equals(item.getName())) {
  1365.             type = Costanti.ID_TOKEN_FORWARD_JWS_KEYSTORE_TYPE;
  1366.         }
  1367.         else if(Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_BYOK_POLICY.equals(item.getName())) {
  1368.             type = Costanti.ID_TOKEN_FORWARD_JWE_KEYSTORE_TYPE;
  1369.         }
  1370.         else if(Costanti.ID_HTTPS_KEYSTORE_BYOK_POLICY.equals(item.getName())) {
  1371.             type = Costanti.ID_HTTPS_KEYSTORE_TYPE;
  1372.         }
  1373.         else if(Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_BYOK_POLOCY.equals(item.getName())) {
  1374.             type = Costanti.ID_VALIDAZIONE_JWT_KEYSTORE_TYPE;
  1375.         }
  1376.        
  1377.         return AbstractSecurityProvider.processStoreByokPolicy(type, items, mapNameValue, item, actualValue);
  1378.     }
  1379.     private String dynamicUpdateTokenDynamicDiscoveryPluginClassName(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue, ExternalResources externalResources) {
  1380.         String idChoice = Costanti.ID_DYNAMIC_DISCOVERY_CUSTOM_PARSER_PLUGIN_CHOICE;
  1381.         return TokenUtilities.dynamicUpdateTokenPluginClassName(externalResources, TipoPlugin.TOKEN_DYNAMIC_DISCOVERY,
  1382.                 items, mapNameValue, item,
  1383.                 idChoice, actualValue);    
  1384.     }
  1385.     private String dynamicUpdateTokenPluginClassName(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue, ExternalResources externalResources) {
  1386.         String idChoice = null;
  1387.         if(Costanti.ID_VALIDAZIONE_JWT_CUSTOM_PARSER_PLUGIN_CLASSNAME.equals(item.getName())){
  1388.             idChoice = Costanti.ID_VALIDAZIONE_JWT_CUSTOM_PARSER_PLUGIN_CHOICE;
  1389.         }
  1390.         else if(Costanti.ID_INTROSPECTION_CUSTOM_PARSER_PLUGIN_CLASSNAME.equals(item.getName())){
  1391.             idChoice = Costanti.ID_INTROSPECTION_CUSTOM_PARSER_PLUGIN_CHOICE;
  1392.         }
  1393.         else {
  1394.             idChoice = Costanti.ID_USER_INFO_CUSTOM_PARSER_PLUGIN_CHOICE;
  1395.         }
  1396.         return TokenUtilities.dynamicUpdateTokenPluginClassName(externalResources, TipoPlugin.TOKEN_VALIDAZIONE,
  1397.                 items, mapNameValue, item,
  1398.                 idChoice, actualValue);    
  1399.     }

  1400.     @Override
  1401.     public ProviderInfo getProviderInfo(String id) throws ProviderException{
  1402.         if(Costanti.ID_VALIDAZIONE_JWT_CUSTOM_PARSER_PLUGIN_CLASSNAME.equals(id) ||
  1403.                 Costanti.ID_INTROSPECTION_CUSTOM_PARSER_PLUGIN_CLASSNAME.equals(id) ||
  1404.                 Costanti.ID_USER_INFO_CUSTOM_PARSER_PLUGIN_CLASSNAME.equals(id)) {
  1405.             ProviderInfo pInfo = new ProviderInfo();
  1406.             pInfo.setHeaderBody(DynamicHelperCostanti.PLUGIN_CLASSNAME_INFO_SINGOLA);
  1407.             pInfo.setListBody(new ArrayList<>());
  1408.             pInfo.getListBody().add(ITokenParser.class.getName());
  1409.             return pInfo;
  1410.         }
  1411.        
  1412.         return null;
  1413.     }
  1414. }