Convert allow_private_message MUC room option to allowpm (#3736)

This commit is contained in:
Badlop 2023-08-08 13:28:02 +02:00
parent 66df953da1
commit 2bd61abd71
7 changed files with 70 additions and 30 deletions

View File

@ -38,7 +38,7 @@
description = <<"">> :: binary(), description = <<"">> :: binary(),
allow_change_subj = true :: boolean(), allow_change_subj = true :: boolean(),
allow_query_users = true :: boolean(), allow_query_users = true :: boolean(),
allow_private_messages = true :: boolean(), allowpm = anyone :: anyone | participants | moderators | none,
allow_private_messages_from_visitors = anyone :: anyone | moderators | nobody , allow_private_messages_from_visitors = anyone :: anyone | moderators | nobody ,
allow_visitor_status = true :: boolean(), allow_visitor_status = true :: boolean(),
allow_visitor_nickchange = true :: boolean(), allow_visitor_nickchange = true :: boolean(),

View File

@ -1193,6 +1193,13 @@ opts_to_binary(Opts) ->
{subject, iolist_to_binary(Subj)}; {subject, iolist_to_binary(Subj)};
({subject_author, Author}) -> ({subject_author, Author}) ->
{subject_author, iolist_to_binary(Author)}; {subject_author, iolist_to_binary(Author)};
({allow_private_messages, Value}) -> % ejabberd 23.04 or older
Value2 = case Value of
true -> anyone;
false -> none;
_ -> Value
end,
{allowpm, Value2};
({AffOrRole, Affs}) when (AffOrRole == affiliation) or (AffOrRole == role) -> ({AffOrRole, Affs}) when (AffOrRole == affiliation) or (AffOrRole == role) ->
{affiliations, lists:map( {affiliations, lists:map(
fun({{U, S, R}, Aff}) -> fun({{U, S, R}, Aff}) ->
@ -1289,7 +1296,8 @@ mod_opt_type(cleanup_affiliations_on_start) ->
mod_opt_type(default_room_options) -> mod_opt_type(default_room_options) ->
econf:options( econf:options(
#{allow_change_subj => econf:bool(), #{allow_change_subj => econf:bool(),
allow_private_messages => econf:bool(), allowpm =>
econf:enum([anyone, participants, moderators, none]),
allow_private_messages_from_visitors => allow_private_messages_from_visitors =>
econf:enum([anyone, moderators, nobody]), econf:enum([anyone, moderators, nobody]),
allow_query_users => econf:bool(), allow_query_users => econf:bool(),
@ -1373,7 +1381,7 @@ mod_options(Host) ->
{cleanup_affiliations_on_start, false}, {cleanup_affiliations_on_start, false},
{default_room_options, {default_room_options,
[{allow_change_subj,true}, [{allow_change_subj,true},
{allow_private_messages,true}, {allowpm,anyone},
{allow_query_users,true}, {allow_query_users,true},
{allow_user_invites,false}, {allow_user_invites,false},
{allow_visitor_nickchange,true}, {allow_visitor_nickchange,true},
@ -1667,11 +1675,11 @@ mod_doc() ->
desc => desc =>
?T("Allow occupants to change the subject. " ?T("Allow occupants to change the subject. "
"The default value is 'true'.")}}, "The default value is 'true'.")}},
{allow_private_messages, {allowpm,
#{value => "true | false", #{value => "anyone | participants | moderators | none",
desc => desc =>
?T("Occupants can send private messages to other occupants. " ?T("Who can send private messages. "
"The default value is 'true'.")}}, "The default value is 'anyone'.")}},
{allow_query_users, {allow_query_users,
#{value => "true | false", #{value => "true | false",
desc => desc =>

View File

@ -1276,7 +1276,7 @@ room_diagnostics(Name, Service) ->
change_option(Option, Value, Config) -> change_option(Option, Value, Config) ->
case Option of case Option of
allow_change_subj -> Config#config{allow_change_subj = Value}; allow_change_subj -> Config#config{allow_change_subj = Value};
allow_private_messages -> Config#config{allow_private_messages = Value}; allowpm -> Config#config{allowpm = Value};
allow_private_messages_from_visitors -> Config#config{allow_private_messages_from_visitors = Value}; allow_private_messages_from_visitors -> Config#config{allow_private_messages_from_visitors = Value};
allow_query_users -> Config#config{allow_query_users = Value}; allow_query_users -> Config#config{allow_query_users = Value};
allow_subscription -> Config#config{allow_subscription = Value}; allow_subscription -> Config#config{allow_subscription = Value};

View File

@ -811,8 +811,8 @@ get_roomconfig_text(members_by_default, Lang) ->
tr(Lang, ?T("Default users as participants")); tr(Lang, ?T("Default users as participants"));
get_roomconfig_text(allow_change_subj, Lang) -> get_roomconfig_text(allow_change_subj, Lang) ->
tr(Lang, ?T("Allow users to change the subject")); tr(Lang, ?T("Allow users to change the subject"));
get_roomconfig_text(allow_private_messages, Lang) -> get_roomconfig_text(allowpm, Lang) ->
tr(Lang, ?T("Allow users to send private messages")); tr(Lang, ?T("Who can send private messages"));
get_roomconfig_text(allow_private_messages_from_visitors, Lang) -> get_roomconfig_text(allow_private_messages_from_visitors, Lang) ->
tr(Lang, ?T("Allow visitors to send private messages to")); tr(Lang, ?T("Allow visitors to send private messages to"));
get_roomconfig_text(allow_query_users, Lang) -> get_roomconfig_text(allow_query_users, Lang) ->

View File

@ -401,6 +401,15 @@ need_transform({muc_room, {N, H}, _})
when is_list(N) orelse is_list(H) -> when is_list(N) orelse is_list(H) ->
?INFO_MSG("Mnesia table 'muc_room' will be converted to binary", []), ?INFO_MSG("Mnesia table 'muc_room' will be converted to binary", []),
true; true;
need_transform({muc_room, {_N, _H}, Opts}) ->
case lists:keymember(allow_private_messages, 1, Opts) of
true ->
?INFO_MSG("Mnesia table 'muc_room' will be converted to allowpm", []),
true;
false ->
false
end;
need_transform({muc_registered, {{U, S}, H}, Nick}) need_transform({muc_registered, {{U, S}, H}, Nick})
when is_list(U) orelse is_list(S) orelse is_list(H) orelse is_list(Nick) -> when is_list(U) orelse is_list(S) orelse is_list(H) orelse is_list(Nick) ->
?INFO_MSG("Mnesia table 'muc_registered' will be converted to binary", []), ?INFO_MSG("Mnesia table 'muc_registered' will be converted to binary", []),
@ -408,9 +417,22 @@ need_transform({muc_registered, {{U, S}, H}, Nick})
need_transform(_) -> need_transform(_) ->
false. false.
transform(#muc_room{name_host = {N, H}, opts = Opts} = R) -> transform({muc_room, {N, H}, Opts} = R)
when is_list(N) orelse is_list(H) ->
R#muc_room{name_host = {iolist_to_binary(N), iolist_to_binary(H)}, R#muc_room{name_host = {iolist_to_binary(N), iolist_to_binary(H)},
opts = mod_muc:opts_to_binary(Opts)}; opts = mod_muc:opts_to_binary(Opts)};
transform(#muc_room{opts = Opts} = R) ->
Opts2 = case lists:keyfind(allow_private_messages, 1, Opts) of
{_, Value} when is_boolean(Value) ->
Value2 = case Value of
true -> anyone;
false -> none
end,
lists:keyreplace(allow_private_messages, 1, Opts, {allowpm, Value2});
_ ->
Opts
end,
R#muc_room{opts = Opts2};
transform(#muc_registered{us_host = {{U, S}, H}, nick = Nick} = R) -> transform(#muc_registered{us_host = {{U, S}, H}, nick = Nick} = R) ->
R#muc_registered{us_host = {{iolist_to_binary(U), iolist_to_binary(S)}, R#muc_registered{us_host = {{iolist_to_binary(U), iolist_to_binary(S)},
iolist_to_binary(H)}, iolist_to_binary(H)},

View File

@ -593,7 +593,7 @@ normal_state({route, ToNick,
forget_message -> forget_message ->
{next_state, normal_state, StateData}; {next_state, normal_state, StateData};
continue_delivery -> continue_delivery ->
case {(StateData#state.config)#config.allow_private_messages, case {is_user_allowed_private_message(From, StateData),
is_user_online(From, StateData) orelse is_user_online(From, StateData) orelse
is_subscriber(From, StateData) orelse is_subscriber(From, StateData) orelse
is_user_allowed_message_nonparticipant(From, StateData)} of is_user_allowed_message_nonparticipant(From, StateData)} of
@ -630,7 +630,7 @@ normal_state({route, ToNick,
ejabberd_router:route(xmpp:set_to(PrivMsg, ToJID)) ejabberd_router:route(xmpp:set_to(PrivMsg, ToJID))
end, ToJIDs); end, ToJIDs);
true -> true ->
ErrText = ?T("It is not allowed to send private messages"), ErrText = ?T("You are not allowed to send private messages"),
Err = xmpp:err_forbidden(ErrText, Lang), Err = xmpp:err_forbidden(ErrText, Lang),
ejabberd_router:route_error(Packet, Err) ejabberd_router:route_error(Packet, Err)
end end
@ -641,7 +641,7 @@ normal_state({route, ToNick,
Err = xmpp:err_not_acceptable(ErrText, Lang), Err = xmpp:err_not_acceptable(ErrText, Lang),
ejabberd_router:route_error(Packet, Err); ejabberd_router:route_error(Packet, Err);
{false, _} -> {false, _} ->
ErrText = ?T("It is not allowed to send private messages"), ErrText = ?T("You are not allowed to send private messages"),
Err = xmpp:err_forbidden(ErrText, Lang), Err = xmpp:err_forbidden(ErrText, Lang),
ejabberd_router:route_error(Packet, Err) ejabberd_router:route_error(Packet, Err)
end, end,
@ -1329,6 +1329,24 @@ is_user_allowed_message_nonparticipant(JID,
_ -> false _ -> false
end. end.
-spec is_user_allowed_private_message(jid(), state()) -> boolean().
is_user_allowed_private_message(JID, StateData) ->
case {(StateData#state.config)#config.allowpm,
get_role(JID, StateData)} of
{anyone, _} ->
true;
{participants, moderator} ->
true;
{participants, participant} ->
true;
{moderators, moderator} ->
true;
{none, _} ->
false;
{_, _} ->
false
end.
%% @doc Get information of this participant, or default values. %% @doc Get information of this participant, or default values.
%% If the JID is not a participant, return values for a service message. %% If the JID is not a participant, return values for a service message.
-spec get_participant_data(jid(), state()) -> {binary(), role()}. -spec get_participant_data(jid(), state()) -> {binary(), role()}.
@ -3788,7 +3806,7 @@ get_config(Lang, StateData, From) ->
{moderatedroom, Config#config.moderated}, {moderatedroom, Config#config.moderated},
{members_by_default, Config#config.members_by_default}, {members_by_default, Config#config.members_by_default},
{changesubject, Config#config.allow_change_subj}, {changesubject, Config#config.allow_change_subj},
{allow_private_messages, Config#config.allow_private_messages}, {allowpm, Config#config.allowpm},
{allow_private_messages_from_visitors, {allow_private_messages_from_visitors,
Config#config.allow_private_messages_from_visitors}, Config#config.allow_private_messages_from_visitors},
{allow_query_users, Config#config.allow_query_users}, {allow_query_users, Config#config.allow_query_users},
@ -3859,8 +3877,8 @@ set_config(Opts, Config, ServerHost, Lang) ->
({roomdesc, Desc}, C) -> C#config{description = Desc}; ({roomdesc, Desc}, C) -> C#config{description = Desc};
({changesubject, V}, C) -> C#config{allow_change_subj = V}; ({changesubject, V}, C) -> C#config{allow_change_subj = V};
({allow_query_users, V}, C) -> C#config{allow_query_users = V}; ({allow_query_users, V}, C) -> C#config{allow_query_users = V};
({allow_private_messages, V}, C) -> ({allowpm, V}, C) ->
C#config{allow_private_messages = V}; C#config{allowpm = V};
({allow_private_messages_from_visitors, V}, C) -> ({allow_private_messages_from_visitors, V}, C) ->
C#config{allow_private_messages_from_visitors = V}; C#config{allow_private_messages_from_visitors = V};
({allow_visitor_status, V}, C) -> C#config{allow_visitor_status = V}; ({allow_visitor_status, V}, C) -> C#config{allow_visitor_status = V};
@ -4026,9 +4044,9 @@ set_opts2([{Opt, Val} | Opts], StateData) ->
StateData#state{config = StateData#state{config =
(StateData#state.config)#config{allow_query_users (StateData#state.config)#config{allow_query_users
= Val}}; = Val}};
allow_private_messages -> allowpm ->
StateData#state{config = StateData#state{config =
(StateData#state.config)#config{allow_private_messages (StateData#state.config)#config{allowpm
= Val}}; = Val}};
allow_private_messages_from_visitors -> allow_private_messages_from_visitors ->
StateData#state{config = StateData#state{config =
@ -4221,7 +4239,7 @@ make_opts(StateData, Hibernation) ->
[?MAKE_CONFIG_OPT(#config.title), ?MAKE_CONFIG_OPT(#config.description), [?MAKE_CONFIG_OPT(#config.title), ?MAKE_CONFIG_OPT(#config.description),
?MAKE_CONFIG_OPT(#config.allow_change_subj), ?MAKE_CONFIG_OPT(#config.allow_change_subj),
?MAKE_CONFIG_OPT(#config.allow_query_users), ?MAKE_CONFIG_OPT(#config.allow_query_users),
?MAKE_CONFIG_OPT(#config.allow_private_messages), ?MAKE_CONFIG_OPT(#config.allowpm),
?MAKE_CONFIG_OPT(#config.allow_private_messages_from_visitors), ?MAKE_CONFIG_OPT(#config.allow_private_messages_from_visitors),
?MAKE_CONFIG_OPT(#config.allow_visitor_status), ?MAKE_CONFIG_OPT(#config.allow_visitor_status),
?MAKE_CONFIG_OPT(#config.allow_visitor_nickchange), ?MAKE_CONFIG_OPT(#config.allow_visitor_nickchange),
@ -4481,20 +4499,12 @@ process_iq_disco_info(From, #iq{type = get, lang = Lang,
-spec iq_disco_info_extras(binary(), state(), boolean()) -> xdata(). -spec iq_disco_info_extras(binary(), state(), boolean()) -> xdata().
iq_disco_info_extras(Lang, StateData, Static) -> iq_disco_info_extras(Lang, StateData, Static) ->
Config = StateData#state.config, Config = StateData#state.config,
AllowPM = case Config#config.allow_private_messages of
false -> none;
true ->
case Config#config.allow_private_messages_from_visitors of
nobody -> participants;
_ -> anyone
end
end,
Fs1 = [{roomname, Config#config.title}, Fs1 = [{roomname, Config#config.title},
{description, Config#config.description}, {description, Config#config.description},
{changesubject, Config#config.allow_change_subj}, {changesubject, Config#config.allow_change_subj},
{allowinvites, Config#config.allow_user_invites}, {allowinvites, Config#config.allow_user_invites},
{allow_query_users, Config#config.allow_query_users}, {allow_query_users, Config#config.allow_query_users},
{allowpm, AllowPM}, {allowpm, Config#config.allowpm},
{lang, Config#config.lang}], {lang, Config#config.lang}],
Fs2 = case Config#config.pubsub of Fs2 = case Config#config.pubsub of
Node when is_binary(Node), Node /= <<"">> -> Node when is_binary(Node), Node /= <<"">> ->

View File

@ -1242,7 +1242,7 @@ config_private_messages_master(Config) ->
[104] = set_config(Config, [{allow_private_messages_from_visitors, nobody}]), [104] = set_config(Config, [{allow_private_messages_from_visitors, nobody}]),
wait_for_slave(Config), wait_for_slave(Config),
[104] = set_config(Config, [{allow_private_messages_from_visitors, anyone}, [104] = set_config(Config, [{allow_private_messages_from_visitors, anyone},
{allow_private_messages, false}]), {allowpm, none}]),
ct:comment("Fail trying to send a private message"), ct:comment("Fail trying to send a private message"),
send(Config, #message{to = PeerNickJID, type = chat}), send(Config, #message{to = PeerNickJID, type = chat}),
#message{from = PeerNickJID, type = error} = ErrMsg = recv_message(Config), #message{from = PeerNickJID, type = error} = ErrMsg = recv_message(Config),