diff --git a/src/mod_offline_odbc.erl b/src/mod_offline_odbc.erl index 55374901e..07ef34506 100644 --- a/src/mod_offline_odbc.erl +++ b/src/mod_offline_odbc.erl @@ -49,7 +49,7 @@ -include("web/ejabberd_http.hrl"). -include("web/ejabberd_web_admin.hrl"). --record(offline_msg, {user, timestamp, expire, from, to, packet}). +-record(offline_msg, {user, server, timestamp, expire, from, to, packet}). -define(PROCNAME, ejabberd_offline). -define(OFFLINE_TABLE_LOCK_THRESHOLD, 1000). @@ -88,15 +88,15 @@ start(Host, Opts) -> loop(Host, AccessMaxOfflineMsgs) -> receive - #offline_msg{user = User} = Msg -> - Msgs = receive_all(User, [Msg]), + #offline_msg{user = User, server = Server} = Msg -> + Msgs = receive_all(User, Server, [Msg]), Len = length(Msgs), MaxOfflineMsgs = get_max_user_messages(AccessMaxOfflineMsgs, User, Host), %% Only count existing messages if needed: Count = if MaxOfflineMsgs =/= infinity -> - Len + count_offline_messages(User, Host); + Len + count_offline_messages(User, Server); true -> 0 end, if @@ -129,9 +129,9 @@ loop(Host, AccessMaxOfflineMsgs) -> XML = ejabberd_odbc:escape( exmpp_xml:document_to_list(Packet1)), - odbc_queries:add_spool_sql(Username, XML) + odbc_queries:add_spool_sql(Server, Username, XML) end, Msgs), - case catch odbc_queries:add_spool(Host, Query) of + case catch odbc_queries:add_spool(Server, Query) of {'EXIT', Reason} -> ?ERROR_MSG("~p~n", [Reason]); {error, Reason} -> @@ -154,10 +154,10 @@ get_max_user_messages(AccessRule, LUser, Host) -> _ -> ?MAX_USER_MESSAGES end. -receive_all(Username, Msgs) -> +receive_all(Username, Server, Msgs) -> receive - #offline_msg{user=Username} = Msg -> - receive_all(Username, [Msg | Msgs]) + #offline_msg{user = Username, server = Server} = Msg -> + receive_all(Username, Server, [Msg | Msgs]) after 0 -> lists:reverse(Msgs) end. @@ -207,11 +207,20 @@ store_packet(From, To, Packet) -> (Type /= <<"headline">>) -> case check_event_chatstates(From, To, Packet) of true -> - LUser = exmpp_jid:prep_node_as_list(To), + LUser = exmpp_jid:prep_node_as_list(To), + LServer = exmpp_jid:prep_domain_as_list(To), TimeStamp = now(), Expire = find_x_expire(TimeStamp, Packet#xmlel.children), - gen_mod:get_module_proc(exmpp_jid:prep_domain_as_list(To), ?PROCNAME) ! + Proc1 = gen_mod:get_module_proc(LServer, ?PROCNAME), + Proc = case whereis(Proc1) of + undefined -> + gen_mod:get_module_proc(global, ?PROCNAME); + _ -> + Proc1 + end, + Proc ! #offline_msg{user = LUser, + server = LServer, timestamp = TimeStamp, expire = Expire, from = From, @@ -377,12 +386,14 @@ user_queue(User, Server, Query, Lang) -> LUser = exmpp_stringprep:nodeprep(User), LServer = exmpp_stringprep:nameprep(Server), Username = ejabberd_odbc:escape(LUser), + Host = ejabberd_odbc:escape(LServer), US0 = {LUser, LServer}, R = user_queue_parse_query(Username, LServer, Query), M = case catch ejabberd_odbc:sql_query( LServer, ["select username, xml from spool" " where username='", Username, "'" + " and host='", Host, "'" " order by seq;"]) of {selected, ["username", "xml"], Rs} -> lists:flatmap( @@ -449,10 +460,12 @@ user_queue(User, Server, Query, Lang) -> user_queue_parse_query(Username, LServer, Query) -> case lists:keysearch("delete", 1, Query) of {value, _} -> + Host = ejabberd_odbc:escape(LServer), Msgs = case catch ejabberd_odbc:sql_query( LServer, ["select xml, seq from spool" - " where username='", Username, "'" + " where username='", Username, "' and" + " host='", Host, "'" " order by seq;"]) of {selected, ["xml", "seq"], Rs} -> lists:flatmap( @@ -481,7 +494,7 @@ user_queue_parse_query(Username, LServer, Query) -> catch ejabberd_odbc:sql_query( LServer, ["delete from spool" - " where username='", Username, "'" + " where username='", Username, "' and host='", Host, "'" " and seq='", SSeq, "';"]); false -> ok @@ -498,10 +511,12 @@ us_to_list({User, Server}) -> exmpp_jid:to_list(User, Server). get_queue_length(Username, LServer) -> + Host = ejabberd_odbc:escape(LServer), case catch ejabberd_odbc:sql_query( LServer, ["select count(*) from spool" - " where username='", Username, "';"]) of + " where username='", Username, "'" + " and host='", Host, "';"]) of {selected, [_], [{SCount}]} -> SCount; _ -> @@ -528,9 +543,9 @@ get_messages_subset2(Max, Length, MsgsAll) -> MsgsFirstN ++ [IntermediateMsg] ++ MsgsLastN. webadmin_user(Acc, User, Server, Lang) -> - LUser = exmpp_stringprep:nodeprep(User), - LServer = exmpp_stringprep:nameprep(Server), - Username = ejabberd_odbc:escape(LUser), + LUser = exmpp_stringprep:nodeprep(User), + LServer = exmpp_stringprep:nameprep(Server), + Username = ejabberd_odbc:escape(LUser), QueueLen = get_queue_length(Username, LServer), FQueueLen = [?AC("queue/", QueueLen)], Acc ++ [?XCT("h3", "Offline Messages:")] ++ FQueueLen ++ [?C(" "), ?INPUTT("submit", "removealloffline", "Remove All Offline Messages")]. @@ -556,8 +571,10 @@ webadmin_user_parse_query(Acc, _Action, _User, _Server, _Query) -> %% Returns as integer the number of offline messages for a given user count_offline_messages(LUser, LServer) -> Username = ejabberd_odbc:escape(LUser), + Host = ejabberd_odbc:escape(LServer), case catch odbc_queries:count_records_where( - LServer, "spool", "where username='" ++ Username ++ "'") of + LServer, "spool", "where username='" ++ Username ++ + "' and host='" ++ Host ++ "'") of {selected, [_], [{Res}]} -> list_to_integer(Res); _ -> diff --git a/src/mod_privacy_odbc.erl b/src/mod_privacy_odbc.erl index aa76daf2c..5f039ef1e 100644 --- a/src/mod_privacy_odbc.erl +++ b/src/mod_privacy_odbc.erl @@ -285,13 +285,13 @@ process_default_set(LUser, LServer, false) -> process_default_set(LUser, LServer, Name) -> F = fun() -> - case sql_get_privacy_list_names_t(LUser) of + case sql_get_privacy_list_names_t(LUser, LServer) of {selected, ["name"], []} -> {error, 'item-not-found'}; {selected, ["name"], Names} -> case lists:member({Name}, Names) of true -> - sql_set_default_privacy_list(LUser, Name), + sql_set_default_privacy_list(LUser, LServer, Name), {result, []}; false -> {error, 'item-not-found'} @@ -337,15 +337,17 @@ process_list_set(_LUser, _LServer, false, _Els) -> {error, 'bad-request'}; process_list_set(LUser, LServer, Name, Els) -> + ?DEBUG("~p@~p: name ~p, els: ~p", [LUser, LServer, Name, Els]), case parse_items(Els) of false -> {error, 'bad-request'}; remove -> F = fun() -> - case sql_get_default_privacy_list_t(LUser) of + case sql_get_default_privacy_list_t(LUser, LServer) of {selected, ["name"], []} -> - sql_remove_privacy_list(LUser, Name), + ?DEBUG("Going to delete privacy list ~p", [Name]), + sql_remove_privacy_list(LUser, LServer, Name), {result, []}; {selected, ["name"], [{Default}]} -> % TODO: check active @@ -353,7 +355,8 @@ process_list_set(LUser, LServer, Name, Els) -> Name == Default -> {error, 'conflict'}; true -> - sql_remove_privacy_list(LUser, Name), + ?DEBUG("Going to delete default list named ~p", [Name]), + sql_remove_privacy_list(LUser, LServer, Name), {result, []} end end @@ -375,14 +378,19 @@ process_list_set(LUser, LServer, Name, Els) -> end; List -> RItems = lists:map(fun item_to_raw/1, List), + ?DEBUG("Got a list of items: ~p", [RItems]), F = fun() -> + ?DEBUG("About to grab the id...", []), ID = - case sql_get_privacy_list_id_t(LUser, Name) of + case sql_get_privacy_list_id_t(LUser, LServer, Name) of {selected, ["id"], []} -> - sql_add_privacy_list(LUser, Name), + ?DEBUG("No privacy list called ~p",[Name]), + sql_add_privacy_list(LUser, LServer, Name), + ?DEBUG("Added the privacy list called ~p",[Name]), {selected, ["id"], [{I}]} = - sql_get_privacy_list_id_t(LUser, Name), + sql_get_privacy_list_id_t(LUser, LServer, Name), + ?DEBUG("Privacy list called ~p added, now id ~p",[Name, I]), I; {selected, ["id"], [{I}]} -> I @@ -778,54 +786,60 @@ sql_get_default_privacy_list(LUser, LServer) -> Username = ejabberd_odbc:escape(LUser), odbc_queries:get_default_privacy_list(LServer, Username). -sql_get_default_privacy_list_t(LUser) -> +sql_get_default_privacy_list_t(LUser, LServer) -> Username = ejabberd_odbc:escape(LUser), - odbc_queries:get_default_privacy_list_t(Username). + odbc_queries:get_default_privacy_list_t(LServer, Username). sql_get_privacy_list_names(LUser, LServer) -> Username = ejabberd_odbc:escape(LUser), odbc_queries:get_privacy_list_names(LServer, Username). -sql_get_privacy_list_names_t(LUser) -> +sql_get_privacy_list_names_t(LUser, LServer) -> Username = ejabberd_odbc:escape(LUser), - odbc_queries:get_privacy_list_names_t(Username). + odbc_queries:get_privacy_list_names_t(LServer, Username). sql_get_privacy_list_id(LUser, LServer, Name) -> Username = ejabberd_odbc:escape(LUser), + Host = ejabberd_odbc:escape(LServer), SName = ejabberd_odbc:escape(Name), - odbc_queries:get_privacy_list_id(LServer, Username, SName). + odbc_queries:get_privacy_list_id(Host, Username, SName). -sql_get_privacy_list_id_t(LUser, Name) -> +sql_get_privacy_list_id_t(LUser, LServer, Name) -> Username = ejabberd_odbc:escape(LUser), + Host = ejabberd_odbc:escape(LServer), SName = ejabberd_odbc:escape(Name), - odbc_queries:get_privacy_list_id_t(Username, SName). + odbc_queries:get_privacy_list_id_t(Host, Username, SName). sql_get_privacy_list_data(LUser, LServer, Name) -> Username = ejabberd_odbc:escape(LUser), + Host = ejabberd_odbc:escape(LServer), SName = ejabberd_odbc:escape(Name), - odbc_queries:get_privacy_list_data(LServer, Username, SName). + odbc_queries:get_privacy_list_data(Host, Username, SName). sql_get_privacy_list_data_by_id(ID, LServer) -> odbc_queries:get_privacy_list_data_by_id(LServer, ID). -sql_set_default_privacy_list(LUser, Name) -> +sql_set_default_privacy_list(LUser, LServer, Name) -> Username = ejabberd_odbc:escape(LUser), + Host = ejabberd_odbc:escape(LServer), SName = ejabberd_odbc:escape(Name), - odbc_queries:set_default_privacy_list(Username, SName). + odbc_queries:set_default_privacy_list(Host, Username, SName). sql_unset_default_privacy_list(LUser, LServer) -> Username = ejabberd_odbc:escape(LUser), odbc_queries:unset_default_privacy_list(LServer, Username). -sql_remove_privacy_list(LUser, Name) -> +sql_remove_privacy_list(LUser, LServer, Name) -> Username = ejabberd_odbc:escape(LUser), + Host = ejabberd_odbc:escape(LServer), SName = ejabberd_odbc:escape(Name), - odbc_queries:remove_privacy_list(Username, SName). + odbc_queries:remove_privacy_list(Host, Username, SName). -sql_add_privacy_list(LUser, Name) -> +sql_add_privacy_list(LUser, LServer, Name) -> Username = ejabberd_odbc:escape(LUser), + Host = ejabberd_odbc:escape(LServer), SName = ejabberd_odbc:escape(Name), - odbc_queries:add_privacy_list(Username, SName). + odbc_queries:add_privacy_list(Host, Username, SName). sql_set_privacy_list(ID, RItems) -> odbc_queries:set_privacy_list(ID, RItems). diff --git a/src/mod_private_odbc.erl b/src/mod_private_odbc.erl index f3b8c7715..ab32552d8 100644 --- a/src/mod_private_odbc.erl +++ b/src/mod_private_odbc.erl @@ -108,7 +108,7 @@ check_packet(From, To, IQ_Rec, [F | R]) -> check_domain(From, _To, _IQ_Rec) -> LServer = exmpp_jid:prep_domain_as_list(From), - case lists:member(LServer, ?MYHOSTS) of + case ?IS_MY_HOST(LServer) of true -> ok; false -> {error, 'not-allowed'} end. diff --git a/src/mod_pubsub/mod_pubsub_odbc.erl b/src/mod_pubsub/mod_pubsub_odbc.erl index 1e609bf01..865c75e07 100644 --- a/src/mod_pubsub/mod_pubsub_odbc.erl +++ b/src/mod_pubsub/mod_pubsub_odbc.erl @@ -176,7 +176,7 @@ stop(Host) -> %%-------------------------------------------------------------------- init([ServerHost, Opts]) -> ?DEBUG("pubsub init ~p ~p",[ServerHost,Opts]), - Host = gen_mod:get_opt_host(ServerHost, Opts, "pubsub.@HOST@"), + Host = gen_mod:expand_host_name(ServerHost, Opts, "pubsub"), Access = gen_mod:get_opt(access_createnode, Opts, all), PepOffline = gen_mod:get_opt(ignore_pep_from_offline, Opts, true), IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), @@ -3105,7 +3105,7 @@ broadcast_stanza({LUser, LServer, LResource}, Publisher, Node, NodeId, Type, Nod Contacts when is_list(Contacts) -> lists:foreach(fun({U, S, _}) -> spawn(fun() -> - case lists:member(S, ?MYHOSTS) of + case ?IS_MY_HOST(S) of true -> lists:foreach(fun(R) -> ejabberd_router:route(Sender, exmpp_jid:make(U, S, R), StanzaToSend) diff --git a/src/mod_roster_odbc.erl b/src/mod_roster_odbc.erl index 4f25ce4c5..4dd824b52 100644 --- a/src/mod_roster_odbc.erl +++ b/src/mod_roster_odbc.erl @@ -118,7 +118,7 @@ stop(Host) -> process_iq(From, To, IQ_Rec) -> LServer = exmpp_jid:prep_domain_as_list(From), - case lists:member(LServer, ?MYHOSTS) of + case ?IS_MY_HOST(LServer) of true -> process_local_iq(From, To, IQ_Rec); _ -> @@ -838,11 +838,11 @@ process_item_set_t(LUser, LServer, #xmlel{} = El) -> Item2 = process_item_els(Item1, El#xmlel.children), case Item2#roster.subscription of remove -> - odbc_queries:del_roster_sql(Username, SJID); + odbc_queries:del_roster_sql(LServer, Username, SJID); _ -> ItemVals = record_to_string(Item1), ItemGroups = groups_to_string(Item2), - odbc_queries:update_roster_sql(Username, SJID, ItemVals, ItemGroups) + odbc_queries:update_roster_sql(LServer, Username, SJID, ItemVals, ItemGroups) end catch _ -> @@ -1158,7 +1158,7 @@ build_contact_jid_td({U, S, R}) -> {CUser, CServer} -> CUser_S = binary_to_list(CUser), CServer_S = binary_to_list(CServer), - case lists:member(CServer_S, ?MYHOSTS) of + case ?IS_MY_HOST(CServer_S) of false -> ""; true -> "/admin/server/" ++ CServer_S ++ "/user/" ++ CUser_S ++ "/" end diff --git a/src/mod_vcard_odbc.erl b/src/mod_vcard_odbc.erl index c80654b36..158ac4713 100644 --- a/src/mod_vcard_odbc.erl +++ b/src/mod_vcard_odbc.erl @@ -54,7 +54,7 @@ start(Host, Opts) -> gen_iq_handler:add_iq_handler(ejabberd_sm, HostB, ?NS_VCARD, ?MODULE, process_sm_iq, IQDisc), ejabberd_hooks:add(disco_sm_features, HostB, ?MODULE, get_sm_features, 50), - MyHost = gen_mod:get_opt_host(Host, Opts, "vjud.@HOST@"), + MyHost = gen_mod:expand_host_name(Host, Opts, "vjud"), Search = gen_mod:get_opt(search, Opts, true), register(gen_mod:get_module_proc(Host, ?PROCNAME), spawn(?MODULE, init, [MyHost, Host, Search])). @@ -154,7 +154,7 @@ process_sm_iq(_From, To, #iq{type = get} = IQ_Rec) -> process_sm_iq(From, _To, #iq{type = set, payload = Request} = IQ_Rec) -> User = exmpp_jid:node_as_list(From), LServer = exmpp_jid:prep_domain_as_list(From), - case lists:member(LServer, ?MYHOSTS) of + case ?IS_MY_HOST(LServer) of true -> set_vcard(User, LServer, Request), exmpp_iq:result(IQ_Rec); @@ -285,6 +285,10 @@ set_vcard(User, LServer, VCARD) -> ?TLFIELD(<<"text-single">>, "Organization Unit", <<"orgunit">>) ]}]). +do_route(global, From, To, Packet) -> + Host = exmpp_jid:prep_domain_as_list(To), + ServerHost = ejabberd_global_router:server_host(Host, self()), + do_route(ServerHost, From, To, Packet); do_route(ServerHost, From, To, Packet) -> User = exmpp_jid:node(To), Resource = exmpp_jid:resource(To), @@ -492,7 +496,8 @@ search(LServer, Data) -> make_matchspec(LServer, Data) -> - filter_fields(Data, "", LServer). + Host = ejabberd_odbc:escape(LServer), + filter_fields(Data, ["host = '", Host, "'"], LServer). filter_fields([], Match, _LServer) -> case Match of