如何在ejabberd中使发件人JID(From)匿名

时间:2015-07-27 18:26:45

标签: xmpp ejabberd

我有一些用户,他们可以匿名聊天。他们正在进行一对一的聊天。假设我想加密发件人的用户名。我怎样才能做到这一点。

到目前为止我做了什么:

start(_Host, _Opts) ->
   ejabberd_hooks:add(filter_packet, global, ?MODULE, on_filter_packet, 0).

on_filter_packet({From, To, XML} = Packet) ->
        ?INFO_MSG("Packet From intercepted ~p", [From] ),
        Packet.

在此代码中,它返回Packet,我可以更改该功能中的数据包。

如何更改From,以便在客户端反映出来。

日志中的From

{jid,<<"username">>,<<"domain.com">>,<<"1960117812133817321731161">>,<<"username">>,<<"domain.com">>,<<"1960117812133817321731161">>}

提前致谢,

1 个答案:

答案 0 :(得分:1)

首先,您的实施有一个重大问题。您正在尝试转换所有数据包,而不仅仅是message数据包。你这样做的方式,你打算通过重写iqpresence数据包打破路由

这是一个基本上替换消息from的工作模块。我用hash来编码&#34;编码&#34;来自并使用户名&#34;永久&#34;这样来自同一个人的所有消息都将出现在一个对话中。但是,请随意替换您选择的算法:

%% To add in ejabberd modules configuration section:
%%   mod_replace_from: {}
-module(mod_replace_from).

-behaviour(gen_mod).

-export([start/2, stop/1]).
-export([on_filter_packet/1]).
-include("jlib.hrl").
-include("logger.hrl").

start(_Host, _Opts) ->
    ejabberd_hooks:add(filter_packet, ?MODULE, on_filter_packet, 50),
    ok.

stop(_Host) ->
    ejabberd_hooks:delete(filter_packet, ?MODULE, on_filter_packet, 50),
    ok.

on_filter_packet({From, To, #xmlel{name = <<"message">>} = XML}) ->
    ?INFO_MSG("Packet From intercepted ~p ~p", [From, XML]),
    NewFrom = replace_jid_user(From),
    {NewFrom, To, XML};
on_filter_packet(Packet) ->
    Packet.

replace_jid_user(JID) ->
    {U, S, R} = split_jid(JID),
    Hash = integer_to_binary(erlang:phash2(U)),
    jlib:make_jid(Hash,S,R).

%% Will be added to jlib.erl
%% This is the reverse of make_jid/3
-spec split_jid(jid()) -> {binary(), binary(), binary()} | error.                              
split_jid(#jid{user = U, server = S, resource = R}) ->
    {U, S, R};
split_jid(_) ->
    error.

这是一个基本的实现,因为虽然它回答了这个问题,但它远非匿名聊天的完整解决方案。例如,您需要处理算法以稍微实现数据包的路由,以允许人们回复并确保数据包将到达原始的匿名发件人。我相信在未来将面临更多挑战。

然而,这解决了这个问题并说明了ejabberd中的From JID操作。