From d12e5a44b82451b68d33bd3e36eced233428af37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Fri, 14 Apr 2023 12:05:49 +0200 Subject: [PATCH] Add by attribute to generated muc moderation messages --- mix.exs | 2 +- rebar.config | 2 +- src/mod_muc_room.erl | 37 +++++++++++++++++++++---------------- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/mix.exs b/mix.exs index 21d8ce596..38cba9790 100644 --- a/mix.exs +++ b/mix.exs @@ -114,7 +114,7 @@ defmodule Ejabberd.MixProject do {:p1_utils, "~> 1.0"}, {:pkix, "~> 1.0"}, {:stringprep, ">= 1.0.26"}, - {:xmpp, git: "https://github.com/processone/xmpp.git", ref: "1107d05640ccd352613b2867ab24c5649603a470", override: true}, + {:xmpp, git: "https://github.com/processone/xmpp.git", ref: "9ba5f2b3a66f929c5a9e455e9124b8752ada4b43", override: true}, {:yconf, "~> 1.0"}] ++ cond_deps() end diff --git a/rebar.config b/rebar.config index 388d450ab..f1fdd07df 100644 --- a/rebar.config +++ b/rebar.config @@ -73,7 +73,7 @@ {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.29"}}}, {if_var_true, stun, {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.2.7"}}}}, - {xmpp, ".*", {git, "https://github.com/processone/xmpp", "1107d05640ccd352613b2867ab24c5649603a470"}}, + {xmpp, ".*", {git, "https://github.com/processone/xmpp", "9ba5f2b3a66f929c5a9e455e9124b8752ada4b43"}}, {yconf, ".*", {git, "https://github.com/processone/yconf", {tag, "1.0.15"}}} ]}. diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index bcc167f53..2be5b4a78 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -2153,11 +2153,22 @@ get_priority_from_presence(#presence{priority = Prio}) -> _ -> Prio end. --spec find_nick_by_jid(jid(), state()) -> binary(). +-spec find_nick_by_jid(jid() | undefined, state()) -> binary(). +find_nick_by_jid(undefined, _StateData) -> + <<>>; find_nick_by_jid(JID, StateData) -> LJID = jid:tolower(JID), - #user{nick = Nick} = maps:get(LJID, StateData#state.users), - Nick. + case maps:find(LJID, StateData#state.users) of + {ok, #user{nick = Nick}} -> + Nick; + _ -> + case maps:find(LJID, (StateData#state.muc_subscribers)#muc_subscribers.subscribers) of + {ok, #subscriber{nick = Nick}} -> + Nick; + _ -> + <<>> + end + end. -spec is_nick_change(jid(), binary(), state()) -> boolean(). is_nick_change(JID, Nick, StateData) -> @@ -2890,7 +2901,7 @@ add_message_to_history(FromNick, FromJID, Packet, StateData) -> remove_from_history(StanzaId, #state{history = #lqueue{queue = Queue} = LQueue} = StateData) -> NewQ = p1_queue:foldl( fun({_, Pkt, _, _, _} = Entry, Acc) -> - case xmpp:get_meta(Pkt, stanza_id, 0) of + case xmpp:get_meta(Pkt, stanza_id, missing) of V when V == StanzaId -> Acc; _ -> @@ -3448,7 +3459,7 @@ send_kickban_presence(UJID, JID, Reason, Code, NewAffiliation, send_kickban_presence1(MJID, UJID, Reason, Code, Affiliation, StateData) -> #user{jid = RealJID, nick = Nick} = maps:get(jid:tolower(UJID), StateData#state.users), - ActorNick = get_actor_nick(MJID, StateData), + ActorNick = find_nick_by_jid(MJID, StateData), %% TODO: optimize further UserMap = maps:merge( @@ -3491,15 +3502,6 @@ send_kickban_presence1(MJID, UJID, Reason, Code, Affiliation, end end, ok, UserMap). --spec get_actor_nick(undefined | jid(), state()) -> binary(). -get_actor_nick(undefined, _StateData) -> - <<"">>; -get_actor_nick(MJID, StateData) -> - try maps:get(jid:tolower(MJID), StateData#state.users) of - #user{nick = ActorNick} -> ActorNick - catch _:{badkey, _} -> <<"">> - end. - -spec convert_legacy_fields([xdata_field()]) -> [xdata_field()]. convert_legacy_fields(Fs) -> lists:map( @@ -5064,16 +5066,19 @@ process_iq_moderate(From, #iq{type = set, lang = Lang}, _ -> ok end, + By = jid:replace_resource(JID, find_nick_by_jid(From, StateData)), Packet = #message{type = groupchat, sub_els = [ #fasten_apply_to{id = Id, sub_els = [ - #message_moderated{reason = Reason, + #message_moderated{by = By, reason = Reason, retract = #message_retract{}} ]}]}, send_wrapped_multiple(JID, get_users_and_subscribers_with_node(?NS_MUCSUB_NODES_MESSAGES, StateData), Packet, ?NS_MUCSUB_NODES_MESSAGES, StateData), - {result, undefined, remove_from_history(StanzaId, StateData)} + NSD = add_message_to_history(<<"">>, + StateData#state.jid, Packet, StateData), + {result, undefined, remove_from_history(StanzaId, NSD)} catch _:_ -> {error, xmpp:err_bad_request( ?T("Stanza id is not valid"), Lang)}