avz.erl 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. -module(avz).
  2. %%-author('Maxim Sokhatsky').
  3. -include_lib("avz/include/avz.hrl").
  4. -include_lib("n4u/include/wf.hrl"). %% todo unbind avz -- todo avz usage example without nitro and n4u (n2o v4.4 fork) framework
  5. -include_lib("kvs/include/metainfo.hrl").
  6. -include_lib("kvs/include/user.hrl").
  7. -export([
  8. sha/1,
  9. update/2,
  10. coalesce/2,
  11. merge/2,
  12. callbacks/1,
  13. sdk/1,
  14. buttons/1,
  15. event/1,
  16. api_event/3,
  17. login_user/1,
  18. login/2,
  19. version/0
  20. ]).
  21. sha(Pass) -> crypto:hmac(wf:config(n4u,hmac,sha256),n2o_secret:secret(),wf:to_binary(Pass)).
  22. update({K,V},P) -> wf:setkey(K,1,case P of undefined -> []; _P -> _P end,{K,V}).
  23. coalesce(X,undefined) -> X;
  24. coalesce(_,Y) -> Y.
  25. merge(A,B) -> list_to_tuple([ coalesce(X,Y) || {X,Y} <- lists:zip(tuple_to_list(A),tuple_to_list(B)) ]).
  26. callbacks(Methods) -> [ M:callback() || M <- Methods].
  27. sdk(Methods) -> [ M:sdk() || M <- Methods].
  28. buttons(Methods) -> [ M:login_button() || M <- Methods].
  29. event(init) -> [];
  30. event(logout) -> wf:user(undefined), wf:redirect(?LOGIN_PAGE);
  31. event(to_login) -> wf:redirect(?LOGIN_PAGE);
  32. event({register, #user{}=U}) -> kvs:put(U#user{id=kvs:next_id("user", 1)}), login_user(U); % sample
  33. event({login, #user{}=U, N}) -> Updated = merge(U,N), kvs:put(Updated), login_user(Updated); % sample
  34. event({error, E}) -> (?CTX#cx.module):event({login_failed, E});
  35. event({Method,Event}) -> Method:event({Method,Event});
  36. event(Ev) -> wf:info(?MODULE,"Page Event ~p",[Ev]).
  37. api_event(gLogin, Args, Term) -> google:api_event(gLogin, Args, Term);
  38. api_event(gLoginFail, Args, Term) -> google:api_event(gLoginFail, Args, Term);
  39. api_event(fbLogin, Args, Term) -> facebook:api_event(fbLogin, Args, Term);
  40. api_event(winLogin, Args, Term) -> microsoft:api_event(winLogin, Args, Term);
  41. api_event(Name, Args, Term) -> wf:info(?MODULE,"Unknown API event: ~p ~p ~p",[Name, Args, Term]).
  42. login_user(User) -> wf:user(User), wf:redirect(?AFTER_LOGIN).
  43. login(_Key, [{error, E}|_Rest])-> wf:info(?MODULE,"Auth Error: ~p", [E]);
  44. login(Key, Args) ->
  45. LoginFun = fun(K) ->
  46. Index = proplists:get_value(Key:index(K), Args),
  47. case kvs:index(user,K,Index) of
  48. [Exists|_] ->
  49. RegData = Key:registration_data(Args, Key, Exists),
  50. (?CTX#cx.module):event({login, Exists, RegData}),
  51. true;
  52. _ -> false end end,
  53. Keys = [K || M<-kvs:modules(),T<-(M:metainfo())#schema.tables, T#table.name==user, K<-T#table.keys],
  54. LoggedIn = lists:any(LoginFun, Keys),
  55. if (LoggedIn =:= true) -> ok; true ->
  56. RegData = Key:registration_data(Args, Key, #user{}),
  57. (?CTX#cx.module):event({register, RegData})
  58. end.
  59. version() -> proplists:get_value(vsn,element(2,application:get_all_key(?MODULE))).