aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_auth_sql.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-05-23 12:25:13 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-05-23 12:25:13 +0300
commit6e8895f9e9d9864709f41ca84669de54342bd881 (patch)
treef0744615fa58325f8355fec17ad6a2980e4b35f6 /src/ejabberd_auth_sql.erl
parentDeprecate misc:encode_base64/1 and misc:decode_base64/1 (diff)
Get rid of sql_queries.erl
Diffstat (limited to 'src/ejabberd_auth_sql.erl')
-rw-r--r--src/ejabberd_auth_sql.erl142
1 files changed, 125 insertions, 17 deletions
diff --git a/src/ejabberd_auth_sql.erl b/src/ejabberd_auth_sql.erl
index d682634f0..0d7c7b375 100644
--- a/src/ejabberd_auth_sql.erl
+++ b/src/ejabberd_auth_sql.erl
@@ -30,11 +30,12 @@
-author('alexey@process-one.net').
-behaviour(ejabberd_auth).
+-behaviour(ejabberd_config).
-export([start/1, stop/1, set_password/3, try_register/3,
get_users/2, count_users/2, get_password/2,
remove_user/2, store_type/1, plain_password_required/1,
- convert_to_scram/1]).
+ convert_to_scram/1, opt_type/1]).
-include("ejabberd.hrl").
-include("logger.hrl").
@@ -56,15 +57,17 @@ store_type(Server) ->
ejabberd_auth:password_format(Server).
set_password(User, Server, Password) ->
- Res = if is_record(Password, scram) ->
- sql_queries:set_password_scram_t(
- Server, User,
- Password#scram.storedkey, Password#scram.serverkey,
- Password#scram.salt, Password#scram.iterationcount);
- true ->
- sql_queries:set_password_t(Server, User, Password)
- end,
- case Res of
+ F = fun() ->
+ if is_record(Password, scram) ->
+ set_password_scram_t(
+ User,
+ Password#scram.storedkey, Password#scram.serverkey,
+ Password#scram.salt, Password#scram.iterationcount);
+ true ->
+ set_password_t(User, Password)
+ end
+ end,
+ case ejabberd_sql:sql_transaction(Server, F) of
{atomic, _} ->
ok;
{aborted, Reason} ->
@@ -74,12 +77,12 @@ set_password(User, Server, Password) ->
try_register(User, Server, Password) ->
Res = if is_record(Password, scram) ->
- sql_queries:add_user_scram(
+ add_user_scram(
Server, User,
Password#scram.storedkey, Password#scram.serverkey,
Password#scram.salt, Password#scram.iterationcount);
true ->
- sql_queries:add_user(Server, User, Password)
+ add_user(Server, User, Password)
end,
case Res of
{updated, 1} -> ok;
@@ -87,21 +90,21 @@ try_register(User, Server, Password) ->
end.
get_users(Server, Opts) ->
- case sql_queries:list_users(Server, Opts) of
+ case list_users(Server, Opts) of
{selected, Res} ->
[{U, Server} || {U} <- Res];
_ -> []
end.
count_users(Server, Opts) ->
- case sql_queries:users_number(Server, Opts) of
+ case users_number(Server, Opts) of
{selected, [{Res}]} ->
Res;
_Other -> 0
end.
get_password(User, Server) ->
- case sql_queries:get_password_scram(Server, User) of
+ case get_password_scram(Server, User) of
{selected, [{Password, <<>>, <<>>, 0}]} ->
{ok, Password};
{selected, [{StoredKey, ServerKey, Salt, IterationCount}]} ->
@@ -118,7 +121,7 @@ get_password(User, Server) ->
end.
remove_user(User, Server) ->
- case sql_queries:del_user(Server, User) of
+ case del_user(Server, User) of
{updated, _} ->
ok;
Err ->
@@ -139,6 +142,105 @@ set_password_scram_t(LUser,
"salt=%(Salt)s",
"iterationcount=%(IterationCount)d"]).
+set_password_t(LUser, Password) ->
+ ?SQL_UPSERT_T(
+ "users",
+ ["!username=%(LUser)s",
+ "password=%(Password)s"]).
+
+get_password_scram(LServer, LUser) ->
+ ejabberd_sql:sql_query(
+ LServer,
+ ?SQL("select @(password)s, @(serverkey)s, @(salt)s, @(iterationcount)d"
+ " from users"
+ " where username=%(LUser)s")).
+
+add_user_scram(LServer, LUser,
+ StoredKey, ServerKey, Salt, IterationCount) ->
+ ejabberd_sql:sql_query(
+ LServer,
+ ?SQL("insert into users(username, password, serverkey, salt, "
+ "iterationcount) "
+ "values (%(LUser)s, %(StoredKey)s, %(ServerKey)s,"
+ " %(Salt)s, %(IterationCount)d)")).
+
+add_user(LServer, LUser, Password) ->
+ ejabberd_sql:sql_query(
+ LServer,
+ ?SQL("insert into users(username, password) "
+ "values (%(LUser)s, %(Password)s)")).
+
+del_user(LServer, LUser) ->
+ ejabberd_sql:sql_query(
+ LServer,
+ ?SQL("delete from users where username=%(LUser)s")).
+
+list_users(LServer, []) ->
+ ejabberd_sql:sql_query(
+ LServer,
+ ?SQL("select @(username)s from users"));
+list_users(LServer, [{from, Start}, {to, End}])
+ when is_integer(Start) and is_integer(End) ->
+ list_users(LServer,
+ [{limit, End - Start + 1}, {offset, Start - 1}]);
+list_users(LServer,
+ [{prefix, Prefix}, {from, Start}, {to, End}])
+ when is_binary(Prefix) and is_integer(Start) and
+ is_integer(End) ->
+ list_users(LServer,
+ [{prefix, Prefix}, {limit, End - Start + 1},
+ {offset, Start - 1}]);
+list_users(LServer, [{limit, Limit}, {offset, Offset}])
+ when is_integer(Limit) and is_integer(Offset) ->
+ ejabberd_sql:sql_query(
+ LServer,
+ ?SQL("select @(username)s from users "
+ "order by username "
+ "limit %(Limit)d offset %(Offset)d"));
+list_users(LServer,
+ [{prefix, Prefix}, {limit, Limit}, {offset, Offset}])
+ when is_binary(Prefix) and is_integer(Limit) and
+ is_integer(Offset) ->
+ SPrefix = ejabberd_sql:escape_like_arg_circumflex(Prefix),
+ SPrefix2 = <<SPrefix/binary, $%>>,
+ ejabberd_sql:sql_query(
+ LServer,
+ ?SQL("select @(username)s from users "
+ "where username like %(SPrefix2)s escape '^' "
+ "order by username "
+ "limit %(Limit)d offset %(Offset)d")).
+
+users_number(LServer) ->
+ ejabberd_sql:sql_query(
+ LServer,
+ fun(pgsql, _) ->
+ case
+ ejabberd_config:get_option(
+ {pgsql_users_number_estimate, LServer}, false) of
+ true ->
+ ejabberd_sql:sql_query_t(
+ ?SQL("select @(reltuples :: bigint)d from pg_class"
+ " where oid = 'users'::regclass::oid"));
+ _ ->
+ ejabberd_sql:sql_query_t(
+ ?SQL("select @(count(*))d from users"))
+ end;
+ (_Type, _) ->
+ ejabberd_sql:sql_query_t(
+ ?SQL("select @(count(*))d from users"))
+ end).
+
+users_number(LServer, [{prefix, Prefix}])
+ when is_binary(Prefix) ->
+ SPrefix = ejabberd_sql:escape_like_arg_circumflex(Prefix),
+ SPrefix2 = <<SPrefix/binary, $%>>,
+ ejabberd_sql:sql_query(
+ LServer,
+ ?SQL("select @(count(*))d from users "
+ "where username like %(SPrefix2)s escape '^'"));
+users_number(LServer, []) ->
+ users_number(LServer).
+
convert_to_scram(Server) ->
LServer = jid:nameprep(Server),
if
@@ -178,10 +280,16 @@ convert_to_scram(Server) ->
Err -> {bad_reply, Err}
end
end,
- case sql_queries:sql_transaction(LServer, F) of
+ case ejabberd_sql:sql_transaction(LServer, F) of
{atomic, ok} -> ok;
{atomic, continue} -> convert_to_scram(Server);
{atomic, Error} -> {error, Error};
Error -> Error
end
end.
+
+-spec opt_type(pgsql_users_number_estimate) -> fun((boolean()) -> boolean());
+ (atom()) -> [atom()].
+opt_type(pgsql_users_number_estimate) ->
+ fun (V) when is_boolean(V) -> V end;
+opt_type(_) -> [pgsql_users_number_estimate].