summaryrefslogtreecommitdiff
path: root/src/mod_muc.erl
diff options
context:
space:
mode:
authorPaweł Chmielowski <pchmielowski@process-one.net>2019-07-05 13:46:48 +0200
committerPaweł Chmielowski <pchmielowski@process-one.net>2019-07-05 13:46:48 +0200
commit756adaba55338ce99f6663dd707b5b34aeb3a361 (patch)
treefb60ea36e11a562e8f451d5aefa18d971325da19 /src/mod_muc.erl
parentLimit number of rooms that we return for disco_items from muc (diff)
Restore room when receiving message or generic iq for not started room
Diffstat (limited to 'src/mod_muc.erl')
-rw-r--r--src/mod_muc.erl108
1 files changed, 63 insertions, 45 deletions
diff --git a/src/mod_muc.erl b/src/mod_muc.erl
index 30ecdc6c..41da5b5c 100644
--- a/src/mod_muc.erl
+++ b/src/mod_muc.erl
@@ -507,28 +507,39 @@ route_to_room(Packet, ServerHost) ->
RMod = gen_mod:ram_db_mod(ServerHost, ?MODULE),
case RMod:find_online_room(ServerHost, Room, Host) of
error ->
- case is_create_request(Packet) of
- true ->
- case check_create_room(ServerHost, Host, Room, From) of
- true ->
- case start_new_room(Host, ServerHost, Room, From, Nick) of
- {ok, Pid} ->
- mod_muc_room:route(Pid, Packet);
- _Err ->
- Err = xmpp:err_internal_server_error(),
- ejabberd_router:route_error(Packet, Err)
- end;
- false ->
- Lang = xmpp:get_lang(Packet),
- ErrText = ?T("Room creation is denied by service policy"),
- Err = xmpp:err_forbidden(ErrText, Lang),
- ejabberd_router:route_error(Packet, Err)
- end;
+ case should_start_room(Packet) of
false ->
Lang = xmpp:get_lang(Packet),
ErrText = ?T("Conference room does not exist"),
Err = xmpp:err_item_not_found(ErrText, Lang),
- ejabberd_router:route_error(Packet, Err)
+ ejabberd_router:route_error(Packet, Err);
+ StartType ->
+ RMod = gen_mod:ram_db_mod(ServerHost, ?MODULE),
+ case load_room(RMod, Host, ServerHost, Room) of
+ error when StartType == start ->
+ case check_create_room(ServerHost, Host, Room, From) of
+ true ->
+ case start_new_room(RMod, Host, ServerHost, Room, From, Nick) of
+ {ok, Pid} ->
+ mod_muc_room:route(Pid, Packet);
+ _Err ->
+ Err = xmpp:err_internal_server_error(),
+ ejabberd_router:route_error(Packet, Err)
+ end;
+ false ->
+ Lang = xmpp:get_lang(Packet),
+ ErrText = ?T("Room creation is denied by service policy"),
+ Err = xmpp:err_forbidden(ErrText, Lang),
+ ejabberd_router:route_error(Packet, Err)
+ end;
+ error ->
+ Lang = xmpp:get_lang(Packet),
+ ErrText = ?T("Conference room does not exist"),
+ Err = xmpp:err_item_not_found(ErrText, Lang),
+ ejabberd_router:route_error(Packet, Err);
+ {ok, Pid2} ->
+ mod_muc_room:route(Pid2, Packet)
+ end
end;
{ok, Pid} ->
mod_muc_room:route(Pid, Packet)
@@ -665,13 +676,24 @@ process_mucsub(#iq{lang = Lang} = IQ) ->
Txt = ?T("No module is handling this query"),
xmpp:make_error(IQ, xmpp:err_service_unavailable(Txt, Lang)).
--spec is_create_request(stanza()) -> boolean().
-is_create_request(#presence{type = available}) ->
- true;
-is_create_request(#iq{type = T} = IQ) when T == get; T == set ->
- xmpp:has_subtag(IQ, #muc_subscribe{}) orelse
- xmpp:has_subtag(IQ, #muc_owner{});
-is_create_request(_) ->
+-spec should_start_room(stanza()) -> start | load | false.
+should_start_room(#presence{type = available}) ->
+ start;
+should_start_room(#iq{type = T} = IQ) when T == get; T == set ->
+ case xmpp:has_subtag(IQ, #muc_subscribe{}) orelse
+ xmpp:has_subtag(IQ, #muc_owner{}) of
+ true ->
+ start;
+ _ ->
+ load
+ end;
+should_start_room(#message{type = T, to = #jid{lresource = <<>>}})
+ when T == groupchat; T == normal->
+ load;
+should_start_room(#message{type = T, to = #jid{lresource = Res}})
+ when Res /= <<>> andalso T /= groupchat andalso T /= error ->
+ load;
+should_start_room(_) ->
false.
-spec check_create_room(binary(), binary(), binary(), jid()) -> boolean().
@@ -751,29 +773,25 @@ load_permanent_rooms(Hosts, ServerHost, Opts) ->
ok
end.
-start_new_room(Host, ServerHost, Room, From, Nick) ->
- RMod = gen_mod:ram_db_mod(ServerHost, ?MODULE),
- Opts = case restore_room(ServerHost, Host, Room) of
- error ->
- error;
- Opts0 ->
- case proplists:get_bool(persistent, Opts0) of
- true ->
- Opts0;
- _ ->
- error
- end
- end,
- case Opts of
+load_room(RMod, Host, ServerHost, Room) ->
+ case restore_room(ServerHost, Host, Room) of
error ->
- ?DEBUG("Open new room: ~s", [Room]),
- DefRoomOpts = mod_muc_opt:default_room_options(ServerHost),
- start_room(RMod, Host, ServerHost, Room, DefRoomOpts, From, Nick);
- _ ->
- ?DEBUG("Restore room: ~s", [Room]),
- start_room(RMod, Host, ServerHost, Room, Opts)
+ error;
+ Opts0 ->
+ case proplists:get_bool(persistent, Opts0) of
+ true ->
+ ?DEBUG("Restore room: ~s", [Room]),
+ start_room(RMod, Host, ServerHost, Room, Opts0);
+ _ ->
+ error
+ end
end.
+start_new_room(RMod, Host, ServerHost, Room, From, Nick) ->
+ ?DEBUG("Open new room: ~s", [Room]),
+ DefRoomOpts = mod_muc_opt:default_room_options(ServerHost),
+ start_room(RMod, Host, ServerHost, Room, DefRoomOpts, From, Nick).
+
start_room(Mod, Host, ServerHost, Room, DefOpts) ->
Access = get_access(ServerHost),
HistorySize = mod_muc_opt:history_size(ServerHost),