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

Xmpp 如何在ejabberd中使发件人JID(From)匿名,xmpp,ejabberd,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 inte

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

到目前为止我所做的:

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.
在这段代码中,它返回数据包,我可以在该函数中更改数据包

如何从更改
,以便它反映在客户端

这是日志中的

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

提前感谢,

首先,您的实现有一个重大问题。您正在尝试转换所有数据包,而不仅仅是
消息
数据包。按照您的方式,您将通过重写
iq
presence
数据包来中断路由

下面是一个工作模块,它基本上取代了消息的from。我使用哈希对发件人进行“编码”,并将用户名设置为“永久”,这样来自同一个人的所有消息都将出现在一次对话中。但是,您可以随意选择以下算法:

%% 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模块配置部分的
%%:
%%mod_replace_from:{}
-模块(模块更换自)。
-行为(gen_mod)。
-导出([开始/2,停止/1])。
-导出([on_filter_packet/1])。
-包括(“jlib.hrl”)。
-包括(“logger.hrl”)。
开始(\u主机,\u选择)->
ejabberd_钩子:添加(过滤器_包,模块,过滤器_包上,50),
好啊
停止(\u主机)->
ejabberd_hooks:delete(filter_packet,模块,on_filter_packet,50),
好啊
在_filter_数据包上({From,To,#xmlel{name=}=XML})->
?INFO_MSG(“来自截获~p~p的数据包,[From,XML]),
NewFrom=替换用户(从),
{NewFrom,To,XML};
在\u过滤器\u数据包(数据包)->
小包裹
替换jid用户(jid)->
{U,S,R}=split_jid(jid),
散列=整数到二进制(erlang:phash2(U)),
jlib:make_jid(散列,S,R)。
%%将添加到jlib.erl
%%这与make_jid/3相反
-spec split_jid(jid())->{binary(),binary(),binary()}错误。
split#jid(#jid{user=U,server=S,resource=R})->
{U,S,R};
分裂(分裂)->
错误。
这是一个基本的实现,因为虽然它回答了这个问题,但它远不是匿名聊天的完整解决方案。例如,您将需要处理算法,以便在某种程度上实现数据包的路由,以允许人们回复并确保数据包将到达原始匿名发送者。我相信,今后我们将面临更多的挑战

然而,这解决了这个问题,并从ejabberd中的JID操作中演示了