All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.fraunhofer.iese.ind2uce.pep.enforce.JsonPathDecisionEnforcer Maven / Gradle / Ivy

/*-
 * =================================LICENSE_START=================================
 * IND2UCE
 * %%
 * Copyright (C) 2016 Fraunhofer IESE (www.iese.fraunhofer.de)
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * =================================LICENSE_END=================================
 */

package de.fraunhofer.iese.ind2uce.pep.enforce;

import de.fraunhofer.iese.ind2uce.api.component.exception.InhibitException;
import de.fraunhofer.iese.ind2uce.api.policy.AuthorizationDecision;
import de.fraunhofer.iese.ind2uce.api.policy.Modifier;
import de.fraunhofer.iese.ind2uce.api.policy.ModifierEngine;
import de.fraunhofer.iese.ind2uce.api.policy.parameter.Parameter;
import de.fraunhofer.iese.ind2uce.api.policy.parameter.ParameterList;
import de.fraunhofer.iese.ind2uce.logger.LoggerFactory;
import de.fraunhofer.iese.ind2uce.pep.common.DecisionEnforcer;
import de.fraunhofer.iese.ind2uce.pep.common.ModifierMethod;
import de.fraunhofer.iese.ind2uce.pep.common.ModifierNotFoundException;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.spi.json.GsonJsonProvider;
import com.jayway.jsonpath.spi.mapper.GsonMappingProvider;

import org.slf4j.Logger;

import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 * Decision Enforcer that uses {@link JsonPath} to provide expressions to
 */
public class JsonPathDecisionEnforcer implements DecisionEnforcer {

  protected static Logger LOG = LoggerFactory.getLogger(JsonPathDecisionEnforcer.class);

  private static Configuration configuration = new Configuration.ConfigurationBuilder().jsonProvider(new GsonJsonProvider()).mappingProvider(new GsonMappingProvider()).build();

  private final Map modifiers = new TreeMap<>();

  private final Gson gson = new GsonBuilder().setPrettyPrinting().create();

  @Override
  public boolean addModificationMethod(ModifierMethod method) {
    if (this.modifiers != null) {
      this.modifiers.put(method.getDisplayName(), method);
      LOG.info("Modifier is added to the list of modifiers: {}", method.getDisplayName());
      return true;
    } else {
      return false;
    }
  }

  private void doModificationForParameter(ParameterList parameterList, Modifier eventParameter) throws InhibitException {

    final Parameter parameterForName = parameterList.getParameterForName(eventParameter.getName());
    if (parameterForName != null) {
      LOG.debug("Starting with event modification.");
      this.doModificationForParameter(parameterList, eventParameter, parameterForName);
    }
  }

  private void doModificationForParameter(ParameterList parameterList, Modifier eventParameter, Parameter parameterForName) throws InhibitException {
    Object parameterValue = parameterForName.getValue();
    final Type parameterType = parameterForName.getType();
    DocumentContext parameterValueDocumentContext = JsonPath.parse(this.gson.toJson(parameterValue), configuration);
    final List modifierEngines = eventParameter.getEngine();
    Object modifiedObject = null;
    for (final ModifierEngine modifierEngine : modifierEngines) {
      final ModifierMethod modifierMethod = this.modifiers.get(modifierEngine.getMethod());
      if (modifierMethod == null) {
        LOG.error("Not found modifier: {}", modifierEngine.getMethod());
        throw new ModifierNotFoundException("ModificationActor is not registered against Modifier Method named  : " + modifierEngine.getMethod());
      }
      if (eventParameter.getExpression() == null) {
        if (parameterValue.getClass().isPrimitive() || parameterValue.getClass() == String.class) {
          parameterValue = modifierMethod.doModification(parameterValue, modifierEngine.getParameters());
          modifiedObject = parameterValue;
        }
      } else {
        try {
          parameterValueDocumentContext = modifierMethod.doModification(parameterValueDocumentContext, eventParameter.getExpression(), modifierEngine.getParameters());
          final String jsonString = parameterValueDocumentContext.jsonString();
          modifiedObject = this.gson.fromJson(jsonString, parameterType);
        } catch (final Exception e) {
          LOG.error("event is inhibited. Error on modification of the modifier: {}", modifierEngine.getMethod());
          throw new InhibitException("Not able todo modification due to ", e);
        }
      }

    }
    parameterList.removeParameter(eventParameter.getName());
    parameterList.addParameter(eventParameter.getName(), modifiedObject, parameterType);
  }

  @Override
  public ParameterList enforce(AuthorizationDecision authorizationDecision, ParameterList parameterList) throws InhibitException {
    final List modifiers = authorizationDecision.getModifiers();

    if (modifiers == null || modifiers.isEmpty()) {
      LOG.info("Event does not need to be modified");
      return parameterList;
    }

    LOG.info("Event needs modification");

    for (final Modifier eventParameter : modifiers) {
      this.doModificationForParameter(parameterList, eventParameter);
    }

    return parameterList;
  }

  @Override
  public boolean removeModificationMethod(String name) {
    if (this.modifiers != null) {
      this.modifiers.remove(this.modifiers.get(name));
      return true;
    } else {
      return false;
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy