NegoziazioneTokenProvider.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.Claims;
  39. import org.openspcoop2.pdd.core.token.parser.ClaimsNegoziazione;
  40. import org.openspcoop2.pdd.core.token.parser.INegoziazioneTokenParser;
  41. import org.openspcoop2.security.message.constants.SecurityConstants;
  42. import org.openspcoop2.security.message.utils.AbstractSecurityProvider;
  43. import org.openspcoop2.utils.UtilsRuntimeException;
  44. import org.openspcoop2.utils.certificate.byok.BYOKProvider;
  45. import org.openspcoop2.utils.certificate.hsm.HSMUtils;
  46. import org.openspcoop2.utils.certificate.ocsp.OCSPProvider;
  47. import org.openspcoop2.utils.properties.PropertiesUtilities;
  48. import org.openspcoop2.utils.transport.http.HttpConstants;
  49. import org.openspcoop2.utils.transport.http.HttpRequestMethod;
  50. import org.openspcoop2.utils.transport.http.SSLUtilities;

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

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

  61.     public NegoziazioneTokenProvider() {
  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.    
  70.    
  71.    
  72.     @Override
  73.     public void validate(Map<String, Properties> mapProperties) throws ProviderException, ProviderValidationException {
  74.        
  75.         Properties pDefault = TokenUtilities.getDefaultProperties(mapProperties);
  76.            
  77.         boolean endpointSSL = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_ENDPOINT_HTTPS_STATO);
  78.         boolean ssl = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_RETRIEVE_TOKEN_AUTH_SSL_STATO);
  79.        
  80.         if(endpointSSL || ssl) {
  81.             validateEndpointSsl(mapProperties);
  82.         }
  83.        
  84.         validateUrl(pDefault);
  85.        
  86.         String retMode = validateRetrieveMode(pDefault);
  87.        
  88.         boolean pdnd = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_RETRIEVE_TOKEN_MODE_PDND);
  89.            
  90.                    
  91.         boolean basic = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_RETRIEVE_TOKEN_AUTH_BASIC_STATO);
  92.         if(basic) {
  93.             validateBasicCredentials(pDefault);
  94.         }
  95.        
  96.         boolean bearer = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_RETRIEVE_TOKEN_AUTH_BEARER_STATO);
  97.         if(bearer) {
  98.             String token = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_AUTH_BEARER_TOKEN);
  99.             InputValidationUtils.validateTextAreaInput(token, "Token Endpoint - Autenticazione Client - Token");
  100.         }
  101.        
  102.         if(ssl) {
  103.             validateSslCredentials(mapProperties);
  104.         }
  105.        
  106.         boolean proxy = TokenUtilities.isEnabled(pDefault, Costanti.POLICY_ENDPOINT_PROXY_STATO);
  107.         if(proxy) {
  108.             validateProxy(mapProperties);
  109.         }
  110.        
  111.         if(Costanti.ID_RETRIEVE_TOKEN_METHOD_RFC_7523_X509.equals(retMode) ||
  112.                 Costanti.ID_RETRIEVE_TOKEN_METHOD_RFC_7523_CLIENT_SECRET.equals(retMode)) {
  113.             validateJWTSigned(pDefault, retMode, pdnd);
  114.         }
  115.        
  116.         validateFormParameters(pDefault, pdnd);
  117.        
  118.         validateCustomFormParameters(pDefault, pdnd);
  119.        
  120.         validateHeaders(pDefault);
  121.                
  122.         if(Costanti.ID_RETRIEVE_TOKEN_METHOD_CUSTOM.equals(retMode)) {
  123.             validateTokenParser(pDefault);
  124.         }
  125.        
  126.         validateForward(pDefault);
  127.        
  128.     }
  129.     private void validateEndpointSsl(Map<String, Properties> mapProperties) throws ProviderValidationException {
  130.         Properties p = mapProperties.get(Costanti.POLICY_ENDPOINT_SSL_CONFIG);
  131.         if(p==null || p.size()<=0) {
  132.             throw new ProviderValidationException("Nonostante sia stato indicato un endpoint 'https', non è stata fornita una configurazione dei parametri ssl da utilizzare");
  133.         }
  134.        
  135.         String trustAllCerts = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_ALL_CERTS);
  136.         boolean trustAll = false;
  137.         if(trustAllCerts!=null && StringUtils.isNotEmpty(trustAllCerts)) {
  138.             trustAll = Boolean.valueOf(trustAllCerts);
  139.         }
  140.        
  141.         if(!trustAll) {
  142.             String location = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_STORE_LOCATION);
  143.             InputValidationUtils.validateTextAreaInput(location, "Https - Autenticazione Server - File (TrustStore per l'autenticazione server)");
  144.            
  145.             String algo = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_MANAGEMENT_ALGORITHM);
  146.             if(algo==null || "".equals(algo)) {
  147.                 throw new ProviderValidationException("Indicare un algoritmo per l'autenticazione server");
  148.             }
  149.             if(algo.contains(" ")) {
  150.                 throw new ProviderValidationException("Non indicare spazi nell'algoritmo per l'autenticazione server");
  151.             }
  152.            
  153.             String locationCRL = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_STORE_CRLS);
  154.             if(locationCRL!=null && !"".equals(locationCRL)) {
  155.                 InputValidationUtils.validateTextAreaInput(locationCRL, "Https - Autenticazione Server - CRL File(s)");
  156.             }
  157.         }
  158.     }
  159.     private void validateUrl(Properties pDefault) throws ProviderValidationException {
  160.         String url = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_URL);
  161.         InputValidationUtils.validateTextAreaInput(url, "Token Endpoint - URL");
  162.         try{
  163.             org.openspcoop2.utils.regexp.RegExpUtilities.validateUrl(url, true);
  164.         }catch(Exception e){
  165.             throw new ProviderValidationException("La URL fornita non è valida: "+e.getMessage());
  166.         }  
  167.     }
  168.     private String validateRetrieveMode(Properties pDefault) throws ProviderValidationException {
  169.         String retMode = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_MODE);
  170.         if(Costanti.ID_RETRIEVE_TOKEN_METHOD_USERNAME_PASSWORD.equals(retMode)) {
  171.             String username = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_USERNAME);
  172.             if(username==null || "".equals(username)) {
  173.                 throw new ProviderValidationException("Non è stato fornito l'username");
  174.             }
  175.             if(username.contains(" ")) {
  176.                 throw new ProviderValidationException("Non indicare spazi nel'username");
  177.             }
  178.             String password = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_PASSWORD);
  179.             if(password==null || "".equals(password)) {
  180.                 throw new ProviderValidationException("Non è stato fornita una password");
  181.             }
  182.             if(password.contains(" ")) {
  183.                 throw new ProviderValidationException("Non indicare spazi nella password");
  184.             }
  185.         }
  186.         return retMode;
  187.     }
  188.     private void validateBasicCredentials(Properties pDefault) throws ProviderValidationException {
  189.         String username = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_AUTH_BASIC_USERNAME);
  190.         if(username==null || "".equals(username)) {
  191.             throw new ProviderValidationException("Nonostante sia richiesta una autenticazione 'HttpBasic', non è stato fornito un 'Client ID' da utilizzare durante la connessione verso il servizio");
  192.         }
  193.         if(username.contains(" ")) {
  194.             throw new ProviderValidationException("Non indicare spazi nel 'Client ID'");
  195.         }
  196.         String password = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_AUTH_BASIC_PASSWORD);
  197.         if(password==null || "".equals(password)) {
  198.             throw new ProviderValidationException("Nonostante sia richiesta una autenticazione 'HttpBasic', non è stato fornita un 'Client Secret' da utilizzare durante la connessione verso il servizio");
  199.         }
  200.         if(password.contains(" ")) {
  201.             throw new ProviderValidationException("Non indicare spazi nel 'Client Secret'");
  202.         }
  203.     }
  204.     private void validateSslCredentials(Map<String, Properties> mapProperties) throws ProviderValidationException {
  205.         Properties p = mapProperties.get(Costanti.POLICY_ENDPOINT_SSL_CLIENT_CONFIG);
  206.         if(p==null || p.size()<=0) {
  207.             throw new ProviderValidationException("Nonostante sia richiesta una autenticazione 'Https', non sono stati forniti i parametri di connessione ssl client da utilizzare verso il servizio");
  208.         }
  209.        
  210.         String location = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_KEY_STORE_LOCATION);
  211.         if(location!=null && !"".equals(location)) {
  212.             InputValidationUtils.validateTextAreaInput(location, "Https - Autenticazione Client - File (KeyStore per l'autenticazione client)");
  213.         }
  214.        
  215.         String algo = p.getProperty(CostantiConnettori.CONNETTORE_HTTPS_KEY_MANAGEMENT_ALGORITHM);
  216.         if(algo==null || "".equals(algo)) {
  217.             throw new ProviderValidationException("Indicare un algoritmo per l'autenticazione client");
  218.         }
  219.         if(algo.contains(" ")) {
  220.             throw new ProviderValidationException("Non indicare spazi nell'algoritmo per l'autenticazione client");
  221.         }
  222.     }
  223.     private void validateProxy(Map<String, Properties> mapProperties) throws ProviderValidationException {
  224.         Properties p = mapProperties.get(Costanti.POLICY_ENDPOINT_CONFIG);
  225.         if(p==null || p.size()<=0) {
  226.             throw new ProviderValidationException("Nonostante sia richiesta un proxy, non sono stati forniti i parametri di connessione");
  227.         }
  228.        
  229.         String hostname = p.getProperty(CostantiConnettori.CONNETTORE_HTTP_PROXY_HOSTNAME);
  230.         if(hostname==null || "".equals(hostname)) {
  231.             throw new ProviderValidationException("Indicare un hostname per il Proxy");
  232.         }
  233.         if(hostname.contains(" ")) {
  234.             throw new ProviderValidationException("Non indicare spazi nell'hostname del Proxy");
  235.         }
  236.        
  237.         String username = p.getProperty(CostantiConnettori.CONNETTORE_HTTP_PROXY_USERNAME);
  238.         if(username!=null && !"".equals(username) &&
  239.             username.contains(" ")) {
  240.             throw new ProviderValidationException("Non indicare spazi nell'username del Proxy");
  241.         }
  242.        
  243.         String password = p.getProperty(CostantiConnettori.CONNETTORE_HTTP_PROXY_PASSWORD);
  244.         if(password!=null && !"".equals(password) &&
  245.             password.contains(" ")) {
  246.             throw new ProviderValidationException("Non indicare spazi nella password del Proxy");
  247.         }
  248.     }
  249.     private void validateJWTSigned(Properties pDefault, String retMode, boolean pdnd) throws ProviderValidationException {
  250.         if(Costanti.ID_RETRIEVE_TOKEN_METHOD_RFC_7523_X509.equals(retMode)) {
  251.             validateJWTSignedx509(pDefault);
  252.         }
  253.         else {
  254.             /**
  255.             // Costanti.ID_RETRIEVE_TOKEN_METHOD_RFC_7523_CLIENT_SECRET.equals(retMode)) {
  256.        
  257.             // Una password può contenere gli spazi, i controlli di inizio e fine vengono gia' fatti dal framework
  258.            
  259. //          String clientSecret = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_CLIENT_SECRET);
  260. //          if(clientSecret!=null && clientSecret.contains(" ")) {
  261. //              throw new ProviderValidationException("Non indicare spazi nel campo 'Client Secret'");
  262. //          }
  263.             */
  264.         }
  265.        
  266.         // NOTA: i controlli seguenti di inizio e fine, vengono fatti gia' in automatico dal framework
  267.        
  268.         validateJWTSignedHeader(pDefault);
  269.                            
  270.         validateJWTSignedPayload(pDefault, pdnd);
  271.        
  272.     }
  273.     private void validateJWTSignedx509(Properties pDefault) throws ProviderValidationException {
  274.         validateJWTSignedx509Keystore(pDefault);
  275.         validateJWTSignedx509Key(pDefault);
  276.     }
  277.     private void validateJWTSignedx509Keystore(Properties pDefault) throws ProviderValidationException {
  278.         String file = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_SIGN_KEYSTORE_FILE);
  279.         InputValidationUtils.validateTextAreaInput(file, "Token Endpoint - JWT KeyStore - File");
  280.        
  281.         String fileChiavePubblica = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_SIGN_KEYSTORE_FILE_PUBLIC_KEY);
  282.         if(fileChiavePubblica!=null && StringUtils.isNotEmpty(fileChiavePubblica)) {
  283.             InputValidationUtils.validateTextAreaInput(file, "Token Endpoint - JWT KeyStore - Chiave Pubblica");
  284.         }
  285.        
  286.         // NOTA: i controlli seguenti di inizio e fine, vengono fatti gia' in automatico dal framework
  287.         String p = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_SIGN_KEYSTORE_PASSWORD);
  288.         if(p!=null) {
  289.             if(p.startsWith(" ")) {
  290.                 throw new ProviderValidationException("Il valore indicato nel campo 'JWT KeyStore - Password', non deve iniziare con uno spazio");
  291.             }
  292.             if(p.endsWith(" ")) {
  293.                 throw new ProviderValidationException("Il valore indicato nel campo 'JWT KeyStore - Password', non deve terminare con uno spazio");
  294.             }
  295.         }
  296.     }
  297.     private void validateJWTSignedx509Key(Properties pDefault) throws ProviderValidationException {
  298.        
  299.         // NOTA: i controlli seguenti di inizio e fine, vengono fatti gia' in automatico dal framework
  300.         String p = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_SIGN_KEY_ALIAS);
  301.         if(p!=null) {
  302.             if(p.startsWith(" ")) {
  303.                 throw new ProviderValidationException("Il valore indicato nel campo 'JWT KeyStore - Alias Chiave Privata', non deve iniziare con uno spazio");
  304.             }
  305.             if(p.endsWith(" ")) {
  306.                 throw new ProviderValidationException("Il valore indicato nel campo 'JWT KeyStore - Alias Chiave Privata', non deve terminare con uno spazio");
  307.             }
  308.         }
  309.        
  310.         p = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_SIGN_KEY_PASSWORD);
  311.         if(p!=null) {
  312.             if(p.startsWith(" ")) {
  313.                 throw new ProviderValidationException("Il valore indicato nel campo 'JWT KeyStore - Password Chiave Privata', non deve iniziare con uno spazio");
  314.             }
  315.             if(p.endsWith(" ")) {
  316.                 throw new ProviderValidationException("Il valore indicato nel campo 'JWT KeyStore - Password Chiave Privata', non deve terminare con uno spazio");
  317.             }
  318.         }
  319.     }
  320.     private void validateJWTSignedHeader(Properties pDefault) throws ProviderValidationException {
  321.         String kidMode = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_SIGN_INCLUDE_KEY_ID);
  322.         if(Costanti.POLICY_RETRIEVE_TOKEN_JWT_SIGN_INCLUDE_KEY_ID_MODE_CUSTOM.equals(kidMode)) {
  323.             String kidValue = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_SIGN_INCLUDE_KEY_ID_VALUE);
  324.             if(kidValue!=null) {
  325.                 if(kidValue.startsWith(" ")) {
  326.                     throw new ProviderValidationException("Il valore indicato nel campo 'JWT Header - Key Id (kid)', non deve iniziare con uno spazio");
  327.                 }
  328.                 if(kidValue.endsWith(" ")) {
  329.                     throw new ProviderValidationException("Il valore indicato nel campo 'JWT Header - Key Id (kid)', non deve terminare con uno spazio");
  330.                 }
  331.             }
  332.         }
  333.        
  334.         String type = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_SIGN_JOSE_TYPE);
  335.         if(type!=null && type.contains(" ")) {
  336.             throw new ProviderValidationException("Non indicare spazi nel campo 'JWT Header - Type (typ)'");
  337.         }
  338.        
  339.         String x5u = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_SIGN_INCLUDE_X509_URL);
  340.         if(x5u!=null && !"".equals(x5u)) {
  341.             InputValidationUtils.validateTextAreaInput(x5u, "Token Endpoint - JWT Header - URL");
  342.         }
  343.     }
  344.     private void validateJWTSignedPayload(Properties pDefault, boolean pdnd) throws ProviderValidationException {
  345.         String clientId = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_CLIENT_ID);
  346.         if(clientId!=null && clientId.contains(" ")) {
  347.             throw new ProviderValidationException("Non indicare spazi nel campo 'JWT Payload - Client ID'");
  348.         }
  349.        
  350.         String audience = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_AUDIENCE);
  351.         if(audience!=null && audience.contains(" ")) {
  352.             throw new ProviderValidationException("Non indicare spazi nel campo 'JWT Payload - Audience'");
  353.         }
  354.        
  355.         String issuer = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_ISSUER);
  356.         if(issuer!=null && issuer.contains(" ")) {
  357.             throw new ProviderValidationException("Non indicare spazi nel campo 'JWT Payload - Issuer'");
  358.         }
  359.        
  360.         String subject = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_SUBJECT);
  361.         if(subject!=null && subject.contains(" ")) {
  362.             throw new ProviderValidationException("Non indicare spazi nel campo 'JWT Payload - Subject'");
  363.         }
  364.        
  365.         String jti = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_IDENTIFIER);
  366.         if(jti!=null && jti.contains(" ")) {
  367.             throw new ProviderValidationException("Non indicare spazi nel campo 'JWT Payload - Identifier'");
  368.         }
  369.        
  370.         if(pdnd) {
  371.             validateJWTSignedPayloadPDND(pDefault);        
  372.         }
  373.        
  374.         validateJWTSignedClaims(pDefault, pdnd);
  375.     }
  376.     private void validateJWTSignedPayloadPDND(Properties pDefault) throws ProviderValidationException {
  377.         String purposeId = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_PURPOSE_ID);
  378.         if(purposeId!=null && purposeId.contains(" ")) {
  379.             throw new ProviderValidationException("Non indicare spazi nel campo 'JWT Payload - Purpose ID'");
  380.         }
  381.        
  382.         String session = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_SESSION_INFO);
  383.         if(session!=null && !"".equals(session)) {
  384.             Properties convertTextToProperties = PropertiesUtilities.convertTextToProperties(session);
  385.             List<String> deny = new ArrayList<>();
  386.             TokenUtilities.checkClaims("claim", convertTextToProperties, "Informazioni Sessione", deny, false);
  387.         }
  388.     }
  389.     private void validateJWTSignedClaims(Properties pDefault, boolean pdnd) throws ProviderValidationException {
  390.         String claims = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_JWT_CLAIMS);
  391.         if(claims!=null && !"".equals(claims)) {
  392.             Properties convertTextToProperties = PropertiesUtilities.convertTextToProperties(claims);
  393.             List<String> deny = new ArrayList<>();
  394.             deny.add(Claims.OIDC_ID_TOKEN_ISSUER);
  395.             deny.add(Claims.OIDC_ID_TOKEN_SUBJECT);
  396.             deny.add(Claims.INTROSPECTION_RESPONSE_RFC_7662_CLIENT_ID);
  397.             deny.add(Claims.OIDC_ID_TOKEN_AUDIENCE);
  398.             deny.add(Claims.JSON_WEB_TOKEN_RFC_7519_ISSUED_AT);
  399.             deny.add(Claims.JSON_WEB_TOKEN_RFC_7519_NOT_TO_BE_USED_BEFORE);
  400.             deny.add(Claims.JSON_WEB_TOKEN_RFC_7519_EXPIRED);
  401.             deny.add(Claims.JSON_WEB_TOKEN_RFC_7519_JWT_ID);
  402.             if(pdnd) {
  403.                 deny.add(Costanti.PDND_PURPOSE_ID);
  404.                 deny.add(Costanti.PDND_SESSION_INFO);
  405.             }
  406.             TokenUtilities.checkClaims("claim", convertTextToProperties, "Claims", deny, false);
  407.         }
  408.     }
  409.     private void validateFormParameters(Properties pDefault, boolean pdnd) throws ProviderValidationException {
  410.         String scopes = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_SCOPES);
  411.         if(scopes!=null && !"".equals(scopes) &&
  412.             scopes.contains(" ")) {
  413.             throw new ProviderValidationException("Non indicare spazi tra gli scope forniti");
  414.         }
  415.        
  416.         String audience = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_AUDIENCE);
  417.         if(audience!=null && !"".equals(audience) &&
  418.             audience.contains(" ")) {
  419.             throw new ProviderValidationException("Non indicare spazi nel valore dell'audience");
  420.         }
  421.        
  422.         if(pdnd) {
  423.             String clientId = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_FORM_CLIENT_ID);
  424.             if(clientId!=null && clientId.contains(" ")) {
  425.                 throw new ProviderValidationException("Non indicare spazi nel campo 'Client ID'");
  426.             }
  427.            
  428.             String resource = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_FORM_RESOURCE);
  429.             if(resource!=null && resource.contains(" ")) {
  430.                 throw new ProviderValidationException("Non indicare spazi nel campo 'Resource'");
  431.             }
  432.         }
  433.     }
  434.     private void validateCustomFormParameters(Properties pDefault, boolean pdnd) throws ProviderValidationException {
  435.         String parameters = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_FORM_PARAMETERS);
  436.         if(parameters!=null && !"".equals(parameters)) {
  437.             Properties convertTextToProperties = PropertiesUtilities.convertTextToProperties(parameters);
  438.             List<String> deny = new ArrayList<>();
  439.             deny.add(ClaimsNegoziazione.OAUTH2_RFC_6749_REQUEST_GRANT_TYPE);
  440.             deny.add(ClaimsNegoziazione.OAUTH2_RFC_6749_REQUEST_CLIENT_ASSERTION_TYPE);
  441.             deny.add(ClaimsNegoziazione.OAUTH2_RFC_6749_REQUEST_CLIENT_ASSERTION);
  442.             deny.add(ClaimsNegoziazione.OAUTH2_RFC_6749_REQUEST_SCOPE);
  443.             deny.add(ClaimsNegoziazione.OAUTH2_RFC_6749_REQUEST_AUDIENCE);
  444.             if(pdnd) {
  445.                 deny.add(Costanti.PDND_OAUTH2_RFC_6749_REQUEST_CLIENT_ID);
  446.             }
  447.             TokenUtilities.checkClaims("parametro", convertTextToProperties, "Parametri", deny, false);
  448.         }  
  449.     }
  450.     private void validateHeaders(Properties pDefault) throws ProviderValidationException {
  451.         String headers = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_HTTP_HEADERS);
  452.         if(headers!=null && !"".equals(headers)) {
  453.             Properties convertTextToProperties = PropertiesUtilities.convertTextToProperties(headers);
  454.             List<String> deny = new ArrayList<>();
  455.             deny.add(HttpConstants.AUTHORIZATION);
  456.             deny.add(HttpConstants.CONTENT_TYPE);
  457.             TokenUtilities.checkClaims("header http", convertTextToProperties, "Header HTTP", deny, false);
  458.         }
  459.     }
  460.     private void validateTokenParser(Properties pDefault) throws ProviderValidationException {
  461.         String parser = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_PARSER_TYPE_CUSTOM);
  462.         if(parser!=null && Costanti.POLICY_RETRIEVE_TOKEN_PARSER_TYPE_CUSTOM_CYSTOM.equals(parser)) {
  463.             String pluginType = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_PARSER_PLUGIN_TYPE);
  464.             validateTokenParser(pDefault, pluginType);
  465.         }
  466.     }
  467.     private void validateTokenParser(Properties pDefault, String pluginType) throws ProviderValidationException {
  468.         if(pluginType!=null && StringUtils.isNotEmpty(pluginType) && CostantiConfigurazione.POLICY_ID_NON_DEFINITA.equals(pluginType)) {
  469.             String className = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_PARSER_CLASS_NAME);
  470.             if(CostantiConfigurazione.POLICY_ID_NON_DEFINITA.equals(className)) {
  471.                 throw new ProviderValidationException("Deve essere selezionato un plugin per il 'Formato Risposta'");  
  472.             }
  473.             else {
  474.                 if(className==null || "".equals(className)) {
  475.                     throw new ProviderValidationException("Non è stata fornita la classe del parser dei claims della risposta");
  476.                 }
  477.                 if(className.contains(" ")) {
  478.                     throw new ProviderValidationException("Non indicare spazi nella classe del parser dei claims della risposta");
  479.                 }
  480.             }
  481.         }
  482.     }
  483.     private void validateForward(Properties pDefault) throws ProviderValidationException {
  484.         String mode = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_FORWARD_MODE);
  485.         if(mode==null) {
  486.             throw new ProviderValidationException("Nessuna modalità di forward indicata");
  487.         }
  488.         if(!Costanti.POLICY_RETRIEVE_TOKEN_FORWARD_MODE_RFC6750_HEADER.equals(mode) &&
  489.                 !Costanti.POLICY_RETRIEVE_TOKEN_FORWARD_MODE_RFC6750_URL.equals(mode) &&
  490.                 !Costanti.POLICY_RETRIEVE_TOKEN_FORWARD_MODE_CUSTOM_HEADER.equals(mode) &&
  491.                 !Costanti.POLICY_RETRIEVE_TOKEN_FORWARD_MODE_CUSTOM_URL.equals(mode)
  492.                 ) {
  493.             throw new ProviderValidationException("La modalità di forward indicata '"+mode+"' non è supportata");  
  494.         }
  495.         if(Costanti.POLICY_RETRIEVE_TOKEN_FORWARD_MODE_CUSTOM_HEADER.equals(mode)) {
  496.             String hdr = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_FORWARD_MODE_CUSTOM_HEADER_NAME);
  497.             if(hdr==null || "".equals(hdr)) {
  498.                 throw new ProviderValidationException("La modalità di forward indicata prevede l'indicazione del nome di un header http");
  499.             }
  500.             if(hdr.contains(" ")) {
  501.                 throw new ProviderValidationException("Non indicare spazi nel nome dell'header HTTP indicato per la modalità di forward");
  502.             }
  503.         }
  504.         else if(Costanti.POLICY_RETRIEVE_TOKEN_FORWARD_MODE_CUSTOM_URL.equals(mode)) {
  505.             String urlP = pDefault.getProperty(Costanti.POLICY_RETRIEVE_TOKEN_FORWARD_MODE_CUSTOM_URL_PARAMETER_NAME);
  506.             if(urlP==null || "".equals(urlP)) {
  507.                 throw new ProviderValidationException("La modalità di forward indicata prevede l'indicazione del nome di una proprietà della url");
  508.             }
  509.             if(urlP.contains(" ")) {
  510.                 throw new ProviderValidationException("Non indicare spazi nel nome della proprietà della url indicata per la modalità di forward");
  511.             }
  512.         }
  513.     }


  514.     @Override
  515.     public List<String> getValues(String id) throws ProviderException {
  516.         return this.getValues(id, null);
  517.     }
  518.     @Override
  519.     public List<String> getValues(String id, ExternalResources externalResources) throws ProviderException{
  520.         List<String> values = null;
  521.         if(Costanti.ID_RETRIEVE_TOKEN_METHOD.equals(id)) {
  522.             List<String> methodsList = new ArrayList<>();
  523.             methodsList.add(Costanti.ID_RETRIEVE_TOKEN_METHOD_CLIENT_CREDENTIAL);
  524.             methodsList.add(Costanti.ID_RETRIEVE_TOKEN_METHOD_USERNAME_PASSWORD);
  525.             methodsList.add(Costanti.ID_RETRIEVE_TOKEN_METHOD_RFC_7523_X509);
  526.             methodsList.add(Costanti.ID_RETRIEVE_TOKEN_METHOD_RFC_7523_CLIENT_SECRET);
  527.             methodsList.add(Costanti.ID_RETRIEVE_TOKEN_METHOD_CUSTOM);
  528.             return methodsList;
  529.         }
  530.         else if(Costanti.ID_TIPOLOGIA_HTTPS.equals(id)) {
  531.             List<String> tipologie = null;
  532.             try{
  533.                 tipologie = SSLUtilities.getSSLSupportedProtocols();
  534.             }catch(Exception e){
  535.                 tipologie = SSLUtilities.getAllSslProtocol();
  536.             }
  537.             return tipologie;
  538.         }
  539.         else if(Costanti.ID_RETRIEVE_TOKEN_JWT_SYMMETRIC_SIGN_ALGORITHM.equals(id) ||
  540.                 Costanti.ID_RETRIEVE_TOKEN_JWT_ASYMMETRIC_SIGN_ALGORITHM.equals(id)) {
  541.             return getValuesSignatureAlgorithm(id);
  542.         }
  543.         else if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE.equals(id) ||
  544.                 Costanti.ID_HTTPS_TRUSTSTORE_TYPE.equals(id) ||
  545.                 Costanti.ID_HTTPS_KEYSTORE_TYPE.equals(id)) {
  546.             return getStoreType(id,true);
  547.         }
  548.         else if(Costanti.ID_RETRIEVE_HTTP_METHOD.equals(id)) {
  549.             List<String> methodsList = new ArrayList<>();
  550.             HttpRequestMethod [] methods = HttpRequestMethod.values();
  551.             for (int i = 0; i < methods.length; i++) {
  552.                 methodsList.add(methods[i].name());
  553.             }
  554.             return methodsList;
  555.         }
  556.         else if(Costanti.ID_NEGOZIAZIONE_CUSTOM_PARSER_PLUGIN_CHOICE.equals(id)) {
  557.             return TokenUtilities.getTokenPluginValues(externalResources, TipoPlugin.TOKEN_NEGOZIAZIONE);
  558.         }
  559.         else if(Costanti.ID_HTTPS_TRUSTSTORE_OCSP_POLICY.equals(id)) {
  560.             return this.ocspProvider.getValues();
  561.         }
  562.         else if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_BYOK_POLICY.equals(id) ||
  563.                 Costanti.ID_HTTPS_KEYSTORE_BYOK_POLICY.equals(id)) {
  564.             return this.byokProvider.getValues();
  565.         }
  566.         return values;
  567.     }
  568.     private List<String> getValuesSignatureAlgorithm(String id) {
  569.         List<String> l = new ArrayList<>();
  570.         org.apache.cxf.rs.security.jose.jwa.SignatureAlgorithm [] tmp = org.apache.cxf.rs.security.jose.jwa.SignatureAlgorithm.values();
  571.         for (int i = 0; i < tmp.length; i++) {
  572.             if(org.apache.cxf.rs.security.jose.jwa.SignatureAlgorithm.NONE.equals(tmp[i])) {
  573.                 continue;
  574.             }
  575.             if(Costanti.ID_RETRIEVE_TOKEN_JWT_SYMMETRIC_SIGN_ALGORITHM.equals(id)) {
  576.                 if(tmp[i].name().toLowerCase().startsWith("hs")) {
  577.                     l.add(tmp[i].name());
  578.                 }
  579.             }
  580.             else {
  581.                 if(!tmp[i].name().toLowerCase().startsWith("hs")) {
  582.                     l.add(tmp[i].name());
  583.                 }
  584.             }
  585.         }
  586.         return l;
  587.     }

  588.     @Override
  589.     public List<String> getLabels(String id) throws ProviderException {
  590.         return this.getLabels(id, null);
  591.     }
  592.     @Override
  593.     public List<String> getLabels(String id, ExternalResources externalResources) throws ProviderException{
  594.         if(Costanti.ID_RETRIEVE_TOKEN_METHOD.equals(id)) {
  595.             List<String> methodsList = new ArrayList<>();
  596.             methodsList.add(Costanti.ID_RETRIEVE_TOKEN_METHOD_CLIENT_CREDENTIAL_LABEL);
  597.             methodsList.add(Costanti.ID_RETRIEVE_TOKEN_METHOD_USERNAME_PASSWORD_LABEL);
  598.             methodsList.add(Costanti.ID_RETRIEVE_TOKEN_METHOD_RFC_7523_X509_LABEL);
  599.             methodsList.add(Costanti.ID_RETRIEVE_TOKEN_METHOD_RFC_7523_CLIENT_SECRET_LABEL);
  600.             methodsList.add(Costanti.ID_RETRIEVE_TOKEN_METHOD_CUSTOM_LABEL);
  601.             return methodsList;
  602.         }
  603.         else if(Costanti.ID_RETRIEVE_TOKEN_JWT_SYMMETRIC_SIGN_ALGORITHM.equals(id) ||
  604.                 Costanti.ID_RETRIEVE_TOKEN_JWT_ASYMMETRIC_SIGN_ALGORITHM.equals(id)) {
  605.             return getLabelsSignatureAlgorithm(id);
  606.         }
  607.         else if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE.equals(id) ||
  608.                 Costanti.ID_HTTPS_TRUSTSTORE_TYPE.equals(id) ||
  609.                 Costanti.ID_HTTPS_KEYSTORE_TYPE.equals(id)) {
  610.             return getStoreType(id,false);
  611.         }
  612.         else if(Costanti.ID_NEGOZIAZIONE_CUSTOM_PARSER_PLUGIN_CHOICE.equals(id)) {
  613.             return TokenUtilities.getTokenPluginLabels(externalResources, TipoPlugin.TOKEN_NEGOZIAZIONE);
  614.         }
  615.         else if(Costanti.ID_HTTPS_TRUSTSTORE_OCSP_POLICY.equals(id)) {
  616.             return this.ocspProvider.getLabels();
  617.         }
  618.         else if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_BYOK_POLICY.equals(id) ||
  619.                 Costanti.ID_HTTPS_KEYSTORE_BYOK_POLICY.equals(id)) {
  620.             return this.byokProvider.getLabels();
  621.         }
  622.         return this.getValues(id); // torno uguale ai valori negli altri casi
  623.     }
  624.     private List<String> getLabelsSignatureAlgorithm(String id) throws ProviderException{
  625.         List<String> l = this.getValues(id);
  626.         List<String> labels = new ArrayList<>();
  627.         for (String value : l) {
  628.             if(value.contains("_")) {
  629.                 String t = "" + value;
  630.                 while(t.contains("_")) {
  631.                     t = t.replace("_", "-");
  632.                 }
  633.                 labels.add(t);
  634.             }
  635.             else {
  636.                 labels.add(value);
  637.             }
  638.         }
  639.         return labels;
  640.     }
  641.    
  642.     private static boolean secret = false;
  643.     public static boolean isSecret() {
  644.         return secret;
  645.     }
  646.     public static void setSecret(boolean secret) {
  647.         NegoziazioneTokenProvider.secret = secret;
  648.     }

  649.     private List<String> getStoreType(String id,boolean value){
  650.         boolean trustStore = true;
  651.         List<String> l = new ArrayList<>();
  652.         l.add(value ? SecurityConstants.KEYSTORE_TYPE_JKS_VALUE : SecurityConstants.KEYSTORE_TYPE_JKS_LABEL);
  653.         l.add(value ? SecurityConstants.KEYSTORE_TYPE_PKCS12_VALUE : SecurityConstants.KEYSTORE_TYPE_PKCS12_LABEL);
  654.         if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE.equals(id)) {
  655.             l.add(value ? SecurityConstants.KEYSTORE_TYPE_JWK_VALUE: SecurityConstants.KEYSTORE_TYPE_JWK_LABEL);
  656.             l.add(value ? SecurityConstants.KEYSTORE_TYPE_KEY_PAIR_VALUE: SecurityConstants.KEYSTORE_TYPE_KEY_PAIR_LABEL);
  657.         }
  658. /**     if(Costanti.UNKNOWN.equals(id)) {
  659. //          l.add(value ? SecurityConstants.KEYSTORE_TYPE_JCEKS_VALUE : SecurityConstants.KEYSTORE_TYPE_JCEKS_LABEL);
  660. //          secret = true;
  661. //      }
  662.         **/
  663.         if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE.equals(id)) {
  664.             l.add(value ? Costanti.KEYSTORE_TYPE_APPLICATIVO_MODI_VALUE: Costanti.KEYSTORE_TYPE_APPLICATIVO_MODI_LABEL);
  665.             l.add(value ? Costanti.KEYSTORE_TYPE_FRUIZIONE_MODI_VALUE: Costanti.KEYSTORE_TYPE_FRUIZIONE_MODI_LABEL);
  666.         }
  667.        
  668.         if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE.equals(id) ||
  669.                 Costanti.ID_HTTPS_KEYSTORE_TYPE.equals(id)) {
  670.             trustStore = false;
  671.         }
  672.         HSMUtils.fillTipologieKeystore(trustStore, false, l);
  673.        
  674.         if(secret) {
  675.             // aggiunto info mancanti come secret
  676.             addStoreTypeSecret(l);
  677.         }
  678.         return l;
  679.     }
  680.     private void addStoreTypeSecret(List<String> l) {
  681.         List<String> lSecret = new ArrayList<>();
  682.         HSMUtils.fillTipologieKeystore(false, true, lSecret);
  683.         if(!lSecret.isEmpty()) {
  684.             for (String type : lSecret) {
  685.                 if(!l.contains(type)) {
  686.                     l.add(type);
  687.                 }
  688.             }
  689.         }
  690.     }
  691.    

  692.     @Override
  693.     public String getDefault(String id) throws ProviderException {
  694.         return getDefault(id, null);
  695.     }
  696.     @Override
  697.     public String getDefault(String id, ExternalResources externalResources) throws ProviderException {
  698.         if(Costanti.ID_RETRIEVE_TOKEN_METHOD.equals(id)) {
  699.             return Costanti.ID_RETRIEVE_TOKEN_METHOD_CLIENT_CREDENTIAL;
  700.         }
  701.         else if(Costanti.ID_TIPOLOGIA_HTTPS.equals(id)) {
  702.             return SSLUtilities.getSafeDefaultProtocol();
  703.         }
  704.         else if(Costanti.ID_RETRIEVE_TOKEN_JWT_EXPIRED_TTL_SECONDS.equals(id)) {
  705.             return Costanti.POLICY_RETRIEVE_TOKEN_JWT_EXPIRED_TTL_SECONDS_DEFAULT_VALUE;
  706.         }
  707.         else if(Costanti.ID_RETRIEVE_TOKEN_JWT_SYMMETRIC_SIGN_ALGORITHM.equals(id)) {
  708.             return org.apache.cxf.rs.security.jose.jwa.SignatureAlgorithm.HS256.name();
  709.         }
  710.         else if(Costanti.ID_RETRIEVE_TOKEN_JWT_ASYMMETRIC_SIGN_ALGORITHM.equals(id)) {
  711.             return org.apache.cxf.rs.security.jose.jwa.SignatureAlgorithm.RS256.name();
  712.         }
  713.         else if(Costanti.ID_RETRIEVE_HTTP_METHOD.equals(id)) {
  714.             return HttpRequestMethod.GET.name();
  715.         }
  716.         return null;
  717.     }

  718.     private boolean isProviderInfoStandard(String id) {
  719.         return
  720.             Costanti.ID_RETRIEVE_ENDPOINT_URL.equals(id) ||
  721.             Costanti.ID_RETRIEVE_AUTENTICAZIONE_USERNAME.equals(id) ||
  722.             Costanti.ID_RETRIEVE_AUTENTICAZIONE_PASSWORD.equals(id) ||
  723.             Costanti.ID_RETRIEVE_CLIENT_ID.equals(id) ||
  724.             Costanti.ID_RETRIEVE_CLIENT_ID_CUSTOM.equals(id) ||
  725.             Costanti.ID_RETRIEVE_CLIENT_SECRET.equals(id) ||
  726.             Costanti.ID_RETRIEVE_CLIENT_SECRET_CUSTOM.equals(id) ||
  727.             Costanti.ID_RETRIEVE_BEARER_TOKEN.equals(id) ||
  728.             Costanti.ID_RETRIEVE_JWT_X5U.equals(id) ||
  729.             Costanti.ID_RETRIEVE_JWT_KID_VALUE.equals(id) ||
  730.             Costanti.ID_RETRIEVE_SCOPE.equals(id) ||
  731.             Costanti.ID_RETRIEVE_AUDIENCE.equals(id) ||
  732.             Costanti.ID_RETRIEVE_FORM_PARAMETERS.equals(id) ||
  733.             Costanti.ID_RETRIEVE_HTTP_CONTENT_TYPE.equals(id) ||
  734.             Costanti.ID_RETRIEVE_HTTP_HEADERS.equals(id) ||
  735.             Costanti.ID_RETRIEVE_HTTP_TEMPLATE_PAYLOAD.equals(id);
  736.     }
  737.     @Override
  738.     public ProviderInfo getProviderInfo(String id) throws ProviderException{
  739.         if(isProviderInfoStandard(id)) {
  740.             ProviderInfo pInfo = new ProviderInfo();
  741.             pInfo.setHeaderBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_INFO_TRASPORTO);
  742.             pInfo.setListBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_TOKEN_INFO_VALORI);
  743.             return pInfo;
  744.         }
  745.         else if(Costanti.ID_RETRIEVE_JWT_ISSUER.equals(id) ||
  746.                 Costanti.ID_RETRIEVE_JWT_ISSUER_APPLICATIVO_MODI_CUSTOM.equals(id)
  747.                 ) {
  748.             ProviderInfo pInfo = new ProviderInfo();
  749.             pInfo.setHeaderBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_ISSUER);
  750.             pInfo.setListBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_TOKEN_INFO_VALORI_CON_OPZIONE_VALORE_NON_DEFINITO);
  751.             return pInfo;
  752.         }
  753.         else if(Costanti.ID_RETRIEVE_JWT_SUBJECT.equals(id) ||
  754.                 Costanti.ID_RETRIEVE_JWT_SUBJECT_APPLICATIVO_MODI_CUSTOM.equals(id)
  755.                 ) {
  756.             ProviderInfo pInfo = new ProviderInfo();
  757.             pInfo.setHeaderBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_SUBJECT);
  758.             pInfo.setListBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_TOKEN_INFO_VALORI_CON_OPZIONE_VALORE_NON_DEFINITO);
  759.             return pInfo;
  760.         }
  761.         else if(Costanti.ID_RETRIEVE_JWT_IDENTIFIER.equals(id)
  762.                 ) {
  763.             ProviderInfo pInfo = new ProviderInfo();
  764.             pInfo.setHeaderBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_IDENTIFIER);
  765.             pInfo.setListBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_TOKEN_INFO_VALORI_CON_OPZIONE_VALORE_NON_DEFINITO);
  766.             return pInfo;
  767.         }
  768.         else if(Costanti.ID_RETRIEVE_JWT_CLIENT_ID.equals(id) ||
  769.                 Costanti.ID_RETRIEVE_JWT_CLIENT_ID_APPLICATIVO_MODI_CUSTOM.equals(id) ||
  770.                 Costanti.ID_RETRIEVE_JWT_AUDIENCE.equals(id) ||
  771.                 Costanti.ID_RETRIEVE_JWT_PURPOSE_ID.equals(id) ||
  772.                 Costanti.ID_RETRIEVE_FORM_RESOURCE.equals(id)
  773.                 ) {
  774.             ProviderInfo pInfo = new ProviderInfo();
  775.             pInfo.setHeaderBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_INFO_TRASPORTO);
  776.             pInfo.setListBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_TOKEN_INFO_VALORI_CON_OPZIONE_VALORE_NON_DEFINITO);
  777.             return pInfo;
  778.         }
  779.         else if(Costanti.ID_RETRIEVE_FORM_CLIENT_ID.equals(id) ||
  780.                 Costanti.ID_RETRIEVE_FORM_CLIENT_ID_APPLICATIVO_MODI_CUSTOM.equals(id)
  781.                 ) {
  782.             ProviderInfo pInfo = new ProviderInfo();
  783.             pInfo.setHeaderBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_FORM_PARAMETRO_CLIENT_ID);
  784.             pInfo.setListBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_TOKEN_INFO_VALORI_CON_OPZIONE_VALORE_NON_DEFINITO);
  785.             return pInfo;
  786.         }
  787.         else if(Costanti.ID_RETRIEVE_JWT_CLAIMS.equals(id) ||
  788.                 Costanti.ID_RETRIEVE_JWT_SESSION_INFO.equals(id)
  789.                 ) {
  790.             ProviderInfo pInfo = new ProviderInfo();
  791.             pInfo.setHeaderBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_CLAIMS);
  792.             pInfo.setListBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_TOKEN_INFO_VALORI);
  793.             return pInfo;
  794.         }
  795.         else if(Costanti.ID_RETRIEVE_HTTP_FREEMARKER_PAYLOAD.equals(id)) {
  796.             ProviderInfo pInfo = new ProviderInfo();
  797.             pInfo.setHeaderBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_INFO_OBJECT_TEMPLATE_FREEMARKER);
  798.             pInfo.setListBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_TOKEN_INFO_OBJECT_VALORI);
  799.             return pInfo;
  800.         }
  801.         else if(Costanti.ID_RETRIEVE_HTTP_VELOCITY_PAYLOAD.equals(id)) {
  802.             ProviderInfo pInfo = new ProviderInfo();
  803.             pInfo.setHeaderBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_INFO_OBJECT_TEMPLATE_VELOCITY);
  804.             pInfo.setListBody(DynamicHelperCostanti.LABEL_CONFIGURAZIONE_NEGOZIAZIONE_TOKEN_INFO_OBJECT_VALORI);
  805.             return pInfo;
  806.         }
  807.         else if(Costanti.ID_NEGOZIAZIONE_CUSTOM_PARSER_PLUGIN_CLASSNAME.equals(id)) {
  808.             return getProviderInfoCustomParserPluginClassname();
  809.         }
  810.        
  811.         return null;
  812.     }
  813.     private ProviderInfo getProviderInfoCustomParserPluginClassname() {
  814.         ProviderInfo pInfo = new ProviderInfo();
  815.         pInfo.setHeaderBody(DynamicHelperCostanti.PLUGIN_CLASSNAME_INFO_SINGOLA);
  816.         pInfo.setListBody(new ArrayList<>());
  817.         pInfo.getListBody().add(INegoziazioneTokenParser.class.getName());
  818.         return pInfo;
  819.     }
  820.    
  821.     @Override
  822.     public String dynamicUpdate(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {
  823.         return dynamicUpdate(items, mapNameValue, item, actualValue, null);
  824.     }
  825.     @Override
  826.     public String dynamicUpdate(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue, ExternalResources externalResources) {
  827.    
  828.         if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_FILE.equals(item.getName()) ||
  829.                 Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_FILE_PRIVATE_KEY.equals(item.getName()) ||
  830.                 Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_FILE_PUBLIC_KEY.equals(item.getName()) ||
  831.                 Costanti.ID_HTTPS_TRUSTSTORE_FILE.equals(item.getName()) ||
  832.                 Costanti.ID_HTTPS_KEYSTORE_FILE.equals(item.getName())) {
  833.             return dynamicUpdateStoreFile(items, mapNameValue, item, actualValue);
  834.         }
  835.         else if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_PASSWORD.equals(item.getName()) ||
  836.                 Costanti.ID_HTTPS_TRUSTSTORE_PASSWORD.equals(item.getName()) ||
  837.                 Costanti.ID_HTTPS_KEYSTORE_PASSWORD.equals(item.getName())) {
  838.             return dynamicUpdateStorePassword(items, mapNameValue, item, actualValue);
  839.         }
  840.         else if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_PASSWORD_PRIVATE_KEY.equals(item.getName()) ||
  841.                 Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_PASSWORD_PRIVATE_KEY_OPZIONALE.equals(item.getName()) ||
  842.                 Costanti.ID_HTTPS_KEYSTORE_PASSWORD_PRIVATE_KEY.equals(item.getName()) ) {
  843.             return dynamicUpdateStoreKeyPassword(items, mapNameValue, item, actualValue);  
  844.         }
  845.         else if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_ALIAS_PRIVATE_KEY.equals(item.getName()) ) {
  846.             return dynamicUpdateStoreKeyAlias(items, mapNameValue, item, actualValue);
  847.         }      
  848.         else if(Costanti.ID_NEGOZIAZIONE_CUSTOM_PARSER_PLUGIN_CHOICE.equals(item.getName())) {
  849.             return TokenUtilities.dynamicUpdateTokenPluginChoice(externalResources, TipoPlugin.TOKEN_NEGOZIAZIONE, item, actualValue);
  850.         }
  851.         else if(Costanti.ID_NEGOZIAZIONE_CUSTOM_PARSER_PLUGIN_CLASSNAME.equals(item.getName())) {
  852.             return TokenUtilities.dynamicUpdateTokenPluginClassName(externalResources, TipoPlugin.TOKEN_NEGOZIAZIONE,
  853.                     items, mapNameValue, item,
  854.                     Costanti.ID_NEGOZIAZIONE_CUSTOM_PARSER_PLUGIN_CHOICE, actualValue);        
  855.         }
  856.         else if(Costanti.ID_HTTPS_TRUSTSTORE_OCSP_POLICY.equals(item.getName())) {
  857.             if(!this.ocspProvider.isOcspEnabled()) {
  858.                 item.setValue("");
  859.                 item.setType(ItemType.HIDDEN);
  860.             }
  861.         }
  862.         else if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_BYOK_POLICY.equals(item.getName()) ||
  863.                 Costanti.ID_HTTPS_KEYSTORE_BYOK_POLICY.equals(item.getName())) {
  864.             return dynamicUpdateByok(items, mapNameValue, item, actualValue);
  865.         }
  866.        
  867.         return actualValue;
  868.     }
  869.     private String dynamicUpdateStoreFile(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {
  870.         String type = Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE;
  871.         if(Costanti.ID_HTTPS_TRUSTSTORE_FILE.equals(item.getName())) {
  872.             type = Costanti.ID_HTTPS_TRUSTSTORE_TYPE;
  873.         }
  874.         else if(Costanti.ID_HTTPS_KEYSTORE_FILE.equals(item.getName())) {
  875.             type = Costanti.ID_HTTPS_KEYSTORE_TYPE;
  876.         }
  877.        
  878.         if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE.equals(type)) {
  879.             String typeValue = AbstractSecurityProvider.readValue(type, items, mapNameValue);
  880.             if(Costanti.KEYSTORE_TYPE_APPLICATIVO_MODI_VALUE.equals(typeValue) || Costanti.KEYSTORE_TYPE_FRUIZIONE_MODI_VALUE.equals(typeValue)) {
  881.                 item.setValue(typeValue);
  882.                 item.setType(ItemType.HIDDEN);
  883.                 return item.getValue();
  884.             }
  885.         }
  886.        
  887.         return AbstractSecurityProvider.processStoreFile(type, items, mapNameValue, item, actualValue);
  888.     }
  889.     private String dynamicUpdateStorePassword(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {
  890.         String type = Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE;
  891.         boolean keystore = true;
  892.         if(Costanti.ID_HTTPS_TRUSTSTORE_PASSWORD.equals(item.getName())) {
  893.             type = Costanti.ID_HTTPS_TRUSTSTORE_TYPE;
  894.             keystore = false;
  895.         }
  896.         else if(Costanti.ID_HTTPS_KEYSTORE_PASSWORD.equals(item.getName())) {
  897.             type = Costanti.ID_HTTPS_KEYSTORE_TYPE;
  898.         }
  899.        
  900.         if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE.equals(type)) {
  901.             String typeValue = AbstractSecurityProvider.readValue(type, items, mapNameValue);
  902.             if(Costanti.KEYSTORE_TYPE_APPLICATIVO_MODI_VALUE.equals(typeValue) || Costanti.KEYSTORE_TYPE_FRUIZIONE_MODI_VALUE.equals(typeValue)) {
  903.                 item.setValue("-");
  904.                 item.setType(ItemType.HIDDEN);
  905.                 return item.getValue();
  906.             }
  907.         }
  908.        
  909.         return AbstractSecurityProvider.processStorePassword(keystore, type, items, mapNameValue, item, actualValue);
  910.     }
  911.     private String dynamicUpdateStoreKeyPassword(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {
  912.         String type = Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE;
  913.         if(Costanti.ID_HTTPS_KEYSTORE_PASSWORD_PRIVATE_KEY.equals(item.getName())) {
  914.             type = Costanti.ID_HTTPS_KEYSTORE_TYPE;
  915.         }
  916.        
  917.         if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE.equals(type)) {
  918.             String typeValue = AbstractSecurityProvider.readValue(type, items, mapNameValue);
  919.             if(Costanti.KEYSTORE_TYPE_APPLICATIVO_MODI_VALUE.equals(typeValue) || Costanti.KEYSTORE_TYPE_FRUIZIONE_MODI_VALUE.equals(typeValue)) {
  920.                 item.setValue("-");
  921.                 item.setType(ItemType.HIDDEN);
  922.                 return item.getValue();
  923.             }
  924.         }
  925.        
  926.         return AbstractSecurityProvider.processStoreKeyPassword(type, items, mapNameValue, item, actualValue);
  927.     }
  928.     private String dynamicUpdateStoreKeyAlias(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {
  929.         String type = Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE;
  930.        
  931.         String typeValue = AbstractSecurityProvider.readValue(type, items, mapNameValue);
  932.         if(Costanti.KEYSTORE_TYPE_APPLICATIVO_MODI_VALUE.equals(typeValue) || Costanti.KEYSTORE_TYPE_FRUIZIONE_MODI_VALUE.equals(typeValue)) {
  933.             item.setValue("-");
  934.             item.setType(ItemType.HIDDEN);
  935.             return item.getValue();
  936.         }
  937.         else {
  938.             item.setType(ItemType.TEXT);
  939.             return actualValue;
  940.         }
  941.     }
  942.     private String dynamicUpdateByok(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {      
  943.         if(!this.byokProvider.isByokEnabled()) {
  944.             item.setValue("");
  945.             item.setType(ItemType.HIDDEN);
  946.             return actualValue;
  947.         }
  948.         else {
  949.             return dynamicUpdateByokPolicy(items, mapNameValue, item, actualValue);
  950.         }
  951.     }
  952.     private String dynamicUpdateByokPolicy(List<?> items, Map<String, String> mapNameValue, Item item, String actualValue) {
  953.         String type = null;
  954.         if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_BYOK_POLICY.equals(item.getName())) {
  955.             type = Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE;
  956.         }
  957.         else if(Costanti.ID_HTTPS_KEYSTORE_BYOK_POLICY.equals(item.getName())) {
  958.             type = Costanti.ID_HTTPS_KEYSTORE_TYPE;
  959.         }
  960.        
  961.         if(Costanti.ID_NEGOZIAZIONE_JWT_KEYSTORE_TYPE.equals(type)) {
  962.             String typeValue = AbstractSecurityProvider.readValue(type, items, mapNameValue);
  963.             if(Costanti.KEYSTORE_TYPE_APPLICATIVO_MODI_VALUE.equals(typeValue) || Costanti.KEYSTORE_TYPE_FRUIZIONE_MODI_VALUE.equals(typeValue)) {
  964.                 item.setValue(typeValue);
  965.                 item.setType(ItemType.HIDDEN);
  966.                 return item.getValue();
  967.             }
  968.         }
  969.        
  970.         return AbstractSecurityProvider.processStoreByokPolicy(type, items, mapNameValue, item, actualValue);
  971.     }
  972. }