Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaweł Chmielowski <pchmielowski@process-one.net>2019-01-15 12:04:15 +0300
committerPaweł Chmielowski <pchmielowski@process-one.net>2019-01-15 12:04:15 +0300
commit7183fe6b803bbe941eae03538fd6dba6b8673a82 (patch)
tree66cd625b7eb3d0a5d19833e659b135f2e3dca0d1 /src/mod_admin_extra.erl
parent63259f5cc90e3d0b5b5e59f4c586449176daa078 (diff)
Guard agains sm:get_user_info returning offline
This fixes issue #2765
Diffstat (limited to 'src/mod_admin_extra.erl')
-rw-r--r--src/mod_admin_extra.erl48
1 files changed, 30 insertions, 18 deletions
diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl
index 80bd8aa62..4655ac226 100644
--- a/src/mod_admin_extra.erl
+++ b/src/mod_admin_extra.erl
@@ -987,11 +987,15 @@ get_status_list(Host, Status_required) ->
apply(Fstatus, [Status, Status_required])].
connected_users_info() ->
- lists:map(
+ lists:filtermap(
fun({U, S, R}) ->
- Info = user_session_info(U, S, R),
- Jid = jid:encode(jid:make(U, S, R)),
- erlang:insert_element(1, Info, Jid)
+ case user_session_info(U, S, R) of
+ offline ->
+ false;
+ Info ->
+ Jid = jid:encode(jid:make(U, S, R)),
+ {true, erlang:insert_element(1, Info, Jid)}
+ end
end,
ejabberd_sm:dirty_get_sessions_list()).
@@ -1054,23 +1058,31 @@ set_presence(User, Host, Resource, Type, Show, Status, Priority0) ->
ejabberd_c2s:set_presence(Ref, Pres).
user_sessions_info(User, Host) ->
- [user_session_info(User, Host, Resource) ||
- Resource <- ejabberd_sm:get_user_resources(User, Host)].
+ lists:filtermap(fun(Resource) ->
+ case user_session_info(User, Host, Resource) of
+ offline -> false;
+ Info -> {true, Info}
+ end
+ end, ejabberd_sm:get_user_resources(User, Host)).
user_session_info(User, Host, Resource) ->
CurrentSec = calendar:datetime_to_gregorian_seconds({date(), time()}),
- Info = ejabberd_sm:get_user_info(User, Host, Resource),
- Now = proplists:get_value(ts, Info),
- Pid = proplists:get_value(pid, Info),
- {_U, _Resource, Status, StatusText} = get_presence(Pid),
- Priority = proplists:get_value(priority, Info),
- Conn = proplists:get_value(conn, Info),
- {Ip, Port} = proplists:get_value(ip, Info),
- IPS = inet_parse:ntoa(Ip),
- NodeS = atom_to_list(node(Pid)),
- Uptime = CurrentSec - calendar:datetime_to_gregorian_seconds(
- calendar:now_to_local_time(Now)),
- {atom_to_list(Conn), IPS, Port, num_prio(Priority), NodeS, Uptime, Status, Resource, StatusText}.
+ case ejabberd_sm:get_user_info(User, Host, Resource) of
+ offline ->
+ offline;
+ Info ->
+ Now = proplists:get_value(ts, Info),
+ Pid = proplists:get_value(pid, Info),
+ {_U, _Resource, Status, StatusText} = get_presence(Pid),
+ Priority = proplists:get_value(priority, Info),
+ Conn = proplists:get_value(conn, Info),
+ {Ip, Port} = proplists:get_value(ip, Info),
+ IPS = inet_parse:ntoa(Ip),
+ NodeS = atom_to_list(node(Pid)),
+ Uptime = CurrentSec - calendar:datetime_to_gregorian_seconds(
+ calendar:now_to_local_time(Now)),
+ {atom_to_list(Conn), IPS, Port, num_prio(Priority), NodeS, Uptime, Status, Resource, StatusText}
+ end.
%%%