aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mod_muc_room.hrl3
-rw-r--r--rebar.config2
-rw-r--r--src/mod_muc_room.erl32
3 files changed, 31 insertions, 6 deletions
diff --git a/include/mod_muc_room.hrl b/include/mod_muc_room.hrl
index 97b84e22b..842aadddd 100644
--- a/include/mod_muc_room.hrl
+++ b/include/mod_muc_room.hrl
@@ -64,7 +64,8 @@
logging = false :: boolean(),
vcard = <<"">> :: binary(),
captcha_whitelist = (?SETS):empty() :: ?TGB_SET,
- mam = false :: boolean()
+ mam = false :: boolean(),
+ pubsub = <<"">> :: binary()
}).
-type config() :: #config{}.
diff --git a/rebar.config b/rebar.config
index d6ad5e7be..c7ffe7f8c 100644
--- a/rebar.config
+++ b/rebar.config
@@ -25,7 +25,7 @@
{fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.0.17"}}},
{stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.10"}}},
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.25"}}},
- {xmpp, ".*", {git, "https://github.com/processone/xmpp", {tag, "1.1.16"}}},
+ {xmpp, ".*", {git, "https://github.com/processone/xmpp", "a893ee1"}},
{fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.12"}}},
{jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "0.14.8"}}},
{p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.2"}}},
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl
index bafa938dc..42a015c72 100644
--- a/src/mod_muc_room.erl
+++ b/src/mod_muc_room.erl
@@ -1242,6 +1242,17 @@ expulse_participant(Packet, From, StateData, Reason1) ->
end,
remove_online_user(From, NewState).
+-spec get_owners(state()) -> [jid:jid()].
+get_owners(StateData) ->
+ ?DICT:fold(
+ fun(LJID, owner, Acc) ->
+ [jid:make(LJID)|Acc];
+ (LJID, {owner, _}, Acc) ->
+ [jid:make(LJID)|Acc];
+ (_, _, Acc) ->
+ Acc
+ end, [], StateData#state.affiliations).
+
-spec set_affiliation(jid(), affiliation(), state()) -> state().
set_affiliation(JID, Affiliation, StateData) ->
set_affiliation(JID, Affiliation, StateData, <<"">>).
@@ -3196,7 +3207,8 @@ get_config(Lang, StateData, From) ->
{allow_visitor_nickchange, Config#config.allow_visitor_nickchange},
{allow_voice_requests, Config#config.allow_voice_requests},
{allow_subscription, Config#config.allow_subscription},
- {voice_request_min_interval, Config#config.voice_request_min_interval}]
+ {voice_request_min_interval, Config#config.voice_request_min_interval},
+ {pubsub, Config#config.pubsub}]
++
case ejabberd_captcha:is_feature_available() of
true -> [{captcha_protected, Config#config.captcha_protected}];
@@ -3278,6 +3290,7 @@ set_config(Opts, Config, ServerHost, Lang) ->
({whois, anyone}, C) -> C#config{anonymous = false};
({maxusers, V}, C) -> C#config{max_users = V};
({enablelogging, V}, C) -> C#config{logging = V};
+ ({pubsub, V}, C) -> C#config{pubsub = V};
({captcha_whitelist, Js}, C) ->
LJIDs = [jid:tolower(J) || J <- Js],
C#config{captcha_whitelist = ?SETS:from_list(LJIDs)};
@@ -3482,6 +3495,9 @@ set_opts([{Opt, Val} | Opts], StateData) ->
StateData#state{config =
(StateData#state.config)#config{vcard =
Val}};
+ pubsub ->
+ StateData#state{config =
+ (StateData#state.config)#config{pubsub = Val}};
allow_subscription ->
StateData#state{config =
(StateData#state.config)#config{allow_subscription = Val}};
@@ -3548,6 +3564,7 @@ make_opts(StateData) ->
?MAKE_CONFIG_OPT(#config.presence_broadcast),
?MAKE_CONFIG_OPT(#config.voice_request_min_interval),
?MAKE_CONFIG_OPT(#config.vcard),
+ ?MAKE_CONFIG_OPT(#config.pubsub),
{captcha_whitelist,
(?SETS):to_list((StateData#state.config)#config.captcha_whitelist)},
{affiliations,
@@ -3629,10 +3646,17 @@ process_iq_disco_info(_From, #iq{type = get, lang = Lang}, StateData) ->
-spec iq_disco_info_extras(binary(), state()) -> xdata().
iq_disco_info_extras(Lang, StateData) ->
- Fs = [{description, (StateData#state.config)#config.description},
- {occupants, ?DICT:size(StateData#state.users)}],
+ Fs1 = [{description, (StateData#state.config)#config.description},
+ {occupants, ?DICT:size(StateData#state.users)},
+ {contactjid, get_owners(StateData)}],
+ Fs2 = case (StateData#state.config)#config.pubsub of
+ Node when is_binary(Node), Node /= <<"">> ->
+ [{pubsub, Node}|Fs1];
+ _ ->
+ Fs1
+ end,
#xdata{type = result,
- fields = muc_roominfo:encode(Fs, Lang)}.
+ fields = muc_roominfo:encode(Fs2, Lang)}.
-spec process_iq_disco_items(jid(), iq(), state()) ->
{error, stanza_error()} | {result, disco_items()}.