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:
Diffstat (limited to 'src/mod_announce.erl')
-rw-r--r--src/mod_announce.erl274
1 files changed, 112 insertions, 162 deletions
diff --git a/src/mod_announce.erl b/src/mod_announce.erl
index c21adfb00..2c3730122 100644
--- a/src/mod_announce.erl
+++ b/src/mod_announce.erl
@@ -33,12 +33,22 @@
-behaviour(gen_mod).
-export([start/2, stop/1, export/1, import_info/0,
- import_start/2, import/5, announce/3, send_motd/1, disco_identity/5,
+ import_start/2, import/5, announce/1, send_motd/1, disco_identity/5,
disco_features/5, disco_items/5, depends/2,
send_announcement_to_all/3, announce_commands/4,
announce_items/4, mod_opt_type/1]).
-export([init/1, handle_call/3, handle_cast/2,
handle_info/2, terminate/2, code_change/3]).
+-export([announce_all/1,
+ announce_all_hosts_all/1,
+ announce_online/1,
+ announce_all_hosts_online/1,
+ announce_motd/1,
+ announce_all_hosts_motd/1,
+ announce_motd_update/1,
+ announce_all_hosts_motd_update/1,
+ announce_motd_delete/1,
+ announce_all_hosts_motd_delete/1]).
-include("ejabberd.hrl").
-include("logger.hrl").
@@ -94,33 +104,33 @@ init([Host, Opts]) ->
handle_call(_Call, _From, State) ->
{noreply, State}.
-handle_cast(Msg, State) ->
- case Msg of
- {announce_all, From, To, Packet} ->
- announce_all(From, To, Packet);
- {announce_all_hosts_all, From, To, Packet} ->
- announce_all_hosts_all(From, To, Packet);
- {announce_online, From, To, Packet} ->
- announce_online(From, To, Packet);
- {announce_all_hosts_online, From, To, Packet} ->
- announce_all_hosts_online(From, To, Packet);
- {announce_motd, From, To, Packet} ->
- announce_motd(From, To, Packet);
- {announce_all_hosts_motd, From, To, Packet} ->
- announce_all_hosts_motd(From, To, Packet);
- {announce_motd_update, From, To, Packet} ->
- announce_motd_update(From, To, Packet);
- {announce_all_hosts_motd_update, From, To, Packet} ->
- announce_all_hosts_motd_update(From, To, Packet);
- {announce_motd_delete, From, To, Packet} ->
- announce_motd_delete(From, To, Packet);
- {announce_all_hosts_motd_delete, From, To, Packet} ->
- announce_all_hosts_motd_delete(From, To, Packet);
- _ ->
- ?WARNING_MSG("unexpected cast: ~p", [Msg])
+handle_cast({F, #message{from = From, to = To} = Pkt}, State) when is_atom(F) ->
+ LServer = To#jid.lserver,
+ Host = case F of
+ announce_all -> LServer;
+ announce_all_hosts_all -> global;
+ announce_online -> LServer;
+ announce_all_hosts_online -> global;
+ announce_motd -> LServer;
+ announce_all_hosts_motd -> global;
+ announce_motd_update -> LServer;
+ announce_all_hosts_motd_update -> global;
+ announce_motd_delete -> LServer;
+ announce_all_hosts_motd_delete -> global
+ end,
+ Access = get_access(Host),
+ case acl:match_rule(Host, Access, From) of
+ deny ->
+ route_forbidden_error(Pkt);
+ allow ->
+ ?MODULE:F(Pkt)
end,
+ {noreply, State};
+handle_cast(Msg, State) ->
+ ?WARNING_MSG("unexpected cast: ~p", [Msg]),
{noreply, State}.
+
handle_info(Info, State) ->
?WARNING_MSG("unexpected info: ~p", [Info]),
{noreply, State}.
@@ -138,30 +148,30 @@ code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%% Announcing via messages to a custom resource
--spec announce(jid(), jid(), stanza()) -> ok | stop.
-announce(From, #jid{luser = <<>>} = To, #message{} = Packet) ->
+-spec announce(stanza()) -> ok | stop.
+announce(#message{to = #jid{luser = <<>>} = To} = Packet) ->
Proc = gen_mod:get_module_proc(To#jid.lserver, ?MODULE),
Res = case To#jid.lresource of
<<"announce/all">> ->
- gen_server:cast(Proc, {announce_all, From, To, Packet});
+ gen_server:cast(Proc, {announce_all, Packet});
<<"announce/all-hosts/all">> ->
- gen_server:cast(Proc, {announce_all_hosts_all, From, To, Packet});
+ gen_server:cast(Proc, {announce_all_hosts_all, Packet});
<<"announce/online">> ->
- gen_server:cast(Proc, {announce_online, From, To, Packet});
+ gen_server:cast(Proc, {announce_online, Packet});
<<"announce/all-hosts/online">> ->
- gen_server:cast(Proc, {announce_all_hosts_online, From, To, Packet});
+ gen_server:cast(Proc, {announce_all_hosts_online, Packet});
<<"announce/motd">> ->
- gen_server:cast(Proc, {announce_motd, From, To, Packet});
+ gen_server:cast(Proc, {announce_motd, Packet});
<<"announce/all-hosts/motd">> ->
- gen_server:cast(Proc, {announce_all_hosts_motd, From, To, Packet});
+ gen_server:cast(Proc, {announce_all_hosts_motd, Packet});
<<"announce/motd/update">> ->
- gen_server:cast(Proc, {announce_motd_update, From, To, Packet});
+ gen_server:cast(Proc, {announce_motd_update, Packet});
<<"announce/all-hosts/motd/update">> ->
- gen_server:cast(Proc, {announce_all_hosts_motd_update, From, To, Packet});
+ gen_server:cast(Proc, {announce_all_hosts_motd_update, Packet});
<<"announce/motd/delete">> ->
- gen_server:cast(Proc, {announce_motd_delete, From, To, Packet});
+ gen_server:cast(Proc, {announce_motd_delete, Packet});
<<"announce/all-hosts/motd/delete">> ->
- gen_server:cast(Proc, {announce_all_hosts_motd_delete, From, To, Packet});
+ gen_server:cast(Proc, {announce_all_hosts_motd_delete, Packet});
_ ->
undefined
end,
@@ -169,7 +179,7 @@ announce(From, #jid{luser = <<>>} = To, #message{} = Packet) ->
ok -> stop;
_ -> ok
end;
-announce(_From, _To, _Packet) ->
+announce(_Packet) ->
ok.
%%-------------------------------------------------------------------------
@@ -521,21 +531,23 @@ handle_adhoc_form(From, #jid{lserver = LServer} = To,
Body = join_lines(xmpp_util:get_xdata_values(<<"body">>, XData)),
Response = #adhoc_command{lang = Lang, node = Node, sid = SessionID,
status = completed},
- Packet = #message{type = headline,
+ Packet = #message{from = From,
+ to = To,
+ type = headline,
body = xmpp:mk_text(Body),
subject = xmpp:mk_text(Subject)},
Proc = gen_mod:get_module_proc(LServer, ?MODULE),
case {Node, Body} of
{?NS_ADMIN_DELETE_MOTD, _} ->
if Confirm ->
- gen_server:cast(Proc, {announce_motd_delete, From, To, Packet}),
+ gen_server:cast(Proc, {announce_motd_delete, Packet}),
Response;
true ->
Response
end;
{?NS_ADMIN_DELETE_MOTD_ALLHOSTS, _} ->
if Confirm ->
- gen_server:cast(Proc, {announce_all_hosts_motd_delete, From, To, Packet}),
+ gen_server:cast(Proc, {announce_all_hosts_motd_delete, Packet}),
Response;
true ->
Response
@@ -549,28 +561,28 @@ handle_adhoc_form(From, #jid{lserver = LServer} = To,
%% We don't use direct announce_* functions because it
%% leads to large delay in response and <iq/> queries processing
{?NS_ADMIN_ANNOUNCE, _} ->
- gen_server:cast(Proc, {announce_online, From, To, Packet}),
+ gen_server:cast(Proc, {announce_online, Packet}),
Response;
{?NS_ADMIN_ANNOUNCE_ALLHOSTS, _} ->
- gen_server:cast(Proc, {announce_all_hosts_online, From, To, Packet}),
+ gen_server:cast(Proc, {announce_all_hosts_online, Packet}),
Response;
{?NS_ADMIN_ANNOUNCE_ALL, _} ->
- gen_server:cast(Proc, {announce_all, From, To, Packet}),
+ gen_server:cast(Proc, {announce_all, Packet}),
Response;
{?NS_ADMIN_ANNOUNCE_ALL_ALLHOSTS, _} ->
- gen_server:cast(Proc, {announce_all_hosts_all, From, To, Packet}),
+ gen_server:cast(Proc, {announce_all_hosts_all, Packet}),
Response;
{?NS_ADMIN_SET_MOTD, _} ->
- gen_server:cast(Proc, {announce_motd, From, To, Packet}),
+ gen_server:cast(Proc, {announce_motd, Packet}),
Response;
{?NS_ADMIN_SET_MOTD_ALLHOSTS, _} ->
- gen_server:cast(Proc, {announce_all_hosts_motd, From, To, Packet}),
+ gen_server:cast(Proc, {announce_all_hosts_motd, Packet}),
Response;
{?NS_ADMIN_EDIT_MOTD, _} ->
- gen_server:cast(Proc, {announce_motd_update, From, To, Packet}),
+ gen_server:cast(Proc, {announce_motd_update, Packet}),
Response;
{?NS_ADMIN_EDIT_MOTD_ALLHOSTS, _} ->
- gen_server:cast(Proc, {announce_all_hosts_motd_update, From, To, Packet}),
+ gen_server:cast(Proc, {announce_all_hosts_motd_update, Packet}),
Response;
Junk ->
%% This can't happen, as we haven't registered any other
@@ -604,85 +616,46 @@ get_title(Lang, ?NS_ADMIN_DELETE_MOTD_ALLHOSTS) ->
%%-------------------------------------------------------------------------
-announce_all(From, To, Packet) ->
- Host = To#jid.lserver,
- Access = get_access(Host),
- case acl:match_rule(Host, Access, From) of
- deny ->
- route_forbidden_error(From, To, Packet);
- allow ->
- Local = jid:make(To#jid.server),
- lists:foreach(
- fun({User, Server}) ->
- Dest = jid:make(User, Server, <<>>),
- ejabberd_router:route(Local, Dest, add_store_hint(Packet))
- end, ejabberd_auth:get_vh_registered_users(Host))
- end.
-
-announce_all_hosts_all(From, To, Packet) ->
- Access = get_access(global),
- case acl:match_rule(global, Access, From) of
- deny ->
- route_forbidden_error(From, To, Packet);
- allow ->
- Local = jid:make(To#jid.server),
- lists:foreach(
- fun({User, Server}) ->
- Dest = jid:make(User, Server, <<>>),
- ejabberd_router:route(Local, Dest, add_store_hint(Packet))
- end, ejabberd_auth:dirty_get_registered_users())
- end.
+announce_all(#message{to = To} = Packet) ->
+ Local = jid:make(To#jid.server),
+ lists:foreach(
+ fun({User, Server}) ->
+ Dest = jid:make(User, Server, <<>>),
+ ejabberd_router:route(
+ xmpp:set_from_to(add_store_hint(Packet), Local, Dest))
+ end, ejabberd_auth:get_vh_registered_users(To#jid.lserver)).
+
+announce_all_hosts_all(#message{to = To} = Packet) ->
+ Local = jid:make(To#jid.server),
+ lists:foreach(
+ fun({User, Server}) ->
+ Dest = jid:make(User, Server, <<>>),
+ ejabberd_router:route(
+ xmpp:set_from_to(add_store_hint(Packet), Local, Dest))
+ end, ejabberd_auth:dirty_get_registered_users()).
-announce_online(From, To, Packet) ->
- Host = To#jid.lserver,
- Access = get_access(Host),
- case acl:match_rule(Host, Access, From) of
- deny ->
- route_forbidden_error(From, To, Packet);
- allow ->
- announce_online1(ejabberd_sm:get_vh_session_list(Host),
- To#jid.server,
- Packet)
- end.
+announce_online(#message{to = To} = Packet) ->
+ announce_online1(ejabberd_sm:get_vh_session_list(To#jid.lserver),
+ To#jid.server, Packet).
-announce_all_hosts_online(From, To, Packet) ->
- Access = get_access(global),
- case acl:match_rule(global, Access, From) of
- deny ->
- route_forbidden_error(From, To, Packet);
- allow ->
- announce_online1(ejabberd_sm:dirty_get_sessions_list(),
- To#jid.server,
- Packet)
- end.
+announce_all_hosts_online(#message{to = To} = Packet) ->
+ announce_online1(ejabberd_sm:dirty_get_sessions_list(),
+ To#jid.server, Packet).
announce_online1(Sessions, Server, Packet) ->
Local = jid:make(Server),
lists:foreach(
fun({U, S, R}) ->
Dest = jid:make(U, S, R),
- ejabberd_router:route(Local, Dest, Packet)
+ ejabberd_router:route(xmpp:set_from_to(Packet, Local, Dest))
end, Sessions).
-announce_motd(From, To, Packet) ->
- Host = To#jid.lserver,
- Access = get_access(Host),
- case acl:match_rule(Host, Access, From) of
- deny ->
- route_forbidden_error(From, To, Packet);
- allow ->
- announce_motd(Host, Packet)
- end.
+announce_motd(#message{to = To} = Packet) ->
+ announce_motd(To#jid.lserver, Packet).
-announce_all_hosts_motd(From, To, Packet) ->
- Access = get_access(global),
- case acl:match_rule(global, Access, From) of
- deny ->
- route_forbidden_error(From, To, Packet);
- allow ->
- Hosts = ?MYHOSTS,
- [announce_motd(Host, Packet) || Host <- Hosts]
- end.
+announce_all_hosts_motd(Packet) ->
+ Hosts = ?MYHOSTS,
+ [announce_motd(Host, Packet) || Host <- Hosts].
announce_motd(Host, Packet) ->
LServer = jid:nameprep(Host),
@@ -692,55 +665,30 @@ announce_motd(Host, Packet) ->
Mod = gen_mod:db_mod(LServer, ?MODULE),
Mod:set_motd_users(LServer, Sessions).
-announce_motd_update(From, To, Packet) ->
- Host = To#jid.lserver,
- Access = get_access(Host),
- case acl:match_rule(Host, Access, From) of
- deny ->
- route_forbidden_error(From, To, Packet);
- allow ->
- announce_motd_update(Host, Packet)
- end.
+announce_motd_update(#message{to = To} = Packet) ->
+ announce_motd_update(To#jid.lserver, Packet).
-announce_all_hosts_motd_update(From, To, Packet) ->
- Access = get_access(global),
- case acl:match_rule(global, Access, From) of
- deny ->
- route_forbidden_error(From, To, Packet);
- allow ->
- Hosts = ?MYHOSTS,
- [announce_motd_update(Host, Packet) || Host <- Hosts]
- end.
+announce_all_hosts_motd_update(Packet) ->
+ Hosts = ?MYHOSTS,
+ [announce_motd_update(Host, Packet) || Host <- Hosts].
announce_motd_update(LServer, Packet) ->
- announce_motd_delete(LServer),
Mod = gen_mod:db_mod(LServer, ?MODULE),
+ Mod:delete_motd(LServer),
Mod:set_motd(LServer, xmpp:encode(Packet)).
-announce_motd_delete(From, To, Packet) ->
- Host = To#jid.lserver,
- Access = get_access(Host),
- case acl:match_rule(Host, Access, From) of
- deny ->
- route_forbidden_error(From, To, Packet);
- allow ->
- announce_motd_delete(Host)
- end.
-
-announce_all_hosts_motd_delete(From, To, Packet) ->
- Access = get_access(global),
- case acl:match_rule(global, Access, From) of
- deny ->
- route_forbidden_error(From, To, Packet);
- allow ->
- Hosts = ?MYHOSTS,
- [announce_motd_delete(Host) || Host <- Hosts]
- end.
-
-announce_motd_delete(LServer) ->
+announce_motd_delete(#message{to = To}) ->
+ LServer = To#jid.lserver,
Mod = gen_mod:db_mod(LServer, ?MODULE),
Mod:delete_motd(LServer).
+announce_all_hosts_motd_delete(_Packet) ->
+ lists:foreach(
+ fun(Host) ->
+ Mod = gen_mod:db_mod(Host, ?MODULE),
+ Mod:delete_motd(Host)
+ end, ?MYHOSTS).
+
-spec send_motd({presence(), ejabberd_c2s:state()}) -> {presence(), ejabberd_c2s:state()}.
send_motd({_, #{pres_last := _}} = Acc) ->
%% This is just a presence update, nothing to do
@@ -756,7 +704,8 @@ send_motd({#presence{type = available},
case Mod:is_motd_user(LUser, LServer) of
false ->
Local = jid:make(LServer),
- ejabberd_router:route(Local, JID, Msg),
+ ejabberd_router:route(
+ xmpp:set_from_to(Msg, Local, JID)),
Mod:set_motd_user(LUser, LServer);
true ->
ok
@@ -797,7 +746,8 @@ send_announcement_to_all(Host, SubjectS, BodyS) ->
lists:foreach(
fun({U, S, R}) ->
Dest = jid:make(U, S, R),
- ejabberd_router:route(Local, Dest, add_store_hint(Packet))
+ ejabberd_router:route(
+ xmpp:set_from_to(add_store_hint(Packet), Local, Dest))
end, Sessions).
-spec get_access(global | binary()) -> atom().
@@ -811,11 +761,11 @@ get_access(Host) ->
add_store_hint(El) ->
xmpp:set_subtag(El, #hint{type = store}).
--spec route_forbidden_error(jid(), jid(), stanza()) -> ok.
-route_forbidden_error(From, To, Packet) ->
+-spec route_forbidden_error(stanza()) -> ok.
+route_forbidden_error(Packet) ->
Lang = xmpp:get_lang(Packet),
Err = xmpp:err_forbidden(<<"Denied by ACL">>, Lang),
- ejabberd_router:route_error(To, From, Packet, Err).
+ ejabberd_router:route_error(Packet, Err).
%%-------------------------------------------------------------------------
export(LServer) ->