diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-03-02 15:30:34 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-03-02 15:30:34 +0300 |
commit | cebdb87387948cf21ff81b22e12728461af226fe (patch) | |
tree | f929e3c9d91f3925c035e507970a87f93c05dd0d /src/mod_service_log.erl | |
parent | Improve 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.erl | 105 |
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]. |