UtilitiesAutenticazione.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 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.pdd.core.integrazione;

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

import org.openspcoop2.core.config.Proprieta;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.Context;
import org.slf4j.Logger;

/**
 * Classe contenenti utilities per le integrazioni gestite tramite autenticazione
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class UtilitiesAutenticazione {

	private OpenSPCoop2Message msg;
	@SuppressWarnings("unused")
	private Context context;
	@SuppressWarnings("unused")
	private Busta busta;
	@SuppressWarnings("unused")
	private Logger log;
	
	private List<String> headers = null;
	private Map<String, String> hdrValues = null;
	
	public UtilitiesAutenticazione(HeaderIntegrazione integrazione,
			OutRequestPDMessage inRequestPDMessage, Context context, Logger log) throws HeaderIntegrazioneException {
		try {
			init(inRequestPDMessage.getMessage(), context, inRequestPDMessage.getBustaRichiesta(), log);
			
			List<Proprieta> proprieta = null;
			if(inRequestPDMessage.getPortaDelegata()!=null && inRequestPDMessage.getPortaDelegata().getProprietaList()!=null) {
				proprieta = inRequestPDMessage.getPortaDelegata().getProprietaList();
			}
			init(proprieta, true);
			
		}catch(Exception e) {
			throw new HeaderIntegrazioneException(e.getMessage(),e);
		}
	}
	
	public UtilitiesAutenticazione(HeaderIntegrazione integrazione,
			OutRequestPAMessage inRequestPAMessage, Context context, Logger log) throws HeaderIntegrazioneException {
		try {
			init(inRequestPAMessage.getMessage(), context, inRequestPAMessage.getBustaRichiesta(), log);
			
			List<Proprieta> proprieta = null;
			if(inRequestPAMessage.getPortaApplicativa()!=null && inRequestPAMessage.getPortaApplicativa().getProprietaList()!=null) {
				proprieta = inRequestPAMessage.getPortaApplicativa().getProprietaList();
			}
			init(proprieta, false);
			
		}catch(Exception e) {
			throw new HeaderIntegrazioneException(e.getMessage(),e);
		}
	}
	
	private void init(OpenSPCoop2Message msg, Context context, Busta busta, Logger log){
		this.msg = msg;
		this.context = context;
		this.busta = busta;
		this.log = log;
	}
	private void init(List<Proprieta> proprieta, boolean portaDelegata) throws HeaderIntegrazioneException {
		try {
			OpenSPCoop2Properties properties = OpenSPCoop2Properties.getInstance();

			if(portaDelegata) {
				this.headers = properties.getIntegrazioneAutenticazionePortaDelegataRequestHeaders();
				this.hdrValues = properties.getIntegrazioneAutenticazionePortaDelegataRequestHeadersMap();
			}
			else {
				this.headers = properties.getIntegrazioneAutenticazionePortaApplicativaRequestHeaders();
				this.hdrValues = properties.getIntegrazioneAutenticazionePortaApplicativaRequestHeadersMap();
			}
			
			if(proprieta!=null && !proprieta.isEmpty()) {
				
				String headersPropertyName = properties.getIntegrazioneAutenticazionePropertyHeaders();
				String headerPrefixPropertyName = properties.getIntegrazioneAutenticazionePropertyHeaderPrefix();
				
				for (Proprieta p : proprieta) {
					if(headersPropertyName.equalsIgnoreCase(p.getNome())) {
						this.headers = convert(p.getValore(), headersPropertyName);
					}
				}
				if(this.headers!=null && !this.headers.isEmpty()) {
					for (String hdr : this.headers) {
						String pName = headerPrefixPropertyName+hdr;
						for (Proprieta p : proprieta) {
							if(pName.equalsIgnoreCase(p.getNome())) {
								String valore = p.getValore();
								this.hdrValues.put(hdr, valore); // aggiorno valore se già definito
							}
						}
					}
				}
			}

			if(this.headers==null || this.headers.isEmpty()) {
				throw new HeaderIntegrazioneException("Nessun header di autenticazione configurato");
			}
			if(this.hdrValues==null || this.hdrValues.isEmpty()) {
				throw new HeaderIntegrazioneException("Nessun valore definito per gli header di autenticazione configurati");
			}
			for (String hdr : this.headers) {
				String v = this.hdrValues.get(hdr);
				if(v==null) {
					throw new HeaderIntegrazioneException("Nessun valore definito per l'header di autenticazione '"+hdr+"' configurato");
				}
			}

		}catch(Exception e) {
			throw new HeaderIntegrazioneException(e.getMessage(),e);
		}
	}

	public static List<String> convert(String headers, String pName) throws HeaderIntegrazioneException {
		try {
			List<String> l = new ArrayList<>();
			if(headers!=null) {
				headers = headers.trim();
				String [] split = headers.split(",");
				if(split!=null){
					for (int i = 0; i < split.length; i++) {
						String v = split[i];
						if(v!=null) {
							v = v.trim();
						}
						if(!"".equals(v)) {
							l.add(v);
						}
					}
				}
			}
			if(l.isEmpty()) {
				throw new HeaderIntegrazioneException("Trovata proprietà '"+pName+"' che non contiene alcun header");
			}
			return l;
		}catch(Exception e) {
			throw new HeaderIntegrazioneException(e.getMessage(),e);
		}
	}

		
	public void process() throws HeaderIntegrazioneException {
		try {
			if(this.msg==null) {
				return;
			}
			
			for (String hdr : this.headers) {
				String v = this.hdrValues.get(hdr);
				this.msg.forceTransportHeader(hdr, v);
			}
			
		}catch(Exception e) {
			throw new HeaderIntegrazioneException(e.getMessage(),e);
		}
	}
}