aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvgeny Khramtsov <xramtsov@gmail.com>2014-04-29 15:41:41 +0400
committerEvgeny Khramtsov <xramtsov@gmail.com>2014-04-29 15:41:41 +0400
commit599fdb9ac2007ffd0cda43c740d4a882d5eb1a36 (patch)
treeaf0141cc2c359dba0996f9f797f82d3a1c07af74 /src
parentMerge pull request #188 from weiss/update-readme (diff)
parentTranslate disconnect_user/2 string sent to client (diff)
Merge pull request #186 from weiss/add-disconnect-command
New ejabberd command: disconnect_user/2
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_c2s.erl6
-rw-r--r--src/ejabberd_sm.erl17
2 files changed, 21 insertions, 2 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 33d76b07c..87b32c43c 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).
@@ -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 b1673d4b9..58debf0c1 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,14 @@ user_resources(User, Server) ->
Resources = get_user_resources(User, Server),
lists:sort(Resources).
+disconnect_user(User, Server) ->
+ Resources = get_user_resources(User, Server),
+ lists:foreach(
+ fun(Resource) ->
+ PID = get_session_pid(User, Server, Resource),
+ PID ! disconnect
+ end, Resources),
+ length(Resources).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Update Mnesia tables