PrincipalUtilities.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.autenticazione;

import org.openspcoop2.core.config.constants.TipoAutenticazionePrincipal;
import org.openspcoop2.core.constants.Costanti;
import org.openspcoop2.core.transazioni.utils.TipoCredenzialeMittente;
import org.openspcoop2.pdd.core.PdDContext;
import org.openspcoop2.pdd.core.connettori.InfoConnettoreIngresso;
import org.openspcoop2.pdd.core.token.InformazioniToken;
import org.openspcoop2.utils.regexp.RegularExpressionEngine;

/**
 * PrincipalUtilities
 *
 * @author Andrea Poli (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class PrincipalUtilities {
	
	private PrincipalUtilities() {}

	public static String getPrincipal(TipoAutenticazionePrincipal tipoAutenticazionePrincipal, String nome, String pattern, TipoCredenzialeMittente token,
			InfoConnettoreIngresso infoConnettore, PdDContext pddContext, boolean throwException,
			StringBuilder fullCredential) throws AutenticazioneException {
		
		String principal = null;
		switch (tipoAutenticazionePrincipal) {
		case CONTAINER:
			if(infoConnettore!=null && infoConnettore.getCredenziali()!=null) {
				principal = infoConnettore.getCredenziali().getPrincipal();
			}
			if( (principal==null || "".equals(principal)) &&
				throwException) {
				throw new AutenticazioneException("["+tipoAutenticazionePrincipal+"] Principal non presente all'interno delle credenziali");
			}
			/**
			 * L'info 'container' viene gia' registrata in automatico tra le credenziali come principal.
			if(fullCredential.length()>0) {
				fullCredential.append("\n");
			}
			fullCredential.append("Principal").append(" (container) '").append(principal).append("'");
			*/
			return principal;
		case HEADER:
			if(nome==null && throwException) {
				throw new AutenticazioneException("["+tipoAutenticazionePrincipal+"] Nome dell'header, da cui estrarre il principal, non indicato");
			}
			if(nome!=null && infoConnettore!=null && infoConnettore.getUrlProtocolContext()!=null) {
				principal = infoConnettore.getUrlProtocolContext().getHeaderFirstValue(nome);
			}
			if( (principal==null || "".equals(principal)) &&
				throwException) {
				throw new AutenticazioneException("["+tipoAutenticazionePrincipal+"] Principal non presente nell'header http '"+nome+"'");
			}
			if(fullCredential.length()>0) {
				fullCredential.append("\n");
			}
			fullCredential.append("Principal").append(" (http) '").append(nome).append(": ").append(principal).append("'");
			return principal;
		case FORM:
			if(nome==null && throwException) {
				throw new AutenticazioneException("["+tipoAutenticazionePrincipal+"] Nome del parametro della query, da cui estrarre il principal, non indicato");
			}
			if(nome!=null && infoConnettore!=null && infoConnettore.getUrlProtocolContext()!=null) {
				principal = infoConnettore.getUrlProtocolContext().getParameterFirstValue(nome);
			}
			if( (principal==null || "".equals(principal)) &&
				throwException) {
				throw new AutenticazioneException("["+tipoAutenticazionePrincipal+"] Principal non presente nel parametro della query '"+nome+"'");
			}
			if(fullCredential.length()>0) {
				fullCredential.append("\n");
			}
			fullCredential.append("Principal").append(" (query) '").append(nome).append(": ").append(principal).append("'");
			return principal;
		case URL:
			if(pattern==null && throwException) {
				throw new AutenticazioneException("["+tipoAutenticazionePrincipal+"] Espressione Regolare, da utilizzare sulla url per estrarre il principal, non indicata");
			}
			String msgErrore = "["+tipoAutenticazionePrincipal+"] Principal non estraibile con l'espressione regolare '"+pattern+"', url non presente";
			if(pattern!=null && infoConnettore!=null && infoConnettore.getUrlProtocolContext()!=null) {
				msgErrore = "["+tipoAutenticazionePrincipal+"] Principal non estraibile con l'espressione regolare '"+pattern+"' dalla url '"+infoConnettore.getUrlProtocolContext().getUrlInvocazione_formBased()+"'";
				try {
					principal = RegularExpressionEngine.getStringMatchPattern(infoConnettore.getUrlProtocolContext().getUrlInvocazione_formBased(), pattern);
				}catch(Exception t) {
					if(throwException) {
						throw new AutenticazioneException(msgErrore+": "+t.getMessage(), t);
					}
				}
			}
			if( (principal==null || "".equals(principal)) &&
				throwException) {
				throw new AutenticazioneException(msgErrore);
			}
			/**
			 * La url viene gia' registrata in automatico tra le info della transazione
			if(fullCredential.length()>0) {
				fullCredential.append("\n");
			}
			fullCredential.append("Principal").append(" (url) '").append(principal).append("'");
			*/
			return principal;
		case INDIRIZZO_IP:
			if(pddContext!=null && pddContext.containsKey(Costanti.CLIENT_IP_REMOTE_ADDRESS)) {
				principal = PdDContext.getValue(Costanti.CLIENT_IP_REMOTE_ADDRESS, pddContext);
			}
			if( (principal==null || "".equals(principal)) &&
				throwException) {
				throw new AutenticazioneException("["+tipoAutenticazionePrincipal+"] Indirizzo IP del Client non disponibile");
			}
			/**
			 * Il client ip viene gia' registrato in automatico tra le info della transazione
			if(fullCredential.length()>0) {
				fullCredential.append("\n");
			}
			fullCredential.append("Principal").append(" (client-ip) '").append(principal).append("'");
			*/
			return principal;
		case INDIRIZZO_IP_X_FORWARDED_FOR:
			if(pddContext!=null && pddContext.containsKey(Costanti.CLIENT_IP_TRANSPORT_ADDRESS)) {
				principal = PdDContext.getValue(Costanti.CLIENT_IP_TRANSPORT_ADDRESS, pddContext);
			}
			if( (principal==null || "".equals(principal)) &&
				throwException) {
				throw new AutenticazioneException("["+tipoAutenticazionePrincipal+"] Indirizzo IP del Client, tramite 'X-Forwarded-For', non disponibile");
			}
			/**
			 * L'indirizzo ip forwared viene gia' registrato in automatico tra le info della transazione
			if(fullCredential.length()>0) {
				fullCredential.append("\n");
			}
			fullCredential.append("Principal").append(" (forwarded-ip) '").append(principal).append("'");
			*/
			return principal;
		// Ho levato il contenuto, poichè senno devo fare il digest per poterlo poi cachare
