summaryrefslogtreecommitdiff
path: root/src/mod_service_log.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-03-02 15:30:34 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-03-02 15:30:34 +0300
commitcebdb87387948cf21ff81b22e12728461af226fe (patch)
treef929e3c9d91f3925c035e507970a87f93c05dd0d /src/mod_service_log.erl
parentImprove reporting of unavailable SASL mechanisms (diff)
Revert "Remove relict mod_service_log"
This reverts commit 0d4e1abbd11155a1cddbe809ff09183af1427af8. However, stanzas are now encapsulated into forwarded element (as per XEP-0297) instead of <route/> nonza.
Diffstat (limited to 'src/mod_service_log.erl')
-rw-r--r--src/mod_service_log.erl105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/mod_service_log.erl b/src/mod_service_log.erl
new file mode 100644
index 00000000..d29cd132
--- /dev/null
+++ b/src/mod_service_log.erl
@@ -0,0 +1,105 @@
+%%%----------------------------------------------------------------------
+%%% File : mod_service_log.erl
+%%% Author : Alexey Shchepin <alexey@process-one.net>
+%%% Purpose : Copy user messages to logger service
+%%% Created : 24 Aug 2003 by Alexey Shchepin <alexey@process-one.net>
+%%%
+%%%
+%%% ejabberd, Copyright (C) 2002-2017 ProcessOne
+%%%
+%%% This program is free software; you can redistribute it and/or
+%%% modify it under the terms of the GNU General Public License as
+%%% published by the Free Software Foundation; either version 2 of the
+%%% License, or (at your option) any later version.
+%%%
+%%% This program is distributed in the hope that it will be useful,
+%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
+%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+%%% General Public License for more details.
+%%%
+%%% You should have received a copy of the GNU General Public License along
+%%% with this program; if not, write to the Free Software Foundation, Inc.,
+%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+%%%
+%%%----------------------------------------------------------------------
+
+-module(mod_service_log).
+
+-author('alexey@process-one.net').
+
+-behaviour(gen_mod).
+
+-export([start/2, stop/1, log_user_send/1,
+ log_user_receive/1, mod_opt_type/1, depends/2]).
+
+-include("ejabberd.hrl").
+-include("logger.hrl").
+
+-include("xmpp.hrl").
+
+start(Host, _Opts) ->
+ ejabberd_hooks:add(user_send_packet, Host, ?MODULE,
+ log_user_send, 50),
+ ejabberd_hooks:add(user_receive_packet, Host, ?MODULE,
+ log_user_receive, 50),
+ ok.
+
+stop(Host) ->
+ ejabberd_hooks:delete(user_send_packet, Host, ?MODULE,
+ log_user_send, 50),
+ ejabberd_hooks:delete(user_receive_packet, Host,
+ ?MODULE, log_user_receive, 50),
+ ok.
+
+depends(_Host, _Opts) ->
+ [].
+
+-spec log_user_send({stanza(), ejabberd_c2s:state()}) -> {stanza(), ejabberd_c2s:state()}.
+log_user_send({Packet, C2SState}) ->
+ From = xmpp:get_from(Packet),
+ To = xmpp:get_to(Packet),
+ log_packet(From, To, Packet, From#jid.lserver),
+ {Packet, C2SState}.
+
+-spec log_user_receive({stanza(), ejabberd_c2s:state()}) -> {stanza(), ejabberd_c2s:state()}.
+log_user_receive({Packet, C2SState}) ->
+ From = xmpp:get_from(Packet),
+ To = xmpp:get_to(Packet),
+ log_packet(From, To, Packet, To#jid.lserver),
+ {Packet, C2SState}.
+
+-spec log_packet(jid(), jid(), stanza(), binary()) -> ok.
+log_packet(From, To, Packet, Host) ->
+ Loggers = gen_mod:get_module_opt(Host, ?MODULE, loggers,
+ fun(L) ->
+ lists:map(
+ fun(S) ->
+ B = iolist_to_binary(S),
+ N = jid:nameprep(B),
+ if N /= error ->
+ N
+ end
+ end, L)
+ end, []),
+ ServerJID = jid:make(Host),
+ FixedPacket = xmpp:set_from_to(Packet, From, To),
+ lists:foreach(fun (Logger) ->
+ ejabberd_router:route(ServerJID,
+ jid:make(Logger),
+ #xmlel{name = <<"route">>,
+ attrs = [],
+ children =
+ [FixedPacket]})
+ end,
+ Loggers).
+
+mod_opt_type(loggers) ->
+ fun (L) ->
+ lists:map(fun (S) ->
+ B = iolist_to_binary(S),
+ N = jid:nameprep(B),
+ if N /= error -> N end
+ end,
+ L)
+ end;
+mod_opt_type(_) -> [loggers].