diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-05-23 12:25:13 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-05-23 12:25:13 +0300 |
commit | 6e8895f9e9d9864709f41ca84669de54342bd881 (patch) | |
tree | f0744615fa58325f8355fec17ad6a2980e4b35f6 /src/ejabberd_auth_sql.erl | |
parent | Deprecate 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.erl | 142 |
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]. |