From 6d1055abecf64d184bc0c1253e8672d66749650d Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 29 Apr 2014 00:50:43 +0200 Subject: [PATCH 1/3] New ejabberd command: disconnect_user/2 --- src/ejabberd_sm.erl | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index b1673d4b9..060643af0 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -52,6 +52,7 @@ connected_users/0, connected_users_number/0, user_resources/2, + disconnect_user/2, get_session_pid/3, get_user_info/3, get_user_ip/3, @@ -801,7 +802,13 @@ commands() -> desc = "List user's connected resources", module = ?MODULE, function = user_resources, args = [{user, binary}, {host, binary}], - result = {resources, {list, {resource, string}}}}]. + result = {resources, {list, {resource, string}}}}, + #ejabberd_commands{name = disconnect_user, + tags = [session], + desc = "Disconnect user's active sessions", + module = ?MODULE, function = disconnect_user, + args = [{user, binary}, {host, binary}], + result = {num_resources, integer}}]. -spec connected_users() -> [binary()]. @@ -818,6 +825,15 @@ user_resources(User, Server) -> Resources = get_user_resources(User, Server), lists:sort(Resources). +disconnect_user(User, Server) -> + Xmlelement = ?SERRT_POLICY_VIOLATION(<<"en">>, <<"has been kicked">>), + Resources = get_user_resources(User, Server), + lists:foreach( + fun(Resource) -> + PID = get_session_pid(User, Server, Resource), + PID ! {kick, kicked_by_admin, Xmlelement} + end, Resources), + length(Resources). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Update Mnesia tables From bb2c8b59f805063e167c0ece406963a416bc50f9 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 29 Apr 2014 11:41:24 +0200 Subject: [PATCH 2/3] Avoid #state.lang type errors in corner cases If #state.lang is used before being initialized to some binary string, the translation code would crash. --- src/ejabberd_c2s.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 33d76b07c..5d8a7bb07 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -107,7 +107,7 @@ auth_module = unknown, ip, aux_fields = [], - lang}). + lang = <<"">>}). %-define(DBGFSM, true). From ebbceab93fb3f3ceb35c6e01b2e93d1d7aa6ecf4 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 29 Apr 2014 11:56:28 +0200 Subject: [PATCH 3/3] Translate disconnect_user/2 string sent to client --- src/ejabberd_c2s.erl | 4 ++++ src/ejabberd_sm.erl | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 5d8a7bb07..87b32c43c 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1229,6 +1229,10 @@ handle_info(replaced, StateName, StateData) -> Lang = StateData#state.lang, Xmlelement = ?SERRT_CONFLICT(Lang, <<"Replaced by new connection">>), handle_info({kick, replaced, Xmlelement}, StateName, StateData); +handle_info(disconnect, StateName, StateData) -> + Lang = StateData#state.lang, + Xmlelement = ?SERRT_POLICY_VIOLATION(Lang, <<"has been kicked">>), + handle_info({kick, kicked_by_admin, Xmlelement}, StateName, StateData); handle_info({kick, Reason, Xmlelement}, _StateName, StateData) -> send_element(StateData, Xmlelement), send_trailer(StateData), diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index 060643af0..58debf0c1 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -826,12 +826,11 @@ user_resources(User, Server) -> lists:sort(Resources). disconnect_user(User, Server) -> - Xmlelement = ?SERRT_POLICY_VIOLATION(<<"en">>, <<"has been kicked">>), Resources = get_user_resources(User, Server), lists:foreach( fun(Resource) -> PID = get_session_pid(User, Server, Resource), - PID ! {kick, kicked_by_admin, Xmlelement} + PID ! disconnect end, Resources), length(Resources).