mod_carboncopy: Support new copying rules

Support the copying rules added to XEP-0280 with version 0.13.0 under
the "urn:xmpp:carbons:rules:0" namespace.

Closes #3011.
This commit is contained in:
Holger Weiss 2020-01-12 13:42:00 +01:00
parent 919c9d6fb1
commit a8f6c1db1d
2 changed files with 19 additions and 7 deletions

View File

@ -25,7 +25,7 @@
{stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.18"}}}, {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.18"}}},
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.38"}}}, {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.38"}}},
{idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}}, {idna, ".*", {git, "https://github.com/benoitc/erlang-idna", {tag, "6.0.0"}}},
{xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.4.3"}}}, {xmpp, ".*", {git, "https://github.com/processone/xmpp", "f98a50eb4135"}},
{fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.22"}}}, {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.22"}}},
{yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.2"}}}, {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.2"}}},
{jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "0.14.8"}}}, {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "0.14.8"}}},

View File

@ -81,12 +81,10 @@ reload(_Host, _NewOpts, _OldOpts) ->
-spec disco_features({error, stanza_error()} | {result, [binary()]} | empty, -spec disco_features({error, stanza_error()} | {result, [binary()]} | empty,
jid(), jid(), binary(), binary()) -> jid(), jid(), binary(), binary()) ->
{error, stanza_error()} | {result, [binary()]}. {error, stanza_error()} | {result, [binary()]}.
disco_features({error, Err}, _From, _To, _Node, _Lang) -> disco_features(empty, From, To, <<"">>, Lang) ->
{error, Err}; disco_features({result, []}, From, To, <<"">>, Lang);
disco_features(empty, _From, _To, <<"">>, _Lang) ->
{result, [?NS_CARBONS_2]};
disco_features({result, Feats}, _From, _To, <<"">>, _Lang) -> disco_features({result, Feats}, _From, _To, <<"">>, _Lang) ->
{result, [?NS_CARBONS_2|Feats]}; {result, [?NS_CARBONS_2,?NS_CARBONS_RULES_0|Feats]};
disco_features(Acc, _From, _To, _Node, _Lang) -> disco_features(Acc, _From, _To, _Node, _Lang) ->
Acc. Acc.
@ -162,7 +160,8 @@ c2s_session_opened(State) ->
-spec check_and_forward(jid(), jid(), stanza(), direction()) -> -spec check_and_forward(jid(), jid(), stanza(), direction()) ->
stanza() | {stop, stanza()}. stanza() | {stop, stanza()}.
check_and_forward(JID, To, Packet, Direction)-> check_and_forward(JID, To, Packet, Direction)->
case is_chat_message(Packet) andalso case (is_chat_message(Packet) orelse
is_received_muc_invite(Packet, Direction)) andalso
not is_received_muc_pm(To, Packet, Direction) andalso not is_received_muc_pm(To, Packet, Direction) andalso
not xmpp:has_subtag(Packet, #carbons_private{}) andalso not xmpp:has_subtag(Packet, #carbons_private{}) andalso
not xmpp:has_subtag(Packet, #hint{type = 'no-copy'}) of not xmpp:has_subtag(Packet, #hint{type = 'no-copy'}) of
@ -275,9 +274,18 @@ is_chat_message(#message{type = chat}) ->
true; true;
is_chat_message(#message{type = normal, body = [_|_]}) -> is_chat_message(#message{type = normal, body = [_|_]}) ->
true; true;
is_chat_message(#message{type = Type} = Msg) when Type == chat;
Type == normal ->
has_chatstate(Msg) orelse xmpp:has_subtag(Msg, #receipt_response{});
is_chat_message(_) -> is_chat_message(_) ->
false. false.
-spec is_received_muc_invite(message(), direction()) -> boolean().
is_received_muc_invite(_Packet, sent) ->
false;
is_received_muc_invite(Packet, received) ->
xmpp:has_subtag(Packet, #x_conference{}).
-spec is_received_muc_pm(jid(), message(), direction()) -> boolean(). -spec is_received_muc_pm(jid(), message(), direction()) -> boolean().
is_received_muc_pm(#jid{lresource = <<>>}, _Packet, _Direction) -> is_received_muc_pm(#jid{lresource = <<>>}, _Packet, _Direction) ->
false; false;
@ -286,6 +294,10 @@ is_received_muc_pm(_To, _Packet, sent) ->
is_received_muc_pm(_To, Packet, received) -> is_received_muc_pm(_To, Packet, received) ->
xmpp:has_subtag(Packet, #muc_user{}). xmpp:has_subtag(Packet, #muc_user{}).
-spec has_chatstate(message()) -> boolean().
has_chatstate(#message{sub_els = Els}) ->
lists:any(fun(El) -> xmpp:get_ns(El) == ?NS_CHATSTATES end, Els).
-spec list(binary(), binary()) -> [{Resource :: binary(), Namespace :: binary()}]. -spec list(binary(), binary()) -> [{Resource :: binary(), Namespace :: binary()}].
list(User, Server) -> list(User, Server) ->
lists:filtermap( lists:filtermap(