Current section
Files
Jump to
Current section
Files
lib/statement.ex
defmodule Carny.Statement do
@moduledoc """
Associates a bucket of resources with an "allow" or "deny". On their own not so useful main
use is to be composed into Policies.
"""
alias Carny.Identifier
defstruct effect: "allow", resources: [], privileges: []
@doc """
Checks if an identifier passes a statement.
## Examples
iex> Carny.Statement.passes?("start", %Carny.Identifier{}, %Carny.Statement{privileges: ["start"], resources: [%Carny.Identifier{}]})
true
"""
def passes?(
privilege,
identifier,
%{resources: resources, privileges: privileges, effect: "allow"}
)
when length(resources) > 0 do
case privilege in privileges do
true ->
Enum.any?(resources, &Identifier.validate_against(identifier, &1))
false ->
false
end
end
def passes?(
identifier,
%{resources: resources, effect: "deny"} = statement
)
when length(resources) > 0 do
not passes?(identifier, statement)
end
def passes?(_, _), do: false
end