defmodule Bosun do
@moduledoc """
Documentation for `Bosun`.
"""
require Logger
alias Bosun.Context
alias Bosun.Impermissible
def permit?(subject, action, resource, options \\ []) do
context = Bosun.Policy.permitted?(resource, action, subject, %Context{}, options)
print_audit_report(subject, action, resource, options, context)
if context.permitted do
true
else
false
end
end
def permit(subject, action, resource, options \\ []) do
context = Bosun.Policy.permitted?(resource, action, subject, %Context{}, options)
print_audit_report(subject, action, resource, options, context)
if context.permitted do
{:ok, context}
else
{:error, context}
end
end
def permit!(subject, action, resource, options \\ []) do
context = Bosun.Policy.permitted?(resource, action, subject, %Context{}, options)
print_audit_report(subject, action, resource, options, context)
if context.permitted do
context
else
raise Impermissible, message: context.reason, context: context
end
end
def debug?() do
Application.get_env(
:bosun,
:debug,
true
)
end
defp print_audit_report(subject, action, resource, options, %Context{
permitted: permitted,
log: log,
reason: reason
}) do
if debug?() do
Logger.debug(">>>> Bosun audit report")
Logger.debug("subject: #{inspect(subject)}")
Logger.debug("action: #{inspect(action)}")
Logger.debug("resource: #{inspect(resource)}")
Logger.debug("options: #{inspect(options)}")
Logger.debug("permitted: #{inspect(permitted)}")
Logger.debug("reason: #{inspect(reason)}")
Logger.debug("log: #{inspect(log)}")
Logger.debug("<<<< Bosun audit report")
end
end
end