1 |
|
-module(mod_auth_token_rdbms). |
2 |
|
-behaviour(mod_auth_token_backend). |
3 |
|
|
4 |
|
-export([start/1, |
5 |
|
get_valid_sequence_number/2, |
6 |
|
revoke/2, |
7 |
|
clean_tokens/2]). |
8 |
|
|
9 |
|
-include("mongoose.hrl"). |
10 |
|
|
11 |
|
-spec start(mongooseim:host_type()) -> ok. |
12 |
|
start(HostType) -> |
13 |
6 |
prepare_queries(HostType). |
14 |
|
|
15 |
|
%% Assumption: all sequence numbers less than the current valid one |
16 |
|
%% are not valid. |
17 |
|
-spec get_valid_sequence_number(mongooseim:host_type(), jid:jid()) -> integer(). |
18 |
|
get_valid_sequence_number(HostType, JID) -> |
19 |
26 |
BBareJID = jid:to_bare_binary(JID), |
20 |
26 |
{atomic, Selected} = |
21 |
|
mongoose_rdbms:sql_transaction( |
22 |
26 |
HostType, fun() -> get_sequence_number_t(HostType, BBareJID) end), |
23 |
26 |
mongoose_rdbms:selected_to_integer(Selected). |
24 |
|
|
25 |
|
-spec revoke(mongooseim:host_type(), jid:jid()) -> ok | not_found. |
26 |
|
revoke(HostType, JID) -> |
27 |
12 |
BBareJID = jid:to_bare_binary(JID), |
28 |
12 |
QueryResult = execute_revoke_token(HostType, BBareJID), |
29 |
12 |
?LOG_DEBUG(#{what => auth_token_revoke, owner => BBareJID, sql_result => QueryResult}), |
30 |
12 |
case QueryResult of |
31 |
8 |
{updated, 1} -> ok; |
32 |
4 |
{updated, 0} -> not_found |
33 |
|
end. |
34 |
|
|
35 |
|
-spec clean_tokens(mongooseim:host_type(), jid:jid()) -> ok. |
36 |
|
clean_tokens(HostType, Owner) -> |
37 |
30 |
BBareJID = jid:to_bare_binary(Owner), |
38 |
30 |
execute_delete_token(HostType, BBareJID), |
39 |
30 |
ok. |
40 |
|
|
41 |
|
-spec prepare_queries(mongooseim:host_type()) -> ok. |
42 |
|
prepare_queries(HostType) -> |
43 |
6 |
mongoose_rdbms:prepare(auth_token_select, auth_token, [owner], |
44 |
|
<<"SELECT seq_no FROM auth_token WHERE owner = ?">>), |
45 |
6 |
mongoose_rdbms:prepare(auth_token_revoke, auth_token, [owner], |
46 |
|
<<"UPDATE auth_token SET seq_no=seq_no+1 WHERE owner = ?">>), |
47 |
6 |
mongoose_rdbms:prepare(auth_token_delete, auth_token, [owner], |
48 |
|
<<"DELETE from auth_token WHERE owner = ?">>), |
49 |
6 |
rdbms_queries:prepare_upsert(HostType, auth_token_upsert, auth_token, |
50 |
|
[<<"owner">>, <<"seq_no">>], [], [<<"owner">>]), |
51 |
6 |
ok. |
52 |
|
|
53 |
|
-spec execute_revoke_token(mongooseim:host_type(), jid:literal_jid()) -> mongoose_rdbms:query_result(). |
54 |
|
execute_revoke_token(HostType, Owner) -> |
55 |
12 |
mongoose_rdbms:execute_successfully(HostType, auth_token_revoke, [Owner]). |
56 |
|
|
57 |
|
-spec execute_delete_token(mongooseim:host_type(), jid:literal_jid()) -> mongoose_rdbms:query_result(). |
58 |
|
execute_delete_token(HostType, Owner) -> |
59 |
30 |
mongoose_rdbms:execute_successfully(HostType, auth_token_delete, [Owner]). |
60 |
|
|
61 |
|
-spec get_sequence_number_t(mongooseim:host_type(), jid:literal_jid()) -> mongoose_rdbms:query_result(). |
62 |
|
get_sequence_number_t(HostType, Owner) -> |
63 |
26 |
{updated, _} = |
64 |
|
rdbms_queries:execute_upsert(HostType, auth_token_upsert, [Owner, 1], [], [Owner]), |
65 |
26 |
mongoose_rdbms:execute_successfully(HostType, auth_token_select, [Owner]). |