From 1a311a30b5ebd1153367d59f379f73bda8387db7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20P=C3=A9dron?= Date: Thu, 26 Jun 2008 15:47:21 +0000 Subject: [PATCH] o Use a macro in ?DEFAULT_NS instead of the namespace atom directly. o Comment DBGFSM our again. o Remove macro ERR_SERVICE_UNAVAILABLE. o In wait_for_auth and is_auth_packet, an empty resource is returned as 'undefined', not the empty string in the {auth, ...} tuple. o In handle_sync_event, remove a debugging printf. o In handle_info({route, ...}), use macro IS_PRESENCE & friends instead of direct matching with NS_JABBER_CLIENT and name. This way, the S2S doesn't have to change the namespace of all its incoming stanzas to NS_JABBER_CLIENT. o In send_element, for stanzas under the NS_JABBER_SERVER namespace, lie to exmpp_xml by telling it that this namespace is the default one. SVN Revision: 1382 --- ChangeLog | 15 +++++++++++++++ src/ejabberd_c2s.erl | 30 +++++++++++++++++------------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index e49553877..f42d06a56 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2008-06-26 Jean-Sébastien Pédron + + * src/ejabberd_c2s.erl: Use a macro in ?DEFAULT_NS instead of the + namespace atom directly. Comment DBGFSM our again. Remove macro + ERR_SERVICE_UNAVAILABLE. + (wait_for_auth, is_auth_packet): An empty resource is returned as + 'undefined', not the empty string in the {auth, ...} tuple. + (handle_sync_event): Remove a debugging printf. + (handle_info/{route, ...}): Use macro IS_PRESENCE & friends instead of + direct matching with NS_JABBER_CLIENT and name. This way, the S2S + doesn't have to change the namespace of all its incoming stanzas to + NS_JABBER_CLIENT. + (send_element): For stanzas under the NS_JABBER_SERVER namespace, lie + to exmpp_xml by telling it that this namespace is the default one. + 2008-06-25 Jean-Sébastien Pédron * src/ejabberd_c2s.erl: Finish ejabberd_c2s conversion with the diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index c847506be..38aae6e8b 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -94,11 +94,11 @@ %-define(DBGFSM, true). -%-ifdef(DBGFSM). +-ifdef(DBGFSM). -define(FSMOPTS, [{debug, [trace]}]). -%-else. -%-define(FSMOPTS, []). -%-endif. +-else. +-define(FSMOPTS, []). +-endif. %% Module start with or without supervisor: -ifdef(NO_TRANSIENT_SUPERVISORS). @@ -116,7 +116,7 @@ % These are the namespace already declared by the stream opening. This is % used at serialization time. --define(DEFAULT_NS, ['jabber:client']). +-define(DEFAULT_NS, [?NS_JABBER_CLIENT]). -define(PREFIXED_NS, [{?NS_XMPP, "stream"}]). % XXX OLD FORMAT @@ -126,7 +126,6 @@ exmpp_xml:xmlel_to_xmlelement(exmpp_stanza:error(Condition), [?NS_JABBER_CLIENT], [{?NS_XMPP, "stream"}])). -define(ERR_FEATURE_NOT_IMPLEMENTED, ?STANZA_ERROR('feature-not-implemented')). --define(ERR_SERVICE_UNAVAILABLE, ?STANZA_ERROR('service-unavialable')). -record(iq, {id = "", type, @@ -387,7 +386,7 @@ wait_for_auth({xmlstreamelement, El}, StateData) -> send_element(StateData, exmpp_server_legacy_auth:fields(El, Fields)), fsm_next_state(wait_for_auth, StateData); - {auth, _ID, set, {_U, _P, _D, ""}} -> + {auth, _ID, set, {_U, _P, _D, undefined}} -> Err = exmpp_stanza:error('not-acceptable', {"en", "No resource provided"}), send_element(StateData, exmpp_iq:error(El, Err)), @@ -988,7 +987,6 @@ handle_sync_event(get_subscribed_and_online, _From, StateName, StateData) -> ?SETS:is_element(User, Subscribed) end, SubscribedAndOnline = ?DICT:filter(Pred, Online), - io:format("===== SubscribedAndOnline = ~p~n", [SubscribedAndOnline]), {reply, ?DICT:to_list(SubscribedAndOnline), StateName, StateData}; handle_sync_event(_Event, _From, StateName, StateData) -> @@ -1021,7 +1019,7 @@ handle_info({route, FromOld, ToOld, PacketOld}, StateName, StateData) -> To = exmpp_jid:from_ejabberd_jid(ToOld), {Pass, NewAttrs, NewState} = case Packet of - #xmlel{ns = ?NS_JABBER_CLIENT, name = 'presence', attrs = Attrs} -> + #xmlel{attrs = Attrs} when ?IS_PRESENCE(Packet) -> case exmpp_presence:get_type(Packet) of 'probe' -> % XXX OLD FORMAT: LFrom and LBFrom. @@ -1172,7 +1170,7 @@ handle_info({route, FromOld, ToOld, PacketOld}, StateName, StateData) -> _ -> {false, Attrs, StateData} end; - #xmlel{ns = ?NS_JABBER_CLIENT, name = 'iq', attrs = Attrs} -> + #xmlel{attrs = Attrs} when ?IS_IQ(Packet) -> case exmpp_iq:is_request(Packet) of true -> case exmpp_iq:get_request(Packet) of @@ -1224,7 +1222,7 @@ handle_info({route, FromOld, ToOld, PacketOld}, StateName, StateData) -> false -> {true, Attrs, StateData} end; - #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', attrs = Attrs} -> + #xmlel{attrs = Attrs} when ?IS_MESSAGE(Packet) -> % XXX OLD FORMAT: From, To and Packet. case ejabberd_hooks:run_fold( privacy_check_packet, StateData#state.server, @@ -1350,8 +1348,14 @@ send_text(StateData, Text) -> ?DEBUG("Send XML on stream = ~p", [lists:flatten(Text)]), (StateData#state.sockmod):send(StateData#state.socket, Text). +send_element(StateData, #xmlel{ns = ?NS_XMPP, name = 'stream'} = El) -> + send_text(StateData, exmpp_xml:document_to_list(El)); +send_element(StateData, #xmlel{ns = ?NS_JABBER_SERVER} = El) -> + send_text(StateData, exmpp_xml:document_fragment_to_list(El, + [?NS_JABBER_SERVER], ?PREFIXED_NS)); send_element(StateData, El) -> - send_text(StateData, xml:element_to_string(El)). + send_text(StateData, exmpp_xml:document_fragment_to_list(El, + ?DEFAULT_NS, ?PREFIXED_NS)). new_id() -> @@ -1366,7 +1370,7 @@ is_auth_packet(El) -> #iq{id = ID, type = Type, xmlns = ?NS_AUTH, sub_el = SubEl} -> {xmlelement, _, _, Els} = SubEl, {auth, ID, Type, - get_auth_tags(Els, "", "", "", "")}; + get_auth_tags(Els, "", "", "", undefined)}; _ -> false end.