]> granicus.if.org Git - ejabberd/commitdiff
Revert "Remove relict mod_service_log"
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Thu, 2 Mar 2017 12:30:34 +0000 (15:30 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Thu, 2 Mar 2017 12:30:34 +0000 (15:30 +0300)
This reverts commit 0d4e1abbd11155a1cddbe809ff09183af1427af8.
However, stanzas are now encapsulated into forwarded element
(as per XEP-0297) instead of <route/> nonza.

src/mod_service_log.erl [new file with mode: 0644]

diff --git a/src/mod_service_log.erl b/src/mod_service_log.erl
new file mode 100644 (file)
index 0000000..d29cd13
--- /dev/null
@@ -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].