]> granicus.if.org Git - ejabberd/commitdiff
Restrict access to MAM archives for members-only rooms
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Thu, 24 Dec 2015 12:01:33 +0000 (15:01 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Thu, 24 Dec 2015 12:04:06 +0000 (15:04 +0300)
src/mod_mam.erl
src/mod_muc_room.erl

index e989fba9926df4b81c8cd858a17c369b315663fe..7124e2c6d13edc4025e3c5af7e53a7873224b415 100644 (file)
@@ -251,7 +251,7 @@ process_iq_v0_3(#jid{lserver = LServer} = From,
 process_iq_v0_3(From, To, IQ) ->
     process_iq(From, To, IQ).
 
-muc_process_iq(#iq{type = set,
+muc_process_iq(#iq{type = set, lang = Lang,
                   sub_el = #xmlel{name = <<"query">>,
                                   attrs = Attrs} = SubEl} = IQ,
               MUCState, From, To) ->
@@ -259,8 +259,24 @@ muc_process_iq(#iq{type = set,
        ?NS_MAM_0 ->
            LServer = MUCState#state.server_host,
            Role = mod_muc_room:get_role(From, MUCState),
-           process_iq(LServer, From, To, IQ, SubEl,
-                      get_xdata_fields(SubEl), {groupchat, Role, MUCState});
+           Config = MUCState#state.config,
+           if Config#config.members_only ->
+                   case mod_muc_room:is_occupant_or_admin(From, MUCState) of
+                       true ->
+                           process_iq(LServer, From, To, IQ, SubEl,
+                                      get_xdata_fields(SubEl),
+                                      {groupchat, Role, MUCState});
+                       false ->
+                           Text = <<"Only members are allowed to query "
+                                    "archives of this room">>,
+                           Error = ?ERRT_FORBIDDEN(Lang, Text),
+                           IQ#iq{type = error, sub_el = [SubEl, Error]}
+                   end;
+              true ->
+                   process_iq(LServer, From, To, IQ, SubEl,
+                              get_xdata_fields(SubEl),
+                              {groupchat, Role, MUCState})
+           end;
        _ ->
            IQ
     end;
index df7b7d3e3079183672ac8ef60ead72cf2fdee01c..760bd7292819b651749379db60e25968dd7af5fb 100644 (file)
@@ -35,6 +35,8 @@
         start/9,
         start/7,
         get_role/2,
+        get_affiliation/2,
+        is_occupant_or_admin/2,
         route/4]).
 
 %% gen_fsm callbacks