timestamper/src/ts_user.erl
Jonathan Bernard 4492f87a39 Added user_summary to api.
Added ts_api:dispatch_app/3
Added ts_api:get_user_summary/2
Fixed compile errors in ts_user.
Added comments.
2011-02-24 07:29:30 -06:00

55 lines
1.7 KiB
Erlang

-module(ts_user).
%-export([create_table/1, new/1, update/1, lookup/1, list/2]).
-compile(export_all).
-include("ts_db_records.hrl").
-include_lib("stdlib/include/qlc.hrl").
create_table(TableOpts) ->
mnesia:create_table(ts_user,
TableOpts ++ [{attributes, record_info(fields, ts_user)},
{type, ordered_set}]).
% expects the password in clear
new(UR = #ts_user{}) ->
case mnesia:dirty_read(ts_user, UR#ts_user.username) of
[ExistingRecord] -> {error, {record_exists, ExistingRecord}};
[] -> mnesia:dirty_write(hash_input_record(UR))
end.
update(UR = #ts_user{}) ->
case mnesia:dirty_read(ts_user, UR#ts_user.username) of
[] -> no_record;
[Record] ->
UpdatedRecord = ts_common:update_record(Record, UR),
HashedRecord = case UR#ts_user.pwd of
undefined -> UpdatedRecord;
_Password -> hash_input_record(UpdatedRecord)
end,
mnesia:dirty_write(HashedRecord)
end.
lookup(Username) ->
case mnesia:dirty_read(ts_user, Username) of
[] -> no_record;
[User] -> User
end.
list(Start, Length) -> ts_common:list(ts_user, Start, Length).
hash_input_record(User=#ts_user{}) ->
% create a new User record
Salt = generate_salt(),
HashedPwd = hash_pwd(User#ts_user.pwd, Salt),
User#ts_user{pwd = HashedPwd, pwd_salt = Salt}.
generate_salt() -> crypto:rand_bytes(36).
hash_pwd(Password, Salt) -> crypto:sha(Password ++ Salt).
check_credentials(Username, Password) ->
User = lookup(Username),
HashedInput = hash_pwd(Password, User#ts_user.pwd_salt),
HashedInput == User#ts_user.pwd.