]> granicus.if.org Git - ejabberd/commitdiff
Create room on configuration request as per XEP-0045, 10.1.3
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Wed, 7 Sep 2016 08:15:19 +0000 (11:15 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Mon, 10 Oct 2016 07:51:39 +0000 (10:51 +0300)
src/mod_muc.erl

index b189508a8f794cca062b62f3b52615a709b83f39..6b71d1e1d9b9d250d5f9b5ecd5d955005dce5a67 100644 (file)
@@ -385,8 +385,8 @@ do_route1(Host, ServerHost, Access, HistorySize, RoomShaper,
     {Room, _, Nick} = jid:tolower(To),
     case mnesia:dirty_read(muc_online_room, {Room, Host}) of
        [] ->
-           case Packet of
-               #presence{type = available, lang = Lang} ->
+           case is_create_request(Packet) of
+               true ->
                    case check_user_can_create_room(
                           ServerHost, AccessCreate, From, Room) and
                        check_create_roomid(ServerHost, Room) of
@@ -399,12 +399,13 @@ do_route1(Host, ServerHost, Access, HistorySize, RoomShaper,
                            mod_muc_room:route(Pid, From, Nick, Packet),
                            ok;
                        false ->
+                           Lang = xmpp:get_lang(Packet),
                            ErrText = <<"Room creation is denied by service policy">>,
                            Err = xmpp:make_error(
                                    Packet, xmpp:err_forbidden(ErrText, Lang)),
                            ejabberd_router:route(To, From, Err)
                    end;
-               _ ->
+               false ->
                    Lang = xmpp:get_lang(Packet),
                    ErrText = <<"Conference room does not exist">>,
                    Err = xmpp:err_item_not_found(ErrText, Lang),
@@ -501,6 +502,16 @@ process_mucsub(#iq{type = get, from = From, to = To} = IQ) ->
     RoomJIDs = get_subscribed_rooms(ServerHost, Host, From),
     xmpp:make_iq_result(IQ, #muc_subscriptions{list = RoomJIDs}).
 
+-spec is_create_request(stanza()) -> boolean().
+is_create_request(#presence{type = available}) ->
+    true;
+is_create_request(#iq{type = set} = IQ) ->
+    xmpp:has_subtag(IQ, #muc_subscribe{});
+is_create_request(#iq{type = get} = IQ) ->
+    #muc_owner{} == xmpp:get_subtag(IQ, #muc_owner{});
+is_create_request(_) ->
+    false.
+
 check_user_can_create_room(ServerHost, AccessCreate,
                           From, _RoomID) ->
     case acl:match_rule(ServerHost, AccessCreate, From) of