如何在 ejabberd 中使发件人 JID(发件人)匿名
How to make sender JID (From) anonymous in 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.
在此代码中,它返回数据包,我可以在该函数中更改数据包。
如何更改From
,以便它反映在客户端。
这是日志中的From
:
{jid,<<"username">>,<<"domain.com">>,<<"1960117812133817321731161">>,<<"username">>,<<"domain.com">>,<<"1960117812133817321731161">>}
提前致谢,
首先,您的实施存在重大问题。您正在尝试转换所有数据包,而不仅仅是 message
个数据包。按照您的方式,您将通过重写 iq
和 presence
数据包来破坏路由
这是一个工作模块,基本上取代了消息的发件人。我使用散列 "encode" 发件人并将用户名设为 "permanent",这样来自同一个人的所有消息都会出现在一个对话中。但是,请随意替换为您选择的算法:
%% 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.
这是一个基本实现,因为虽然它回答了问题,但它远非匿名聊天的完整解决方案。例如,您将需要处理算法以在某种程度上实现数据包路由,以允许人们回复并确保数据包将到达原始匿名发件人。相信以后还会面临更多的挑战。
但是,这解决了问题并说明了 From
ejabberd 中的 JID 操作。
我有一些用户,他们可以匿名聊天。他们正在进行一对一的聊天。假设我想加密发件人的用户名。我怎样才能做到这一点。
到目前为止我做了什么:
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.
在此代码中,它返回数据包,我可以在该函数中更改数据包。
如何更改From
,以便它反映在客户端。
这是日志中的From
:
{jid,<<"username">>,<<"domain.com">>,<<"1960117812133817321731161">>,<<"username">>,<<"domain.com">>,<<"1960117812133817321731161">>}
提前致谢,
首先,您的实施存在重大问题。您正在尝试转换所有数据包,而不仅仅是 message
个数据包。按照您的方式,您将通过重写 iq
和 presence
数据包来破坏路由
这是一个工作模块,基本上取代了消息的发件人。我使用散列 "encode" 发件人并将用户名设为 "permanent",这样来自同一个人的所有消息都会出现在一个对话中。但是,请随意替换为您选择的算法:
%% 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.
这是一个基本实现,因为虽然它回答了问题,但它远非匿名聊天的完整解决方案。例如,您将需要处理算法以在某种程度上实现数据包路由,以允许人们回复并确保数据包将到达原始匿名发件人。相信以后还会面临更多的挑战。
但是,这解决了问题并说明了 From
ejabberd 中的 JID 操作。