summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2003-01-26 20:16:53 +0000
committerAlexey Shchepin <alexey@process-one.net>2003-01-26 20:16:53 +0000
commitaed24c637fea62e0a72636fd0a1714a9ecd16a6b (patch)
tree612296a521a90c06d582d5745c09981ea859d93e /src
parent*** empty log message *** (diff)
*** empty log message ***
SVN Revision: 51
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd.erl3
-rw-r--r--src/ejabberd.hrl5
-rw-r--r--src/ejabberd_auth.erl10
-rw-r--r--src/ejabberd_s2s.erl63
-rw-r--r--src/ejabberd_s2s_in.erl5
-rw-r--r--src/ejabberd_s2s_out.erl53
-rw-r--r--src/jlib.erl33
-rw-r--r--src/mod_configure.erl34
-rw-r--r--src/mod_disco.erl3
-rw-r--r--src/mod_offline.erl10
-rw-r--r--src/mod_roster.erl13
-rw-r--r--src/mod_vcard.erl16
-rw-r--r--src/xml.erl67
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
+% $& -> "&amp;";
+% $< -> "&lt;";
+% $> -> "&gt;";
+% $" -> "&quot;";
+% $' -> "&apos;";
+% _ -> 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.