aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-09-07 11:15:19 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-09-07 11:15:19 +0300
commitf3041496151e57eb8212ff1f29bf99ad42e4691a (patch)
tree0a3a4d13bc9ea4cf2c9ddf8ef15841cf546524f3
parentLink MUC subscription to bare JID (diff)
Create room on configuration request as per XEP-0045, 10.1.3
-rw-r--r--src/mod_muc.erl23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/mod_muc.erl b/src/mod_muc.erl
index 571f85926..85c0914d1 100644
--- a/src/mod_muc.erl
+++ b/src/mod_muc.erl
@@ -488,9 +488,8 @@ do_route1(Host, ServerHost, Access, HistorySize, RoomShaper,
_ ->
case mnesia:dirty_read(muc_online_room, {Room, Host}) of
[] ->
- Type = fxml:get_attr_s(<<"type">>, Attrs),
- case {Name, Type} of
- {<<"presence">>, <<"">>} ->
+ case is_create_request(Packet) of
+ true ->
case check_user_can_create_room(ServerHost,
AccessCreate, From, Room) and
check_create_roomid(ServerHost, Room) of
@@ -508,7 +507,7 @@ do_route1(Host, ServerHost, Access, HistorySize, RoomShaper,
Packet, ?ERRT_FORBIDDEN(Lang, ErrText)),
ejabberd_router:route(To, From, Err)
end;
- _ ->
+ false ->
Lang = fxml:get_attr_s(<<"xml:lang">>, Attrs),
ErrText = <<"Conference room does not exist">>,
Err = jlib:make_error_reply(Packet,
@@ -523,6 +522,22 @@ do_route1(Host, ServerHost, Access, HistorySize, RoomShaper,
end
end.
+-spec is_create_request(xmlel()) -> boolean().
+is_create_request(#xmlel{name = <<"presence">>} = Packet) ->
+ <<"">> == fxml:get_tag_attr_s(<<"type">>, Packet);
+is_create_request(#xmlel{name = <<"iq">>} = Packet) ->
+ case jlib:iq_query_info(Packet) of
+ #iq{type = set, xmlns = ?NS_MUCSUB,
+ sub_el = #xmlel{name = <<"subscribe">>}} ->
+ true;
+ #iq{type = get, xmlns = ?NS_MUC_OWNER, sub_el = SubEl} ->
+ [] == fxml:remove_cdata(SubEl#xmlel.children);
+ _ ->
+ false
+ end;
+is_create_request(_) ->
+ false.
+
check_user_can_create_room(ServerHost, AccessCreate,
From, _RoomID) ->
case acl:match_rule(ServerHost, AccessCreate, From) of