diff options
author | Alexey Shchepin <alexey@process-one.net> | 2004-03-02 21:16:55 +0000 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2004-03-02 21:16:55 +0000 |
commit | ec182cbd60786487c6843e60981dabc03a4e78bb (patch) | |
tree | 61fcd1e6635317d883b65e9272bb0a70e54f328a /src/mod_muc | |
parent | * src/msgs/ru.msg: Updated (thanks to Sergei Golovan) (diff) |
* src/web/: Small HTTP server and admin web-interface to ejabberd
(not completed yet)
* src/ejabberd_sup.erl: Added HTTP processes supervisor
* src/ejabberd_c2s.erl: Added API to ask presence (thanks to
Mickael Remond)
* src/msgs/ru.msg: Updated (thanks to Sergei Golovan)
* src/mod_muc/mod_muc_room.erl: Updated date parser (thanks to
Sergei Golovan)
* src/mod_muc/mod_muc.erl: Added error descriptions (thanks to
Sergei Golovan)
* src/mod_muc/mod_muc_room.erl: Likewise
* src/mod_vcard.erl: Fixed vCard tag (thanks to Sergei Golovan)
* src/mod_irc/mod_irc.erl: Likewise
* src/mod_pubsub/mod_pubsub.erl: Likewise
* src/jlib.hrl: Added macros for errors with <text/> (thanks to
Sergei Golovan)
SVN Revision: 206
Diffstat (limited to 'src/mod_muc')
-rw-r--r-- | src/mod_muc/mod_muc.erl | 26 | ||||
-rw-r--r-- | src/mod_muc/mod_muc_room.erl | 372 |
2 files changed, 232 insertions, 166 deletions
diff --git a/src/mod_muc/mod_muc.erl b/src/mod_muc/mod_muc.erl index 8fee7a29..551182b3 100644 --- a/src/mod_muc/mod_muc.erl +++ b/src/mod_muc/mod_muc.erl @@ -113,8 +113,9 @@ do_route(Host, From, To, Packet) -> jlib:iq_to_xml(Res)); #iq{type = set, xmlns = ?NS_REGISTER = XMLNS, + lang = Lang, sub_el = SubEl} = IQ -> - case process_iq_register_set(From, SubEl) of + case process_iq_register_set(From, SubEl, Lang) of {result, IQRes} -> Res = IQ#iq{type = result, sub_el = @@ -135,7 +136,7 @@ do_route(Host, From, To, Packet) -> sub_el = SubEl} = IQ -> Res = IQ#iq{type = result, sub_el = - [{xmlelement, "query", + [{xmlelement, "vCard", [{"xmlns", XMLNS}], iq_get_vcard(Lang)}]}, ejabberd_router:route(To, @@ -161,9 +162,12 @@ do_route(Host, From, To, Packet) -> [{elem, "body"}, cdata]), broadcast_service_message(Msg); _ -> + Lang = xml:get_attr_s("xml:lang", Attrs), + ErrText = "Only service administrators " + "are allowed to send service messages", Err = jlib:make_error_reply( Packet, - ?ERR_NOT_ALLOWED), + ?ERRT_FORBIDDEN(Lang, ErrText)), ejabberd_router:route( To, From, Err) end @@ -198,8 +202,10 @@ do_route(Host, From, To, Packet) -> mod_muc_room:route(Pid, From, Nick, Packet), ok; _ -> + Lang = xml:get_attr_s("xml:lang", Attrs), + ErrText = "Conference room does not exist", Err = jlib:make_error_reply( - Packet, ?ERR_SERVICE_UNAVAILABLE), + Packet, ?ERRT_ITEM_NOT_FOUND(Lang, ErrText)), ejabberd_router:route(To, From, Err) end; [R] -> @@ -332,12 +338,13 @@ iq_get_register_info(From, Host, Lang) -> Lang, "Enter nickname you want to register")}]}, ?XFIELD("text-single", "Nickname", "nick", Nick)]}]. -iq_set_register_info(From, XData) -> +iq_set_register_info(From, XData, Lang) -> {LUser, LServer, _} = jlib:jid_tolower(From), LUS = {LUser, LServer}, case lists:keysearch("nick", 1, XData) of false -> - {error, ?ERR_BAD_REQUEST}; + ErrText = "You must fill in field \"nick\" in the form", + {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)}; {value, {_, [Nick]}} -> F = fun() -> case Nick of @@ -369,13 +376,14 @@ iq_set_register_info(From, XData) -> {atomic, ok} -> {result, []}; {atomic, false} -> - {error, ?ERR_CONFLICT}; + ErrText = "Specified nickname is already registered", + {error, ?ERRT_CONFLICT(Lang, ErrText)}; _ -> {error, ?ERR_INTERNAL_SERVER_ERROR} end end. -process_iq_register_set(From, SubEl) -> +process_iq_register_set(From, SubEl, Lang) -> {xmlelement, Name, Attrs, Els} = SubEl, case xml:remove_cdata(Els) of [{xmlelement, "x", Attrs1, Els1} = XEl] -> @@ -389,7 +397,7 @@ process_iq_register_set(From, SubEl) -> invalid -> {error, ?ERR_BAD_REQUEST}; _ -> - iq_set_register_info(From, XData) + iq_set_register_info(From, XData, Lang) end; _ -> {error, ?ERR_BAD_REQUEST} diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl index 31293828..2aca20b1 100644 --- a/src/mod_muc/mod_muc_room.erl +++ b/src/mod_muc/mod_muc_room.erl @@ -119,6 +119,7 @@ init([Host, Room, Opts]) -> normal_state({route, From, "", {xmlelement, "message", Attrs, Els} = Packet}, StateData) -> + Lang = xml:get_attr_s("xml:lang", Attrs), case is_user_online(From, StateData) of true -> case xml:get_attr_s("type", Attrs) of @@ -172,16 +173,26 @@ normal_state({route, From, "", NewStateData1), {next_state, normal_state, NewStateData2}; _ -> + ErrText = + case (StateData#state.config)#config.allow_change_subj of + true -> + "Only moderators and participants " + "are allowed to change subject in this room"; + _ -> + "Only moderators " + "are allowed to change subject in this room" + end, Err = jlib:make_error_reply( - Packet, ?ERR_FORBIDDEN), + Packet, ?ERRT_FORBIDDEN(Lang, ErrText)), ejabberd_router:route( StateData#state.jid, From, Err), {next_state, normal_state, StateData} end; true -> + ErrText = "Visitors are not allowed to send messages to all occupants", Err = jlib:make_error_reply( - Packet, ?ERR_FORBIDDEN), + Packet, ?ERRT_FORBIDDEN(Lang, ErrText)), ejabberd_router:route( StateData#state.jid, From, Err), @@ -202,11 +213,20 @@ normal_state({route, From, "", _ -> {next_state, normal_state, StateData} end; + "chat" -> + ErrText = "It is not allowed to send private messages to the conference", + Err = jlib:make_error_reply( + Packet, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)), + ejabberd_router:route( + StateData#state.jid, + From, Err), + {next_state, normal_state, StateData}; Type when (Type == "") or (Type == "normal") -> case check_invitation(From, Els, StateData) of error -> + ErrText = "It is not allowed to send normal messages to the conference", Err = jlib:make_error_reply( - Packet, ?ERR_NOT_ALLOWED), + Packet, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)), ejabberd_router:route( StateData#state.jid, From, Err), @@ -231,8 +251,9 @@ normal_state({route, From, "", end end; _ -> + ErrText = "Improper message type", Err = jlib:make_error_reply( - Packet, ?ERR_NOT_ALLOWED), + Packet, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)), ejabberd_router:route( StateData#state.jid, From, Err), @@ -243,8 +264,9 @@ normal_state({route, From, "", "error" -> ok; _ -> + ErrText = "Only occupants are allowed to send messages to the conference", Err = jlib:make_error_reply( - Packet, ?ERR_NOT_ACCEPTABLE), + Packet, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)), ejabberd_router:route(StateData#state.jid, From, Err) end, {next_state, normal_state, StateData} @@ -305,6 +327,7 @@ normal_state({route, From, Nick, {xmlelement, "presence", Attrs, Els} = Packet}, StateData) -> Type = xml:get_attr_s("type", Attrs), + Lang = xml:get_attr_s("xml:lang", Attrs), StateData1 = case Type of "unavailable" -> @@ -336,17 +359,32 @@ normal_state({route, From, Nick, true -> case is_nick_change(From, Nick, StateData) of true -> - case is_nick_exists(Nick, StateData) of - true -> + case {is_nick_exists(Nick, StateData), + mod_muc:can_use_nick(From, Nick)} of + {true, _} -> + Lang = xml:get_attr_s("xml:lang", Attrs), + ErrText = "Nickname is already in use by another occupant", Err = jlib:make_error_reply( Packet, - ?ERR_CONFLICT), + ?ERRT_CONFLICT(Lang, ErrText)), ejabberd_router:route( jlib:jid_replace_resource( StateData#state.jid, Nick), % TODO: s/Nick/""/ From, Err), StateData; + {_, false} -> + ErrText = "Nickname is registered by another person", + Err = jlib:make_error_reply( + Packet, + ?ERRT_CONFLICT(Lang, ErrText)), + ejabberd_router:route( + % TODO: s/Nick/""/ + jlib:jid_replace_resource( + StateData#state.jid, + Nick), + From, Err), + StateData; _ -> change_nick(From, Nick, StateData) end; @@ -376,6 +414,7 @@ normal_state({route, From, ToNick, {xmlelement, "message", Attrs, Els} = Packet}, StateData) -> Type = xml:get_attr_s("type", Attrs), + Lang = xml:get_attr_s("xml:lang", Attrs), case Type of "error" -> case is_user_online(From, StateData) of @@ -398,8 +437,10 @@ normal_state({route, From, ToNick, true -> case Type of "groupchat" -> + ErrText = "It is not allowed to send private " + "messages of type \"groupchat\"", Err = jlib:make_error_reply( - Packet, ?ERR_BAD_REQUEST), + Packet, ?ERRT_BAD_REQUEST(Lang, ErrText)), ejabberd_router:route( jlib:jid_replace_resource( StateData#state.jid, @@ -408,8 +449,9 @@ normal_state({route, From, ToNick, _ -> case find_jid_by_nick(ToNick, StateData) of false -> + ErrText = "Recipient is not in the conference room", Err = jlib:make_error_reply( - Packet, ?ERR_ITEM_NOT_FOUND), + Packet, ?ERRT_ITEM_NOT_FOUND(Lang, ErrText)), ejabberd_router:route( jlib:jid_replace_resource( StateData#state.jid, @@ -427,8 +469,9 @@ normal_state({route, From, ToNick, end end; _ -> + ErrText = "Only occupants are allowed to send messages to the conference", Err = jlib:make_error_reply( - Packet, ?ERR_NOT_ALLOWED), + Packet, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)), ejabberd_router:route( jlib:jid_replace_resource( StateData#state.jid, @@ -441,17 +484,19 @@ normal_state({route, From, ToNick, normal_state({route, From, ToNick, {xmlelement, "iq", Attrs, Els} = Packet}, StateData) -> - case (StateData#state.config)#config.allow_query_users - andalso is_user_online(From, StateData) of - true -> + Lang = xml:get_attr_s("xml:lang", Attrs), + case {(StateData#state.config)#config.allow_query_users, + is_user_online(From, StateData)} of + {true, true} -> case find_jid_by_nick(ToNick, StateData) of false -> case jlib:iq_query_info(Packet) of reply -> ok; _ -> + ErrText = "Recipient is not in the conference room", Err = jlib:make_error_reply( - Packet, ?ERR_ITEM_NOT_FOUND), + Packet, ?ERRT_ITEM_NOT_FOUND(Lang, ErrText)), ejabberd_router:route( jlib:jid_replace_resource( StateData#state.jid, ToNick), @@ -465,13 +510,26 @@ normal_state({route, From, ToNick, jlib:jid_replace_resource(StateData#state.jid, FromNick), ToJID, Packet) end; + {_, false} -> + case jlib:iq_query_info(Packet) of + reply -> + ok; + _ -> + ErrText = "Only occupants are allowed to send queries to the conference", + Err = jlib:make_error_reply( + Packet, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)), + ejabberd_router:route( + jlib:jid_replace_resource(StateData#state.jid, ToNick), + From, Err) + end; _ -> case jlib:iq_query_info(Packet) of reply -> ok; _ -> + ErrText = "Queries to the conference members are not allowed in this room", Err = jlib:make_error_reply( - Packet, ?ERR_NOT_ALLOWED), + Packet, ?ERRT_NOT_ALLOWED(Lang, ErrText)), ejabberd_router:route( jlib:jid_replace_resource(StateData#state.jid, ToNick), From, Err) @@ -798,10 +856,20 @@ is_nick_change(JID, Nick, StateData) -> end. add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) -> - case is_nick_exists(Nick, StateData) or - not mod_muc:can_use_nick(From, Nick) of - true -> - Err = jlib:make_error_reply(Packet, ?ERR_CONFLICT), + Lang = xml:get_attr_s("xml:lang", Attrs), + case {is_nick_exists(Nick, StateData), + mod_muc:can_use_nick(From, Nick)} of + {true, _} -> + ErrText = "Nickname is already in use by another occupant", + Err = jlib:make_error_reply(Packet, ?ERRT_CONFLICT(Lang, ErrText)), + ejabberd_router:route( + % TODO: s/Nick/""/ + jlib:jid_replace_resource(StateData#state.jid, Nick), + From, Err), + StateData; + {_, false} -> + ErrText = "Nickname is registered by another person", + Err = jlib:make_error_reply(Packet, ?ERRT_CONFLICT(Lang, ErrText)), ejabberd_router:route( % TODO: s/Nick/""/ jlib:jid_replace_resource(StateData#state.jid, Nick), @@ -815,8 +883,12 @@ add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) -> Err = jlib:make_error_reply( Packet, case Affiliation of - outcast -> ?ERR_FORBIDDEN; - _ -> ?ERR_REGISTRATION_REQUIRED + outcast -> + ErrText = "You have been banned from this room", + ?ERRT_FORBIDDEN(Lang, ErrText); + _ -> + ErrText = "Membership required to enter this room", + ?ERRT_REGISTRATION_REQUIRED(Lang, ErrText) end), ejabberd_router:route( % TODO: s/Nick/""/ jlib:jid_replace_resource(StateData#state.jid, Nick), @@ -836,13 +908,22 @@ add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) -> true -> ok; _ -> - Lang = xml:get_attr_s("xml:lang", Attrs), send_subject(From, Lang, StateData) end, NewState; + nopass -> + ErrText = "Password required to enter this room", + Err = jlib:make_error_reply( + Packet, ?ERRT_NOT_AUTHORIZED(Lang, ErrText)), + ejabberd_router:route( % TODO: s/Nick/""/ + jlib:jid_replace_resource( + StateData#state.jid, Nick), + From, Err), + StateData; _ -> + ErrText = "Incorrect password", Err = jlib:make_error_reply( - Packet, ?ERR_NOT_AUTHORIZED), + Packet, ?ERRT_NOT_AUTHORIZED(Lang, ErrText)), ejabberd_router:route( % TODO: s/Nick/""/ jlib:jid_replace_resource( StateData#state.jid, Nick), @@ -860,20 +941,30 @@ check_password(_Affiliation, Els, StateData) -> true; true -> Pass = extract_password(Els), - case (StateData#state.config)#config.password of - Pass -> - true; + case Pass of + false -> + nopass; _ -> - false + case (StateData#state.config)#config.password of + Pass -> + true; + _ -> + false + end end end. extract_password([]) -> - ""; -extract_password([{xmlelement, Name, Attrs, SubEls} = El | Els]) -> + false; +extract_password([{xmlelement, _Name, Attrs, _SubEls} = El | Els]) -> case xml:get_attr_s("xmlns", Attrs) of ?NS_MUC -> - xml:get_path_s(El, [{elem, "password"}, cdata]); + case xml:get_subtag(El, "password") of + false -> + false; + SubEl -> + xml:get_tag_cdata(SubEl) + end; _ -> extract_password(Els) end; @@ -913,6 +1004,7 @@ count_stanza_shift(Nick, Els, StateData) -> _ -> count_maxchars_shift(Nick, MaxChars, HL) end, + lists:max([Shift0, Shift1, Shift2, Shift3]). count_seconds_shift(Seconds, HistoryList) -> @@ -968,7 +1060,12 @@ extract_history([{xmlelement, Name, Attrs, SubEls} = El | Els], Type) -> [{elem, "history"}, {attr, Type}]), case Type of "since" -> - parse_datetime(AttrVal); + case catch parse_datetime(AttrVal) of + {'EXIT', Err} -> + false; + Res -> + Res + end; _ -> case catch list_to_integer(AttrVal) of {'EXIT', _} -> @@ -991,50 +1088,20 @@ extract_history([_ | Els], Type) -> % JEP-0082 % yyyy-mm-ddThh:mm:ss[.sss]{Z|{+|-}hh:mm} -> {{yyyy, mm, dd}, {hh, mm, ss}} (UTC) parse_datetime(TimeStr) -> - DateTime = string:tokens(TimeStr, "T"), - case DateTime of - [Date, Time] -> - case parse_date(Date) of - false -> - false; - D -> - case parse_time(Time) of - false -> - false; - {T, TZH, TZM} -> - S = calendar:datetime_to_gregorian_seconds( - {D, T}), - calendar:gregorian_seconds_to_datetime( - S - TZH * 60 * 60 - TZM * 60 * 30) - end - end; - _ -> - false - end. + [Date, Time] = string:tokens(TimeStr, "T"), + D = parse_date(Date), + {T, TZH, TZM} = parse_time(Time), + S = calendar:datetime_to_gregorian_seconds({D, T}), + calendar:gregorian_seconds_to_datetime(S - TZH * 60 * 60 - TZM * 60). % yyyy-mm-dd parse_date(Date) -> YearMonthDay = string:tokens(Date, "-"), - case length(YearMonthDay) of - 3 -> - [Y, M, D] = lists:map( - fun(L)-> - case catch list_to_integer(L) of - {'EXIT', _} -> - false; - Int -> - Int - end - end, YearMonthDay), - case catch calendar:valid_date(Y, M, D) of - true -> - {Y, M, D}; - _ -> - false - end; - _ -> - false - end. + [Y, M, D] = lists:map( + fun(L)-> + list_to_integer(L) + end, YearMonthDay), + {Y, M, D}. % hh:mm:ss[.sss]TZD parse_time(Time) -> @@ -1043,12 +1110,7 @@ parse_time(Time) -> parse_time_with_timezone(Time); _ -> [T | _] = string:tokens(Time, "Z"), - case parse_time1(T) of - false -> - false; - TT -> - {TT, 0, 0} - end + {parse_time1(T), 0, 0} end. parse_time_with_timezone(Time) -> @@ -1065,71 +1127,35 @@ parse_time_with_timezone(Time) -> end. parse_time_with_timezone(Time, Delim) -> - TTZ = string:tokens(Time, Delim), - case TTZ of - [T, TZ] -> - case parse_timezone(TZ) of - false -> - false; - {TZH, TZM} -> - case parse_time1(T) of - false -> - false; - TT -> - case Delim of - "-" -> - {TT, -TZH, -TZM}; - "+" -> - {TT, TZH, TZM}; - _ -> - false - end - end - end; - _ -> - false + [T, TZ] = string:tokens(Time, Delim), + {TZH, TZM} = parse_timezone(TZ), + TT = parse_time1(T), + case Delim of + "-" -> + {TT, -TZH, -TZM}; + "+" -> + {TT, TZH, TZM} end. parse_timezone(TZ) -> - case string:tokens(TZ, ":") of - [H, M] -> - case check_list([{H, 12}, {M, 60}]) of - {[H, M], true} -> - {H, M}; - _ -> - false - end; - _ -> - false - end. + [H, M] = string:tokens(TZ, ":"), + {[H1, M1], true} = check_list([{H, 12}, {M, 60}]), + {H1, M1}. parse_time1(Time) -> - case string:tokens(Time, ".") of - [HMS | _] -> - case string:tokens(HMS, ":") of - [H, M, S] -> - case check_list([{H, 24}, {M, 60}, {S, 60}]) of - {[H1, M1, S1], true} -> - {H1, M1, S1}; - _ -> - false - end; - _ -> - false - end; - _ -> - false - end. + [HMS | _] = string:tokens(Time, "."), + [H, M, S] = string:tokens(HMS, ":"), + {[H1, M1, S1], true} = check_list([{H, 24}, {M, 60}, {S, 60}]), + {H1, M1, S1}. check_list(List) -> lists:mapfoldl( fun({L, N}, B)-> - case catch list_to_integer(L) of - {'EXIT', _} -> - {false, false}; - Int when (Int >= 0) and (Int =< N) -> - {Int, B}; - _ -> + V = list_to_integer(L), + if + (V >= 0) and (V =< N) -> + {V, B}; + true -> {false, false} end end, true, List). @@ -1405,7 +1431,7 @@ can_change_subject(Role, StateData) -> process_iq_admin(From, set, Lang, SubEl, StateData) -> {xmlelement, _, _, Items} = SubEl, - process_admin_items_set(From, Items, StateData); + process_admin_items_set(From, Items, Lang, StateData); process_iq_admin(From, get, Lang, SubEl, StateData) -> case xml:get_subtag(SubEl, "item") of @@ -1431,7 +1457,8 @@ process_iq_admin(From, get, Lang, SubEl, StateData) -> SAffiliation, StateData), {result, Items, StateData}; true -> - {error, ?ERR_NOT_ALLOWED} + ErrText = "Administrator privileges required", + {error, ?ERRT_FORBIDDEN(Lang, ErrText)} end end end; @@ -1445,7 +1472,8 @@ process_iq_admin(From, get, Lang, SubEl, StateData) -> Items = items_with_role(SRole, StateData), {result, Items, StateData}; true -> - {error, ?ERR_NOT_ALLOWED} + ErrText = "Moderator privileges required", + {error, ?ERRT_FORBIDDEN(Lang, ErrText)} end end end @@ -1492,10 +1520,10 @@ search_affiliation(Affiliation, StateData) -> end, ?DICT:to_list(StateData#state.affiliations)). -process_admin_items_set(UJID, Items, StateData) -> +process_admin_items_set(UJID, Items, Lang, StateData) -> UAffiliation = get_affiliation(UJID, StateData), URole = get_role(UJID, StateData), - case find_changed_items(UJID, UAffiliation, URole, Items, StateData, []) of + case find_changed_items(UJID, UAffiliation, URole, Items, Lang, StateData, []) of {result, Res} -> NSD = lists:foldl( @@ -1555,19 +1583,23 @@ process_admin_items_set(UJID, Items, StateData) -> end. -find_changed_items(UJID, UAffiliation, URole, [], StateData, Res) -> +find_changed_items(UJID, UAffiliation, URole, [], Lang, StateData, Res) -> {result, Res}; find_changed_items(UJID, UAffiliation, URole, [{xmlcdata, _} | Items], - StateData, Res) -> - find_changed_items(UJID, UAffiliation, URole, Items, StateData, Res); + Lang, StateData, Res) -> + find_changed_items(UJID, UAffiliation, URole, Items, Lang, StateData, Res); find_changed_items(UJID, UAffiliation, URole, [{xmlelement, "item", Attrs, Els} = Item | Items], - StateData, Res) -> + Lang, StateData, Res) -> TJID = case xml:get_attr("jid", Attrs) of {value, S} -> case jlib:string_to_jid(S) of error -> - {error, ?ERR_BAD_REQUEST}; + ErrText = io_lib:format( + translate:translate( + Lang, + "JID ~s is invalid"), [S]), + {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)}; J -> {value, J} end; @@ -1576,7 +1608,13 @@ find_changed_items(UJID, UAffiliation, URole, {value, N} -> case find_jid_by_nick(N, StateData) of false -> - {error, ?ERR_NOT_ALLOWED}; + ErrText = + io_lib:format( + translate:translate( + Lang, + "Nickname ~s does not exist in the room"), + [N]), + {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)}; J -> {value, J} end; @@ -1596,7 +1634,13 @@ find_changed_items(UJID, UAffiliation, URole, {value, StrAffiliation} -> case catch list_to_affiliation(StrAffiliation) of {'EXIT', _} -> - {error, ?ERR_BAD_REQUEST}; + ErrText1 = + io_lib:format( + translate:translate( + Lang, + "Invalid affiliation: ~s"), + [StrAffiliation]), + {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText1)}; SAffiliation -> case can_change_ra( UAffiliation, URole, @@ -1606,13 +1650,13 @@ find_changed_items(UJID, UAffiliation, URole, find_changed_items( UJID, UAffiliation, URole, - Items, StateData, + Items, Lang, StateData, Res); true -> find_changed_items( UJID, UAffiliation, URole, - Items, StateData, + Items, Lang, StateData, [{jlib:jid_remove_resource(JID), affiliation, SAffiliation, @@ -1627,7 +1671,13 @@ find_changed_items(UJID, UAffiliation, URole, {value, StrRole} -> case catch list_to_role(StrRole) of {'EXIT', _} -> - {error, ?ERR_BAD_REQUEST}; + ErrText1 = + io_lib:format( + translate:translate( + Lang, + "Invalid role: ~s"), + [StrRole]), + {error, ?ERRT_BAD_REQUEST(Lang, ErrText1)}; SRole -> case can_change_ra( UAffiliation, URole, @@ -1637,13 +1687,13 @@ find_changed_items(UJID, UAffiliation, URole, find_changed_items( UJID, UAffiliation, URole, - Items, StateData, + Items, Lang, StateData, Res); true -> find_changed_items( UJID, UAffiliation, URole, - Items, StateData, + Items, Lang, StateData, [{JID, role, SRole, xml:get_path_s( Item, [{elem, "reason"}, @@ -1656,7 +1706,7 @@ find_changed_items(UJID, UAffiliation, URole, Err -> Err end; -find_changed_items(UJID, UAffiliation, URole, Items, StateData, Res) -> +find_changed_items(UJID, UAffiliation, URole, Items, Lang, StateData, Res) -> {error, ?ERR_BAD_REQUEST}. @@ -1851,10 +1901,11 @@ process_iq_owner(From, set, Lang, SubEl, StateData) -> [{xmlelement, "destroy", Attrs1, Els1}] -> destroy_room(Els1, StateData); Items -> - process_admin_items_set(From, Items, StateData) + process_admin_items_set(From, Items, Lang, StateData) end; _ -> - {error, ?ERR_FORBIDDEN} + ErrText = "Owner privileges required", + {error, ?ERRT_FORBIDDEN(Lang, ErrText)} end; process_iq_owner(From, get, Lang, SubEl, StateData) -> @@ -1872,7 +1923,13 @@ process_iq_owner(From, get, Lang, SubEl, StateData) -> {value, StrAffiliation} -> case catch list_to_affiliation(StrAffiliation) of {'EXIT', _} -> - {error, ?ERR_BAD_REQUEST}; + ErrText = + io_lib:format( + translate:translate( + Lang, + "Invalid affiliation: ~s"), + [StrAffiliation]), + {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)}; SAffiliation -> Items = items_with_affiliation( SAffiliation, StateData), @@ -1883,7 +1940,8 @@ process_iq_owner(From, get, Lang, SubEl, StateData) -> {error, ?ERR_FEATURE_NOT_IMPLEMENTED} end; _ -> - {error, ?ERR_NOT_ALLOWED} + ErrText = "Owner privileges required", + {error, ?ERRT_FORBIDDEN(Lang, ErrText)} end. @@ -2191,7 +2249,7 @@ process_iq_disco_items(From, get, Lang, StateData) -> ?DICT:to_list(StateData#state.users)), {result, UList, StateData}; _ -> - {error, ?ERR_NOT_ALLOWED} + {error, ?ERR_FORBIDDEN} end. get_title(StateData) -> |