diff --git a/src/ejabberd.hrl b/src/ejabberd.hrl index cd08402f7..08f06e3fb 100644 --- a/src/ejabberd.hrl +++ b/src/ejabberd.hrl @@ -16,5 +16,5 @@ -endif. --define(MYNAME,"127.0.0.1"). +-define(MYNAME,"e.localhost"). diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl index b58bbdb9a..5332d00b3 100644 --- a/src/ejabberd_router.erl +++ b/src/ejabberd_router.erl @@ -11,7 +11,9 @@ -vsn('$Revision$ '). -export([route/3, register_route/1, register_local_route/1, - dirty_get_all_routes/0]). + dirty_get_all_routes/0, + dirty_get_all_domains/0 + ]). -export([start/0, init/0]). @@ -132,3 +134,7 @@ dirty_get_all_routes() -> lists:umerge(lists:sort(mnesia:dirty_all_keys(route)), lists:sort(mnesia:dirty_all_keys(local_route)))). +dirty_get_all_domains() -> + lists:umerge(lists:sort(mnesia:dirty_all_keys(route)), + lists:sort(mnesia:dirty_all_keys(local_route))). + diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index c106bfe85..fd8ede288 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -137,6 +137,7 @@ try_register(Server) -> do_route(From, To, Packet) -> ?DEBUG("s2s manager~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n", [From, To, Packet, 8]), + {_, MyServer, _} = From, {User, Server, Resource} = To, Key = randoms:get_string(), F = fun() -> @@ -172,7 +173,7 @@ do_route(From, To, Packet) -> ok; {atomic, new} -> ?DEBUG("starting new s2s connection~n", []), - Pid = ejabberd_s2s_out:start(Server, {new, Key}), + Pid = ejabberd_s2s_out:start(MyServer, Server, {new, Key}), mnesia:transaction(fun() -> mnesia:write(#mys2s{server = Server, pid = Pid}) end), {xmlelement, Name, Attrs, Els} = Packet, diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl index c032e24fa..f4c6f0fed 100644 --- a/src/ejabberd_s2s_in.erl +++ b/src/ejabberd_s2s_in.erl @@ -27,7 +27,7 @@ -include("ejabberd.hrl"). -record(state, {socket, receiver, streamid, - myself = ?MYNAME, server, queue}). + myname, server, queue}). -define(DBGFSM, true). @@ -53,6 +53,12 @@ "" ). +-define(INVALID_DOMAIN_ERR, + "" + "Invalid Destination" + "" + ). + %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- @@ -90,8 +96,19 @@ wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) -> % TODO case {xml:get_attr_s("xmlns", Attrs), xml:get_attr_s("xmlns:db", Attrs)} of {"jabber:server", "jabber:server:dialback"} -> - send_text(StateData#state.socket, ?STREAM_HEADER), - {next_state, wait_for_key, StateData}; + Me = case xml:get_attr_s("to", Attrs) of + "" -> ?MYNAME; + Dom -> Dom + end, + case lists:member(Me, ejabberd_router:dirty_get_all_domains()) of + true -> + send_text(StateData#state.socket, ?STREAM_HEADER), + {next_state, wait_for_key, StateData#state{myname = Me}}; + _ -> + send_text(StateData#state.socket, ?INVALID_DOMAIN_ERR), + {stop, normal, StateData} + end; + _ -> send_text(StateData#state.socket, ?INVALID_HEADER_ERR), {stop, normal, StateData} @@ -105,7 +122,8 @@ wait_for_key({xmlstreamelement, El}, StateData) -> case is_key_packet(El) of {key, To, From, Id, Key} -> io:format("GET KEY: ~p~n", [{To, From, Id, Key}]), - ejabberd_s2s_out:start(From, {verify, self(), Key}), + ejabberd_s2s_out:start(StateData#state.myname, From, + {verify, self(), Key}), {next_state, wait_for_verification, StateData#state{server = From}}; @@ -118,7 +136,7 @@ wait_for_key({xmlstreamelement, El}, StateData) -> send_element(StateData#state.socket, {xmlelement, "db:verify", - [{"from", ?MYNAME}, + [{"from", StateData#state.myname}, {"to", From}, {"id", Id}, {"type", Type}], @@ -139,7 +157,7 @@ wait_for_verification(valid, StateData) -> send_element(StateData#state.socket, {xmlelement, "db:result", - [{"from", ?MYNAME}, + [{"from", StateData#state.myname}, {"to", StateData#state.server}, {"type", "valid"}], []}), @@ -150,7 +168,7 @@ wait_for_verification(invalid, StateData) -> send_element(StateData#state.socket, {xmlelement, "db:result", - [{"from", ?MYNAME}, + [{"from", StateData#state.myname}, {"to", StateData#state.server}, {"type", "invalid"}], []}), @@ -167,7 +185,7 @@ wait_for_verification({xmlstreamelement, El}, StateData) -> send_element(StateData#state.socket, {xmlelement, "db:verify", - [{"from", ?MYNAME}, + [{"from", StateData#state.myname}, {"to", From}, {"id", Id}, {"type", Type}], @@ -198,7 +216,7 @@ stream_established({xmlstreamelement, El}, StateData) -> send_element(StateData#state.socket, {xmlelement, "db:verify", - [{"from", ?MYNAME}, + [{"from", StateData#state.myname}, {"to", From}, {"id", Id}, {"type", Type}], diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index b5ec1b7c0..71dd5e176 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -13,7 +13,7 @@ -behaviour(gen_fsm). %% External exports --export([start/2, receiver/2, send_text/2, send_element/2]). +-export([start/3, receiver/2, send_text/2, send_element/2]). %% gen_fsm callbacks -export([init/1, @@ -27,7 +27,7 @@ -include("ejabberd.hrl"). -record(state, {socket, receiver, streamid, - myself = ?MYNAME, server, xmlpid, queue, + myname, server, xmlpid, queue, new = false, verify = false}). -define(DBGFSM, true). @@ -43,7 +43,8 @@ "" + "xmlns:db='jabber:server:dialback' " + "to='~s'>" ). -define(STREAM_TRAILER, ""). @@ -57,8 +58,8 @@ %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- -start(Host, Type) -> - {ok, Pid} = gen_fsm:start(ejabberd_s2s_out, [Host, Type], ?FSMOPTS), +start(From, Host, Type) -> + {ok, Pid} = gen_fsm:start(ejabberd_s2s_out, [From, Host, Type], ?FSMOPTS), Pid. %%%---------------------------------------------------------------------- @@ -72,7 +73,7 @@ start(Host, Type) -> %% ignore | %% {stop, StopReason} %%---------------------------------------------------------------------- -init([Server, Type]) -> +init([From, Server, Type]) -> gen_fsm:send_event(self(), init), {New, Verify} = case Type of {new, Key} -> @@ -81,6 +82,7 @@ init([Server, Type]) -> {false, {Pid, Key}} end, {ok, open_socket, #state{queue = queue:new(), + myname = From, server = Server, new = New, verify = Verify}}. @@ -96,7 +98,8 @@ open_socket(init, StateData) -> [binary, {packet, 0}]) of {ok, Socket} -> XMLStreamPid = xml_stream:start(self()), - send_text(Socket, ?STREAM_HEADER), + send_text(Socket, io_lib:format(?STREAM_HEADER, + [StateData#state.server])), {next_state, wait_for_stream, StateData#state{socket = Socket, xmlpid = XMLStreamPid, @@ -135,7 +138,7 @@ wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) -> send_element(StateData#state.socket, {xmlelement, "db:result", - [{"from", ?MYNAME}, + [{"from", StateData#state.myname}, {"to", Server}], [{xmlcdata, Key1}]}) end, @@ -146,7 +149,7 @@ wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) -> send_element(StateData#state.socket, {xmlelement, "db:verify", - [{"from", ?MYNAME}, + [{"from", StateData#state.myname}, {"to", StateData#state.server}], [{xmlcdata, Key2}]}) end, diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index 8c092eb39..5383240da 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -23,7 +23,7 @@ -record(session, {ur, user, node}). -record(mysession, {ur, pid}). -record(presence, {ur, user, priority}). - +-record(offline_msg, {user, timestamp, xml}). start() -> spawn(ejabberd_sm, init, []). diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl index 7f8cfa215..796ad58a8 100644 --- a/src/mod_vcard.erl +++ b/src/mod_vcard.erl @@ -172,8 +172,8 @@ set_vcard(LUser, VCARD) -> [{xmlcdata, "Fill in fields to search " "for any matching Jabber User"}]}, {xmlelement, "field", [{"type", "text-single"}, - {"label", "JID"}, - {"var", "jid"}], []}, + {"label", "User"}, + {"var", "user"}], []}, {xmlelement, "field", [{"type", "text-single"}, {"label", "Full Name"}, {"var", "fn"}], []}, @@ -403,7 +403,7 @@ filter_fields([], Match) -> filter_fields([{SVar, [Val]} | Ds], Match) when is_list(Val) and (Val /= "") -> NewMatch = case SVar of - "jid" -> Match; + "user" -> Match#vcard_search{user = Val}; "fn" -> Match#vcard_search{fn = Val}; "family" -> Match#vcard_search{family = Val}; "given" -> Match#vcard_search{given = Val};