kvs_acl.erl 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  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. -include("group.hrl").
  9. -include("feed.hrl").
  10. metainfo() ->
  11. #schema{name=kvs,tables=[
  12. #table{name=acl,container=true,fields=record_info(fields,acl),keys=[id,accessor]},
  13. #table{name=access,container=acl,fields=record_info(fields,access)}
  14. ]}.
  15. define_access(Accessor, Resource, Action) ->
  16. Entry = #access{ id={Accessor, Resource}, accessor=Accessor, action=Action},
  17. case kvs:add(Entry) of
  18. {error, exist} -> kvs:put(Entry#access{action=Action});
  19. {error, no_container} -> skip;
  20. {ok, E} -> E end.
  21. check(Keys) ->
  22. Acls = [Acl || {ok, Acl = #access{}} <- [kvs:get(access, Key) || Key <- Keys]],
  23. case Acls of
  24. [] -> none;
  25. [#access{action = Action} | _] -> Action end.
  26. check_access(#user{id = Id}, Feature) ->
  27. Query = [ {{user,Id},Feature} ],
  28. check(Query);
  29. check_access(Id, Feature) ->
  30. case kvs:get(user, Id) of
  31. {ok, User} -> check_access(User, Feature);
  32. E -> E end.