kvs_acl.erl 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  1. -module(kvs_acl).
  2. -copyright('Synrc Research Center s.r.o.').
  3. -compile(export_all).
  4. -include("kvs.hrl").
  5. -include("metainfo.hrl").
  6. -include("acl.hrl").
  7. -include("user.hrl").
  8. metainfo() ->
  9. #schema{name=kvs,tables=[
  10. #table{name=acl,container=true,fields=record_info(fields,acl),keys=[id,accessor]},
  11. #table{name=access,container=acl,fields=record_info(fields,access)}
  12. ]}.
  13. define_access(Accessor, Resource, Action) ->
  14. Entry = #access{ id={Accessor, Resource}, accessor=Accessor, action=Action},
  15. case kvs:add(Entry) of
  16. {error, exist} -> kvs:put(Entry#access{action=Action});
  17. {error, no_container} -> skip;
  18. {ok, E} -> E end.
  19. check(Keys) ->
  20. Acls = [Acl || {ok, Acl = #access{}} <- [kvs:get(access, Key) || Key <- Keys]],
  21. case Acls of
  22. [] -> none;
  23. [#access{action = Action} | _] -> Action end.
  24. check_access(#user{id = Id}, Feature) ->
  25. Query = [ {{user,Id},Feature} ],
  26. check(Query);
  27. check_access(Id, Feature) ->
  28. case kvs:get(user, Id) of
  29. {ok, User} -> check_access(User, Feature);
  30. E -> E end.