PolicyUtilities.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.core.controllo_traffico.utils;
import java.text.SimpleDateFormat;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.controllo_traffico.AttivazionePolicy;
import org.openspcoop2.core.controllo_traffico.AttivazionePolicyFiltro;
import org.openspcoop2.core.controllo_traffico.AttivazionePolicyRaggruppamento;
import org.openspcoop2.core.controllo_traffico.beans.ActivePolicy;
import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
import org.openspcoop2.core.controllo_traffico.beans.RisultatoStato;
import org.openspcoop2.core.controllo_traffico.constants.RuoloPolicy;
import org.openspcoop2.core.transazioni.utils.TipoCredenzialeMittente;
import org.openspcoop2.utils.date.DateUtils;
import org.openspcoop2.utils.properties.PropertiesUtilities;
/**
* PolicyUtilities
*
* @author Andrea Poli (poli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class PolicyUtilities {
private PolicyUtilities() {}
private static final String DISABILITATO_LABEL = "Disabilitato";
public static String toString(Integer statoAllarme){
StringBuilder bf = new StringBuilder();
if(statoAllarme==null){
bf.append("N.C.");
}
else if(statoAllarme==0){
bf.append("OK");
}
else if(statoAllarme==1){
bf.append("Warning");
}
else if(statoAllarme==2){
bf.append("Error");
}
else{
bf.append("N.C.");
}
return bf.toString();
}
public static String toString(RisultatoStato statoAllarme){
SimpleDateFormat dateFormat = DateUtils.getSimpleDateFormatMs();
StringBuilder bf = new StringBuilder(toString(statoAllarme.getStato()));
bf.append(", ultimo aggiornamento:").
append(dateFormat.format(statoAllarme.getDateCheck())).
append(")");
return bf.toString();
}
public static String toStringFilter(AttivazionePolicyFiltro filtro) {
StringBuilder bf = new StringBuilder("");
if(filtro.isEnabled()){
if( (filtro.getRuoloPorta()!=null && !RuoloPolicy.ENTRAMBI.equals(filtro.getRuoloPorta())) ){
if(bf.length()>0){
bf.append(", ");
}
if(RuoloPolicy.DELEGATA.equals(filtro.getRuoloPorta())){
bf.append("Ruolo:Fruitore");
}
else if(RuoloPolicy.APPLICATIVA.equals(filtro.getRuoloPorta())){
bf.append("Ruolo:Erogatore");
}
}
if( !(filtro.getNomePorta()==null || "".equals(filtro.getNomePorta())) ){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Porta:");
bf.append(filtro.getNomePorta());
}
if( !(filtro.getProtocollo()==null || "".equals(filtro.getProtocollo())) ){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Protocollo:");
bf.append(filtro.getProtocollo());
}
if(filtro.getRuoloErogatore()!=null && !"".equals(filtro.getRuoloErogatore())){
if(bf.length()>0){
bf.append(", ");
}
bf.append("RuoloErogatore:");
bf.append(filtro.getRuoloErogatore());
}
if( !( (filtro.getTipoErogatore()==null || "".equals(filtro.getTipoErogatore()))
||
(filtro.getNomeErogatore()==null || "".equals(filtro.getNomeErogatore())) ) ){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Erogatore:");
bf.append(filtro.getTipoErogatore()+"/"+filtro.getNomeErogatore());
}
if( !(filtro.getTag()==null || "".equals(filtro.getTag())) ){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Tag:");
bf.append(filtro.getTag());
}
if( !( (filtro.getTipoServizio()==null || "".equals(filtro.getTipoServizio()))
||
(filtro.getNomeServizio()==null || "".equals(filtro.getNomeServizio())) ) ){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Servizio:");
bf.append(filtro.getTipoServizio()+"/"+filtro.getNomeServizio());
if(filtro.getVersioneServizio()!=null && filtro.getVersioneServizio()>0) {
bf.append("/v").append(filtro.getVersioneServizio());
}
}
if( !(filtro.getAzione()==null || "".equals(filtro.getAzione())) ){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Azione:");
bf.append(filtro.getAzione());
}
if( !(filtro.getServizioApplicativoErogatore()==null || "".equals(filtro.getServizioApplicativoErogatore())) ){
if(bf.length()>0){
bf.append(", ");
}
bf.append("SAErogatore:");
bf.append(filtro.getServizioApplicativoErogatore());
}
if(filtro.getRuoloFruitore()!=null && !"".equals(filtro.getRuoloFruitore())){
if(bf.length()>0){
bf.append(", ");
}
bf.append("RuoloFruitore:");
bf.append(filtro.getRuoloFruitore());
}
if( !( (filtro.getTipoFruitore()==null || "".equals(filtro.getTipoFruitore()))
||
(filtro.getNomeFruitore()==null || "".equals(filtro.getNomeFruitore())) ) ){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Fruitore:");
bf.append(filtro.getTipoFruitore()+"/"+filtro.getNomeFruitore());
}
if( !(filtro.getServizioApplicativoFruitore()==null || "".equals(filtro.getServizioApplicativoFruitore())) ){
if(bf.length()>0){
bf.append(", ");
}
bf.append("SAFruitore:");
bf.append(filtro.getServizioApplicativoFruitore());
}
if(filtro.getTokenClaims()!=null){
Properties properties = PropertiesUtilities.convertTextToProperties(filtro.getTokenClaims());
addStringFilter(properties, "Token-", bf);
}
if(filtro.isInformazioneApplicativaEnabled()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Chiave:");
bf.append(filtro.getInformazioneApplicativaTipo());
}
}
else{
bf.append(DISABILITATO_LABEL);
}
return bf.toString();
}
private static void addStringFilter(Properties properties, String prefix, StringBuilder bf) {
if(properties!=null && properties.size()>0) {
for (Object o : properties.keySet()) {
if(o instanceof String) {
String key = (String) o;
String value = properties.getProperty(key);
if(bf.length()>0){
bf.append(", ");
}
bf.append(prefix).append(key).append(":");
bf.append(value);
}
}
}
}
public static String toStringGroupBy(AttivazionePolicyRaggruppamento groupBy,IDUnivocoGroupByPolicy datiGroupBy, boolean printDati) {
if(printDati) {
return toStringGroupByWithValues(groupBy, datiGroupBy);
}
StringBuilder bf = new StringBuilder("");
if(groupBy.isEnabled()){
if(groupBy.isRuoloPorta()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Tipologia");
}
if(groupBy.isProtocollo()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Modalità");
}
if(groupBy.isErogatore()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Erogatore");
}
if(groupBy.isServizio()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Servizio");
}
if(groupBy.isAzione()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Azione");
}
if(groupBy.isServizioApplicativoErogatore()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("SAErogatore");
}
if(groupBy.isFruitore()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Fruitore");
}
if(groupBy.isServizioApplicativoFruitore()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("SAFruitore");
}
if(groupBy.getToken()!=null && StringUtils.isNotEmpty(groupBy.getToken())){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Token: ").append(groupBy.getToken());
}
if(groupBy.isInformazioneApplicativaEnabled()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Chiave-Tipo: ");
bf.append(groupBy.getInformazioneApplicativaTipo());
if(groupBy.getInformazioneApplicativaNome()!=null) {
bf.append(", Chiave-Criterio: ");
bf.append(groupBy.getInformazioneApplicativaNome());
}
if(datiGroupBy!=null) {
bf.append(", Chiave-Valore: ");
bf.append(datiGroupBy.getValoreKey());
}
}
}
else{
bf.append(DISABILITATO_LABEL);
}
return bf.toString();
}
private static String toStringGroupByWithValues(AttivazionePolicyRaggruppamento groupBy,IDUnivocoGroupByPolicy datiGroupBy) {
StringBuilder bf = new StringBuilder("");
if(groupBy.isEnabled()){
if(groupBy.isRuoloPorta()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Tipologia: ");
bf.append(datiGroupBy.getRuoloPorta());
}
if(groupBy.isProtocollo()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Protocollo: ");
bf.append(datiGroupBy.getProtocollo());
}
if(groupBy.isErogatore()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Erogatore: ");
bf.append(datiGroupBy.getErogatore());
}
if(groupBy.isServizio()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Servizio: ");
bf.append(datiGroupBy.getServizio());
}
if(groupBy.isAzione()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Azione: ");
bf.append(datiGroupBy.getAzione());
}
if(groupBy.isServizioApplicativoErogatore()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("SAErogatore: ");
bf.append(datiGroupBy.getServizioApplicativoErogatore());
}
if(groupBy.isFruitore()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Fruitore: ");
bf.append(datiGroupBy.getFruitore());
}
if(groupBy.isServizioApplicativoFruitore()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("SAFruitore: ");
bf.append(datiGroupBy.getServizioApplicativoFruitore());
if(bf.length()>0){
bf.append(", ");
}
bf.append("ApplicativoToken: ");
bf.append(datiGroupBy.getServizioApplicativoToken());
}
if(groupBy.getToken()!=null && StringUtils.isNotEmpty(groupBy.getToken())){
String [] token = null;
if(groupBy.getToken().contains(",")) {
token = groupBy.getToken().split(",");
}
else {
token = new String[] {groupBy.getToken()};
}
if(token!=null && token.length>0) {
for (int i = 0; i < token.length; i++) {
if(bf.length()>0){
bf.append(", ");
}
bf.append(token[i]).append(": ");
TipoCredenzialeMittente claim = TipoCredenzialeMittente.toEnumConstant(token[i]);
if(claim!=null) {
switch (claim) {
case TOKEN_SUBJECT:
bf.append(datiGroupBy.getTokenSubject());
break;
case TOKEN_ISSUER:
bf.append(datiGroupBy.getTokenIssuer());
break;
case TOKEN_CLIENT_ID:
bf.append(datiGroupBy.getTokenClientId());
break;
case TOKEN_USERNAME:
bf.append(datiGroupBy.getTokenUsername());
break;
case TOKEN_EMAIL:
bf.append(datiGroupBy.getTokenEMail());
break;
case PDND_ORGANIZATION_NAME:
bf.append(datiGroupBy.getPdndOrganizationName());
break;
default:
bf.append("N.D.");
break;
}
}
else {
bf.append("N.D.");
}
}
}
}
if(groupBy.isInformazioneApplicativaEnabled()){
if(bf.length()>0){
bf.append(", ");
}
bf.append("Chiave-Tipo: ");
bf.append(groupBy.getInformazioneApplicativaTipo());
if(groupBy.getInformazioneApplicativaNome()!=null) {
bf.append(", Chiave-Criterio: ");
bf.append(groupBy.getInformazioneApplicativaNome());
}
bf.append(", Chiave-Valore: ");
bf.append(datiGroupBy.getValoreKey());
}
}
else{
bf.append(DISABILITATO_LABEL);
}
return bf.toString();
}
/**
public static IDUnivocoGroupByPolicy toIDUnivocoGroupByPolicy(String stringGroupBy) {
IDUnivocoGroupByPolicy id = new IDUnivocoGroupByPolicy();
if(stringGroupBy==null || stringGroupBy.equals("") || stringGroupBy.equals(DISABILITATO_LABEL)) {
return id;
}
String [] split = stringGroupBy.split(",");
for (int i = 0; i minor split.length; i++) {
String tmp = split[i].trim();
if(tmp.startsWith("Tipologia: ")) {
id.setRuoloPorta(tmp.substring("Tipologia: ".length()));
}
else if(tmp.startsWith("Protocollo: ")) {
id.setProtocollo(tmp.substring("Protocollo: ".length()));
}
else if(tmp.startsWith("Erogatore: ")) {
id.setErogatore(tmp.substring("Erogatore: ".length()));
}
else if(tmp.startsWith("Servizio: ")) {
id.setServizio(tmp.substring("Servizio: ".length()));
}
else if(tmp.startsWith("Azione: ")) {
id.setAzione(tmp.substring("Azione: ".length()));
}
else if(tmp.startsWith("SAErogatore: ")) {
id.setServizioApplicativoErogatore(tmp.substring("SAErogatore: ".length()));
}
else if(tmp.startsWith("Fruitore: ")) {
id.setFruitore(tmp.substring("Fruitore: ".length()));
}
else if(tmp.startsWith("SAFruitore: ")) {
id.setServizioApplicativoFruitore(tmp.substring("SAFruitore: ".length()));
}
else if(tmp.startsWith("ApplicativoToken: ")) {
id.setServizioApplicativoToken(tmp.substring("ApplicativoToken: ".length()));
}
else if(tmp.startsWith("TokenSubject: ")) {
id.setTokenSubject(tmp.substring("TokenSubject: ".length()));
}
else if(tmp.startsWith("TokenIssuer: ")) {
id.setTokenIssuer(tmp.substring("TokenIssuer: ".length()));
}
else if(tmp.startsWith("TokenClientId: ")) {
id.setTokenClientId(tmp.substring("TokenClientId: ".length()));
}
else if(tmp.startsWith("TokenUsername: ")) {
id.setTokenUsername(tmp.substring("TokenUsername: ".length()));
}
else if(tmp.startsWith("TokenEMail: ")) {
id.setTokenEMail(tmp.substring("TokenEMail: ".length()));
}
else if(tmp.startsWith("Chiave-Tipo: ")) {
id.setTipoKey(tmp.substring("Chiave-Tipo: ".length()));
}
else if(tmp.startsWith("Chiave-Criterio: ")) {
id.setNomeKey(tmp.substring("Chiave-Criterio: ".length()));
}
else if(tmp.startsWith("Chiave-Valore: ")) {
id.setValoreKey(tmp.substring("Chiave-Valore: ".length()));
}
}
return id;
}
*/
public static String buildIdConfigurazioneEventoPerPolicy(ActivePolicy activePolicy, IDUnivocoGroupByPolicy datiGroupBy, String api) {
AttivazionePolicy attivazionePolicy = activePolicy.getInstanceConfiguration();
return buildIdConfigurazioneEventoPerPolicy(attivazionePolicy, datiGroupBy, api);
}
public static String buildIdConfigurazioneEventoPerPolicy(AttivazionePolicy attivazionePolicy, IDUnivocoGroupByPolicy datiGroupBy, String api) {
// L'obiettivo è di generare un evento differente per ogni raggruppamento violato di una stessa policy
// All'interno di una stessa policy ci possono essere gruppi che non sono violati ed altri che lo sono
// Ad esempio se si raggruppa per soggetto fruitore, ci potranno essere soggetti che la violano, altri no.
// Si vuole un evento per ogni soggetto che viola la policy
boolean printDati = true;
String idPolicyConGruppo = PolicyUtilities.getNomeActivePolicy(attivazionePolicy.getAlias(), attivazionePolicy.getIdActivePolicy());
if(api!=null && !"".equals(api)) {
idPolicyConGruppo = idPolicyConGruppo + " - API: "+api;
}
if(attivazionePolicy.getGroupBy().isEnabled()){
String toStringRaggruppamentoConDatiIstanza = PolicyUtilities.toStringGroupBy(attivazionePolicy.getGroupBy(), datiGroupBy, printDati);
idPolicyConGruppo = idPolicyConGruppo +
org.openspcoop2.core.controllo_traffico.constants.Costanti.SEPARATORE_IDPOLICY_RAGGRUPPAMENTO+
toStringRaggruppamentoConDatiIstanza;
}
return idPolicyConGruppo;
}
public static final String GLOBALE_PROPERTY = "globale:";
public static final String ID_ACTIVE_POLICY_PROPERTY = "idActivePolicy:";
public static final String RUOLO_PORTA_PROPERTY = "ruoloPorta:";
public static final String NOME_PORTA_PROPERTY = "nomePorta:";
public static String buildConfigurazioneEventoPerPolicy(ActivePolicy activePolicy, boolean policyGlobale) {
AttivazionePolicy attivazionePolicy = activePolicy.getInstanceConfiguration();
return buildConfigurazioneEventoPerPolicy(attivazionePolicy, policyGlobale);
}
public static String buildConfigurazioneEventoPerPolicy(AttivazionePolicy attivazionePolicy, boolean policyGlobale) {
StringBuilder sb = new StringBuilder();
sb.append(GLOBALE_PROPERTY).append(policyGlobale);
sb.append("\n").append(ID_ACTIVE_POLICY_PROPERTY).append(attivazionePolicy.getIdActivePolicy());
if(!policyGlobale &&
attivazionePolicy.getFiltro()!=null &&
attivazionePolicy.getFiltro().getNomePorta()!=null &&
StringUtils.isNotEmpty(attivazionePolicy.getFiltro().getNomePorta()) &&
attivazionePolicy.getFiltro().getRuoloPorta()!=null) {
String nomePorta = attivazionePolicy.getFiltro().getNomePorta();
String ruoloPorta = attivazionePolicy.getFiltro().getRuoloPorta().getValue();
sb.append("\n").append(RUOLO_PORTA_PROPERTY).append(ruoloPorta);
sb.append("\n").append(NOME_PORTA_PROPERTY).append(nomePorta);
}
return sb.toString();
}
public static boolean isConfigurazioneEventoPerPolicy(String configurazione) {
return configurazione!=null && configurazione.startsWith(GLOBALE_PROPERTY);
}
public static boolean isConfigurazioneEventoPerPolicy_policyGlobale(String configurazione) {
if(isConfigurazioneEventoPerPolicy(configurazione)) {
String [] tmp = configurazione.split("\n");
if(tmp!=null && tmp.length>0) {
String firstLine = tmp[0];
if(firstLine!=null && firstLine.startsWith(GLOBALE_PROPERTY) && firstLine.length()>GLOBALE_PROPERTY.length()) {
String s = firstLine.substring(GLOBALE_PROPERTY.length());
return Boolean.valueOf(s);
}
}
}
return false;
}
public static String getConfigurazioneEventoPerPolicy_idActivePolicy(String configurazione) {
if(isConfigurazioneEventoPerPolicy(configurazione)) {
String [] tmp = configurazione.split("\n");
if(tmp!=null && tmp.length>1) {
String firstLine = tmp[1];
if(firstLine!=null && firstLine.startsWith(ID_ACTIVE_POLICY_PROPERTY) && firstLine.length()>ID_ACTIVE_POLICY_PROPERTY.length()) {
return firstLine.substring(ID_ACTIVE_POLICY_PROPERTY.length());
}
}
}
return null;
}
public static String getConfigurazioneEventoPerPolicy_ruoloPorta(String configurazione) {
if(isConfigurazioneEventoPerPolicy(configurazione)) {
String [] tmp = configurazione.split("\n");
if(tmp!=null && tmp.length>2) {
String firstLine = tmp[2];
if(firstLine!=null && firstLine.startsWith(RUOLO_PORTA_PROPERTY) && firstLine.length()>RUOLO_PORTA_PROPERTY.length()) {
return firstLine.substring(RUOLO_PORTA_PROPERTY.length());
}
}
}
return null;
}
public static String getConfigurazioneEventoPerPolicy_nomePorta(String configurazione) {
if(isConfigurazioneEventoPerPolicy(configurazione)) {
String [] tmp = configurazione.split("\n");
if(tmp!=null && tmp.length>3) {
String firstLine = tmp[3];
if(firstLine!=null && firstLine.startsWith(NOME_PORTA_PROPERTY) && firstLine.length()>NOME_PORTA_PROPERTY.length()) {
return firstLine.substring(NOME_PORTA_PROPERTY.length());
}
}
}
return null;
}
public static String extractIdPolicyFromIdConfigurazioneEvento(String idConfigurazioneEvento) {
if(idConfigurazioneEvento.contains(org.openspcoop2.core.controllo_traffico.constants.Costanti.SEPARATORE_IDPOLICY_RAGGRUPPAMENTO)) {
return idConfigurazioneEvento.split(org.openspcoop2.core.controllo_traffico.constants.Costanti.SEPARATORE_IDPOLICY_RAGGRUPPAMENTO)[0];
}
else {
return idConfigurazioneEvento;
}
}
public static String extractIDUnivocoGroupByPolicyFromIdConfigurazioneEventoAsString(String idConfigurazioneEvento) {
String datiGruppo = null;
if(idConfigurazioneEvento.contains(org.openspcoop2.core.controllo_traffico.constants.Costanti.SEPARATORE_IDPOLICY_RAGGRUPPAMENTO)) {
int indexOf = idConfigurazioneEvento.indexOf(org.openspcoop2.core.controllo_traffico.constants.Costanti.SEPARATORE_IDPOLICY_RAGGRUPPAMENTO);
datiGruppo = idConfigurazioneEvento.substring(indexOf+org.openspcoop2.core.controllo_traffico.constants.Costanti.SEPARATORE_IDPOLICY_RAGGRUPPAMENTO.length());
}
return datiGruppo;
}
/**
public static IDUnivocoGroupByPolicy extractIDUnivocoGroupByPolicyFromIdConfigurazioneEvento(String idConfigurazioneEvento) {
return toIDUnivocoGroupByPolicy(extractIDUnivocoGroupByPolicyFromIdConfigurazioneEventoAsString(idConfigurazioneEvento));
}
*/
public static String getNomeActivePolicy(String alias, String id) {
if(alias==null || "".equals(alias)) {
return id.replace(":", "_");
}
else {
return alias;
}
}
}