From 23e1914e9466197aeb62bec5440cb3942aab7910 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Thu, 16 Jan 2003 20:24:53 +0000 Subject: [PATCH] *** empty log message *** SVN Revision: 41 --- TODO | 9 ++-- src/ejabberd_c2s.erl | 32 +++++--------- src/ejabberd_config.erl | 23 ++++------ src/ejabberd_local.erl | 1 + src/ejabberd_router.erl | 11 ++++- src/mod_private.erl | 95 +++++++++++++++++++++++++++++++++++++++++ src/mod_vcard.erl | 2 +- src/namespaces.hrl | 3 ++ src/translate.erl | 23 ++++------ 9 files changed, 139 insertions(+), 60 deletions(-) create mode 100644 src/mod_private.erl diff --git a/TODO b/TODO index 5aa7c610f..87f4691ea 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,5 @@ S2S timeouts -... -iq:browse -iq:disco -... -services support -JUD +iq:browse(?) SVR DNS records +karma +SSL diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 54c94889d..7f0fb5e76 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -136,10 +136,10 @@ wait_for_auth({xmlstreamelement, El}, StateData) -> end; _ -> case jlib:iq_query_info(El) of - {iq, ID, Type, "jabber:iq:register", SubEl} -> + {iq, ID, Type, ?NS_REGISTER, SubEl} -> ResIQ = mod_register:process_iq( {"", "", ""}, {"", ?MYNAME, ""}, - {iq, ID, Type, "jabber:iq:register", SubEl}), + {iq, ID, Type, ?NS_REGISTER, SubEl}), Res1 = jlib:replace_from_to({"", ?MYNAME, ""}, {"", "", ""}, jlib:iq_to_xml(ResIQ)), @@ -388,26 +388,16 @@ new_id() -> randoms:get_string(). -is_auth_packet({xmlelement, Name, Attrs, Els}) when Name == "iq" -> - case xml:get_attr_s("type", Attrs) of - "set" -> - case xml:remove_cdata(Els) of - [{xmlelement, "query", Attrs2, Els2}] -> - case xml:get_attr_s("xmlns", Attrs2) of - "jabber:iq:auth" -> - {auth, - xml:get_attr_s("id", Attrs), - get_auth_tags(Els2, "", "", "", "")}; - _ -> false - end; - _ -> - false - end; - true -> +is_auth_packet(El) -> + case jlib:iq_query_info(El) of + {iq, ID, Type, ?NS_AUTH, SubEl} -> + {xmlelement, _, _, Els} = SubEl, + {auth, ID, + get_auth_tags(Els, "", "", "", "")}; + _ -> false - end; -is_auth_packet(_) -> - false. + end. + get_auth_tags([{xmlelement, Name, Attrs, Els}| L], U, P, D, R) -> CData = xml:get_cdata(Els), diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl index 5fb03ad2b..0c1470900 100644 --- a/src/ejabberd_config.erl +++ b/src/ejabberd_config.erl @@ -20,23 +20,16 @@ start() -> load_file(File) -> - {ok, Bin} = file:read_file(File), - Content = binary_to_list(Bin), - parse(Content). - - -parse(String) -> - case erl_scan:tokens([], String, 0) of - {done, Result, Left} -> - {ok, Tokens, _} = Result, - {ok, Term} = erl_parse:parse_term(Tokens), - {Opt, Val} = Term, - ets:insert(ejabberd_config, {Opt, Val}), - parse(Left); - _ -> - ok + case file:consult(File) of + {ok, Terms} -> + lists:foreach(fun({Opt, Val}) -> + ets:insert(ejabberd_config, {Opt, Val}) + end, Terms); + {error, Reason} -> + exit(file:format_error(Reason)) end. + get_option(Opt) -> case ets:lookup(ejabberd_config, Opt) of [{_, Val}] -> diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl index b7e949eef..1b970447a 100644 --- a/src/ejabberd_local.erl +++ b/src/ejabberd_local.erl @@ -27,6 +27,7 @@ start() -> mod_vcard:start(), mod_offline:start(), mod_echo:start(), + mod_private:start(), ok. init() -> diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl index 1dfab8562..bb60b797c 100644 --- a/src/ejabberd_router.erl +++ b/src/ejabberd_router.erl @@ -142,8 +142,15 @@ do_route(From, To, Packet) -> ejabberd_s2s ! {route, From, To, Packet}; [R] -> Node = R#route.node, - ?DEBUG("routed to node ~p~n", [Node]), - {ejabberd_router, Node} ! {route, From, To, Packet} + case node() of + Node -> + Pid = R#local_route.pid, + ?DEBUG("routed to process ~p~n", [Pid]), + Pid ! {route, From, To, Packet}; + _ -> + ?DEBUG("routed to node ~p~n", [Node]), + {ejabberd_router, Node} ! {route, From, To, Packet} + end end; [R] -> Pid = R#local_route.pid, diff --git a/src/mod_private.erl b/src/mod_private.erl new file mode 100644 index 000000000..4f8164c12 --- /dev/null +++ b/src/mod_private.erl @@ -0,0 +1,95 @@ +%%%---------------------------------------------------------------------- +%%% File : mod_private.erl +%%% Author : Alexey Shchepin +%%% Purpose : +%%% Created : 16 Jan 2003 by Alexey Shchepin +%%% Id : $Id$ +%%%---------------------------------------------------------------------- + +-module(mod_private). +-author('alexey@sevcom.net'). +-vsn('$Revision$ '). + +-export([start/0, + process_local_iq/3]). + +-include("ejabberd.hrl"). +-include("namespaces.hrl"). + +-record(private_storage, {userns, xml}). + +start() -> + mnesia:create_table(private_storage, + [{disc_only_copies, [node()]}, + {attributes, record_info(fields, private_storage)}]), + ejabberd_local:register_iq_handler(?NS_PRIVATE, ?MODULE, process_local_iq). + + +process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> + {User, Server, _} = From, + LUser = jlib:tolower(User), + LServer = jlib:tolower(Server), + case ?MYNAME of + Server -> + {xmlelement, Name, Attrs, Els} = SubEl, + case Type of + set -> + F = fun() -> + lists:foreach( + fun(El) -> + set_data(LUser, El) + end, Els) + end, + mnesia:transaction(F), + {iq, ID, result, XMLNS, [{xmlelement, Name, Attrs, []}]}; + get -> + case catch get_data(LUser, Els) of + {'EXIT', Reason} -> + {iq, ID, error, XMLNS, + [SubEl, {xmlelement, "error", + [{"code", "500"}], + [{xmlcdata, "Internal Server Error"}]}]}; + Res -> + {iq, ID, error, XMLNS, + [{xmlelement, Name, Attrs, Res}]} + end + end; + _ -> + {iq, ID, error, XMLNS, [SubEl, {xmlelement, "error", + [{"code", "405"}], + [{xmlcdata, "Not Allowed"}]}]} + end. + +set_data(LUser, El) -> + case El of + {xmlelement, Name, Attrs, Els} -> + XMLNS = xml:get_attr_s("xmlns", Attrs), + case XMLNS of + "" -> + ignore; + _ -> + mnesia:write(#private_storage{userns = {LUser, XMLNS}, + xml = El}) + end; + _ -> + ignore + end. + +get_data(LUser, Els) -> + get_data(LUser, Els, []). + +get_data(LUser, [], Res) -> + lists:reverse(Res); +get_data(LUser, [El | Els], Res) -> + case El of + {xmlelement, Name, Attrs, _} -> + XMLNS = xml:get_attr_s("xmlns", Attrs), + case mnesia:dirty_read(private_storage, {LUser, XMLNS}) of + [R] -> + get_data(LUser, Els, [R#private_storage.xml | Res]); + [] -> + get_data(LUser, Els, [El | Res]) + end; + _ -> + get_data(LUser, Els, Res) + end. diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl index 0b2c8d443..91f8904c2 100644 --- a/src/mod_vcard.erl +++ b/src/mod_vcard.erl @@ -53,13 +53,13 @@ start() -> mnesia:add_table_index(vcard_search, lorgname), mnesia:add_table_index(vcard_search, lorgunit), - ejabberd_local:register_iq_handler(?NS_VCARD, ?MODULE, process_local_iq), ejabberd_sm:register_iq_handler(?NS_VCARD, ?MODULE, process_sm_iq), spawn(?MODULE, init, []). + init() -> ejabberd_router:register_local_route("vjud." ++ ?MYNAME), loop(). diff --git a/src/namespaces.hrl b/src/namespaces.hrl index 0786a5974..21835b43d 100644 --- a/src/namespaces.hrl +++ b/src/namespaces.hrl @@ -8,8 +8,11 @@ -define(NS_DISCO_ITEMS, "http://jabber.org/protocol/disco#items"). -define(NS_DISCO_INFO, "http://jabber.org/protocol/disco#info"). -define(NS_VCARD, "vcard-temp"). +-define(NS_AUTH, "jabber:iq:auth"). +-define(NS_REGISTER, "jabber:iq:register"). -define(NS_SEARCH, "jabber:iq:search"). -define(NS_ROSTER, "jabber:iq:roster"). +-define(NS_PRIVATE, "jabber:iq:private"). -define(NS_XDATA, "jabber:x:data"). -define(NS_DELAY, "jabber:x:delay"). -define(NS_EVENT, "jabber:x:event"). diff --git a/src/translate.erl b/src/translate.erl index ca2a8f03c..062ed846b 100644 --- a/src/translate.erl +++ b/src/translate.erl @@ -41,21 +41,14 @@ load_dir(Dir) -> ok. load_file(Lang, File) -> - {ok, Bin} = file:read_file(File), - Content = binary_to_list(Bin), - parse(Lang, Content). - - -parse(Lang, String) -> - case erl_scan:tokens([], String, 0) of - {done, Result, Left} -> - {ok, Tokens, _} = Result, - {ok, Term} = erl_parse:parse_term(Tokens), - {Orig, Trans} = Term, - ets:insert(translations, {{Lang, Orig}, Trans}), - parse(Lang, Left); - _ -> - ok + case file:consult(File) of + {ok, Terms} -> + lists:foreach(fun({Orig, Trans}) -> + ets:insert(translations, + {{Lang, Orig}, Trans}) + end, Terms); + {error, Reason} -> + exit(file:format_error(Reason)) end. translate(Lang, Msg) ->