defmodule ABAC.PDP do require ABAC require BPE require KVS require Record # PDP def decision(request) do {new_request, policy} = ABAC.Attributes.request(request) x = :lists.foldl(fn x, acc -> case :kvs.index_match(x, :object, KVS.kvs(mod: :kvs_mnesia)) do [ABAC.policy() | _ ] = p -> p ++ acc _ -> acc end end, [], policy) x != [] and :lists.all(&policy(new_request, &1), x) end def policy(ABAC.request(endpoint: e, resources: resources) = request, ABAC.policy(rules: r, combining: :all)) do :lists.all(fn ABAC.rule_ref(id: i, resource_type: t) -> case :lists.keyfind(t, 1, resources) do false -> false object -> case :kvs.index_match(ABAC.rule(id: i, subject: :_, api_endpoint: e, description: :_, type: :permit, condition: :_, object: object), :object, KVS.kvs(mod: :kvs_mnesia)) do [ABAC.rule(condition: c) = rule] -> :erlang.apply(:"Elixir.ABAC.Condition", c, [request, rule]) _ -> false end end end, r) end def policy(_, _), do: false end