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