Current section

Files

Jump to
acl lib acl_web controllers rule_controller.ex
Raw

lib/acl_web/controllers/rule_controller.ex

defmodule AclWeb.RuleController do
@moduledoc false
use AclWeb, :controller
alias Acl.Acl_context
alias Acl.Acl_context.Rule
action_fallback AclWeb.FallbackController
def index(conn, _params) do
acl_rules = Acl_context.list_acl_rules()
render(conn, "index.json", acl_rules: acl_rules)
end
def create(conn, %{"rule" => rule_params}) do
with {:ok, %Rule{} = rule} <- Acl_context.create_rule(rule_params) do
conn
|> put_status(:created)
|> put_resp_header("location", Routes.rule_path(conn, :show, rule))
|> render("show.json", rule: rule)
end
end
def show(conn, %{"role" => role, "res" => res, "permission" => permission, "action" => action}) do
rule = Acl_context.get_rule!([role, res, permission, action])
render(conn, "show.json", rule: rule)
end
def update(conn, %{"id" => id, "rule" => rule_params}) do
rule = Acl_context.get_rule!(id)
with {:ok, %Rule{} = rule} <- Acl_context.update_rule(rule, rule_params) do
render(conn, "show.json", rule: rule)
end
end
def delete(conn, %{"id" => id}) do
rule = Acl_context.get_rule!(id)
with {:ok, %Rule{}} <- Acl_context.delete_rule(rule) do
send_resp(conn, :no_content, "")
end
end
def getRule(params)do
rule = Acl_context.get_rule_by(params)
case rule do
nil -> {:error, "rule_doesnt_exist"}
_ -> rule
end
end
def checkRule(role, res, action, permission)do
case Acl_context.get_rule_by(role) do
{:error, error} -> {:error, error}
records -> iterateRules(res, action, permission, Map.from_struct(records).rules)
_ -> {:error, :permission_denied}
end
end
def iterateRules(res, action, permission, [rule | rules]) do
cond do
rule.res.res == res and rule.action == action and rule.permission >= permission(permission) ->
formAclResponse(rule)
rule.res.res == res and rule.permission >= permission(permission) ->
formAclResponse(rule)
rule.res.res == nil and rule.permission >= permission(permission) ->
formAclResponse(rule)
true ->
iterateRules(res, action, permission, rules)
end
end
def iterateRules(res, action, permission, []), do: {:error, :permission_denied}
def formAclResponse(rule) do
if rule.where_cond == nil or rule.where_field == nil or rule.where_value == nil do
{
:ok,
%{
"condition" => condition(rule.condition),
"permission" => permission(rule.permission),
"role" => rule.role,
"res" => rule.res.res,
"$where" => %{}
}
}
else
whereclause = %{
rule.where_field => %{
rule.where_cond => rule.where_value
}
}
{
:ok,
%{
"condition" => condition(rule.condition),
"permission" => permission(rule.permission),
"role" => rule.role,
"res" => rule.res.res,
"$where" => whereclause
}
}
end
end
def permission (param) do
case param do
0 -> 0
1 -> 1
2 -> 2
3 -> 3
4 -> 4
"read" -> 1
"write" -> 2
"delete" -> 3
"edit" -> 4
"none" -> 0
_ -> nil
end
end
def condition (param) do
case param do
0 -> "none"
1 -> "self"
2 -> "related"
3 -> "all"
end
end
def addRule(role, res_, permission \\ 1, action \\ nil, condition \\ 1)do
case Acl_context.get_res(res_) do
res ->
rule_= Acl_context.get_rule_by(
%{"role" => role, "res" => res.id, "action" => action}
);
case rule_
do
{:error, :rule_not_found} ->
Acl_context.create_rule(
%{"role" => role, "res" => res, "permission" => permission(permission), "action" => action, "condition" => condition}
)
{:error, _} ->
{:error, :error_occured}
[rule|_] ->
Acl_context.update_rule(
rule,
%{
"role" => role,
"res" => res,
"permission" => permission(permission),
"action" => action,
"condition" => condition
}
)
end
nil -> {:error, :res_unknown}
end
end
def allowRule(
%{"role" => role, "res" => res, "permission" => permission, "action" => action, "condition" => condition}
)do
rule = Acl_context.get_rule_by(%{"role" => role, "res" => res, "permission" => permission, "action" => action});
if rule! = nil
do
Acl_context.update_rule(rule, %{"allowed" => true, "condition" => condition})
true
else
false
end
end
def allowRule(%Rule{} = rule)do
Acl_context.update_rule(rule, %{"allowed" => true})
end
def denyRule(
%{"role" => role, "res" => res, "permission" => permission, "action" => action, "condition" => condition}
)do
rule = Acl_context.get_rule_by(%{"role" => role, "res" => res, "permission" => permission, "action" => action});
if rule! = nil
do
Acl_context.update_rule(rule, %{"allowed" => false, "condition" => condition})
true
else
false
end
end
def denyRule(%Rule{} = rule)do
Acl_context.update_rule(rule, %{"allowed" => false})
end
end