From 7a002470e6b6c858fa5fea99245006b5d52c6eff Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Sat, 17 Jan 2004 20:26:57 +0000 Subject: [PATCH] * src/mod_muc/mod_muc_room.erl: Bugfix, updated error codes (thanks to Sergei Golovan) * src/jlib.hrl: Updated error codes (thanks to Sergei Golovan) SVN Revision: 199 --- ChangeLog | 7 ++ src/jlib.hrl | 64 ++++++++++++----- src/mod_muc/mod_muc_room.erl | 136 ++++++++++++++++++++--------------- 3 files changed, 131 insertions(+), 76 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8fdf4427c..be9539f4d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2004-01-17 Alexey Shchepin + + * src/mod_muc/mod_muc_room.erl: Bugfix, updated error codes + (thanks to Sergei Golovan) + + * src/jlib.hrl: Updated error codes (thanks to Sergei Golovan) + 2004-01-11 Alexey Shchepin * src/ejabberd_c2s.erl: Fixed bind namespace diff --git a/src/jlib.hrl b/src/jlib.hrl index e930a7e52..9a0be9ace 100644 --- a/src/jlib.hrl +++ b/src/jlib.hrl @@ -49,37 +49,47 @@ [{xmlelement, Condition, [{"xmlns", ?NS_STANZAS}], []}]}). -define(ERR_BAD_REQUEST, - ?STANZA_ERROR("400", "modify", "bad-request")). + ?STANZA_ERROR("400", "modify", "bad-request")). -define(ERR_CONFLICT, - ?STANZA_ERROR("409", "cancel", "conflict")). + ?STANZA_ERROR("409", "cancel", "conflict")). -define(ERR_FEATURE_NOT_IMPLEMENTED, - ?STANZA_ERROR("501", "cancel", "feature-not-implemented")). + ?STANZA_ERROR("501", "cancel", "feature-not-implemented")). -define(ERR_FORBIDDEN, - ?STANZA_ERROR("403", "auth", "forbidden")). + ?STANZA_ERROR("403", "auth", "forbidden")). +-define(ERR_GONE, + ?STANZA_ERROR("302", "modify", "gone")). -define(ERR_INTERNAL_SERVER_ERROR, - ?STANZA_ERROR("500", "wait", "internal-server-error")). + ?STANZA_ERROR("500", "wait", "internal-server-error")). -define(ERR_ITEM_NOT_FOUND, - ?STANZA_ERROR("404", "cancel", "item-not-found")). + ?STANZA_ERROR("404", "cancel", "item-not-found")). -define(ERR_JID_MALFORMED, - ?STANZA_ERROR("400", "modify", "jid-malformed")). + ?STANZA_ERROR("400", "modify", "jid-malformed")). +-define(ERR_NOT_ACCEPTABLE, + ?STANZA_ERROR("406", "modify", "not-acceptable")). -define(ERR_NOT_ALLOWED, - ?STANZA_ERROR("405", "cancel", "not-allowed")). + ?STANZA_ERROR("405", "cancel", "not-allowed")). +-define(ERR_NOT_AUTHORIZED, + ?STANZA_ERROR("401", "auth", "not-authorized")). +-define(ERR_PAYMENT_REQUIRED, + ?STANZA_ERROR("402", "auth", "payment-required")). -define(ERR_RECIPIENT_UNAVAILABLE, - ?STANZA_ERROR("404", "wait", "recipient-unavailable")). + ?STANZA_ERROR("404", "wait", "recipient-unavailable")). +-define(ERR_REDIRECT, + ?STANZA_ERROR("302", "modify", "redirect")). -define(ERR_REGISTRATION_REQUIRED, - ?STANZA_ERROR("407", "auth", "registration-required")). + ?STANZA_ERROR("407", "auth", "registration-required")). -define(ERR_REMOTE_SERVER_NOT_FOUND, - ?STANZA_ERROR("404", "cancel", "remote-server-not-found")). + ?STANZA_ERROR("404", "cancel", "remote-server-not-found")). -define(ERR_REMOTE_SERVER_TIMEOUT, - ?STANZA_ERROR("504", "wait", "remote-server-timeout")). + ?STANZA_ERROR("504", "wait", "remote-server-timeout")). -define(ERR_RESOURCE_CONSTRAINT, - ?STANZA_ERROR("0", "wait", "resource-constraint")). + ?STANZA_ERROR("500", "wait", "resource-constraint")). -define(ERR_SERVICE_UNAVAILABLE, - ?STANZA_ERROR("503", "cancel", "service-unavailable")). + ?STANZA_ERROR("503", "cancel", "service-unavailable")). -define(ERR_SUBSCRIPTION_REQUIRED, - ?STANZA_ERROR("0", "auth", "subscription-required")). + ?STANZA_ERROR("407", "auth", "subscription-required")). -define(ERR_UNEXPECTED_REQUEST, - ?STANZA_ERROR("0", "wait", "unexpected-request")). + ?STANZA_ERROR("400", "wait", "unexpected-request")). %-define(ERR_, % ?STANZA_ERROR("", "", "")). @@ -103,8 +113,16 @@ -define(STREAM_ERROR(Condition), {xmlelement, "stream:error", [], - [{xmlelement, Condition, [{"xmlns", ?NS_STANZAS}], []}]}). + [{xmlelement, Condition, [{"xmlns", ?NS_STREAMS}], []}]}). +-define(SERR_BAD_FORMAT, + ?STREAM_ERROR("bad-format")). +-define(SERR_BAD_NAMESPACE_PREFIX, + ?STREAM_ERROR("bad-namespace-prefix")). +-define(SERR_CONFLICT, + ?STREAM_ERROR("conflict")). +-define(SERR_CONNECTION_TIMEOUT, + ?STREAM_ERROR("connection-timeout")). -define(SERR_HOST_GONE, ?STREAM_ERROR("host-gone")). -define(SERR_HOST_UNKNOWN, @@ -113,23 +131,31 @@ ?STREAM_ERROR("improper-addressing")). -define(SERR_INTERNAL_SERVER_ERROR, ?STREAM_ERROR("internal-server-error")). +-define(SERR_INVALID_FROM, + ?STREAM_ERROR("invalid-from")). -define(SERR_INVALID_ID, ?STREAM_ERROR("invalid-id")). -define(SERR_INVALID_NAMESPACE, ?STREAM_ERROR("invalid-namespace")). --define(SERR_NONMATCHING_HOSTS, - ?STREAM_ERROR("nonmatching-hosts")). +-define(SERR_INVALID_XML, + ?STREAM_ERROR("invalid-xml")). -define(SERR_NOT_AUTHORIZED, ?STREAM_ERROR("not-authorized")). +-define(SERR_POLICY_VIOLATION, + ?STREAM_ERROR("policy-violation")). -define(SERR_REMOTE_CONNECTION_FAILED, ?STREAM_ERROR("remote-connection-failed")). -define(SERR_RESOURSE_CONSTRAINT, ?STREAM_ERROR("resource-constraint")). +-define(SERR_RESTRICTED_XML, + ?STREAM_ERROR("restricted-xml")). % TODO: include hostname or IP -define(SERR_SEE_OTHER_HOST, ?STREAM_ERROR("see-other-host")). -define(SERR_SYSTEM_SHUTDOWN, ?STREAM_ERROR("system-shutdown")). +-define(SERR_UNSUPPORTED_ENCODING, + ?STREAM_ERROR("unsupported-encoding")). -define(SERR_UNSUPPORTED_STANZA_TYPE, ?STREAM_ERROR("unsupported-stanza-type")). -define(SERR_UNSUPPORTED_VERSION, diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl index d8af30c30..f62880c4b 100644 --- a/src/mod_muc/mod_muc_room.erl +++ b/src/mod_muc/mod_muc_room.erl @@ -68,23 +68,6 @@ subject_author = ""}). --define(OLD_ERROR(Code, Desc), - {xmlelement, "error", - [{"code", Code}], - [{xmlcdata, Desc}]}). - --define(ERR_MUC_NICK_CONFLICT, - ?OLD_ERROR("409", "Please choose a different nickname.")). --define(ERR_MUC_NICK_CHANGE_CONFLICT, - ?OLD_ERROR("409", "Nickname already in use.")). --define(ERR_MUC_BANNED, - ?OLD_ERROR("403", "You have been banned from this room.")). --define(ERR_MUC_NOT_MEMBER, - ?OLD_ERROR("407", "Membership required to enter this room.")). --define(ERR_MUC_BAD_PASSWORD, - ?OLD_ERROR("401", "Bad password.")). - - %-define(DBGFSM, true). -ifdef(DBGFSM). @@ -357,7 +340,7 @@ normal_state({route, From, Nick, true -> Err = jlib:make_error_reply( Packet, - ?ERR_MUC_NICK_CHANGE_CONFLICT), + ?ERR_CONFLICT), ejabberd_router:route( jlib:jid_replace_resource( StateData#state.jid, @@ -392,7 +375,8 @@ normal_state({route, From, Nick, normal_state({route, From, ToNick, {xmlelement, "message", Attrs, Els} = Packet}, StateData) -> - case xml:get_attr_s("type", Attrs) of + Type = xml:get_attr_s("type", Attrs), + case Type of "error" -> case is_user_online(From, StateData) of true -> @@ -412,35 +396,46 @@ normal_state({route, From, ToNick, case (StateData#state.config)#config.allow_private_messages andalso is_user_online(From, StateData) of true -> - case find_jid_by_nick(ToNick, StateData) of - false -> + case Type of + "groupchat" -> Err = jlib:make_error_reply( - Packet, ?ERR_ITEM_NOT_FOUND), - ejabberd_router:route( - jlib:jid_replace_resource( - StateData#state.jid, - ToNick), - From, Err); - ToJID -> - {ok, #user{nick = FromNick}} = - ?DICT:find(jlib:jid_tolower(From), - StateData#state.users), + Packet, ?ERR_BAD_REQUEST), ejabberd_router:route( - jlib:jid_replace_resource( - StateData#state.jid, - FromNick), - ToJID, Packet) - end, - {next_state, normal_state, StateData}; + jlib:jid_replace_resource( + StateData#state.jid, + ToNick), + From, Err); + _ -> + case find_jid_by_nick(ToNick, StateData) of + false -> + Err = jlib:make_error_reply( + Packet, ?ERR_ITEM_NOT_FOUND), + ejabberd_router:route( + jlib:jid_replace_resource( + StateData#state.jid, + ToNick), + From, Err); + ToJID -> + {ok, #user{nick = FromNick}} = + ?DICT:find(jlib:jid_tolower(From), + StateData#state.users), + ejabberd_router:route( + jlib:jid_replace_resource( + StateData#state.jid, + FromNick), + ToJID, Packet) + end + end; _ -> Err = jlib:make_error_reply( Packet, ?ERR_NOT_ALLOWED), ejabberd_router:route( - jlib:jid_replace_resource( - StateData#state.jid, - ToNick), From, Err), - {next_state, normal_state, StateData} - end + jlib:jid_replace_resource( + StateData#state.jid, + ToNick), + From, Err) + end, + {next_state, normal_state, StateData} end; normal_state({route, From, ToNick, @@ -806,7 +801,7 @@ 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_MUC_NICK_CONFLICT), + Err = jlib:make_error_reply(Packet, ?ERR_CONFLICT), ejabberd_router:route( % TODO: s/Nick/""/ jlib:jid_replace_resource(StateData#state.jid, Nick), @@ -820,8 +815,8 @@ add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) -> Err = jlib:make_error_reply( Packet, case Affiliation of - outcast -> ?ERR_MUC_BANNED; - _ -> ?ERR_MUC_NOT_MEMBER + outcast -> ?ERR_FORBIDDEN; + _ -> ?ERR_REGISTRATION_REQUIRED end), ejabberd_router:route( % TODO: s/Nick/""/ jlib:jid_replace_resource(StateData#state.jid, Nick), @@ -846,7 +841,7 @@ add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) -> NewState; _ -> Err = jlib:make_error_reply( - Packet, ?ERR_MUC_BAD_PASSWORD), + Packet, ?ERR_NOT_AUTHORIZED), ejabberd_router:route( % TODO: s/Nick/""/ jlib:jid_replace_resource( StateData#state.jid, Nick), @@ -1412,10 +1407,6 @@ find_changed_items(UJID, UAffiliation, URole, Items, StateData, Res) -> {error, ?ERR_BAD_REQUEST}. - - - - can_change_ra(FAffiliation, FRole, TAffiliation, TRole, affiliation, Value) @@ -1510,9 +1501,20 @@ can_change_ra(FAffiliation, FRole, when (FAffiliation == owner) or (FAffiliation == admin) -> true; can_change_ra(FAffiliation, FRole, + owner, moderator, + role, participant) -> + false; +can_change_ra(owner, FRole, TAffiliation, moderator, - role, participant) - when (FAffiliation == owner) or (FAffiliation == admin) -> + role, participant) -> + true; +can_change_ra(FAffiliation, FRole, + admin, moderator, + role, participant) -> + false; +can_change_ra(admin, FRole, + TAffiliation, moderator, + role, participant) -> true; can_change_ra(FAffiliation, FRole, TAffiliation, TRole, @@ -1736,7 +1738,6 @@ set_config(XEl, StateData) -> set_xoption(Opts, Config#config{Opt = Val})). - set_xoption([], Config) -> Config; set_xoption([{"title", [Val]} | Opts], Config) -> @@ -1871,16 +1872,40 @@ destroy_room(DEls, StateData) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Disco +-define(FEATURE(Var), {xmlelement, "feature", [{"var", Var}], []}). + +-define(CONFIG_OPT_TO_FEATURE(Opt, Fiftrue, Fiffalse), + case Opt of + true -> + ?FEATURE(Fiftrue); + false -> + ?FEATURE(Fiffalse) + end). + process_iq_disco_info(From, set, StateData) -> {error, ?ERR_NOT_ALLOWED}; process_iq_disco_info(From, get, StateData) -> + Config = StateData#state.config, {result, [{xmlelement, "identity", [{"category", "conference"}, {"type", "text"}, {"name", get_title(StateData)}], []}, {xmlelement, "feature", - [{"var", ?NS_MUC}], []}], StateData}. + [{"var", ?NS_MUC}], []}, + ?CONFIG_OPT_TO_FEATURE(Config#config.public, + "muc_public", "muc_hidden"), + ?CONFIG_OPT_TO_FEATURE(Config#config.persistent, + "muc_persistent", "muc_temporary"), + ?CONFIG_OPT_TO_FEATURE(Config#config.members_only, + "muc_membersonly", "muc_open"), + ?CONFIG_OPT_TO_FEATURE(Config#config.anonymous, + "muc_semianonymous", "muc_nonanonymous"), + ?CONFIG_OPT_TO_FEATURE(Config#config.moderated, + "muc_moderated", "muc_unmoderated"), + ?CONFIG_OPT_TO_FEATURE(Config#config.password_protected, + "muc_passwordprotected", "muc_unsecured") + ], StateData}. process_iq_disco_items(From, set, StateData) -> @@ -1985,6 +2010,3 @@ check_invitation(From, Els, StateData) -> error end. - - - -- 2.40.0