summaryrefslogtreecommitdiff
path: root/src/mod_muc_room.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-09-06 19:06:02 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-09-06 19:06:02 +0300
commitc6afb9731b6d2e0de33eba4f239e27c236477039 (patch)
treedf8af0707067b7126857f114ae0f77d0a228dd21 /src/mod_muc_room.erl
parentDo not update muc_online_users table on MUC/Sub operations (diff)
Handle <subscriptions/> request to list MUC subscribers
Diffstat (limited to 'src/mod_muc_room.erl')
-rw-r--r--src/mod_muc_room.erl25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl
index 6280d75a..f86b990d 100644
--- a/src/mod_muc_room.erl
+++ b/src/mod_muc_room.erl
@@ -4695,11 +4695,28 @@ process_iq_mucsub(From, _Packet,
_ ->
{result, [], StateData}
end;
-process_iq_mucsub(_From, _Packet, #iq{type = set, lang = Lang}, _StateData) ->
+process_iq_mucsub(From, _Packet,
+ #iq{type = get, lang = Lang,
+ sub_el = #xmlel{name = <<"subscriptions">>}},
+ StateData) ->
+ FAffiliation = get_affiliation(From, StateData),
+ FRole = get_role(From, StateData),
+ if FRole == moderator; FAffiliation == owner; FAffiliation == admin ->
+ Subs = dict:fold(
+ fun(_, #user{is_subscriber = true, jid = J}, Acc) ->
+ SJID = jid:to_string(jid:remove_resource(J)),
+ [#xmlel{name = <<"subscription">>,
+ attrs = [{<<"jid">>, SJID}]}|Acc];
+ (_, _, Acc) ->
+ Acc
+ end, [], StateData#state.users),
+ {result, Subs, StateData};
+ true ->
+ Txt = <<"Moderator privileges required">>,
+ {error, ?ERRT_FORBIDDEN(Lang, Txt)}
+ end;
+process_iq_mucsub(_From, _Packet, #iq{lang = Lang}, _StateData) ->
Txt = <<"Unrecognized subscription command">>,
- {error, ?ERRT_BAD_REQUEST(Lang, Txt)};
-process_iq_mucsub(_From, _Packet, #iq{type = get, lang = Lang}, _StateData) ->
- Txt = <<"Value 'get' of 'type' attribute is not allowed">>,
{error, ?ERRT_BAD_REQUEST(Lang, Txt)}.
remove_subscription(JID, #user{is_subscriber = true} = User, StateData) ->