summaryrefslogtreecommitdiff
path: root/src/ejabberd_auth.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2018-02-16 20:50:22 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2018-02-16 20:50:22 +0300
commitcffdb06b66233d58f2bee763cc14e4eaba3b6454 (patch)
tree6a15dba9939b945447a96b1ec911fdd4df9e1790 /src/ejabberd_auth.erl
parentImprove example extauth script (diff)
Cache 'isuser' queries to external auth program
Diffstat (limited to 'src/ejabberd_auth.erl')
-rw-r--r--src/ejabberd_auth.erl20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl
index df75be9e..03eee9de 100644
--- a/src/ejabberd_auth.erl
+++ b/src/ejabberd_auth.erl
@@ -526,7 +526,10 @@ db_get_password(User, Server, Mod) ->
UseCache = use_cache(Mod, Server),
case erlang:function_exported(Mod, get_password, 2) of
false when UseCache ->
- ets_cache:lookup(?AUTH_CACHE, {User, Server});
+ case ets_cache:lookup(?AUTH_CACHE, {User, Server}) of
+ {ok, exists} -> error;
+ Other -> Other
+ end;
false ->
error;
true when UseCache ->
@@ -544,7 +547,20 @@ db_user_exists(User, Server, Mod) ->
error ->
case Mod:store_type(Server) of
external ->
- Mod:user_exists(User, Server);
+ case ets_cache:update(
+ ?AUTH_CACHE, {User, Server}, {ok, exists},
+ fun() ->
+ case Mod:user_exists(User, Server) of
+ true -> {ok, exists};
+ false -> error;
+ {error, _} = Err -> Err
+ end
+ end, cache_nodes(Mod, Server)) of
+ {ok, _} ->
+ true;
+ error ->
+ false
+ end;
_ ->
false
end