Browse Source

remove ids, they should be integers in kvs 3.4. check user by defined indexes

Andrii Zadorozhnii 8 years ago
parent
commit
c1654bfa1e
7 changed files with 40 additions and 29 deletions
  1. 20 10
      src/avz.erl
  2. 2 2
      src/email.erl
  3. 4 5
      src/facebook.erl
  4. 2 2
      src/github.erl
  5. 8 6
      src/google.erl
  6. 2 2
      src/microsoft.erl
  7. 2 2
      src/twitter.erl

+ 20 - 10
src/avz.erl

@@ -1,9 +1,10 @@
 -module(avz).
 -author('Maxim Sokhatsky').
 -compile(export_all).
--include_lib("kvs/include/user.hrl").
 -include_lib("avz/include/avz.hrl").
 -include_lib("n2o/include/wf.hrl").
+-include_lib("kvs/include/metainfo.hrl").
+-include_lib("kvs/include/user.hrl").
 
 sha(Pass) -> crypto:hmac(wf:config(n2o,hmac,sha256),n2o_secret:secret(),wf:to_binary(Pass)).
 update({K,V},P) -> wf:setkey(K,1,case P of undefined -> []; _P -> _P end,{K,V}).
@@ -34,14 +35,23 @@ api_event(Name, Args, Term)      -> wf:info(?MODULE,"Unknown API event: ~p ~p ~p
 login_user(User) -> wf:user(User), wf:redirect(?AFTER_LOGIN).
 login(_Key, [{error, E}|_Rest])-> wf:info(?MODULE,"Auth Error: ~p", [E]);
 login(Key, Args) ->
-    n2o_session:ensure_sid([],?CTX,[]),
-    case kvs:get(user,Key:email_prop(Args,Key)) of
-        {ok,Existed} ->
-            RegData = Key:registration_data(Args, Key, Existed),
-            (?CTX#cx.module):event({login, Existed, RegData});
-        {error,_} ->
-            RegData = Key:registration_data(Args, Key, #user{}),
-            (?CTX#cx.module):event({register, RegData});
-        U -> wf:info(?MODULE,"Unknown Login: ~p",[U]) end.
+
+  LoginFun = fun(K) ->
+    Index = proplists:get_value(Key:index(K), Args),
+    case kvs:index(user,K,Index) of
+      [Exists|_] ->
+        RegData = Key:registration_data(Args, Key, Exists),
+        (?CTX#cx.module):event({login, Exists, RegData}),
+        true;
+      _ -> false end end,
+  
+  Keys = [K || M<-kvs:modules(),T<-(M:metainfo())#schema.tables, T#table.name==user, K<-T#table.keys],
+
+  LoggedIn = lists:any(LoginFun, Keys),
+
+  if (LoggedIn =:= true) -> ok; true -> 
+    RegData = Key:registration_data(Args, Key, #user{}),
+    (?CTX#cx.module):event({register, RegData})
+  end.
 
 version() -> proplists:get_value(vsn,element(2,application:get_all_key(?MODULE))).

+ 2 - 2
src/email.erl

@@ -9,14 +9,14 @@
 
 registration_data(Props, email, Ori)->
   Email = email_prop(Props, email),
-  Ori#user{ id = Email,
-            display_name = Email,
+  Ori#user{ display_name = Email,
             email = Email,
             register_date = os:timestamp(),
             tokens = avz:update({email,Email},Ori#user.tokens),
             status = ok,
             password = avz:sha(proplists:get_value(<<"password">>,Props))}.
 
+index(K) -> wf:to_binary(K).
 email_prop(Props, _) -> binary_to_list(proplists:get_value(<<"email">>, Props)).
 
 login_button() -> application:get_env(avz,email_button,#button{id=login, class=[btn, "btn-info", "btn-large", "btn-lg"], body= <<"Sign in">>, postback={email, loginemail}, source=[user,pass]}).

+ 4 - 5
src/facebook.erl

@@ -19,11 +19,10 @@ registration_data(Props, facebook, Ori)->
     BirthDay = case proplists:get_value(<<"birthday">>, Props) of
         undefined -> {1, 1, 1970};
         BD -> list_to_tuple([list_to_integer(X) || X <- string:tokens(binary_to_list(BD), "/")]) end,
-    Email = email_prop(Props, facebook),
+    Email = proplists:get_value(<<"email">>, Props),
     [UserName|_] = string:tokens(binary_to_list(Email),"@"),
     Cover = case proplists:get_value(<<"cover">>,Props) of undefined -> ""; {P} -> case proplists:get_value(<<"source">>,P) of undefined -> ""; C -> binary_to_list(C) end end,
-    Ori#user{   id = Email,
-                display_name = UserName,
+    Ori#user{   display_name = UserName,
                 images = avz:update({fb_cover,Cover},avz:update({fb_avatar,"https://graph.facebook.com/" ++ binary_to_list(Id) ++ "/picture?type=large"},Ori#user.images)),
                 email = Email,
                 names = proplists:get_value(<<"first_name">>, Props),
@@ -33,8 +32,8 @@ registration_data(Props, facebook, Ori)->
                 register_date = os:timestamp(),
                 status = ok }.
 
-email_prop(Props, _) ->
-    proplists:get_value(<<"email">>, Props).
+index(K) -> wf:to_binary(K).
+email_prop(Props, _) -> proplists:get_value(<<"email">>, Props).
 
 login_button() -> application:get_env(avz,facebook_button,
     #panel{class=["btn-group"], body=#link{id=loginfb,

+ 2 - 2
src/github.erl

@@ -53,8 +53,7 @@ registration_data(Props, github, Ori) ->
     Id = proplists:get_value(<<"id">>, Props),
     Name = proplists:get_value(<<"name">>, Props),
     Email = email_prop(Props, github),
-    Ori#user{   id= Email,
-                username = binary_to_list(proplists:get_value(<<"login">>, Props)),
+    Ori#user{   username = binary_to_list(proplists:get_value(<<"login">>, Props)),
                 display_name = Name,
                 images = avz:update({gh_avatar,proplists:get_value(<<"avatar_url">>, Props)},Ori#user.images),
                 email = Email,
@@ -64,6 +63,7 @@ registration_data(Props, github, Ori) ->
                 register_date = os:timestamp(),
                 status = ok }.
 
+index(K) -> wf:to_binary(K).
 email_prop(Props, github) ->
     Mail = proplists:get_value(<<"email">>, Props, undefined),
     L = wf:to_list(Mail),

+ 8 - 6
src/google.erl

@@ -15,18 +15,19 @@
 -define(G_BTN_THEME,     application:get_env(avz, g_btn_theme, "light")).
 -define(G_BTN_LONGTITLE, application:get_env(avz, g_btn_longtitle, true)).
 
+-define(ATTS, #{email => <<"U3">>, name => <<"ig">>, id => <<"Eea">>, image => <<"Paa">>}).
+
 api_event(gLogin, Args, _) -> {JSArgs} = ?AVZ_JSON:decode(list_to_binary(Args)), avz:login(google, JSArgs);
 api_event(gLoginFail, Args, _) -> wf:info(?MODULE, "Login failed ~p~n", [Args]).
 
 registration_data(Props, google, Ori)->
-    Id = proplists:get_value(<<"Eea">>, Props),
-    Name = proplists:get_value(<<"ig">>, Props),
-    Image = proplists:get_value(<<"Paa">>, Props),
+    Id = proplists:get_value(maps:get(id,?ATTS), Props),
+    Name = proplists:get_value(maps:get(name, ?ATTS), Props),
+    Image = proplists:get_value(maps:get(image,?ATTS), Props),
     GivenName = proplists:get_value(<<"ofa">>, Props),
     FamilyName = proplists:get_value(<<"wea">>, Props),
     Email = email_prop(Props,google),
-    Ori#user{id = Email,
-                display_name = Name,
+    Ori#user{   display_name = Name,
                 images = avz:update({google_avatar,Image},Ori#user.images),
                 email = Email,
                 names = GivenName,
@@ -36,7 +37,8 @@ registration_data(Props, google, Ori)->
                 % sex = proplists:get_value(<<"gender">>, Props),
                 status = ok }.
 
-email_prop(Props, _) -> proplists:get_value(<<"U3">>, Props).
+index(K) -> maps:get(K, ?ATTS, K).
+email_prop(Props, _) -> proplists:get_value(maps:get(email,?ATTS), Props).
 
 login_button()-> #panel{id=?G_BTN_ID}.
 

+ 2 - 2
src/microsoft.erl

@@ -37,8 +37,7 @@ registration_data(Props, microsoft, Ori)->
     GivenName = proplists:get_value(<<"givenName">>, Props),
     FamilyName = proplists:get_value(<<"surname">>, Props),
     Email = email_prop(Props,microsoft),
-    Ori#user{ id = Email,
-                display_name = proplists:get_value(<<"displayName">>, Props),
+    Ori#user{   display_name = proplists:get_value(<<"displayName">>, Props),
                 email = Email,
                 names = GivenName,
                 surnames = FamilyName,
@@ -47,6 +46,7 @@ registration_data(Props, microsoft, Ori)->
                 sex = proplists:get_value(<<"gender">>, Props),
                 status = ok }.
 
+index(K) -> wf:to_binary(K).
 email_prop(Props, _) -> proplists:get_value(<<"userPrincipalName">>, Props).
 
 login_button()-> #link{

+ 2 - 2
src/twitter.erl

@@ -14,8 +14,7 @@ registration_data(Props, twitter, Ori)->
     Id = proplists:get_value(<<"id_str">>, Props),
     UserName = binary_to_list(proplists:get_value(<<"screen_name">>, Props)),
     Email = email_prop(Props,twitter),
-    Ori#user{   id = Email,
-                username = re:replace(UserName, "\\.", "_", [{return, list}]),
+    Ori#user{   username = re:replace(UserName, "\\.", "_", [{return, list}]),
                 display_name = proplists:get_value(<<"screen_name">>, Props),
                 images = avz:update({tw_avatar,proplists:get_value(<<"profile_image_url">>, Props)},Ori#user.images),
                 names = proplists:get_value(<<"name">>, Props),
@@ -25,6 +24,7 @@ registration_data(Props, twitter, Ori)->
                 register_date = os:timestamp(),
                 status = ok }.
 
+index(K) -> wf:to_binary(K).
 email_prop(Props, twitter) -> proplists:get_value(<<"screen_name">>, Props).
 
 callback() ->