mirror of
https://github.com/processone/ejabberd
synced 2025-10-03 17:59:31 +02:00
* src/ejabberd.cfg: Updated
* src/mod_muc/mod_muc_room.erl: Support for service admin, kick/ban reasons, more options * src/msgs/ru.msg: Added translations for MUC messages SVN Revision: 95
This commit is contained in:
parent
27b0a72c6f
commit
1c189c0f1b
4 changed files with 127 additions and 24 deletions
|
@ -1,5 +1,12 @@
|
||||||
2003-03-27 Alexey Shchepin <alexey@sevcom.net>
|
2003-03-27 Alexey Shchepin <alexey@sevcom.net>
|
||||||
|
|
||||||
|
* src/ejabberd.cfg: Updated
|
||||||
|
|
||||||
|
* src/mod_muc/mod_muc_room.erl: Support for service admin,
|
||||||
|
kick/ban reasons, more options
|
||||||
|
|
||||||
|
* src/msgs/ru.msg: Added translations for MUC messages
|
||||||
|
|
||||||
* src/ejabberd_s2s_in.erl: Bugfix
|
* src/ejabberd_s2s_in.erl: Bugfix
|
||||||
|
|
||||||
* src/mod_muc/: Small fixes in discovering
|
* src/mod_muc/: Small fixes in discovering
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
{access, c2s_shaper, [{none, admin},
|
{access, c2s_shaper, [{none, admin},
|
||||||
{normal, all}]}.
|
{normal, all}]}.
|
||||||
|
|
||||||
|
{access, muc_admin, [{allow, admin}]}.
|
||||||
|
|
||||||
|
|
||||||
{host, "e.localhost"}.
|
{host, "e.localhost"}.
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,8 @@
|
||||||
|
|
||||||
-record(lqueue, {queue, len, max}).
|
-record(lqueue, {queue, len, max}).
|
||||||
|
|
||||||
-record(config, {allow_change_subj = true,
|
-record(config, {title = "",
|
||||||
|
allow_change_subj = true,
|
||||||
allow_query_users = true,
|
allow_query_users = true,
|
||||||
allow_private_messages = true,
|
allow_private_messages = true,
|
||||||
public = true,
|
public = true,
|
||||||
|
@ -436,7 +437,7 @@ handle_event(Event, StateName, StateData) ->
|
||||||
handle_sync_event(get_disco_item, From, StateName, StateData) ->
|
handle_sync_event(get_disco_item, From, StateName, StateData) ->
|
||||||
Reply = case (StateData#state.config)#config.public of
|
Reply = case (StateData#state.config)#config.public of
|
||||||
true ->
|
true ->
|
||||||
{item, StateData#state.room};
|
{item, get_title(StateData)};
|
||||||
_ ->
|
_ ->
|
||||||
false
|
false
|
||||||
end,
|
end,
|
||||||
|
@ -528,12 +529,17 @@ set_affiliation(JID, Affiliation, StateData) ->
|
||||||
StateData#state{affiliations = Affiliations}.
|
StateData#state{affiliations = Affiliations}.
|
||||||
|
|
||||||
get_affiliation(JID, StateData) ->
|
get_affiliation(JID, StateData) ->
|
||||||
LJID = jlib:jid_tolower(JID),
|
case acl:match_rule(muc_admin, JID) of
|
||||||
case ?DICT:find(LJID, StateData#state.affiliations) of
|
allow ->
|
||||||
{ok, Affiliation} ->
|
owner;
|
||||||
Affiliation;
|
|
||||||
_ ->
|
_ ->
|
||||||
none
|
LJID = jlib:jid_tolower(JID),
|
||||||
|
case ?DICT:find(LJID, StateData#state.affiliations) of
|
||||||
|
{ok, Affiliation} ->
|
||||||
|
Affiliation;
|
||||||
|
_ ->
|
||||||
|
none
|
||||||
|
end
|
||||||
end.
|
end.
|
||||||
|
|
||||||
set_role(JID, Role, StateData) ->
|
set_role(JID, Role, StateData) ->
|
||||||
|
@ -1002,35 +1008,41 @@ process_admin_items_set(UJID, Items, StateData) ->
|
||||||
fun(E, SD) ->
|
fun(E, SD) ->
|
||||||
case catch (
|
case catch (
|
||||||
case E of
|
case E of
|
||||||
{JID, role, none} ->
|
{JID, role, none, Reason} ->
|
||||||
catch send_kickban_presence(
|
catch send_kickban_presence(
|
||||||
JID, "307", SD),
|
JID, Reason, "307", SD),
|
||||||
set_role(JID, none, SD);
|
set_role(JID, none, SD);
|
||||||
{JID, affiliation, outcast} ->
|
{JID, affiliation, outcast, Reason} ->
|
||||||
catch send_kickban_presence(
|
catch send_kickban_presence(
|
||||||
JID, "301", SD),
|
JID, Reason, "301", SD),
|
||||||
set_affiliation(
|
set_affiliation(
|
||||||
JID, outcast,
|
JID, outcast,
|
||||||
set_role(JID, none, SD));
|
set_role(JID, none, SD));
|
||||||
{JID, role, R} ->
|
{JID, role, R, Reason} ->
|
||||||
SD1 = set_role(JID, R, SD),
|
SD1 = set_role(JID, R, SD),
|
||||||
catch send_new_presence(JID, SD1),
|
catch send_new_presence(JID, SD1),
|
||||||
SD1;
|
SD1;
|
||||||
{JID, affiliation, A} ->
|
{JID, affiliation, A, Reason} ->
|
||||||
SD1 = set_affiliation(JID, A, SD),
|
SD1 = set_affiliation(JID, A, SD),
|
||||||
catch send_new_presence(JID, SD1),
|
catch send_new_presence(JID, SD1),
|
||||||
SD1
|
SD1
|
||||||
end
|
end
|
||||||
) of
|
) of
|
||||||
{'EXIT', Reason} ->
|
{'EXIT', ErrReason} ->
|
||||||
io:format("MUC ITEMS SET ERR: ~p~n",
|
io:format("MUC ITEMS SET ERR: ~p~n",
|
||||||
[Reason]),
|
[ErrReason]),
|
||||||
SD;
|
SD;
|
||||||
NSD ->
|
NSD ->
|
||||||
NSD
|
NSD
|
||||||
end
|
end
|
||||||
end, StateData, Res),
|
end, StateData, Res),
|
||||||
io:format("MUC SET: ~p~n", [Res]),
|
io:format("MUC SET: ~p~n", [Res]),
|
||||||
|
case (NSD#state.config)#config.persistent of
|
||||||
|
true ->
|
||||||
|
mod_muc:store_room(NSD#state.room, make_opts(NSD));
|
||||||
|
_ ->
|
||||||
|
ok
|
||||||
|
end,
|
||||||
{result, [], NSD};
|
{result, [], NSD};
|
||||||
Err ->
|
Err ->
|
||||||
Err
|
Err
|
||||||
|
@ -1043,7 +1055,7 @@ find_changed_items(UJID, UAffiliation, URole, [{xmlcdata, _} | Items],
|
||||||
StateData, Res) ->
|
StateData, Res) ->
|
||||||
find_changed_items(UJID, UAffiliation, URole, Items, StateData, Res);
|
find_changed_items(UJID, UAffiliation, URole, Items, StateData, Res);
|
||||||
find_changed_items(UJID, UAffiliation, URole,
|
find_changed_items(UJID, UAffiliation, URole,
|
||||||
[{xmlelement, "item", Attrs, Els} | Items],
|
[{xmlelement, "item", Attrs, Els} = Item | Items],
|
||||||
StateData, Res) ->
|
StateData, Res) ->
|
||||||
TJID = case xml:get_attr("jid", Attrs) of
|
TJID = case xml:get_attr("jid", Attrs) of
|
||||||
{value, S} ->
|
{value, S} ->
|
||||||
|
@ -1097,7 +1109,10 @@ find_changed_items(UJID, UAffiliation, URole,
|
||||||
Items, StateData,
|
Items, StateData,
|
||||||
[{JID,
|
[{JID,
|
||||||
affiliation,
|
affiliation,
|
||||||
SAffiliation} | Res]);
|
SAffiliation,
|
||||||
|
xml:get_path_s(
|
||||||
|
Item, [{elem, "reason"},
|
||||||
|
cdata])} | Res]);
|
||||||
_ ->
|
_ ->
|
||||||
{error, ?ERR_NOT_ALLOWED}
|
{error, ?ERR_NOT_ALLOWED}
|
||||||
end
|
end
|
||||||
|
@ -1123,7 +1138,10 @@ find_changed_items(UJID, UAffiliation, URole,
|
||||||
UJID,
|
UJID,
|
||||||
UAffiliation, URole,
|
UAffiliation, URole,
|
||||||
Items, StateData,
|
Items, StateData,
|
||||||
[{JID, role, SRole} | Res]);
|
[{JID, role, SRole,
|
||||||
|
xml:get_path_s(
|
||||||
|
Item, [{elem, "reason"},
|
||||||
|
cdata])} | Res]);
|
||||||
_ ->
|
_ ->
|
||||||
{error, ?ERR_NOT_ALLOWED}
|
{error, ?ERR_NOT_ALLOWED}
|
||||||
end
|
end
|
||||||
|
@ -1244,7 +1262,7 @@ can_change_ra(FAffiliation, FRole,
|
||||||
false.
|
false.
|
||||||
|
|
||||||
|
|
||||||
send_kickban_presence(UJID, Code, StateData) ->
|
send_kickban_presence(UJID, Reason, Code, StateData) ->
|
||||||
{ok, #user{jid = RealJID,
|
{ok, #user{jid = RealJID,
|
||||||
nick = Nick}} =
|
nick = Nick}} =
|
||||||
?DICT:find(jlib:jid_tolower(UJID), StateData#state.users),
|
?DICT:find(jlib:jid_tolower(UJID), StateData#state.users),
|
||||||
|
@ -1254,9 +1272,16 @@ send_kickban_presence(UJID, Code, StateData) ->
|
||||||
fun({LJID, Info}) ->
|
fun({LJID, Info}) ->
|
||||||
ItemAttrs = [{"affiliation", SAffiliation},
|
ItemAttrs = [{"affiliation", SAffiliation},
|
||||||
{"role", "none"}],
|
{"role", "none"}],
|
||||||
|
ItemEls = case Reason of
|
||||||
|
"" ->
|
||||||
|
[];
|
||||||
|
_ ->
|
||||||
|
[{xmlelement, "reason", [],
|
||||||
|
[{xmlcdata, Reason}]}]
|
||||||
|
end,
|
||||||
Packet = {xmlelement, "presence", [{"type", "unavailable"}],
|
Packet = {xmlelement, "presence", [{"type", "unavailable"}],
|
||||||
[{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
|
[{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
|
||||||
[{xmlelement, "item", ItemAttrs, []},
|
[{xmlelement, "item", ItemAttrs, ItemEls},
|
||||||
{xmlelement, "status", [{"code", Code}], []}]}]},
|
{xmlelement, "status", [{"code", Code}], []}]}]},
|
||||||
ejabberd_router:route(
|
ejabberd_router:route(
|
||||||
{StateData#state.room, StateData#state.host, Nick},
|
{StateData#state.room, StateData#state.host, Nick},
|
||||||
|
@ -1280,17 +1305,20 @@ process_iq_owner(From, set, SubEl, StateData) ->
|
||||||
case {xml:get_tag_attr_s("xmlns", XEl),
|
case {xml:get_tag_attr_s("xmlns", XEl),
|
||||||
xml:get_tag_attr_s("type", XEl)} of
|
xml:get_tag_attr_s("type", XEl)} of
|
||||||
{?NS_XDATA, "cancel"} ->
|
{?NS_XDATA, "cancel"} ->
|
||||||
{error, ?ERR_FEATURE_NOT_IMPLEMENTED};
|
%{error, ?ERR_FEATURE_NOT_IMPLEMENTED};
|
||||||
|
{result, [], StateData};
|
||||||
{?NS_XDATA, "submit"} ->
|
{?NS_XDATA, "submit"} ->
|
||||||
set_config(XEl, StateData);
|
set_config(XEl, StateData);
|
||||||
_ ->
|
_ ->
|
||||||
{error, ?ERR_BAD_REQUEST}
|
{error, ?ERR_BAD_REQUEST}
|
||||||
end;
|
end;
|
||||||
|
[{xmlelement, "destroy", Attrs1, Els1}] ->
|
||||||
|
destroy_room(Els1, StateData);
|
||||||
_ ->
|
_ ->
|
||||||
{error, ?ERR_FEATURE_NOT_IMPLEMENTED}
|
{error, ?ERR_FEATURE_NOT_IMPLEMENTED}
|
||||||
end;
|
end;
|
||||||
_ ->
|
_ ->
|
||||||
{error, ?ERR_NOT_ALLOWED}
|
{error, ?ERR_FORBIDDEN}
|
||||||
end;
|
end;
|
||||||
% {xmlelement, _, _, Items} = SubEl,
|
% {xmlelement, _, _, Items} = SubEl,
|
||||||
% process_admin_items_set(From, Items, StateData);
|
% process_admin_items_set(From, Items, StateData);
|
||||||
|
@ -1369,11 +1397,17 @@ process_iq_owner(From, get, SubEl, StateData) ->
|
||||||
_ -> "0"
|
_ -> "0"
|
||||||
end)).
|
end)).
|
||||||
|
|
||||||
|
-define(STRINGXFIELD(Label, Var, Val),
|
||||||
|
?XFIELD("text-single", Label, Var, Val)).
|
||||||
|
|
||||||
|
|
||||||
get_config(Lang, StateData) ->
|
get_config(Lang, StateData) ->
|
||||||
Config = StateData#state.config,
|
Config = StateData#state.config,
|
||||||
Res =
|
Res =
|
||||||
[?BOOLXFIELD("Allow users to change subject?",
|
[?STRINGXFIELD("Room title",
|
||||||
|
"title",
|
||||||
|
Config#config.title),
|
||||||
|
?BOOLXFIELD("Allow users to change subject?",
|
||||||
"allow_change_subj",
|
"allow_change_subj",
|
||||||
Config#config.allow_change_subj),
|
Config#config.allow_change_subj),
|
||||||
?BOOLXFIELD("Allow users to query other users?",
|
?BOOLXFIELD("Allow users to query other users?",
|
||||||
|
@ -1435,10 +1469,15 @@ set_config(XEl, StateData) ->
|
||||||
_ -> {error, ?ERR_BAD_REQUEST}
|
_ -> {error, ?ERR_BAD_REQUEST}
|
||||||
end).
|
end).
|
||||||
|
|
||||||
|
-define(SET_STRING_XOPT(Opt, Val),
|
||||||
|
set_xoption(Opts, Config#config{Opt = Val})).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
set_xoption([], Config) ->
|
set_xoption([], Config) ->
|
||||||
Config;
|
Config;
|
||||||
|
set_xoption([{"title", [Val]} | Opts], Config) ->
|
||||||
|
?SET_STRING_XOPT(title, Val);
|
||||||
set_xoption([{"allow_change_subj", [Val]} | Opts], Config) ->
|
set_xoption([{"allow_change_subj", [Val]} | Opts], Config) ->
|
||||||
?SET_BOOL_XOPT(allow_change_subj, Val);
|
?SET_BOOL_XOPT(allow_change_subj, Val);
|
||||||
set_xoption([{"allow_query_users", [Val]} | Opts], Config) ->
|
set_xoption([{"allow_query_users", [Val]} | Opts], Config) ->
|
||||||
|
@ -1489,6 +1528,7 @@ set_opts([], StateData) ->
|
||||||
StateData;
|
StateData;
|
||||||
set_opts([{Opt, Val} | Opts], StateData) ->
|
set_opts([{Opt, Val} | Opts], StateData) ->
|
||||||
NSD = case Opt of
|
NSD = case Opt of
|
||||||
|
?CASE_CONFIG_OPT(title);
|
||||||
?CASE_CONFIG_OPT(allow_change_subj);
|
?CASE_CONFIG_OPT(allow_change_subj);
|
||||||
?CASE_CONFIG_OPT(allow_query_users);
|
?CASE_CONFIG_OPT(allow_query_users);
|
||||||
?CASE_CONFIG_OPT(allow_private_messages);
|
?CASE_CONFIG_OPT(allow_private_messages);
|
||||||
|
@ -1512,6 +1552,7 @@ set_opts([{Opt, Val} | Opts], StateData) ->
|
||||||
make_opts(StateData) ->
|
make_opts(StateData) ->
|
||||||
Config = StateData#state.config,
|
Config = StateData#state.config,
|
||||||
[
|
[
|
||||||
|
?MAKE_CONFIG_OPT(title),
|
||||||
?MAKE_CONFIG_OPT(allow_change_subj),
|
?MAKE_CONFIG_OPT(allow_change_subj),
|
||||||
?MAKE_CONFIG_OPT(allow_query_users),
|
?MAKE_CONFIG_OPT(allow_query_users),
|
||||||
?MAKE_CONFIG_OPT(allow_private_messages),
|
?MAKE_CONFIG_OPT(allow_private_messages),
|
||||||
|
@ -1528,6 +1569,28 @@ make_opts(StateData) ->
|
||||||
].
|
].
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
destroy_room(DEls, StateData) ->
|
||||||
|
lists:foreach(
|
||||||
|
fun({LJID, Info}) ->
|
||||||
|
Nick = Info#user.nick,
|
||||||
|
ItemAttrs = [{"affiliation", "none"},
|
||||||
|
{"role", "none"}],
|
||||||
|
Packet = {xmlelement, "presence", [{"type", "unavailable"}],
|
||||||
|
[{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
|
||||||
|
[{xmlelement, "item", ItemAttrs, []},
|
||||||
|
{xmlelement, "destroy", [],
|
||||||
|
DEls}]}]},
|
||||||
|
ejabberd_router:route(
|
||||||
|
{StateData#state.room, StateData#state.host, Nick},
|
||||||
|
Info#user.jid,
|
||||||
|
Packet)
|
||||||
|
end, ?DICT:to_list(StateData#state.users)),
|
||||||
|
{result, [], StateData}.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
% Disco
|
% Disco
|
||||||
|
|
||||||
|
@ -1544,7 +1607,7 @@ process_iq_disco_info(From, get, StateData) ->
|
||||||
{result, [{xmlelement, "identity",
|
{result, [{xmlelement, "identity",
|
||||||
[{"category", "conference"},
|
[{"category", "conference"},
|
||||||
{"type", "text"},
|
{"type", "text"},
|
||||||
{"name", StateData#state.room}], []},
|
{"name", get_title(StateData)}], []},
|
||||||
{xmlelement, "feature",
|
{xmlelement, "feature",
|
||||||
[{"var", ?NS_MUC}], []}], StateData};
|
[{"var", ?NS_MUC}], []}], StateData};
|
||||||
_ ->
|
_ ->
|
||||||
|
@ -1579,4 +1642,12 @@ process_iq_disco_items(From, get, StateData) ->
|
||||||
{error, ?ERR_NOT_ALLOWED}
|
{error, ?ERR_NOT_ALLOWED}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
get_title(StateData) ->
|
||||||
|
case (StateData#state.config)#config.title of
|
||||||
|
"" ->
|
||||||
|
StateData#state.room;
|
||||||
|
Name ->
|
||||||
|
Name
|
||||||
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,29 @@
|
||||||
{"Organization Unit", "Отдел организации"}.
|
{"Organization Unit", "Отдел организации"}.
|
||||||
|
|
||||||
|
|
||||||
|
% mod_muc/mod_muc_room.erl
|
||||||
|
|
||||||
|
{"Room title", "Название комнаты"}.
|
||||||
|
{"Allow users to change subject?", "Разрешить пользователям изменять тему?"}.
|
||||||
|
{"Allow users to query other users?",
|
||||||
|
"Разрешить iq-запросы к пользователям?"}.
|
||||||
|
{"Allow users to send private messages?",
|
||||||
|
"Разрешить приватные сообщения?"}.
|
||||||
|
{"Make room public searchable?", "Сделать комнату видимой всем?"}.
|
||||||
|
{"Make room persistent?", "Сделать комнату постоянной?"}.
|
||||||
|
{"Make room moderated?", "Сделать комнату модерируемой?"}.
|
||||||
|
{"Default users as members?",
|
||||||
|
"Сделать пользователей участниками по умолчанию?"}.
|
||||||
|
{"Make room members only?",
|
||||||
|
"Комната только для зарегистрированных участников?"}.
|
||||||
|
{"Allow users to send invites?",
|
||||||
|
"Разрешить пользователям посылать приглашения?"}.
|
||||||
|
{"Make room password protected?", "Сделать комнату защищённой паролем?"}.
|
||||||
|
{"Make room anonymous?", "Сделать комнату анонимной?"}.
|
||||||
|
{"Enable logging?", "Включить журналирование?"}.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% Local Variables:
|
% Local Variables:
|
||||||
% mode: erlang
|
% mode: erlang
|
||||||
% End:
|
% End:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue