summaryrefslogtreecommitdiff
path: root/src/login
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2018-08-10 10:20:09 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2018-08-10 10:20:09 +0200
commitcbae439196de8382d5218f11e7a3afd812a5ae52 (patch)
tree2f6d35aa5d5462d61ce4a4cd6fb9fd2ba3c79ee3 /src/login
parent16f10af4f1fbf8c21d127d2163c3ace9611cbb91 (diff)
Got login to work.
Diffstat (limited to 'src/login')
-rw-r--r--src/login/lgn_handler.erl66
-rw-r--r--src/login/lgn_shim.erl30
-rw-r--r--src/login/query/lgn_sign_in.erl136
-rw-r--r--src/login/reply/lgn_set_session.erl30
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}
+ ]
+ }.