diff options
author | Alexey Shchepin <alexey@process-one.net> | 2003-01-26 20:16:53 +0000 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2003-01-26 20:16:53 +0000 |
commit | aed24c637fea62e0a72636fd0a1714a9ecd16a6b (patch) | |
tree | 612296a521a90c06d582d5745c09981ea859d93e /src | |
parent | *** empty log message *** (diff) |
*** empty log message ***
SVN Revision: 51
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd.erl | 3 | ||||
-rw-r--r-- | src/ejabberd.hrl | 5 | ||||
-rw-r--r-- | src/ejabberd_auth.erl | 10 | ||||
-rw-r--r-- | src/ejabberd_s2s.erl | 63 | ||||
-rw-r--r-- | src/ejabberd_s2s_in.erl | 5 | ||||
-rw-r--r-- | src/ejabberd_s2s_out.erl | 53 | ||||
-rw-r--r-- | src/jlib.erl | 33 | ||||
-rw-r--r-- | src/mod_configure.erl | 34 | ||||
-rw-r--r-- | src/mod_disco.erl | 3 | ||||
-rw-r--r-- | src/mod_offline.erl | 10 | ||||
-rw-r--r-- | src/mod_roster.erl | 13 | ||||
-rw-r--r-- | src/mod_vcard.erl | 16 | ||||
-rw-r--r-- | src/xml.erl | 67 |
13 files changed, 225 insertions, 90 deletions
diff --git a/src/ejabberd.erl b/src/ejabberd.erl index 4a2b3440..a5c3675e 100644 --- a/src/ejabberd.erl +++ b/src/ejabberd.erl @@ -19,6 +19,9 @@ start() -> init() -> register(ejabberd, self()), + % Profiling + %eprof:start(), + %eprof:profile([self()]), %erlang:system_flag(fullsweep_after, 0), error_logger:logfile({open, ?ERROR_LOG_PATH}), randoms:start(), diff --git a/src/ejabberd.hrl b/src/ejabberd.hrl index c05f766d..68499e66 100644 --- a/src/ejabberd.hrl +++ b/src/ejabberd.hrl @@ -8,8 +8,8 @@ -define(VERSION, "0.0.1-alpha"). -%-define(ejabberd_debug, true). -%-define(DBGFSM, true). +-define(ejabberd_debug, true). +-define(DBGFSM, true). -ifdef(ejabberd_debug). -define(DEBUG(Format, Args), io:format("D(~p:~p:~p) : "++Format++"~n", @@ -25,6 +25,7 @@ %-define(MYNAME,"e.localhost"). -define(MYNAME, ejabberd_config:get_global_option(host)). +-define(S2STIMEOUT, 1200000). -define(MSGS_DIR, "msgs"). -define(CONFIG_PATH, "ejabberd.cfg"). diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl index 7715a01f..d280a429 100644 --- a/src/ejabberd_auth.erl +++ b/src/ejabberd_auth.erl @@ -23,7 +23,8 @@ try_register/2, dirty_get_registered_users/0, get_password_s/1, - is_user_exists/1]). + is_user_exists/1, + remove_user/1]). %% gen_server callbacks -export([init/1, @@ -198,3 +199,10 @@ is_user_exists(User) -> _ -> false end. + +remove_user(User) -> + LUser = jlib:tolower(User), + F = fun() -> + mnesia:delete({passwd, LUser}) + end, + mnesia:transaction(F). diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index 3a2d19a5..fbe6092f 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -106,18 +106,6 @@ have_connection(FromTo) -> false end. -%get_key(FromTo) -> -% F = fun() -> -% [E] = mnesia:read({s2s, FromTo}), -% E -% end, -% case mnesia:transaction(F) of -% {atomic, E} -> -% E#s2s.key; -% _ -> -% "" -% end. - get_key(FromTo) -> case catch mnesia:dirty_read(s2s, FromTo) of [E] -> @@ -159,24 +147,7 @@ do_route(From, To, Packet) -> {User, Server, Resource} = To, FromTo = {MyServer, Server}, Key = randoms:get_string(), - F = fun() -> - case mnesia:read({local_s2s, FromTo}) of - [] -> - case mnesia:read({s2s, FromTo}) of - [Er] -> - {remote, Er#s2s.node}; - [] -> - % TODO - mnesia:write(#s2s{fromto = FromTo, - node = node(), - key = Key}), - new - end; - [El] -> - {local, El#local_s2s.pid} - end - end, - case mnesia:transaction(F) of + case find_connection(FromTo, Key) of {atomic, {local, Pid}} -> ?DEBUG("sending to process ~p~n", [Pid]), % TODO @@ -211,6 +182,38 @@ do_route(From, To, Packet) -> false end. +find_connection(FromTo, Key) -> + F = fun() -> + case mnesia:read({local_s2s, FromTo}) of + [] -> + case mnesia:read({s2s, FromTo}) of + [Er] -> + {remote, Er#s2s.node}; + [] -> + mnesia:write(#s2s{fromto = FromTo, + node = node(), + key = Key}), + new + end; + [El] -> + {local, El#local_s2s.pid} + end + end, + case catch mnesia:dirty_read({local_s2s, FromTo}) of + {'EXIT', Reason} -> + {aborted, Reason}; + [] -> + case catch mnesia:dirty_read({s2s, FromTo}) of + [Er] -> + {atomic, {remote, Er#s2s.node}}; + [] -> + mnesia:transaction(F) + end; + [El] -> + {atomic, {local, El#local_s2s.pid}} + end. + + send_element(Pid, El) -> Pid ! {send_element, El}. diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl index 782788ac..fbc572d3 100644 --- a/src/ejabberd_s2s_in.erl +++ b/src/ejabberd_s2s_in.erl @@ -250,12 +250,15 @@ stream_established({xmlstreamelement, El}, StateData) -> error end end, - {next_state, stream_established, StateData}; + {next_state, stream_established, StateData, ?S2STIMEOUT}; stream_established({xmlstreamend, Name}, StateData) -> % TODO {stop, normal, StateData}; +stream_established(timeout, StateData) -> + {stop, normal, StateData}; + stream_established(closed, StateData) -> % TODO {stop, normal, StateData}. diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index 683cd784..799e9da4 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -175,7 +175,7 @@ wait_for_validation({xmlstreamelement, El}, StateData) -> case Type of "valid" -> send_queue(StateData#state.socket, StateData#state.queue), - {next_state, stream_established, StateData}; + {next_state, stream_established, StateData, ?S2STIMEOUT}; _ -> % TODO: bounce packets {stop, normal, StateData} @@ -212,6 +212,7 @@ wait_for_validation(closed, StateData) -> stream_established({xmlstreamelement, El}, StateData) -> + io:format("s2s out~n"), case is_verify_res(El) of {verify, VTo, VFrom, VId, VType} -> case StateData#state.verify of @@ -228,36 +229,36 @@ stream_established({xmlstreamelement, El}, StateData) -> _ -> ok end, - {xmlelement, Name, Attrs, Els} = El, - % TODO - From = xml:get_attr_s("from", Attrs), - FromJID1 = jlib:string_to_jid(From), - FromJID = case FromJID1 of - {Node, Server, Resource} -> - if Server == StateData#state.server -> FromJID1; - true -> error - end; - _ -> error - end, - To = xml:get_attr_s("to", Attrs), - ToJID = case To of - "" -> error; - _ -> jlib:string_to_jid(To) - end, - if ((Name == "iq") or (Name == "message") or (Name == "presence")) and - (ToJID /= error) and (FromJID /= error) -> - ejabberd_router:route(FromJID, ToJID, El); - true -> - error - end, - {next_state, stream_established, StateData}; + %{xmlelement, Name, Attrs, Els} = El, + %From = xml:get_attr_s("from", Attrs), + %FromJID1 = jlib:string_to_jid(From), + %FromJID = case FromJID1 of + % {Node, Server, Resource} -> + % if Server == StateData#state.server -> FromJID1; + % true -> error + % end; + % _ -> error + % end, + %To = xml:get_attr_s("to", Attrs), + %ToJID = case To of + % "" -> error; + % _ -> jlib:string_to_jid(To) + % end, + %if ((Name == "iq") or (Name == "message") or (Name == "presence")) and + % (ToJID /= error) and (FromJID /= error) -> + % ejabberd_router:route(FromJID, ToJID, El); + % true -> + % error + %end, + {next_state, stream_established, StateData, ?S2STIMEOUT}; stream_established({xmlstreamend, Name}, StateData) -> - % TODO + {stop, normal, StateData}; + +stream_established(timeout, StateData) -> {stop, normal, StateData}; stream_established(closed, StateData) -> - % TODO {stop, normal, StateData}. diff --git a/src/jlib.erl b/src/jlib.erl index c15bc06a..b9fb8b99 100644 --- a/src/jlib.erl +++ b/src/jlib.erl @@ -211,13 +211,32 @@ is_nodename1([]) -> % TODO: UNICODE support -tolower_c(C) when C >= $A, C =< $Z -> - C + 32; -tolower_c(C) -> - C. - -tolower(S) -> - lists:map(fun tolower_c/1, S). +%tolower_c(C) when C >= $A, C =< $Z -> +% C + 32; +%tolower_c(C) -> +% C. + +-define(LOWER(Char), + if + Char >= $A, Char =< $Z -> + Char + 32; + true -> + Char + end). + +%tolower(S) -> +% lists:map(fun tolower_c/1, S). + +%tolower(S) -> +% [?LOWER(Char) || Char <- S]. + +% Not tail-recursive but it seems works faster than variants above +tolower([C | Cs]) when C >= $A, C =< $Z -> + [C + 32 | tolower(Cs)]; +tolower([C | Cs]) -> + [C | tolower(Cs)]; +tolower([]) -> + []. jid_tolower({U, S, R}) -> diff --git a/src/mod_configure.erl b/src/mod_configure.erl index 405ad470..cc2f6727 100644 --- a/src/mod_configure.erl +++ b/src/mod_configure.erl @@ -202,6 +202,25 @@ get_form(["config", "acls"], Lang) -> } ]}; +get_form(["config", "remusers"], Lang) -> + {result, [{xmlelement, "title", [], + [{xmlcdata, + translate:translate( + Lang, "Remove Users")}]}, + {xmlelement, "instructions", [], + [{xmlcdata, + translate:translate( + Lang, "Choose users to remove")}]}] ++ + case catch ejabberd_auth:dirty_get_registered_users() of + {'EXIT', Reason} -> + []; + Users -> + lists:map(fun(U) -> + ?XFIELD("boolean", U, U, "0") + end, lists:sort(Users)) + end + }; + get_form(_, Lang) -> {error, "503", "Service Unavailable"}. @@ -254,6 +273,21 @@ set_form(["config", "hostname"], Lang, XData) -> {error, "406", "Not Acceptable"} end; +set_form(["config", "remusers"], Lang, XData) -> + lists:foreach( + fun({Var, Vals}) -> + case Vals of + ["1"] -> + catch ejabberd_auth:remove_user(Var), + catch mod_roster:remove_user(Var), + catch mod_offline:remove_user(Var), + catch mod_vcard:remove_user(Var); + _ -> + ok + end + end, XData), + {result, []}; + set_form(_, Lang, XData) -> {error, "503", "Service Unavailable"}. diff --git a/src/mod_disco.erl b/src/mod_disco.erl index 56bd4b00..bb3d40ff 100644 --- a/src/mod_disco.erl +++ b/src/mod_disco.erl @@ -160,7 +160,8 @@ get_local_items(["config"], Server, Lang) -> [?NODE("Host Name", "config/hostname"), ?NODE("ACLs", "config/acls"), ?NODE("Access Rules", "config/access"), - ?NODE("Loaded Modules", "config/modules") + ?NODE("Loaded Modules", "config/modules"), + ?NODE("Remove Users", "config/remusers") ]}; get_local_items(["config", _], Server, Lang) -> diff --git a/src/mod_offline.erl b/src/mod_offline.erl index f524735a..b5e84cad 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -13,7 +13,8 @@ -export([start/1, store_packet/3, - resend_offline_messages/1]). + resend_offline_messages/1, + remove_user/1]). -include("namespaces.hrl"). @@ -115,3 +116,10 @@ resend_offline_messages(User) -> _ -> ok end. + +remove_user(User) -> + LUser = jlib:tolower(User), + F = fun() -> + mnesia:delete({offline_msg, LUser}) + end, + mnesia:transaction(F). diff --git a/src/mod_roster.erl b/src/mod_roster.erl index ea8e48a5..22a1d185 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -17,7 +17,8 @@ process_local_iq/3, get_subscription_lists/1, in_subscription/3, - out_subscription/3]). + out_subscription/3, + remove_user/1]). -include_lib("mnemosyne/include/mnemosyne.hrl"). -include("ejabberd.hrl"). @@ -459,3 +460,13 @@ out_subscription(User, JID, Type) -> false end. +remove_user(User) -> + LUser = jlib:tolower(User), + F = fun() -> + lists:foreach(fun(R) -> + mnesia:delete_object(R) + end, + mnesia:index_read(roster, LUser, #roster.user)) + end, + mnesia:transaction(F). + diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl index cba7ee06..b41b2101 100644 --- a/src/mod_vcard.erl +++ b/src/mod_vcard.erl @@ -15,7 +15,8 @@ -export([start/1, init/1, process_local_iq/3, process_sm_iq/3, - reindex_vcards/0]). + reindex_vcards/0, + remove_user/1]). -include("ejabberd.hrl"). -include("namespaces.hrl"). @@ -478,3 +479,16 @@ reindex_vcards() -> mnesia:transaction(F). +remove_user(User) -> + LUser = jlib:tolower(User), + F = fun() -> + mnesia:delete({vcard, LUser}), + lists:foreach(fun(R) -> + mnesia:delete_object(R) + end, + mnesia:index_read(vcard_search, + LUser, + #vcard_search.luser)) + end, + mnesia:transaction(F). + diff --git a/src/xml.erl b/src/xml.erl index 1c5d9213..76da8a70 100644 --- a/src/xml.erl +++ b/src/xml.erl @@ -10,7 +10,9 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). --export([element_to_string/1, crypt/1, remove_cdata/1, +-export([element_to_string/1, + crypt/1, + remove_cdata/1, get_cdata/1, get_tag_cdata/1, get_attr/2, get_attr_s/2, get_tag_attr/2, get_tag_attr_s/2, @@ -38,24 +40,51 @@ attrs_to_string(Attrs) -> attr_to_string({Name, Value}) -> " " ++ crypt(Name) ++ "='" ++ crypt(Value) ++ "'". -crypt(S) -> - lists:reverse(crypt(S, "")). - -crypt([$& | S], R) -> - crypt(S, [$;, $p, $m, $a, $& | R]); -crypt([$< | S], R) -> - crypt(S, [$;, $t, $l, $& | R]); -crypt([$> | S], R) -> - crypt(S, [$;, $t, $g, $& | R]); -crypt([$" | S], R) -> - crypt(S, [$;, $t, $o, $u, $q, $& | R]); -crypt([$' | S], R) -> - crypt(S, [$;, $s, $o, $p, $a, $& | R]); -crypt([C | S], R) -> - crypt(S, [C | R]); -crypt([], R) -> - R. - +%crypt(S) -> +% lists:reverse(crypt(S, "")). +% +%crypt([$& | S], R) -> +% crypt(S, [$;, $p, $m, $a, $& | R]); +%crypt([$< | S], R) -> +% crypt(S, [$;, $t, $l, $& | R]); +%crypt([$> | S], R) -> +% crypt(S, [$;, $t, $g, $& | R]); +%crypt([$" | S], R) -> +% crypt(S, [$;, $t, $o, $u, $q, $& | R]); +%crypt([$' | S], R) -> +% crypt(S, [$;, $s, $o, $p, $a, $& | R]); +%crypt([C | S], R) -> +% crypt(S, [C | R]); +%crypt([], R) -> +% R. + +%crypt1(S) -> +% lists:flatten([case C of +% $& -> "&"; +% $< -> "<"; +% $> -> ">"; +% $" -> """; +% $' -> "'"; +% _ -> C +% end || C <- S]). + +% Not tail-recursive but it seems works faster than variants above +crypt([$& | S]) -> + [$&, $a, $m, $p, $; | crypt(S)]; +crypt([$< | S]) -> + [$&, $l, $t, $; | crypt(S)]; +crypt([$> | S]) -> + [$&, $g, $t, $; | crypt(S)]; +crypt([$" | S]) -> + [$&, $q, $u, $o, $t, $; | crypt(S)]; +crypt([$' | S]) -> + [$&, $a, $p, $o, $s, $; | crypt(S)]; +crypt([C | S]) -> + [C | crypt(S)]; +crypt([]) -> + []. + + remove_cdata_p({xmlelement, Name, Attrs, Els}) -> true; remove_cdata_p(_) -> false. |