aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMickaël Rémond <mickael.remond@process-one.net>2007-06-20 11:25:19 +0000
committerMickaël Rémond <mickael.remond@process-one.net>2007-06-20 11:25:19 +0000
commit81117800e80b929a953cb6745f2d7bcfdbcee5f4 (patch)
tree21ff5be267f0da78d83e9fa55f98556ffd672adf /src
parent* src/odbc/odbc_queries.erl: Added missing users_number/1 for MSSQL (EJAB-239). (diff)
* src/mod_muc/mod_muc_room.erl: It is now possible to limit who is allowed to create persistent MUC rooms (Thanks to Badlop) (EJAB-257)
* src/mod_muc/mod_muc.erl: Likewise * doc/guide.tex: Likewise * src/ejabberd.cfg.example: Likewise SVN Revision: 786
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd.cfg.example2
-rw-r--r--src/mod_muc/mod_muc.erl9
-rw-r--r--src/mod_muc/mod_muc_room.erl33
3 files changed, 32 insertions, 12 deletions
diff --git a/src/ejabberd.cfg.example b/src/ejabberd.cfg.example
index 00581047b..b5e5559e1 100644
--- a/src/ejabberd.cfg.example
+++ b/src/ejabberd.cfg.example
@@ -172,9 +172,11 @@
% host: "conference." ++ ?MYNAME
% access: all
% access_create: all
+% access_persistent: all
% access_admin: none (only room creator has owner privileges)
{mod_muc, [{access, muc},
{access_create, muc},
+ {access_persistent, muc},
{access_admin, muc_admin}]},
% {mod_muc_log, []},
% {mod_shared_roster, []},
diff --git a/src/mod_muc/mod_muc.erl b/src/mod_muc/mod_muc.erl
index 169c7ad3d..f31230933 100644
--- a/src/mod_muc/mod_muc.erl
+++ b/src/mod_muc/mod_muc.erl
@@ -154,13 +154,14 @@ init([Host, Opts]) ->
Access = gen_mod:get_opt(access, Opts, all),
AccessCreate = gen_mod:get_opt(access_create, Opts, all),
AccessAdmin = gen_mod:get_opt(access_admin, Opts, none),
+ AccessPersistent = gen_mod:get_opt(access_persistent, Opts, all),
HistorySize = gen_mod:get_opt(history_size, Opts, 20),
ejabberd_router:register_route(MyHost),
- load_permanent_rooms(MyHost, Host, {Access, AccessCreate, AccessAdmin},
+ load_permanent_rooms(MyHost, Host, {Access, AccessCreate, AccessAdmin, AccessPersistent},
HistorySize),
{ok, #state{host = MyHost,
server_host = Host,
- access = {Access, AccessCreate, AccessAdmin},
+ access = {Access, AccessCreate, AccessAdmin, AccessPersistent},
history_size = HistorySize}}.
%%--------------------------------------------------------------------
@@ -254,7 +255,7 @@ stop_supervisor(Host) ->
supervisor:delete_child(ejabberd_sup, Proc).
do_route(Host, ServerHost, Access, HistorySize, From, To, Packet) ->
- {AccessRoute, _AccessCreate, _AccessAdmin} = Access,
+ {AccessRoute, _AccessCreate, _AccessAdmin, AccessPersistent} = Access,
case acl:match_rule(ServerHost, AccessRoute, From) of
allow ->
do_route1(Host, ServerHost, Access, HistorySize, From, To, Packet);
@@ -269,7 +270,7 @@ do_route(Host, ServerHost, Access, HistorySize, From, To, Packet) ->
do_route1(Host, ServerHost, Access, HistorySize, From, To, Packet) ->
- {_AccessRoute, AccessCreate, AccessAdmin} = Access,
+ {_AccessRoute, AccessCreate, AccessAdmin, AccessPersistent} = Access,
{Room, _, Nick} = jlib:jid_tolower(To),
{xmlelement, Name, Attrs, _Els} = Packet,
case Room of
diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl
index b7ceb8939..2444c120d 100644
--- a/src/mod_muc/mod_muc_room.erl
+++ b/src/mod_muc/mod_muc_room.erl
@@ -773,7 +773,7 @@ set_affiliation_and_reason(JID, Affiliation, Reason, StateData) ->
StateData#state{affiliations = Affiliations}.
get_affiliation(JID, StateData) ->
- {_AccessRoute, _AccessCreate, AccessAdmin} = StateData#state.access,
+ {_AccessRoute, _AccessCreate, AccessAdmin, _AccessPersistent} = StateData#state.access,
Res =
case acl:match_rule(StateData#state.server_host, AccessAdmin, JID) of
allow ->
@@ -2041,9 +2041,10 @@ process_iq_owner(From, set, Lang, SubEl, StateData) ->
{?NS_XDATA, "cancel"} ->
{result, [], StateData};
{?NS_XDATA, "submit"} ->
- case check_allowed_log_change(XEl, StateData, From) of
- allow -> set_config(XEl, StateData);
- deny -> {error, ?ERR_BAD_REQUEST}
+ case {check_allowed_log_change(XEl, StateData, From),
+ check_allowed_persistent_change(XEl, StateData, From)} of
+ {allow, allow} -> set_config(XEl, StateData);
+ _ -> {error, ?ERR_BAD_REQUEST}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
@@ -2104,6 +2105,15 @@ check_allowed_log_change(XEl, StateData, From) ->
StateData#state.server_host, From)
end.
+check_allowed_persistent_change(XEl, StateData, From) ->
+ case lists:keymember("muc#roomconfig_persistentroom", 1,
+ jlib:parse_xdata_submit(XEl)) of
+ false ->
+ allow;
+ true ->
+ {_AccessRoute, _AccessCreate, _AccessAdmin, AccessPersistent} = StateData#state.access,
+ acl:match_rule(StateData#state.server_host, AccessPersistent, From)
+ end.
-define(XFIELD(Type, Label, Var, Val),
{xmlelement, "field", [{"type", Type},
@@ -2126,6 +2136,7 @@ check_allowed_log_change(XEl, StateData, From) ->
get_config(Lang, StateData, From) ->
+ {_AccessRoute, _AccessCreate, _AccessAdmin, AccessPersistent} = StateData#state.access,
Config = StateData#state.config,
Res =
[{xmlelement, "title", [],
@@ -2137,10 +2148,16 @@ get_config(Lang, StateData, From) ->
[{xmlcdata, "http://jabber.org/protocol/muc#roomconfig"}]}]},
?STRINGXFIELD("Room title",
"muc#roomconfig_roomname",
- Config#config.title),
- ?BOOLXFIELD("Make room persistent",
- "muc#roomconfig_persistentroom",
- Config#config.persistent),
+ Config#config.title)
+ ] ++
+ case acl:match_rule(StateData#state.server_host, AccessPersistent, From) of
+ allow ->
+ [?BOOLXFIELD(
+ "Make room persistent",
+ "muc#roomconfig_persistentroom",
+ Config#config.persistent)];
+ _ -> []
+ end ++ [
?BOOLXFIELD("Make room public searchable",
"muc#roomconfig_publicroom",
Config#config.public),