diff options
author | Paweł Chmielowski <pchmielowski@process-one.net> | 2019-01-15 12:04:15 +0300 |
---|---|---|
committer | Paweł Chmielowski <pchmielowski@process-one.net> | 2019-01-15 12:04:15 +0300 |
commit | 7183fe6b803bbe941eae03538fd6dba6b8673a82 (patch) | |
tree | 66cd625b7eb3d0a5d19833e659b135f2e3dca0d1 /src/mod_admin_extra.erl | |
parent | 63259f5cc90e3d0b5b5e59f4c586449176daa078 (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.erl | 48 |
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. %%% |