diff options
author | Alexey Shchepin <alexey@process-one.net> | 2007-05-16 10:13:04 +0000 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2007-05-16 10:13:04 +0000 |
commit | 8c326ea928382861905984f1b35c5560ab8e0609 (patch) | |
tree | c3304977385de3861d4b1a30260d4a8146176c61 /src | |
parent | * src/ejd2odbc.erl: Bugfix (thanks to Badlop) (diff) |
* src/mod_muc/mod_muc_room.erl: Corrected error messages when
trying to join members-only room (thanks to Badlop)
* src/ejabberd_c2s.erl: Added c2s_update_presence hook
SVN Revision: 770
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_c2s.erl | 13 | ||||
-rw-r--r-- | src/mod_muc/mod_muc_room.erl | 143 |
2 files changed, 80 insertions, 76 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 98232cf09..af658faf1 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -804,15 +804,22 @@ session_established({xmlstreamelement, El}, StateData) -> _ -> case Name of "presence" -> + PresenceEl = ejabberd_hooks:run_fold( + c2s_update_presence, + Server, + NewEl, + [User, Server]), case ToJID of #jid{user = User, server = Server, resource = ""} -> ?DEBUG("presence_update(~p,~n\t~p,~n\t~p)", - [FromJID, NewEl, StateData]), - presence_update(FromJID, NewEl, StateData); + [FromJID, PresenceEl, StateData]), + presence_update(FromJID, PresenceEl, + StateData); _ -> - presence_track(FromJID, ToJID, NewEl, StateData) + presence_track(FromJID, ToJID, PresenceEl, + StateData) end; "iq" -> case StateData#state.privacy_list of diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl index 2c8c81e08..b7ceb8939 100644 --- a/src/mod_muc/mod_muc_room.erl +++ b/src/mod_muc/mod_muc_room.erl @@ -970,9 +970,26 @@ is_nick_change(JID, Nick, StateData) -> add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) -> Lang = xml:get_attr_s("xml:lang", Attrs), + Affiliation = get_affiliation(From, StateData), case {is_nick_exists(Nick, StateData), - mod_muc:can_use_nick(StateData#state.host, From, Nick)} of - {true, _} -> + mod_muc:can_use_nick(StateData#state.host, From, Nick), + get_default_role(Affiliation, StateData)} of + {_, _, none} -> + Err = jlib:make_error_reply( + Packet, + case Affiliation of + 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), + From, Err), + StateData; + {true, _, _} -> ErrText = "Nickname is already in use by another occupant", Err = jlib:make_error_reply(Packet, ?ERRT_CONFLICT(Lang, ErrText)), ejabberd_router:route( @@ -980,7 +997,7 @@ add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) -> jlib:jid_replace_resource(StateData#state.jid, Nick), From, Err), StateData; - {_, false} -> + {_, false, _} -> ErrText = "Nickname is registered by another person", Err = jlib:make_error_reply(Packet, ?ERRT_CONFLICT(Lang, ErrText)), ejabberd_router:route( @@ -988,81 +1005,61 @@ add_new_user(From, Nick, {xmlelement, _, Attrs, Els} = Packet, StateData) -> jlib:jid_replace_resource(StateData#state.jid, Nick), From, Err), StateData; - _ -> - Affiliation = get_affiliation(From, StateData), - Role = get_default_role(Affiliation, StateData), - case Role of - none -> + {_, _, Role} -> + case check_password(Affiliation, Els, StateData) of + true -> + NewState = + add_user_presence( + From, Packet, + add_online_user(From, Nick, Role, StateData)), + if not (NewState#state.config)#config.anonymous -> + WPacket = {xmlelement, "message", [{"type", "groupchat"}], + [{xmlelement, "body", [], + [{xmlcdata, translate:translate( + Lang, + "This room is not anonymous")}]}, + {xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], + [{xmlelement, "status", [{"code", "100"}], []}]}]}, + ejabberd_router:route( + StateData#state.jid, + From, WPacket); + true -> + ok + end, + send_existing_presences(From, NewState), + send_new_presence(From, NewState), + Shift = count_stanza_shift(Nick, Els, NewState), + case send_history(From, Shift, NewState) of + true -> + ok; + _ -> + send_subject(From, Lang, StateData) + end, + case NewState#state.just_created of + true -> + NewState#state{just_created = false}; + false -> + NewState + end; + nopass -> + ErrText = "Password required to enter this room", Err = jlib:make_error_reply( - Packet, - case Affiliation of - 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), + Packet, ?ERRT_NOT_AUTHORIZED(Lang, ErrText)), ejabberd_router:route( % TODO: s/Nick/""/ - jlib:jid_replace_resource(StateData#state.jid, Nick), + jlib:jid_replace_resource( + StateData#state.jid, Nick), From, Err), StateData; _ -> - case check_password(Affiliation, Els, StateData) of - true -> - NewState = - add_user_presence( - From, Packet, - add_online_user(From, Nick, Role, StateData)), - if not (NewState#state.config)#config.anonymous -> - WPacket = {xmlelement, "message", [{"type", "groupchat"}], - [{xmlelement, "body", [], - [{xmlcdata, translate:translate( - Lang, - "This room is not anonymous")}]}, - {xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], - [{xmlelement, "status", [{"code", "100"}], []}]}]}, - ejabberd_router:route( - StateData#state.jid, - From, WPacket); - true -> - ok - end, - send_existing_presences(From, NewState), - send_new_presence(From, NewState), - Shift = count_stanza_shift(Nick, Els, NewState), - case send_history(From, Shift, NewState) of - true -> - ok; - _ -> - send_subject(From, Lang, StateData) - end, - case NewState#state.just_created of - true -> - NewState#state{just_created = false}; - false -> - NewState - end; - 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, ?ERRT_NOT_AUTHORIZED(Lang, ErrText)), - ejabberd_router:route( % TODO: s/Nick/""/ - jlib:jid_replace_resource( - StateData#state.jid, Nick), - From, Err), - StateData - end - end + ErrText = "Incorrect password", + 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 + end end. check_password(owner, _Els, _StateData) -> |