//			case CONTENT:
		case TOKEN:
			InformazioniToken informazioniTokenNormalizzate = null;
			if(pddContext!=null && pddContext.containsKey(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE)) {
				Object oInformazioniTokenNormalizzate = pddContext.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_TOKEN_INFORMAZIONI_NORMALIZZATE);
	    		if(oInformazioniTokenNormalizzate!=null) {
	    			informazioniTokenNormalizzate = (InformazioniToken) oInformazioniTokenNormalizzate;
	    		}
			}
			String nomeClaim = null;
			switch (token) {
			case TOKEN_ISSUER:
				nomeClaim = "issuer";
				if(informazioniTokenNormalizzate!=null) {
					principal = informazioniTokenNormalizzate.getIss();
				}
				break;
			case TOKEN_SUBJECT:
				nomeClaim = "subject";
				if(informazioniTokenNormalizzate!=null) {
					principal = informazioniTokenNormalizzate.getSub();
				}
				break;
			case TOKEN_CLIENT_ID:
				nomeClaim = "clientId";
				if(informazioniTokenNormalizzate!=null) {
					principal = informazioniTokenNormalizzate.getClientId();
				}
				break;
			case TOKEN_USERNAME:
				nomeClaim = "username";
				if(informazioniTokenNormalizzate!=null) {
					principal = informazioniTokenNormalizzate.getUsername();
				}
				break;
			case TOKEN_EMAIL:
				nomeClaim = "eMail";
				if(informazioniTokenNormalizzate!=null && informazioniTokenNormalizzate.getUserInfo()!=null) {
					principal = informazioniTokenNormalizzate.getUserInfo().getEMail();
				}
				break;
			case TRASPORTO:
				nomeClaim = nome;
				if(informazioniTokenNormalizzate!=null && informazioniTokenNormalizzate.getClaims()!=null) {
					Object oValueClaim = informazioniTokenNormalizzate.getClaims().get(nomeClaim);
					if(oValueClaim instanceof String) {
						principal = (String) oValueClaim;
					}
				}
				break;
			case PDND_CLIENT_JSON:
			case PDND_ORGANIZATION_JSON:
			case PDND_ORGANIZATION_NAME:
			case CLIENT_ADDRESS:
			case GRUPPI:
			case API:
			case EVENTI:
				// non usati in questo contesto
				break;
			}
			if( (principal==null || "".equals(principal)) &&
				throwException) {
				throw new AutenticazioneException("["+tipoAutenticazionePrincipal+"] Token claim '"+nomeClaim+"' non disponibile");
			}
			/**
			 * Le info sul token vengono gia' registrate in automatico tra le info della transazione
			if(fullCredential.length()>0) {
				fullCredential.append("\n");
			}
			fullCredential.append("Principal").append(" (token) '").append(nomeClaim).append(": ").append(principal).append("'");
			*/
			return principal;
		}
		return null;
	}
	
}