| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-08-10 10:20:09 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-08-10 10:20:09 +0200 | 
| commit | cbae439196de8382d5218f11e7a3afd812a5ae52 (patch) | |
| tree | 2f6d35aa5d5462d61ce4a4cd6fb9fd2ba3c79ee3 /src/login | |
| parent | 16f10af4f1fbf8c21d127d2163c3ace9611cbb91 (diff) | |
Got login to work.
Diffstat (limited to 'src/login')
| -rw-r--r-- | src/login/lgn_handler.erl | 66 | ||||
| -rw-r--r-- | src/login/lgn_shim.erl | 30 | ||||
| -rw-r--r-- | src/login/query/lgn_sign_in.erl | 136 | ||||
| -rw-r--r-- | src/login/reply/lgn_set_session.erl | 30 | 
4 files changed, 262 insertions, 0 deletions
| diff --git a/src/login/lgn_handler.erl b/src/login/lgn_handler.erl new file mode 100644 index 0000000..dc154b0 --- /dev/null +++ b/src/login/lgn_handler.erl @@ -0,0 +1,66 @@ +-module(lgn_handler). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([start/1]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec ensure_player_exists (binary(), binary(), binary(), binary()) -> 'ok'. +ensure_player_exists (ID, Username, Password, Email) -> +   case shr_database:fetch(player_db, ID, admin) of +      {ok, _} -> ok; +      not_found -> +         shr_database:insert +         ( +            player_db, +            ID, +            any, +            any, +            lgn_shim:generate_random_player(ID, Username, Password, Email) +         ) +   end, + +   case shr_database:fetch(login_db, ID, admin) of +      {ok, _} -> ok; +      not_found -> +         shr_database:insert +         ( +            login_db, +            Username, +            any, +            any, +            ID +         ) +   end, + +   ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec start (pid()) -> 'ok'. +start (TimedCachesManagerPid) -> +   ensure_player_exists +   ( +      <<"0">>, +      <<"Player1">>, +      <<"Kalimer0">>, +      <<"P1@Tacticians.Online">> +   ), +   ensure_player_exists +   ( +      <<"1">>, +      <<"Player2">>, +      <<"Kalimer1">>, +      <<"P2@Tacticians.Online">> +   ), +   shr_timed_caches_manager:new_cache(TimedCachesManagerPid, login_db, none), +   shr_timed_caches_manager:new_cache(TimedCachesManagerPid, player_db, none), +   ok. diff --git a/src/login/lgn_shim.erl b/src/login/lgn_shim.erl new file mode 100644 index 0000000..53d95ee --- /dev/null +++ b/src/login/lgn_shim.erl @@ -0,0 +1,30 @@ +-module(lgn_shim). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([generate_random_player/4]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec generate_random_player +   ( +      binary(), +      binary(), +      binary(), +      binary() +   ) +   -> shr_player:type(). +generate_random_player (ID, Username, Password, Email) -> +   Result = shr_player:new(ID, Username, Password, Email), + +   Result. diff --git a/src/login/query/lgn_sign_in.erl b/src/login/query/lgn_sign_in.erl new file mode 100644 index 0000000..1ded595 --- /dev/null +++ b/src/login/query/lgn_sign_in.erl @@ -0,0 +1,136 @@ +-module(lgn_sign_in). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-include("../../../include/yaws_api.hrl"). + +-record +( +   input, +   { +      username :: binary(), +      password :: binary() +   } +). + +-record +( +   query_state, +   { +      player_id :: binary(), +      player :: shr_player:type() +   } +). + +-type input() :: #input{}. +-type query_state() :: #query_state{}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([out/1]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec parse_input (binary()) -> input(). +parse_input (Req) -> +   JSONReqMap = jiffy:decode(Req, [return_maps]), +   Username = maps:get(<<"usr">>, JSONReqMap), +   Password = maps:get(<<"pwd">>, JSONReqMap), + +   #input +   { +      username = Username, +      password = Password +   }. + +-spec fetch_data (input()) -> query_state(). +fetch_data (Input) -> +   Username = Input#input.username, + +   % Having this be cached my be both useless and a security issue. +   PlayerID = shr_timed_cache:fetch(login_db, any, Username), + +   Player = shr_timed_cache:fetch(player_db, PlayerID, PlayerID), + +   #query_state +   { +      player_id = PlayerID, +      player = Player +   }. + +-spec update_data (query_state(), input()) -> query_state(). +update_data (QueryState, Input) -> +   InputPassword = Input#input.password, +   Player = QueryState#query_state.player, + +   true = (shr_player:password_is(InputPassword, Player)), + +   S0Player = shr_player:new_token(Player), +   S1Player = shr_player:refresh_active(S0Player), + +   QueryState#query_state +   { +      player = S1Player +   }. + +-spec commit_update (query_state()) -> 'ok'. +commit_update (QueryState) -> +   PlayerID = QueryState#query_state.player_id, +   UpdatedPlayer = QueryState#query_state.player, +   NewToken = shr_player:get_token(UpdatedPlayer), +   NewActiveTime = shr_player:get_last_active(UpdatedPlayer), + +   Query = +      shr_db_query:new +      ( +         player_db, +         PlayerID, +         {user, PlayerID}, +         [ +            shr_db_query:set_field +            ( +               shr_player:get_token_field(), +               NewToken +            ), +            shr_db_query:set_field +            ( +               shr_player:get_last_active_field(), +               NewActiveTime +            ) +         ] +      ), + +   shr_database:commit(Query), +   shr_timed_cache:update(player_db, PlayerID, PlayerID, UpdatedPlayer), + +   'ok'. + +-spec generate_reply(query_state()) -> binary(). +generate_reply (QueryState) -> +   Player = QueryState#query_state.player, + +   SetSession = lgn_set_session:generate(Player), +   Output = jiffy:encode([SetSession]), + +   Output. + +-spec handle (binary()) -> binary(). +handle (Req) -> +   Input = parse_input(Req), +   QueryState = fetch_data(Input), +   Update = update_data(QueryState, Input), +   commit_update(Update), +   generate_reply(QueryState). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +out(A) -> +   { +      content, +      "application/json; charset=UTF-8", +      handle(A#arg.clidata) +   }. diff --git a/src/login/reply/lgn_set_session.erl b/src/login/reply/lgn_set_session.erl new file mode 100644 index 0000000..f033d91 --- /dev/null +++ b/src/login/reply/lgn_set_session.erl @@ -0,0 +1,30 @@ +-module(lgn_set_session). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([generate/1]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec generate (shr_player:type()) -> {list(any())}. +generate (Player) -> +   PID = shr_player:get_id(Player), +   SessionToken = shr_player:get_token(Player), + +   { +      [ +         {<<"msg">>, <<"sse">>}, +         {<<"pid">>, PID}, +         {<<"stk">>, SessionToken} +      ] +   }. | 


