kvs_acl.erl 1.2 KB

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