auth_server.erl 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. -module(auth_server).
  2. -include_lib("server/include/conf.hrl").
  3. -include_lib("server/include/settings.hrl").
  4. -include_lib("server/include/log.hrl").
  5. -include_lib("server/include/authtoken.hrl").
  6. -include_lib("server/include/requests.hrl").
  7. -include_lib("kvs/include/user.hrl").
  8. -behaviour(gen_server).
  9. -compile(export_all).
  10. -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
  11. -define(SERVER, ?MODULE).
  12. -define(SPARE_LOGINS, [#'PlayerInfo'{name = <<"Abe">>, surname="Kobo", login = <<"dunes">>, avatar_url = <<"/files/users/user_dunes/avatar/1-small.jpg">>},
  13. #'PlayerInfo'{name = <<"Herman">>, surname="Hesse", login = <<"wolves">>, avatar_url = <<"/files/users/user_wolves/avatar/1-small.jpg">>},
  14. #'PlayerInfo'{name = <<"Ernest">>, surname = <<"Hemingway">>, login = <<"oldman">>, avatar_url = <<"/files/users/user_oldman/avatar/1-small.jpg">>},
  15. #'PlayerInfo'{name = <<"Erich Maria">>, surname = <<"Remarque">>, login = <<"imwesten">>, avatar_url = <<"/files/users/user_imwesten/avatar/1-small.jpg">>}]).
  16. -record(state, {
  17. spare = ?SPARE_LOGINS,
  18. tokens
  19. }).
  20. %% definition of user from zealot/include/user.hrl
  21. -record(user_info,
  22. {username,
  23. name,
  24. surname,
  25. age,
  26. avatar_url,
  27. sex,
  28. skill :: integer(),
  29. score :: integer()}).
  30. start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
  31. store_token(GameId, Token, UserId) when is_list(Token) -> store_token(GameId, list_to_binary(Token), UserId);
  32. store_token(GameId, Token, UserId) when is_binary(Token) -> gen_server:call(?SERVER, {store_token, GameId, Token, UserId}).
  33. get_user_info(Token) when is_list(Token) -> get_user_info(list_to_binary(Token));
  34. get_user_info(Token) when is_binary(Token) -> gen_server:call(?SERVER, {get_user_info, Token}).
  35. get_user_info(Token, Id) when is_list(Token) -> get_user_info(list_to_binary(Token), Id);
  36. get_user_info(Token, Id) when is_list(Id) -> get_user_info(Token, list_to_binary(Id));
  37. get_user_info(Token, Id) when is_binary(Token), is_binary(Id) -> gen_server:call(?SERVER, {get_user_info, Token, Id}).
  38. get_user_info_by_user_id(UserId) when is_list(UserId) -> get_user_info_by_user_id(list_to_binary(UserId));
  39. get_user_info_by_user_id(UserId) -> user_info(UserId).
  40. fake_credentials() -> gen_server:call(?SERVER, {fake_credentials}).
  41. robot_credentials() -> gen_server:call(?SERVER, {robot_credentials}).
  42. generate_token(Game,User) -> T = base64:encode(crypto:rand_bytes(100)), store_token(Game,T,User).
  43. init([]) ->
  44. Tokens = ets:new(tokens, [private, ordered_set, {keypos, #authtoken.token}]),
  45. store_token(0,Tokens, <<?TEST_TOKEN>>, "maxim"),
  46. store_token(0,Tokens, <<?TEST_TOKEN2>>, "alice"),
  47. {ok, #state{tokens = Tokens}}.
  48. handle_call({store_token, GameId, Token, UserId}, _From, #state{tokens = E} = State) ->
  49. store_token(GameId, E, Token, UserId),
  50. {reply, Token, State};
  51. handle_call({get_user_info, Token}, _From, #state{tokens = E} = State) ->
  52. gas:info("checking token: ~p", [Token]),
  53. case ets:lookup(E, Token) of
  54. [] ->
  55. gas:info("token not found", []),
  56. {reply, false, State};
  57. List ->
  58. {authtoken, _, UserId} = hd(List),
  59. gas:info("token was registred, getting user info for ~p",[UserId]),
  60. Reply = case user_info(UserId) of
  61. {ok, UserInfo} ->
  62. gas:info("..user info retrieved", []),
  63. UserInfo;
  64. {error, not_found} ->
  65. gas:info("..no such user info, providing fake credentials", []),
  66. fake_credentials0(State#state.spare); %% for eunit tests. FIX
  67. {badrpc, _} ->
  68. gas:info("..bad rpc, providing fake credentials", []),
  69. fake_credentials0(State#state.spare) %% for eunit tests. FIX
  70. end,
  71. {reply, Reply, State}
  72. end;
  73. handle_call({get_user_info, Token, Id}, _From, #state{tokens = E} = State) ->
  74. gas:info("checking token: ~p", [Token]),
  75. case ets:lookup(E, Token) of
  76. [] ->
  77. gas:error("token not found", []),
  78. {reply, false, State};
  79. _List ->
  80. Reply0 = fake_credentials0(State#state.spare),
  81. Reply = Reply0#'PlayerInfo'{id = Id},
  82. {reply, Reply, State}
  83. end;
  84. handle_call({fake_credentials}, _From, #state{spare = Spare} = State) -> H = fake_credentials0(Spare), {reply, H, State};
  85. handle_call({robot_credentials}, _From, #state{spare = Spare} = State) -> H = fake_credentials0(Spare), {reply, H#'PlayerInfo'{robot = true}, State};
  86. handle_call(_Request, _From, State) -> Reply = ok, {reply, Reply, State}.
  87. handle_cast(_Msg, State) -> {noreply, State}.
  88. handle_info(_Info, State) -> {noreply, State}.
  89. terminate(_Reason, _State) -> ok.
  90. code_change(_OldVsn, State, _Extra) -> {ok, State}.
  91. fake_credentials0(Spare) ->
  92. Pos = crypto:rand_uniform(1, length(Spare)),
  93. H0 = lists:nth(Pos, Spare),
  94. Id = list_to_binary(binary_to_list(H0#'PlayerInfo'.login) ++
  95. integer_to_list(id_generator:get_id2())),
  96. H0#'PlayerInfo'{id = Id}.
  97. store_token(GameId, E, Token, UserId) ->
  98. gas:info("storing token: ~p", [Token]),
  99. Data = #authtoken{token = Token, id = UserId},
  100. ets:insert(E, Data).
  101. user_info(UserId) ->
  102. case kvs:get(user,UserId) of
  103. {ok, UserData} ->
  104. gas:info("User Data: ~p",[UserData]),
  105. {ok, #'PlayerInfo'{id = wf:to_binary(UserData#user.id),
  106. login = wf:to_binary(UserData#user.username),
  107. name = wf:to_binary(UserData#user.id),
  108. avatar_url = wf:to_binary(UserData#user.avatar),
  109. skill = 0,
  110. score = 0,
  111. surname = wf:to_binary(UserData#user.surnames)}};
  112. Error ->
  113. Error
  114. end.