InformazioniIntegrazione.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.dynamic;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.openspcoop2.utils.io.Base64Utilities;
import org.openspcoop2.utils.io.HexBinaryUtilities;
import org.openspcoop2.utils.json.JSONUtils;
import org.openspcoop2.utils.transport.TransportRequestContext;
import org.openspcoop2.utils.transport.TransportResponseContext;
import org.openspcoop2.utils.xml2json.JsonXmlPathExpressionEngine;
import org.slf4j.Logger;
import com.fasterxml.jackson.databind.JsonNode;
/**
* InformazioniIntegrazioneCustom
*
* @author Poli Andrea (poli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class InformazioniIntegrazione extends org.openspcoop2.utils.beans.BaseBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public InformazioniIntegrazione() {} // per serializzatore
public InformazioniIntegrazione(InformazioniIntegrazioneSorgente sourceType, String sourceName, InformazioniIntegrazioneCodifica sourceEncodeType, boolean sourceRequired,
Logger log, TransportRequestContext transportRequestContext) throws Exception {
init(sourceType, sourceName, sourceEncodeType, sourceRequired,
log, transportRequestContext, null);
}
public InformazioniIntegrazione(InformazioniIntegrazioneSorgente sourceType, String sourceName, InformazioniIntegrazioneCodifica sourceEncodeType, boolean sourceRequired,
Logger log, TransportResponseContext transportResponseContext) throws Exception {
init(sourceType, sourceName, sourceEncodeType, sourceRequired,
log, null, transportResponseContext);
}
private static boolean logError = true;
public static boolean isLogError() {
return logError;
}
public static void setLogError(boolean logError) {
InformazioniIntegrazione.logError = logError;
}
private void init(InformazioniIntegrazioneSorgente sourceType, String sourceName, InformazioniIntegrazioneCodifica sourceEncodeType, boolean sourceRequired,
Logger log, TransportRequestContext transportRequestContext, TransportResponseContext transportResponseContext) throws Exception {
this.log = log;
this.sourceType = sourceType;
this.sourceName = sourceName;
this.sourceEncodeType = sourceEncodeType;
this.sourceRequired = sourceRequired;
if(this.sourceType==null) {
throw new Exception("Source type undefined");
}
if(this.sourceName==null) {
throw new Exception("Source name undefined");
}
if(this.sourceEncodeType==null) {
throw new Exception("Source encode type undefined");
}
if(transportRequestContext==null && transportResponseContext==null) {
throw new Exception("TransportContext undefined");
}
List<String> values = null;
String debugName = null;
switch (this.sourceType) {
case http_header:
if(transportRequestContext!=null) {
values = transportRequestContext.getHeaderValues(this.sourceName);
}
else if(transportResponseContext!=null) {
values = transportResponseContext.getHeaderValues(this.sourceName);
}
debugName = "http header "+this.sourceName;
break;
case query_parameter:
if(transportRequestContext!=null) {
values = transportRequestContext.getParameterValues(this.sourceName);
}
else {
throw new Exception("QueryParameter unsupported for transport response context");
}
debugName = "query parameter "+this.sourceName;
break;
}
if(values==null || values.isEmpty()) {
if(this.sourceRequired) {
throw new Exception("Required " +debugName+" not found");
}
else {
this.claims = new HashMap<>();
this.integrationInfo = new HashMap<>();
return;
}
}
if(values.size()>1) {
throw new Exception("Found more than one "+debugName+" ("+values.size()+")");
}
this.raw = values.get(0);
if(this.raw==null || StringUtils.isEmpty(this.raw)) {
throw new Exception("Found empty " +debugName);
}
switch (this.sourceEncodeType) {
case plain:
this.rawDecoded = this.raw.getBytes();
break;
case base64:
try {
this.rawDecoded = Base64Utilities.decode(this.raw);
}catch(Throwable t) {
throw new Exception("Base64 decode " +debugName+" failed: "+t.getMessage(),t);
}
break;
case hex:
try {
this.rawDecoded = HexBinaryUtilities.decode(this.raw);
}catch(Throwable t) {
throw new Exception("HEX decode " +debugName+" failed: "+t.getMessage(),t);
}
break;
case jwt:
try {
String [] split = this.raw.split("\\.");
if(split==null || split.length<2) {
throw new Exception("uncorrect jwt format");
}
String payload = split[1];
if(payload==null || StringUtils.isEmpty(payload)) {
throw new Exception("Found empty jwt payload in " +debugName);
}
this.rawDecoded = Base64Utilities.decode(payload);
}catch(Throwable t) {
throw new Exception("JWT decode " +debugName+" failed: "+t.getMessage(),t);
}
break;
}
//System.out.println("JSON ["+new String(this.rawDecoded)+"]");
JSONUtils jsonUtils = JSONUtils.getInstance();
JsonNode root = null;
if(logError) {
try {
root = jsonUtils.getAsNode(this.rawDecoded);
}catch(Throwable t) {
throw new Exception("Content in " +debugName+" isn't a json: "+t.getMessage(),t);
}
}
else {
if(jsonUtils.isJson(this.rawDecoded)) {
root = jsonUtils.getAsNode(this.rawDecoded);
}
}
if(root!=null) {
Map<String, Serializable> readClaims = jsonUtils.convertToSimpleMap(root);
if(readClaims!=null && readClaims.size()>0) {
this.claims.putAll(readClaims);
}
}
this.integrationInfo = jsonUtils.convertToMap(log, debugName, this.rawDecoded);
}
// NOTA: l'ordine stabilisce come viene serializzato nell'oggetto json
private transient Logger log;
// Informazioni
private Map<String, Serializable> integrationInfo;
// Claims
private Map<String,Object> claims = new HashMap<>();
// NOTA: l'ordine stabilisce come viene serializzato nell'oggetto json
// Raw
private String raw;
private byte[] rawDecoded;
// Nome dell'header HTTP dove sono stati reperite le informazioni
private InformazioniIntegrazioneSorgente sourceType;
private String sourceName;
private InformazioniIntegrazioneCodifica sourceEncodeType;
private boolean sourceRequired;
public Map<String, Serializable> getIntegrationInfo() {
return this.integrationInfo;
}
public Map<String, Serializable> getInfo() {
return this.integrationInfo;
}
public void setIntegrationInfo(Map<String, Serializable> integrationInfo) {
this.integrationInfo = integrationInfo;
}
public List<String> getInfoNames(){
return getIntegrationInfoNames();
}
public List<String> getIntegrationInfoNames(){
if(this.integrationInfo!=null && !this.integrationInfo.isEmpty()) {
List<String> attributesNames = new ArrayList<>();
for (String attrName : this.integrationInfo.keySet()) {
attributesNames.add(attrName);
}
Collections.sort(attributesNames);
return attributesNames;
}
return null;
}
public String getClaim(String name) throws Exception {
if(name==null) {
throw new Exception("Claim name is null");
}
String pattern ="$.."+name;
return JsonXmlPathExpressionEngine.extractAndConvertResultAsString(getRawDecodedAsString(), pattern, this.log);
}
public Map<String, Object> getClaims() {
return this.claims;
}
public void setClaims(Map<String, Object> claims) {
this.claims = claims;
}
public String getRaw() {
return this.raw;
}
public void setRaw(String raw) {
this.raw = raw;
}
public void setRawDecoded(byte[] rawDecoded) {
this.rawDecoded = rawDecoded;
}
public byte[] getRawDecoded() {
return this.rawDecoded;
}
public String getRawDecodedAsString() {
return new String(this.rawDecoded);
}
public InformazioniIntegrazioneSorgente getSourceType() {
return this.sourceType;
}
public void setSourceType(InformazioniIntegrazioneSorgente sourceType) {
this.sourceType = sourceType;
}
public void setSourceName(String sourceName) {
this.sourceName = sourceName;
}
public void setSourceEncodeType(InformazioniIntegrazioneCodifica sourceEncodeType) {
this.sourceEncodeType = sourceEncodeType;
}
public void setSourceRequired(boolean sourceRequired) {
this.sourceRequired = sourceRequired;
}
public String getSourceName() {
return this.sourceName;
}
public InformazioniIntegrazioneCodifica getSourceEncodeType() {
return this.sourceEncodeType;
}
public boolean isSourceRequired() {
return this.sourceRequired;
}
}