IdentificazioneApplicativoMittenteUtils.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 Link.it srl (https://link.it).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3, as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package org.openspcoop2.protocol.modipa.validator;
- import java.security.cert.X509Certificate;
- import java.util.List;
- import java.util.Map;
- import org.apache.commons.lang.StringUtils;
- import org.openspcoop2.core.config.Credenziali;
- import org.openspcoop2.core.config.ServizioApplicativo;
- import org.openspcoop2.core.config.constants.CostantiConfigurazione;
- import org.openspcoop2.core.config.constants.PortaApplicativaSoggettiFruitori;
- import org.openspcoop2.core.config.constants.StatoFunzionalita;
- import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
- import org.openspcoop2.core.config.driver.FiltroRicercaProtocolPropertyConfig;
- import org.openspcoop2.core.constants.CostantiLabel;
- import org.openspcoop2.core.id.IDServizioApplicativo;
- import org.openspcoop2.core.id.IDSoggetto;
- import org.openspcoop2.core.registry.PortaDominio;
- import org.openspcoop2.core.registry.Soggetto;
- import org.openspcoop2.message.OpenSPCoop2Message;
- import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
- import org.openspcoop2.pdd.core.GestoreRichieste;
- import org.openspcoop2.pdd.logger.MsgDiagnostico;
- import org.openspcoop2.pdd.services.core.RicezioneBusteGestioneAutenticazione;
- import org.openspcoop2.protocol.engine.ConfigurazioneFiltroServiziApplicativi;
- import org.openspcoop2.protocol.modipa.constants.ModIConsoleCostanti;
- import org.openspcoop2.protocol.modipa.constants.ModICostanti;
- import org.openspcoop2.protocol.registry.RegistroServiziManager;
- import org.openspcoop2.protocol.sdk.Busta;
- import org.openspcoop2.protocol.sdk.Context;
- import org.openspcoop2.protocol.sdk.IProtocolFactory;
- import org.openspcoop2.protocol.sdk.ProtocolException;
- import org.openspcoop2.protocol.sdk.Trasmissione;
- import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesUtils;
- import org.openspcoop2.protocol.sdk.registry.ProtocolFiltroRicercaServiziApplicativi;
- import org.openspcoop2.protocol.sdk.state.IState;
- import org.openspcoop2.protocol.sdk.state.RequestFruitore;
- import org.openspcoop2.protocol.sdk.state.RequestInfo;
- import org.openspcoop2.protocol.utils.ModIUtils;
- import org.openspcoop2.security.keystore.MerlinKeystore;
- import org.openspcoop2.security.keystore.cache.GestoreKeystoreCache;
- import org.openspcoop2.utils.certificate.ArchiveLoader;
- import org.openspcoop2.utils.certificate.ArchiveType;
- import org.openspcoop2.utils.certificate.Certificate;
- import org.openspcoop2.utils.certificate.CertificateInfo;
- import org.openspcoop2.utils.certificate.CertificateUtils;
- import org.openspcoop2.utils.certificate.PrincipalType;
- import org.slf4j.Logger;
- /**
- * IdentificazioneApplicativoMittenteUtils
- *
- * @author Poli Andrea (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class IdentificazioneApplicativoMittenteUtils {
-
- private IdentificazioneApplicativoMittenteUtils() {}
- private static void logError(Logger log, String msg, Exception e) {
- log.error(msg,e);
- }
-
- // invocato in AbstractModIValidazioneSintatticaCommons e di conseguenza in ModIValidazioneSintatticaRest e ModIValidazioneSintatticaSoap durante il trattamento del token di sicurezza
- public static IDServizioApplicativo identificazioneApplicativoMittenteByX509(Logger log, IState state, X509Certificate x509, OpenSPCoop2Message msg, Busta busta,
- Context context, IProtocolFactory<?> factory, RequestInfo requestInfo, MsgDiagnostico msgDiag) throws ProtocolException {
- try {
-
- /** SICUREZZA MESSAGGIO **/
-
- IDSoggetto idSoggettoMittente = null;
- if(busta.getTipoMittente()!=null && busta.getMittente()!=null) {
- idSoggettoMittente = new IDSoggetto(busta.getTipoMittente(),busta.getMittente());
- }
-
- IDServizioApplicativo idServizioApplicativo = null;
-
- boolean rilevatoSoggettoIntermediario = false;
-
- if(x509!=null) {
-
- CertificateInfo certificate = new CertificateInfo(x509, "applicativoMittente");
-
- RequestFruitore requestFruitoreToken = null;
- String certificateKey = null;
- try {
- certificateKey = GestoreRichieste.toCertificateKey(certificate);
- if(certificateKey!=null) {
- requestFruitoreToken = GestoreRichieste.readFruitoreTokenModI(requestInfo, certificateKey);
- }
- }catch(Exception t) {
- // ignore
- }
-
- if(certificateKey!=null && requestFruitoreToken!=null && requestFruitoreToken.getCertificateKey()!=null &&
- requestFruitoreToken.getCertificateKey().equals(certificateKey)) {
- idServizioApplicativo = requestFruitoreToken.getIdServizioApplicativoFruitore();
- }
- else {
- idServizioApplicativo = identificazioneApplicativoMittenteByX509Engine(state, requestInfo, certificate);
- }
-
- if(idServizioApplicativo!=null) {
- if(idSoggettoMittente==null) {
- idSoggettoMittente = idServizioApplicativo.getIdSoggettoProprietario();
- }
- // Non ha senso poter identificare entrambi con le stesse credenziali
- else if(!idServizioApplicativo.getIdSoggettoProprietario().equals(idSoggettoMittente)) {
- Soggetto soggettoCanale = RegistroServiziManager.getInstance(state).getSoggetto(idSoggettoMittente, null, requestInfo);
- if(ModIUtils.isSoggettoCanaleIntermediario(soggettoCanale, log)) {
- String idTransazione = null;
- if(context.containsKey(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)) {
- idTransazione = (String) context.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
- }
- RicezioneBusteGestioneAutenticazione.registraIntermediario(idSoggettoMittente, msgDiag, idTransazione, null, context);
- // assegno ad idSoggettoMittente il soggetto dell'applicativo
- idSoggettoMittente = idServizioApplicativo.getIdSoggettoProprietario();
- rilevatoSoggettoIntermediario = true;
- }
- else {
- String msgError = ModIUtils.getMessaggioErroreDominioCanaleDifferenteDominioApplicativo(idServizioApplicativo, idSoggettoMittente);
- throw new ProtocolException(msgError);
- }
- }
- }
-
- if(certificateKey!=null && requestFruitoreToken==null && idServizioApplicativo!=null) {
-
- ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
- RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(state);
-
- RequestFruitore rf = new RequestFruitore();
-
- rf.setIdSoggettoFruitore(idServizioApplicativo.getIdSoggettoProprietario());
- try {
- org.openspcoop2.core.registry.Soggetto soggettoRegistry = registroServiziManager.getSoggetto(idServizioApplicativo.getIdSoggettoProprietario(), null, requestInfo);
- rf.setSoggettoFruitoreRegistry(soggettoRegistry);
- }catch(Exception t) {
- logError(log, "Errore durante la lettura del soggetto '"+idServizioApplicativo.getIdSoggettoProprietario()+"' dal registro: "+t.getMessage(),t);
- }
- try {
- org.openspcoop2.core.config.Soggetto soggettoConfig = configurazionePdDManager.getSoggetto(idServizioApplicativo.getIdSoggettoProprietario(), requestInfo);
- rf.setSoggettoFruitoreConfig(soggettoConfig);
- }catch(Exception t) {
- logError(log, "Errore durante la lettura del soggetto '"+idServizioApplicativo.getIdSoggettoProprietario()+"' dalla configurazione: "+t.getMessage(),t);
- }
- try {
- String idPorta = configurazionePdDManager.getIdentificativoPorta(idServizioApplicativo.getIdSoggettoProprietario(), factory, requestInfo);
- rf.setSoggettoFruitoreIdentificativoPorta(idPorta);
- }catch(Exception t) {
- logError(log, "Errore durante la lettura dell'identificativo porta del soggetto '"+idServizioApplicativo.getIdSoggettoProprietario()+"' dal registro: "+t.getMessage(),t);
- }
- try {
- boolean soggettoVirtualeFRU = configurazionePdDManager.isSoggettoVirtuale(idServizioApplicativo.getIdSoggettoProprietario(), requestInfo);
- rf.setSoggettoFruitoreSoggettoVirtuale(soggettoVirtualeFRU);
- }catch(Exception t) {
- logError(log, "Errore durante la lettura dell'indicazione sul soggetto virtuale associato al soggetto '"+idServizioApplicativo.getIdSoggettoProprietario()+"' dal registro: "+t.getMessage(),t);
- }
- try {
- if(rf!=null) {
- if(rf.getSoggettoFruitoreRegistry().getPortaDominio()!=null &&
- StringUtils.isNotEmpty(rf.getSoggettoFruitoreRegistry().getPortaDominio())) {
- PortaDominio pdd = registroServiziManager.getPortaDominio(rf.getSoggettoFruitoreRegistry().getPortaDominio(), null, requestInfo);
- rf.setSoggettoFruitorePddReaded(true);
- rf.setSoggettoFruitorePdd(pdd);
- }
- else {
- rf.setSoggettoFruitorePddReaded(true);
- }
- }
- }catch(Exception t) {
- logError(log, "Errore durante la lettura dei dati della pdd del soggetto '"+idServizioApplicativo.getIdSoggettoProprietario()+"' dal registro: "+t.getMessage(),t);
- }
- try {
- String impl = registroServiziManager.getImplementazionePdD(idServizioApplicativo.getIdSoggettoProprietario(), null, requestInfo);
- rf.setSoggettoFruitoreImplementazionePdd(impl);
- }catch(Exception t) {
- logError(log, "Errore durante la lettura dell'implementazione pdd del soggetto '"+idServizioApplicativo.getIdSoggettoProprietario()+"' dal registro: "+t.getMessage(),t);
- }
-
- rf.setIdServizioApplicativoFruitore(idServizioApplicativo);
- try {
- org.openspcoop2.core.config.ServizioApplicativo sa = configurazionePdDManager.getServizioApplicativo(idServizioApplicativo, requestInfo);
- rf.setServizioApplicativoFruitore(sa);
- }catch(Exception t) {
- logError(log, "Errore durante la lettura del servizio applicativo '"+idServizioApplicativo+"' dalla configurazione: "+t.getMessage(),t);
- }
- // nel token non ha senso rf.setServizioApplicativoFruitoreAnonimo(saApplicativoToken==null);
-
- try {
- rf.setCertificateKey(certificateKey);
- GestoreRichieste.saveRequestFruitoreTokenModI(requestInfo, rf);
- } catch (Exception e) {
- logError(log, "Errore durante il salvataggio nella cache e nel thread context delle informazioni sul fruitore token ModI: "+e.getMessage(),e);
- }
-
- }
- }
-
- /** IMPOSTAZIONI */
-
- setInformazioniInBustaAndContext(log, state, busta, context, requestInfo,
- rilevatoSoggettoIntermediario, idSoggettoMittente, idServizioApplicativo);
-
- return idServizioApplicativo;
-
- }catch(Exception e) {
- logError(log, "Errore durante il riconoscimento dell'applicativo mittente (tramite la sicurezza messaggio): "+e.getMessage(),e);
- throw new ProtocolException(e.getMessage(),e);
- }
- }
-
- private static IDServizioApplicativo identificazioneApplicativoMittenteByX509Engine(IState state, RequestInfo requestInfo, CertificateInfo certificate) throws ProtocolException {
-
- try {
-
- ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
-
- String subject = null;
- if(certificate!=null && certificate.getCertificate()!=null) {
- subject = certificate.getCertificate().getSubjectX500Principal().toString();
- }
- String issuer = null;
- if(certificate!=null && certificate.getCertificate()!=null && certificate.getCertificate().getIssuerX500Principal()!=null) {
- issuer = certificate.getCertificate().getIssuerX500Principal().toString();
- }
-
- IDServizioApplicativo idServizioApplicativo = null;
-
- // NOTA: il fatto di essersi registrati come strict o come non strict è insito nella registrazione dell'applicativo
-
- // FIX: cerco solo applicativi del profilo ModI esterno
- ConfigurazioneFiltroServiziApplicativi filtroFirma = ConfigurazioneFiltroServiziApplicativi.getFiltroApplicativiModIFirma();
-
- // 1. Prima si cerca per certificato strict
- if(certificate!=null) {
- idServizioApplicativo = configurazionePdDManager.getIdServizioApplicativoByCredenzialiSsl(certificate, true,
- filtroFirma.getTipiSoggetti(), filtroFirma.isIncludiApplicativiNonModI(), filtroFirma.isIncludiApplicativiModIEsterni(), filtroFirma.isIncludiApplicativiModIInterni());
- }
- if(idServizioApplicativo==null &&
- // 2. Poi per certificato no strict
- certificate!=null) {
- idServizioApplicativo = configurazionePdDManager.getIdServizioApplicativoByCredenzialiSsl(certificate, false,
- filtroFirma.getTipiSoggetti(), filtroFirma.isIncludiApplicativiNonModI(), filtroFirma.isIncludiApplicativiModIEsterni(), filtroFirma.isIncludiApplicativiModIInterni());
- }
- if(idServizioApplicativo==null) {
- // 3. per subject/issuer
- idServizioApplicativo = configurazionePdDManager.getIdServizioApplicativoByCredenzialiSsl(subject, issuer,
- filtroFirma.getTipiSoggetti(), filtroFirma.isIncludiApplicativiNonModI(), filtroFirma.isIncludiApplicativiModIEsterni(), filtroFirma.isIncludiApplicativiModIInterni());
- }
- if(idServizioApplicativo==null) {
- // 4. solo per subject
- idServizioApplicativo = configurazionePdDManager.getIdServizioApplicativoByCredenzialiSsl(subject, null,
- filtroFirma.getTipiSoggetti(), filtroFirma.isIncludiApplicativiNonModI(), filtroFirma.isIncludiApplicativiModIEsterni(), filtroFirma.isIncludiApplicativiModIInterni());
- }
- if(idServizioApplicativo==null &&
- // 5. provare a vedere se si tratta di un applicativo interno (multi-tenant)
-
- StatoFunzionalita.ABILITATO.equals(configurazionePdDManager.getConfigurazioneMultitenant().getStato()) &&
- !PortaApplicativaSoggettiFruitori.SOGGETTI_ESTERNI.equals(configurazionePdDManager.getConfigurazioneMultitenant().getErogazioneSceltaSoggettiFruitori())) {
-
- ProtocolFiltroRicercaServiziApplicativi filtro = createFilter(subject, issuer);
-
- List<IDServizioApplicativo> list = null;
- try {
- list = configurazionePdDManager.getAllIdServiziApplicativi(filtro);
- }catch(DriverConfigurazioneNotFound notFound) {
- // ignore
- }
- if(list!=null) {
- for (IDServizioApplicativo idServizioApplicativoSubjectIssuerCheck : list) {
- // Possono esistere piu' sil che hanno un CN con subject e issuer.
-
- ServizioApplicativo sa = configurazionePdDManager.getServizioApplicativo(idServizioApplicativoSubjectIssuerCheck, requestInfo);
-
- java.security.cert.Certificate certificatoCheck = readServizioApplicativoByCertificate(sa, requestInfo);
- if(
- /**if(certificate.equals(certificatoCheck.getCertificate(),true)) {*/
- certificatoCheck instanceof java.security.cert.X509Certificate &&
- certificate!=null && certificate.equals(((java.security.cert.X509Certificate)certificatoCheck),true)) {
- idServizioApplicativo = idServizioApplicativoSubjectIssuerCheck;
- break;
- }
-
- }
- }
-
- }
-
- return idServizioApplicativo;
-
- }catch(Exception e) {
- throw new ProtocolException(e.getMessage(),e);
- }
- }
-
-
- public static IDServizioApplicativo identificazioneApplicativoMittenteByToken(Logger log, IState state, Busta busta, Context context, RequestInfo requestInfo, MsgDiagnostico msgDiag, StringBuilder errorDetails) throws ProtocolException {
- try {
-
- // letto tramite la sicurezza messaggio nella validazione sintattica
-
- IDSoggetto idSoggettoMittente = null;
- if(busta.getTipoMittente()!=null && busta.getMittente()!=null) {
- idSoggettoMittente = new IDSoggetto(busta.getTipoMittente(),busta.getMittente());
- }
-
- IDServizioApplicativo idServizioApplicativo = null;
- if(busta.getServizioApplicativoFruitore()!=null && idSoggettoMittente!=null) {
- idServizioApplicativo = new IDServizioApplicativo();
- idServizioApplicativo.setNome(busta.getServizioApplicativoFruitore());
- idServizioApplicativo.setIdSoggettoProprietario(idSoggettoMittente);
- }
-
- boolean rilevatoSoggettoIntermediario = false;
-
-
- /** SICUREZZA TOKEN **/
-
- IDServizioApplicativo idServizioApplicativoToken = null;
- if(context!=null && context.containsKey(org.openspcoop2.core.constants.Costanti.ID_APPLICATIVO_TOKEN)) {
- idServizioApplicativoToken = (IDServizioApplicativo) context.getObject(org.openspcoop2.core.constants.Costanti.ID_APPLICATIVO_TOKEN);
-
- if(idSoggettoMittente==null) {
- idSoggettoMittente = idServizioApplicativoToken.getIdSoggettoProprietario();
- }
- // Non ha senso poter identificare entrambi con le stesse credenziali
- else if(!idServizioApplicativoToken.getIdSoggettoProprietario().equals(idSoggettoMittente)) {
- Soggetto soggettoCanale = RegistroServiziManager.getInstance(state).getSoggetto(idSoggettoMittente, null, requestInfo);
- if(ModIUtils.isSoggettoCanaleIntermediario(soggettoCanale, log)) {
- String idTransazione = null;
- if(context.containsKey(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)) {
- idTransazione = (String) context.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
- }
- RicezioneBusteGestioneAutenticazione.registraIntermediario(idSoggettoMittente, msgDiag, idTransazione, null, context);
- // assegno ad idSoggettoMittente il soggetto dell'applicativo
- idSoggettoMittente = idServizioApplicativoToken.getIdSoggettoProprietario();
- rilevatoSoggettoIntermediario = true;
- }
- else {
- String msgError = ModIUtils.getMessaggioErroreDominioCanaleDifferenteDominioApplicativo(idServizioApplicativoToken, idSoggettoMittente);
- errorDetails.append(msgError);
- throw new ProtocolException(msgError);
- }
- }
-
- if(idServizioApplicativo!=null) {
- // già identificato anche in token di sicurezza messaggio
- // DEPRECATO: non può succedere, poichè se vi è attivo una autenticazione token, viene usata quella per identificare l'applicativo mittente
- // questo caso quindi non può succedere, si lascia il codice per controllo di robustezza
- if(!idServizioApplicativo.equals(idServizioApplicativoToken)) {
- String msgError = "Rilevati due token di sicurezza firmati da applicativi differenti: '"+idServizioApplicativo.getNome()+
- "' e '"+idServizioApplicativoToken.getNome()+"'";
- errorDetails.append(msgError);
- throw new ProtocolException(msgError);
- }
- }
- else {
- idServizioApplicativo = idServizioApplicativoToken;
- }
- }
- else {
- return null;
- }
-
-
- /** IMPOSTAZIONI */
-
- setInformazioniInBustaAndContext(log, state, busta, context, requestInfo,
- rilevatoSoggettoIntermediario, idSoggettoMittente, idServizioApplicativo);
-
- return idServizioApplicativo;
-
- }catch(Exception e) {
- logError(log, "Errore durante il riconoscimento dell'applicativo mittente (tramite il token): "+e.getMessage(),e);
- throw new ProtocolException(e.getMessage(),e);
- }
- }
-
-
- public static void checkApplicativoTokenByX509(Logger log, IDServizioApplicativo idServizioApplicativo,
- IState state, RequestInfo requestInfo,
- String tipoToken, CertificateInfo certificatoSicurezzaMessaggio, StringBuilder errorDetails) throws ProtocolException {
- try {
-
- ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
-
- ServizioApplicativo saToken = configurazionePdDManager.getServizioApplicativo(idServizioApplicativo, requestInfo);
-
- String cnSubjectSicurezzaMessaggio = certificatoSicurezzaMessaggio.getSubject().getCN();
- String subjectSicurezzaMessaggio = certificatoSicurezzaMessaggio.getSubject().toString();
- String issuerSicurezzaMessaggio = null;
- if(certificatoSicurezzaMessaggio.getIssuer()!=null) {
- issuerSicurezzaMessaggio = certificatoSicurezzaMessaggio.getIssuer().toString();
- }
-
- boolean registered = false;
- if(saToken.getInvocazionePorta()!=null){
- for(int z=0;z<saToken.getInvocazionePorta().sizeCredenzialiList();z++){
-
- if(saToken.getInvocazionePorta().getCredenziali(z).getTipo() == null // default
- ||
- CostantiConfigurazione.CREDENZIALE_SSL.equals(saToken.getInvocazionePorta().getCredenziali(z).getTipo())){
-
- Credenziali c = saToken.getInvocazionePorta().getCredenziali(z);
-
- // 1. Prima si cerca per certificato strict
- // 2. Poi per certificato no strict
- if(c.getCertificate()!=null &&
- cnSubjectSicurezzaMessaggio.equals(c.getCnSubject())) {
- Certificate cer = ArchiveLoader.load(ArchiveType.CER, c.getCertificate(), 0, null);
- boolean strict = true;
- if(certificatoSicurezzaMessaggio.equals(cer.getCertificate(),strict)) {
- registered=true;
- break;
- }
- if(certificatoSicurezzaMessaggio.equals(cer.getCertificate(),!strict)) {
- registered=true;
- break;
- }
- }
-
- // 3. per subject/issuer
- // 4. solo per subject
- if(c.getSubject()!=null) {
-
- boolean subjectValid = CertificateUtils.sslVerify(c.getSubject(), subjectSicurezzaMessaggio, PrincipalType.SUBJECT, log);
- boolean issuerValid = true;
- if(subjectValid &&
- c.getIssuer()!=null &&
- issuerSicurezzaMessaggio!=null) {
- issuerValid = CertificateUtils.sslVerify(c.getIssuer(), issuerSicurezzaMessaggio, PrincipalType.ISSUER, log);
- }
-
- if(subjectValid && issuerValid){
- registered=true;
- break;
- }
- }
-
- }
-
- }
- }
-
- // 5. provare a vedere se si tratta di un applicativo interno (multi-tenant)
-
- if(!registered &&
- StatoFunzionalita.ABILITATO.equals(configurazionePdDManager.getConfigurazioneMultitenant().getStato()) &&
- !PortaApplicativaSoggettiFruitori.SOGGETTI_ESTERNI.equals(configurazionePdDManager.getConfigurazioneMultitenant().getErogazioneSceltaSoggettiFruitori())) {
-
- java.security.cert.Certificate certificatoCheck = readServizioApplicativoByCertificate(saToken, requestInfo);
- if(
- /**if(certificate.equals(certificatoCheck.getCertificate(),true)) {*/
- certificatoCheck instanceof java.security.cert.X509Certificate &&
- certificatoSicurezzaMessaggio.equals(((java.security.cert.X509Certificate)certificatoCheck),true)) {
- registered=true;
- }
- }
-
- if(!registered) {
-
- StringBuilder sb = new StringBuilder();
- sb.append("subject=\"").append(subjectSicurezzaMessaggio).append("\"");
- if(issuerSicurezzaMessaggio!=null) {
- sb.append(" issuer=\"").append(issuerSicurezzaMessaggio).append("\"");
- }
-
- String idApp = idServizioApplicativo.getNome() + " (Soggetto: "+idServizioApplicativo.getIdSoggettoProprietario().getNome()+")";
- String msgError = "Applicativo Mittente "+idApp+" non autorizzato; il certificato di firma ("+sb.toString()+") del security token ("+tipoToken+") non corrisponde all'applicativo";
- errorDetails.append(msgError);
- throw new ProtocolException(msgError);
- }
-
- }catch(Exception e) {
- logError(log, "Errore durante la verifica del certificato di firma associato all'applicativo token: "+e.getMessage(),e);
- throw new ProtocolException(e.getMessage(),e);
- }
- }
-
-
-
- public static void setInformazioniInBustaAndContext(Logger log, IState state, Busta busta, Context context, RequestInfo requestInfo,
- boolean rilevatoSoggettoIntermediario, IDSoggetto idSoggettoMittente, IDServizioApplicativo idServizioApplicativo) throws ProtocolException {
- try {
-
- if(idSoggettoMittente!=null) {
- busta.setTipoMittente(idSoggettoMittente.getTipo());
- busta.setMittente(idSoggettoMittente.getNome());
-
- if(rilevatoSoggettoIntermediario) {
- // devo aggiornare anche altri campi della busta
- try {
- RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(state);
- Soggetto soggetto = registroServiziManager.getSoggetto(idSoggettoMittente, null, requestInfo);
- busta.setIdentificativoPortaMittente(soggetto.getIdentificativoPorta());
- if(busta.sizeListaTrasmissioni()==1) {
- Trasmissione tr = busta.getTrasmissione(0);
- tr.setTipoOrigine(idSoggettoMittente.getTipo());
- tr.setOrigine(idSoggettoMittente.getNome());
- tr.setIdentificativoPortaOrigine(soggetto.getIdentificativoPorta());
- }
- }catch(Exception t) {
- // ignore
- }
- }
-
- try {
- if(!context.containsKey(org.openspcoop2.core.constants.Costanti.PROPRIETA_SOGGETTO_FRUITORE)) {
- RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(state);
- Soggetto soggetto = registroServiziManager.getSoggetto(idSoggettoMittente, null, requestInfo);
- Map<String, String> configProperties = registroServiziManager.getProprietaConfigurazione(soggetto);
- if (configProperties != null && !configProperties.isEmpty()) {
- context.addObject(org.openspcoop2.core.constants.Costanti.PROPRIETA_SOGGETTO_FRUITORE, configProperties);
- }
- }
- }catch(Exception t) {
- // ignore
- }
- }
-
- }catch(Exception e) {
- logError(log, "Errore durante l'impostazione nel contest del soggetto mittente: "+e.getMessage(),e);
- throw new ProtocolException(e.getMessage(),e);
- }
-
- try {
-
- if(idServizioApplicativo!=null) {
- busta.setServizioApplicativoFruitore(idServizioApplicativo.getNome());
-
- try {
- if(!context.containsKey(org.openspcoop2.core.constants.Costanti.PROPRIETA_APPLICATIVO)) {
- ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
- ServizioApplicativo sa = configurazionePdDManager.getServizioApplicativo(idServizioApplicativo, requestInfo);
- Map<String, String> configProperties = configurazionePdDManager.getProprietaConfigurazione(sa);
- if (configProperties != null && !configProperties.isEmpty()) {
- context.addObject(org.openspcoop2.core.constants.Costanti.PROPRIETA_APPLICATIVO, configProperties);
- }
- }
- }catch(Exception t) {
- // ignore
- }
- }
-
- }catch(Exception e) {
- logError(log, "Errore durante l'impostazione nel contest dell'applicativo mittente: "+e.getMessage(),e);
- throw new ProtocolException(e.getMessage(),e);
- }
- }
-
-
-
-
- public static ProtocolFiltroRicercaServiziApplicativi createFilter(String subject, String issuer) {
- ProtocolFiltroRicercaServiziApplicativi filtro = new ProtocolFiltroRicercaServiziApplicativi();
-
- filtro.setTipoSoggetto(CostantiLabel.MODIPA_PROTOCOL_NAME);
-
- FiltroRicercaProtocolPropertyConfig filtroSubject = new FiltroRicercaProtocolPropertyConfig();
- filtroSubject.setName(ModICostanti.MODIPA_KEY_CN_SUBJECT);
- filtroSubject.setValueAsString(subject);
- filtro.addProtocolProperty(filtroSubject);
-
- FiltroRicercaProtocolPropertyConfig filtroIssuer = new FiltroRicercaProtocolPropertyConfig();
- filtroIssuer.setName(ModICostanti.MODIPA_KEY_CN_ISSUER);
- filtroIssuer.setValueAsString(issuer);
- filtro.addProtocolProperty(filtroIssuer);
-
- return filtro;
- }
-
- public static java.security.cert.Certificate readServizioApplicativoByCertificate(ServizioApplicativo sa, RequestInfo requestInfo) throws ProtocolException {
- if(sa!=null && sa.sizeProtocolPropertyList()>0) {
-
- java.security.cert.Certificate certificatoCheck = null;
-
- String mode = ProtocolPropertiesUtils.getOptionalStringValuePropertyConfig(sa.getProtocolPropertyList(), ModICostanti.MODIPA_KEYSTORE_MODE);
- if(mode!=null && !"".equals(mode) && !ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_ARCHIVE.equals(mode)) {
-
- byte [] certificateBytes = ProtocolPropertiesUtils.getOptionalBinaryValuePropertyConfig(sa.getProtocolPropertyList(), ModICostanti.MODIPA_KEYSTORE_CERTIFICATE);
- if(certificateBytes!=null) {
- org.openspcoop2.utils.certificate.Certificate c = null;
- try {
- c = ArchiveLoader.load(certificateBytes);
- }catch(Exception e) {
- throw new ProtocolException(e.getMessage(),e);
- }
- if(c!=null && c.getCertificate()!=null) {
- certificatoCheck = c.getCertificate().getCertificate();
- }
- }
-
- }
- else {
-
- byte [] keystoreBytes = ProtocolPropertiesUtils.getOptionalBinaryValuePropertyConfig(sa.getProtocolPropertyList(), ModICostanti.MODIPA_KEYSTORE_ARCHIVE);
- String keystoreType = ProtocolPropertiesUtils.getOptionalStringValuePropertyConfig(sa.getProtocolPropertyList(), ModICostanti.MODIPA_KEYSTORE_TYPE);
- String keystorePassword = ProtocolPropertiesUtils.getOptionalStringValuePropertyConfig(sa.getProtocolPropertyList(), ModICostanti.MODIPA_KEYSTORE_PASSWORD);
- String keyAlias = ProtocolPropertiesUtils.getOptionalStringValuePropertyConfig(sa.getProtocolPropertyList(), ModICostanti.MODIPA_KEY_ALIAS);
- if(keystoreBytes!=null && keystoreType!=null && keystorePassword!=null && keyAlias!=null) {
- ArchiveType archiveType = null;
- if(ModIConsoleCostanti.MODIPA_KEYSTORE_TYPE_VALUE_JKS.equals(keystoreType)) {
- archiveType = ArchiveType.JKS;
- }
- else {
- archiveType = ArchiveType.PKCS12;
- }
- try {
- MerlinKeystore merlinKs = GestoreKeystoreCache.getMerlinKeystore(requestInfo, keystoreBytes, archiveType.name(),
- keystorePassword);
- certificatoCheck = merlinKs.getCertificate(keyAlias);
- }catch(Exception e) {
- throw new ProtocolException(e.getMessage(),e);
- }
- }
- }
- return certificatoCheck;
- }
-
- return null;
- }
- }