]> granicus.if.org Git - ejabberd/commitdiff
Handle <subscriptions/> request to list MUC subscribers
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Tue, 6 Sep 2016 16:06:02 +0000 (19:06 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Tue, 6 Sep 2016 16:06:02 +0000 (19:06 +0300)
src/mod_muc_room.erl

index 6280d75ad79edfcec35e9bc27fd8c6f294eab289..f86b990d31c4659063708ac52c9f873cb75de308 100644 (file)
@@ -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) ->