diff options
Diffstat (limited to 'src/ejabberd_c2s.erl')
-rw-r--r-- | src/ejabberd_c2s.erl | 77 |
1 files changed, 43 insertions, 34 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index f4b6a3513..d20be5a27 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -45,6 +45,7 @@ access, shaper, authentificated = false, + jid, user = "", server = ?MYNAME, resource = "", pres_t = ?SETS:new(), pres_f = ?SETS:new(), @@ -205,7 +206,7 @@ wait_for_auth({xmlstreamelement, El}, StateData) -> {next_state, wait_for_auth, StateData}; {auth, ID, set, {U, P, D, R}} -> io:format("AUTH: ~p~n", [{U, P, D, R}]), - JID = {U, ?MYNAME, R}, + JID = jlib:make_jid(U, StateData#state.server, R), case acl:match_rule(StateData#state.access, JID) of allow -> case ejabberd_auth:check_password( @@ -224,6 +225,7 @@ wait_for_auth({xmlstreamelement, El}, StateData) -> {next_state, session_established, StateData#state{user = U, resource = R, + jid = JID, pres_f = ?SETS:from_list(Fs), pres_t = ?SETS:from_list(Ts), privacy_list = PrivList}}; @@ -281,12 +283,14 @@ wait_for_sasl_auth({xmlstreamelement, El}, StateData) -> send_element(StateData, {xmlelement, "success", [{"xmlns", ?NS_SASL}], []}), - {U, _, R} = jlib:string_to_jid( - xml:get_attr_s(authzid, Props)), + JID = #jid{user = U, resource = R} = + jlib:string_to_jid( + xml:get_attr_s(authzid, Props)), {next_state, wait_for_stream, StateData#state{authentificated = true, user = U, - resource = R + resource = R, + jid = JID }}; {continue, ServerOut, NewSASLState} -> send_element(StateData, @@ -344,12 +348,13 @@ wait_for_sasl_response({xmlstreamelement, El}, StateData) -> send_element(StateData, {xmlelement, "success", [{"xmlns", ?NS_SASL}], []}), - {U, _, R} = jlib:string_to_jid( - xml:get_attr_s(authzid, Props)), + JID = #jid{user = U, resource = R} = + jlib:string_to_jid(xml:get_attr_s(authzid, Props)), {next_state, wait_for_stream, StateData#state{authentificated = true, user = U, - resource = R + resource = R, + jid = JID }}; {continue, ServerOut, NewSASLState} -> send_element(StateData, @@ -402,7 +407,7 @@ wait_for_session({xmlstreamelement, El}, StateData) -> U = StateData#state.user, R = StateData#state.resource, io:format("SASLAUTH: ~p~n", [{U, R}]), - JID = {U, ?MYNAME, R}, + JID = jlib:make_jid(U, StateData#state.server, R), case acl:match_rule(StateData#state.access, JID) of allow -> ejabberd_sm:open_session(U, R), @@ -457,13 +462,14 @@ session_established({xmlstreamelement, El}, StateData) -> {xmlelement, Name, Attrs, Els} = El, User = StateData#state.user, Server = StateData#state.server, - FromJID = {User, - Server, - StateData#state.resource}, + %FromJID = {User, + % Server, + % StateData#state.resource}, + FromJID = StateData#state.jid, To = xml:get_attr_s("to", Attrs), ToJID = case To of "" -> - {User, Server, ""}; + jlib:make_jid(User, Server, ""); _ -> jlib:string_to_jid(To) end, @@ -476,7 +482,9 @@ session_established({xmlstreamelement, El}, StateData) -> case Name of "presence" -> case ToJID of - {User, Server, ""} -> + #jid{user = User, + server = Server, + resource = ""} -> ?DEBUG("presence_update(~p,~n\t~p,~n\t~p)", [FromJID, El, StateData]), presence_update(FromJID, El, StateData); @@ -573,7 +581,6 @@ handle_info(replaced, StateName, StateData) -> {stop, normal, StateData#state{user = ""}}; handle_info({route, From, To, Packet}, StateName, StateData) -> {xmlelement, Name, Attrs, Els} = Packet, - {FU, FS, FR} = From, {Pass, NewAttrs, NewState} = case Name of "presence" -> @@ -694,9 +701,7 @@ terminate(Reason, StateName, StateData) -> _ -> ejabberd_sm:close_session(StateData#state.user, StateData#state.resource), - From = {StateData#state.user, - StateData#state.server, - StateData#state.resource}, + From = StateData#state.jid, Packet = {xmlelement, "presence", [{"type", "unavailable"}], []}, ejabberd_sm:unset_presence(StateData#state.user, StateData#state.resource), @@ -797,16 +802,17 @@ get_auth_tags([], U, P, D, R) -> process_presence_probe(From, To, StateData) -> + LFrom = jlib:jid_tolower(From), case StateData#state.pres_last of undefined -> ok; _ -> Cond1 = (not StateData#state.pres_invis) - and ?SETS:is_element(From, StateData#state.pres_f) - and (not ?SETS:is_element(From, StateData#state.pres_i)), + and ?SETS:is_element(LFrom, StateData#state.pres_f) + and (not ?SETS:is_element(LFrom, StateData#state.pres_i)), Cond2 = StateData#state.pres_invis - and ?SETS:is_element(From, StateData#state.pres_f) - and ?SETS:is_element(From, StateData#state.pres_a), + and ?SETS:is_element(LFrom, StateData#state.pres_f) + and ?SETS:is_element(LFrom, StateData#state.pres_a), if Cond1 -> ejabberd_router:route(To, From, @@ -934,14 +940,16 @@ presence_track(From, To, Packet, StateData) -> presence_broadcast(From, JIDSet, Packet) -> lists:foreach(fun(JID) -> - ejabberd_router:route(From, JID, Packet) + ejabberd_router:route( + From, jlib:make_jid(JID), Packet) end, ?SETS:to_list(JIDSet)). presence_broadcast_to_trusted(From, T, A, Packet) -> lists:foreach(fun(JID) -> case ?SETS:is_element(JID, T) of true -> - ejabberd_router:route(From, JID, Packet); + ejabberd_router:route( + From, jlib:make_jid(JID), Packet); _ -> ok end @@ -949,12 +957,13 @@ presence_broadcast_to_trusted(From, T, A, Packet) -> presence_broadcast_first(From, StateData, Packet) -> - {U, S, _} = From, ?SETS:fold(fun(JID, X) -> - ejabberd_router:route({U, S, ""}, JID, - {xmlelement, "presence", - [{"type", "probe"}], - []}), + ejabberd_router:route( + jlib:jid_replace_resource(From, ""), + jlib:make_jid(JID), + {xmlelement, "presence", + [{"type", "probe"}], + []}), X end, [], @@ -964,7 +973,9 @@ presence_broadcast_first(From, StateData, Packet) -> StateData; true -> As = ?SETS:fold(fun(JID, A) -> - ejabberd_router:route(From, JID, Packet), + ejabberd_router:route(From, + jlib:make_jid(JID), + Packet), ?SETS:add_element(JID, A) end, StateData#state.pres_a, @@ -1003,9 +1014,7 @@ roster_change(IJID, ISubscription, StateData) -> StateData#state{pres_f = FSet, pres_t = TSet}; P -> ?DEBUG("roster changed for ~p~n", [StateData#state.user]), - From = {StateData#state.user, - StateData#state.server, - StateData#state.resource}, + From = StateData#state.jid, Cond1 = (not StateData#state.pres_invis) and IsFrom, Cond2 = (not IsFrom) and (?SETS:is_element(LIJID, StateData#state.pres_a) or @@ -1013,7 +1022,7 @@ roster_change(IJID, ISubscription, StateData) -> if Cond1 -> ?DEBUG("C1: ~p~n", [LIJID]), - ejabberd_router:route(From, IJID, P), + ejabberd_router:route(From, jlib:make_jid(IJID), P), A = ?SETS:add_element(LIJID, StateData#state.pres_a), StateData#state{pres_a = A, @@ -1021,7 +1030,7 @@ roster_change(IJID, ISubscription, StateData) -> pres_t = TSet}; Cond2 -> ?DEBUG("C2: ~p~n", [LIJID]), - ejabberd_router:route(From, IJID, + ejabberd_router:route(From, jlib:make_jid(IJID), {xmlelement, "presence", [{"type", "unavailable"}], []}), I = remove_element(LIJID, |