auth_server.erl 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. -module(auth_server).
  2. -include_lib("server/include/settings.hrl").
  3. -include_lib("server/include/authtoken.hrl").
  4. -include_lib("server/include/requests.hrl").
  5. -include_lib("kvs/include/user.hrl").
  6. -behaviour(gen_server).
  7. -compile(export_all).
  8. -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
  9. -define(SERVER, ?MODULE).
  10. -define(SPARE_LOGINS, [
  11. #'PlayerInfo'{name = <<"Hürrem"/utf8>>, sex = female, surname = <<"Sultan">>, login = <<"peace">>, robot = true},
  12. #'PlayerInfo'{name = <<"Ilya">>, sex = male, surname = <<"Prigogine">>, login = <<"synergetics">>, robot = true},
  13. #'PlayerInfo'{name = <<"Albert">>, sex = male, surname= <<"Einstein">>, login = <<"quantum">>, robot = true },
  14. #'PlayerInfo'{name = <<"Marie">>, sex = female, surname= <<"Curie">>, login = <<"radio">>, robot = true }
  15. ]).
  16. -record(state, {spare = ?SPARE_LOGINS,tokens}).
  17. spare() -> [ P#'PlayerInfo'{id =wf:to_binary(wf:to_list(P#'PlayerInfo'.login) ++
  18. wf:to_list(id_generator:get_id2()))} || P <- ?SPARE_LOGINS ].
  19. start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
  20. store_token(GameId, Token, UserId) -> gen_server:call(?SERVER, {store_token, GameId, Token, UserId}).
  21. get_user_info(Token) -> gen_server:call(?SERVER, {get_user_info, Token}).
  22. get_user_info_by_user_id(UserId) -> user_info(UserId).
  23. generate_token(Game,User) -> T = base64:encode(crypto:rand_bytes(100)), store_token(Game,T,User).
  24. init([]) ->
  25. Tokens = ets:new(tokens, [private, ordered_set, {keypos, #authtoken.token}]),
  26. {ok, #state{tokens = Tokens}}.
  27. handle_call({store_token, GameId, Token, UserId}, _From, #state{tokens = E} = State) ->
  28. store_token(GameId, E, Token, UserId),
  29. {reply, Token, State};
  30. handle_call({get_user_info, Token}, _From, #state{tokens = E} = State) ->
  31. case ets:lookup(E, Token) of
  32. [] ->
  33. gas:info(?MODULE,"Token not found. Denied.", []),
  34. {reply, false, State};
  35. List ->
  36. {authtoken, _, UserId} = hd(List),
  37. Reply = case user_info(UserId) of
  38. {error, not_found} ->
  39. gas:info(?MODULE,"User is not in DB", []),
  40. user_info(#user{id = UserId, names= UserId, surnames = <<>> });
  41. UserInfo ->
  42. gas:info(?MODULE,"Registered User", []),
  43. UserInfo
  44. end,
  45. {reply, Reply, State}
  46. end;
  47. handle_call(_Request, _From, State) -> Reply = ok, {reply, Reply, State}.
  48. handle_cast(_Msg, State) -> {noreply, State}.
  49. handle_info(_Info, State) -> {noreply, State}.
  50. terminate(_Reason, _State) -> ok.
  51. code_change(_OldVsn, State, _Extra) -> {ok, State}.
  52. robot_credentials() ->
  53. Pos = crypto:rand_uniform(1, length(?SPARE_LOGINS) + 1),
  54. H0 = lists:nth(Pos, ?SPARE_LOGINS),
  55. Id = wf:to_binary(wf:to_list(H0#'PlayerInfo'.login) ++ wf:to_list(id_generator:get_id2())),
  56. H0#'PlayerInfo'{id = Id}.
  57. store_token(GameId, E, Token, UserId) ->
  58. gas:info(?MODULE,"Storing token: ~p", [Token]),
  59. Data = #authtoken{token = Token, id = UserId},
  60. ets:insert(E, Data).
  61. player_name(#'PlayerInfo'{login = Id, name = Name, surname = Surname}) ->
  62. wf:to_binary([case Name of <<"undefined">> -> Id;
  63. _ -> wf:to_list(Name) ++ case Surname of
  64. <<"undefined">> -> ""; _ -> " " ++ wf:to_list(Surname) end end]).
  65. user_info(#user{}=UserData) ->
  66. % gas:info(?MODULE,"PlayerInfo by #user: ~p",[UserData]),
  67. #'PlayerInfo'{id = UserData#user.id,
  68. login = UserData#user.username,
  69. name = UserData#user.names,
  70. sex = UserData#user.sex,
  71. avatar_url = UserData#user.avatar,
  72. skill = proplists:get_value(skill,UserData#user.tokens,0),
  73. score = proplists:get_value(score,UserData#user.tokens,0),
  74. surname = UserData#user.surnames};
  75. user_info(UserId) ->
  76. case kvs:get(user,UserId) of
  77. {ok, UserData} ->
  78. % gas:info(?MODULE,"User Data: ~p",[UserData]),
  79. user_info(UserData);
  80. Error -> Error end.