Current section
Files
Jump to
Current section
Files
src/session_token.erl
-module(session_token).
-export([init_table/0, issue/2, validate/1, update_device/2]).
-include("session_token.hrl").
init_table() ->
case ets:info(session_tokens) of
undefined ->
ets:new(session_tokens, [set, public, named_table, {keypos, #session_token.token}]);
_ ->
ok
end.
issue(User, Room) ->
init_table(),
Token = n2o_secret:sid(os:timestamp()),
Now = calendar:datetime_to_gregorian_seconds(calendar:local_time()),
Expiry = Now + 180, % 3 minutes (180 seconds)
Record = #session_token{
token = Token,
user = case is_binary(User) of true -> User; false -> list_to_binary(User) end,
room = case is_binary(Room) of true -> Room; false -> list_to_binary(Room) end,
device = undefined,
expiry = Expiry
},
ets:insert(session_tokens, Record),
Token.
validate(Token) ->
init_table(),
Now = calendar:datetime_to_gregorian_seconds(calendar:local_time()),
case ets:lookup(session_tokens, Token) of
[#session_token{expiry = Expiry} = ST] when Expiry >= Now ->
{ok, ST};
[#session_token{token = T}] ->
%% Expired
ets:delete(session_tokens, T),
{error, expired};
[] ->
{error, not_found}
end.
update_device(Token, Device) ->
init_table(),
case ets:lookup(session_tokens, Token) of
[ST] ->
NewST = ST#session_token{device = case is_binary(Device) of true -> Device; false -> list_to_binary(Device) end},
ets:insert(session_tokens, NewST),
ok;
[] ->
{error, not_found}
end.