parent
1834fb3a72
commit
ca5d88c368
|
@ -1,3 +1,11 @@
|
||||||
|
2003-07-20 Alexey Shchepin <alexey@sevcom.net>
|
||||||
|
|
||||||
|
* (all): Reorganized supervision tree
|
||||||
|
|
||||||
|
2003-07-19 Alexey Shchepin <alexey@sevcom.net>
|
||||||
|
|
||||||
|
* src/mod_register.erl: Bugfix
|
||||||
|
|
||||||
2003-07-14 Alexey Shchepin <alexey@sevcom.net>
|
2003-07-14 Alexey Shchepin <alexey@sevcom.net>
|
||||||
|
|
||||||
* src/ejabberd_s2s_out.erl: Close connection after key
|
* src/ejabberd_s2s_out.erl: Close connection after key
|
||||||
|
|
|
@ -4,7 +4,12 @@
|
||||||
[{description, "ejabberd"},
|
[{description, "ejabberd"},
|
||||||
{vsn, "0.1-alpha"},
|
{vsn, "0.1-alpha"},
|
||||||
{modules, [acl,
|
{modules, [acl,
|
||||||
|
configure,
|
||||||
|
cyrsasl,
|
||||||
|
cyrsasl_digest,
|
||||||
|
cyrsasl_plain,
|
||||||
ejabberd,
|
ejabberd,
|
||||||
|
ejabberd_app,
|
||||||
ejabberd_auth,
|
ejabberd_auth,
|
||||||
ejabberd_c2s,
|
ejabberd_c2s,
|
||||||
ejabberd_config,
|
ejabberd_config,
|
||||||
|
@ -16,6 +21,11 @@
|
||||||
ejabberd_s2s_out,
|
ejabberd_s2s_out,
|
||||||
ejabberd_service,
|
ejabberd_service,
|
||||||
ejabberd_sm,
|
ejabberd_sm,
|
||||||
|
ejabberd_sup,
|
||||||
|
ejabberd_tmp_sup,
|
||||||
|
gen_iq_handler,
|
||||||
|
gen_mod,
|
||||||
|
jd2ejd,
|
||||||
jlib,
|
jlib,
|
||||||
mod_configure,
|
mod_configure,
|
||||||
mod_disco,
|
mod_disco,
|
||||||
|
@ -30,18 +40,31 @@
|
||||||
mod_version,
|
mod_version,
|
||||||
randoms,
|
randoms,
|
||||||
sha,
|
sha,
|
||||||
|
shaper,
|
||||||
translate,
|
translate,
|
||||||
xml,
|
xml,
|
||||||
xml_stream
|
xml_stream
|
||||||
]},
|
]},
|
||||||
{registered, [ejabberd,
|
{registered, [ejabberd,
|
||||||
|
ejabberd_sup,
|
||||||
ejabberd_auth,
|
ejabberd_auth,
|
||||||
ejabberd_router,
|
ejabberd_router,
|
||||||
ejabberd_sm,
|
ejabberd_sm,
|
||||||
ejabberd_s2s,
|
ejabberd_s2s,
|
||||||
ejabberd_local,
|
ejabberd_local,
|
||||||
|
ejabberd_listeners,
|
||||||
|
ejabberd_iq_sup,
|
||||||
|
ejabberd_service_sup,
|
||||||
|
ejabberd_s2s_out_sup,
|
||||||
|
ejabberd_s2s_in_sup,
|
||||||
|
ejabberd_c2s_sup,
|
||||||
ejabberd_mod_roster,
|
ejabberd_mod_roster,
|
||||||
ejabberd_listeners
|
ejabberd_mod_echo,
|
||||||
|
ejabberd_mod_pubsub,
|
||||||
|
ejabberd_mod_irc,
|
||||||
|
ejabberd_mod_muc,
|
||||||
|
ejabberd_offline,
|
||||||
|
random_generator
|
||||||
]},
|
]},
|
||||||
{applications, [kernel, stdlib]},
|
{applications, [kernel, stdlib]},
|
||||||
{env, []},
|
{env, []},
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
-export([start/0, stop/0]).
|
-export([start/0, stop/0]).
|
||||||
|
|
||||||
start() ->
|
start() ->
|
||||||
%application:start(mnesia),
|
|
||||||
application:start(ejabberd).
|
application:start(ejabberd).
|
||||||
|
|
||||||
stop() ->
|
stop() ->
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
|
|
||||||
start(normal, Args) ->
|
start(normal, Args) ->
|
||||||
|
application:start(sasl),
|
||||||
randoms:start(),
|
randoms:start(),
|
||||||
db_init(),
|
db_init(),
|
||||||
sha:start(),
|
sha:start(),
|
||||||
|
@ -29,6 +30,9 @@ start(normal, Args) ->
|
||||||
ejabberd_config:start(),
|
ejabberd_config:start(),
|
||||||
ejabberd_auth:start(),
|
ejabberd_auth:start(),
|
||||||
cyrsasl:start(),
|
cyrsasl:start(),
|
||||||
|
% Profiling
|
||||||
|
%eprof:start(),
|
||||||
|
%eprof:profile([self()]),
|
||||||
Sup = ejabberd_sup:start_link(),
|
Sup = ejabberd_sup:start_link(),
|
||||||
start(),
|
start(),
|
||||||
load_modules(),
|
load_modules(),
|
||||||
|
@ -40,13 +44,10 @@ stop(StartArgs) ->
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
start() ->
|
start() ->
|
||||||
spawn(?MODULE, init, []).
|
spawn_link(?MODULE, init, []).
|
||||||
|
|
||||||
init() ->
|
init() ->
|
||||||
register(ejabberd, self()),
|
register(ejabberd, self()),
|
||||||
% Profiling
|
|
||||||
%eprof:start(),
|
|
||||||
%eprof:profile([self()]),
|
|
||||||
%erlang:system_flag(fullsweep_after, 0),
|
%erlang:system_flag(fullsweep_after, 0),
|
||||||
error_logger:logfile({open, ?LOG_PATH}),
|
error_logger:logfile({open, ?LOG_PATH}),
|
||||||
timer:apply_interval(3600000, ?MODULE, dump_ports, []),
|
timer:apply_interval(3600000, ?MODULE, dump_ports, []),
|
||||||
|
|
|
@ -13,7 +13,11 @@
|
||||||
-behaviour(gen_fsm).
|
-behaviour(gen_fsm).
|
||||||
|
|
||||||
%% External exports
|
%% External exports
|
||||||
-export([start_link/2, receiver/4, send_text/2, send_element/2]).
|
-export([start/2,
|
||||||
|
start_link/2,
|
||||||
|
receiver/4,
|
||||||
|
send_text/2,
|
||||||
|
send_element/2]).
|
||||||
|
|
||||||
%% gen_fsm callbacks
|
%% gen_fsm callbacks
|
||||||
-export([init/1,
|
-export([init/1,
|
||||||
|
@ -77,6 +81,9 @@
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%% API
|
%%% API
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
|
start(SockData, Opts) ->
|
||||||
|
supervisor:start_child(ejabberd_c2s_sup, [SockData, Opts]).
|
||||||
|
|
||||||
start_link(SockData, Opts) ->
|
start_link(SockData, Opts) ->
|
||||||
gen_fsm:start_link(ejabberd_c2s, [SockData, Opts], ?FSMOPTS).
|
gen_fsm:start_link(ejabberd_c2s, [SockData, Opts], ?FSMOPTS).
|
||||||
|
|
||||||
|
@ -430,14 +437,15 @@ wait_for_session(closed, StateData) ->
|
||||||
|
|
||||||
session_established({xmlstreamelement, El}, StateData) ->
|
session_established({xmlstreamelement, El}, StateData) ->
|
||||||
{xmlelement, Name, Attrs, Els} = El,
|
{xmlelement, Name, Attrs, Els} = El,
|
||||||
|
User = StateData#state.user,
|
||||||
Server = StateData#state.server,
|
Server = StateData#state.server,
|
||||||
FromJID = {StateData#state.user,
|
FromJID = {User,
|
||||||
Server,
|
Server,
|
||||||
StateData#state.resource},
|
StateData#state.resource},
|
||||||
To = xml:get_attr_s("to", Attrs),
|
To = xml:get_attr_s("to", Attrs),
|
||||||
ToJID = case To of
|
ToJID = case To of
|
||||||
"" ->
|
"" ->
|
||||||
{"", Server, ""};
|
{User, Server, ""};
|
||||||
_ ->
|
_ ->
|
||||||
jlib:string_to_jid(To)
|
jlib:string_to_jid(To)
|
||||||
end,
|
end,
|
||||||
|
@ -450,7 +458,7 @@ session_established({xmlstreamelement, El}, StateData) ->
|
||||||
case Name of
|
case Name of
|
||||||
"presence" ->
|
"presence" ->
|
||||||
case ToJID of
|
case ToJID of
|
||||||
{"", Server, ""} ->
|
{User, Server, ""} ->
|
||||||
?DEBUG("presence_update(~p,~n\t~p,~n\t~p)",
|
?DEBUG("presence_update(~p,~n\t~p,~n\t~p)",
|
||||||
[FromJID, El, StateData]),
|
[FromJID, El, StateData]),
|
||||||
presence_update(FromJID, El, StateData);
|
presence_update(FromJID, El, StateData);
|
||||||
|
|
|
@ -32,7 +32,7 @@ init(_) ->
|
||||||
permanent,
|
permanent,
|
||||||
brutal_kill,
|
brutal_kill,
|
||||||
worker,
|
worker,
|
||||||
[Module]}
|
[?MODULE]}
|
||||||
end, Ls)}}
|
end, Ls)}}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -56,7 +56,16 @@ init(Port, Module, Opts) ->
|
||||||
accept(ListenSocket, Module, Opts) ->
|
accept(ListenSocket, Module, Opts) ->
|
||||||
case gen_tcp:accept(ListenSocket) of
|
case gen_tcp:accept(ListenSocket) of
|
||||||
{ok, Socket} ->
|
{ok, Socket} ->
|
||||||
{ok, Pid} = apply(Module, start_link, [{gen_tcp, Socket}, Opts]),
|
{ok, Pid} = Module:start({gen_tcp, Socket}, Opts),
|
||||||
|
%{ok, Pid} =
|
||||||
|
% supervisor:start_child(
|
||||||
|
% ejabberd_tmp_sup,
|
||||||
|
% {{Module, Socket},
|
||||||
|
% {Module, start_link, [{gen_tcp, Socket}, Opts]},
|
||||||
|
% transient,
|
||||||
|
% brutal_kill,
|
||||||
|
% worker,
|
||||||
|
% [Module]}),
|
||||||
gen_tcp:controlling_process(Socket, Pid),
|
gen_tcp:controlling_process(Socket, Pid),
|
||||||
accept(ListenSocket, Module, Opts)
|
accept(ListenSocket, Module, Opts)
|
||||||
end.
|
end.
|
||||||
|
|
|
@ -168,7 +168,7 @@ do_route(From, To, Packet) ->
|
||||||
ok;
|
ok;
|
||||||
{atomic, new} ->
|
{atomic, new} ->
|
||||||
?DEBUG("starting new s2s connection~n", []),
|
?DEBUG("starting new s2s connection~n", []),
|
||||||
Pid = ejabberd_s2s_out:start_link(MyServer, Server, {new, Key}),
|
{ok, Pid} = ejabberd_s2s_out:start(MyServer, Server, {new, Key}),
|
||||||
mnesia:transaction(fun() ->
|
mnesia:transaction(fun() ->
|
||||||
mnesia:write(#local_s2s{fromto = FromTo,
|
mnesia:write(#local_s2s{fromto = FromTo,
|
||||||
pid = Pid})
|
pid = Pid})
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
-behaviour(gen_fsm).
|
-behaviour(gen_fsm).
|
||||||
|
|
||||||
%% External exports
|
%% External exports
|
||||||
-export([start_link/2, receiver/2, send_text/2, send_element/2]).
|
-export([start/2, start_link/2, receiver/2, send_text/2, send_element/2]).
|
||||||
|
|
||||||
%% gen_fsm callbacks
|
%% gen_fsm callbacks
|
||||||
-export([init/1,
|
-export([init/1,
|
||||||
|
@ -63,6 +63,9 @@
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%% API
|
%%% API
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
|
start(SockData, Opts) ->
|
||||||
|
supervisor:start_child(ejabberd_s2s_in_sup, [SockData, Opts]).
|
||||||
|
|
||||||
start_link(SockData, Opts) ->
|
start_link(SockData, Opts) ->
|
||||||
gen_fsm:start_link(ejabberd_s2s_in, [SockData], ?FSMOPTS).
|
gen_fsm:start_link(ejabberd_s2s_in, [SockData], ?FSMOPTS).
|
||||||
|
|
||||||
|
@ -134,8 +137,8 @@ wait_for_key({xmlstreamelement, El}, StateData) ->
|
||||||
?INFO_MSG("GET KEY: ~p", [{To, From, Id, Key}]),
|
?INFO_MSG("GET KEY: ~p", [{To, From, Id, Key}]),
|
||||||
case lists:member(To, ejabberd_router:dirty_get_all_domains()) of
|
case lists:member(To, ejabberd_router:dirty_get_all_domains()) of
|
||||||
true ->
|
true ->
|
||||||
ejabberd_s2s_out:start_link(To, From,
|
ejabberd_s2s_out:start(To, From,
|
||||||
{verify, self(), Key}),
|
{verify, self(), Key}),
|
||||||
{next_state,
|
{next_state,
|
||||||
wait_for_verification,
|
wait_for_verification,
|
||||||
StateData#state{myname = To,
|
StateData#state{myname = To,
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
-behaviour(gen_fsm).
|
-behaviour(gen_fsm).
|
||||||
|
|
||||||
%% External exports
|
%% External exports
|
||||||
-export([start_link/3, send_text/2, send_element/2]).
|
-export([start/3, start_link/3, send_text/2, send_element/2]).
|
||||||
|
|
||||||
%% gen_fsm callbacks
|
%% gen_fsm callbacks
|
||||||
-export([init/1,
|
-export([init/1,
|
||||||
|
@ -65,10 +65,11 @@
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%% API
|
%%% API
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
|
start(From, Host, Type) ->
|
||||||
|
supervisor:start_child(ejabberd_s2s_out_sup, [From, Host, Type]).
|
||||||
|
|
||||||
start_link(From, Host, Type) ->
|
start_link(From, Host, Type) ->
|
||||||
{ok, Pid} = gen_fsm:start_link(ejabberd_s2s_out, [From, Host, Type],
|
gen_fsm:start_link(ejabberd_s2s_out, [From, Host, Type], ?FSMOPTS).
|
||||||
?FSMOPTS),
|
|
||||||
Pid.
|
|
||||||
|
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%% Callback functions from gen_fsm
|
%%% Callback functions from gen_fsm
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
-behaviour(gen_fsm).
|
-behaviour(gen_fsm).
|
||||||
|
|
||||||
%% External exports
|
%% External exports
|
||||||
-export([start_link/2, receiver/2, send_text/2, send_element/2]).
|
-export([start/2, start_link/2, receiver/2, send_text/2, send_element/2]).
|
||||||
|
|
||||||
%% gen_fsm callbacks
|
%% gen_fsm callbacks
|
||||||
-export([init/1,
|
-export([init/1,
|
||||||
|
@ -69,6 +69,9 @@
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%% API
|
%%% API
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
|
start(SockData, Opts) ->
|
||||||
|
supervisor:start_child(ejabberd_service_sup, [SockData, Opts]).
|
||||||
|
|
||||||
start_link(SockData, Opts) ->
|
start_link(SockData, Opts) ->
|
||||||
gen_fsm:start_link(ejabberd_service, [SockData, Opts], ?FSMOPTS).
|
gen_fsm:start_link(ejabberd_service, [SockData, Opts], ?FSMOPTS).
|
||||||
|
|
||||||
|
|
|
@ -46,9 +46,55 @@ init([]) ->
|
||||||
Listener = {ejabberd_listener,
|
Listener = {ejabberd_listener,
|
||||||
{ejabberd_listener, start_link, []},
|
{ejabberd_listener, start_link, []},
|
||||||
permanent,
|
permanent,
|
||||||
brutal_kill,
|
infinity,
|
||||||
supervisor,
|
supervisor,
|
||||||
[ejabberd_listener]},
|
[ejabberd_listener]},
|
||||||
{ok, {{one_for_one, 10, 1}, [Router, SM, S2S, Local, Listener]}}.
|
C2SSupervisor =
|
||||||
|
{ejabberd_c2s_sup,
|
||||||
|
{ejabberd_tmp_sup, start_link, [ejabberd_c2s_sup, ejabberd_c2s]},
|
||||||
|
permanent,
|
||||||
|
infinity,
|
||||||
|
supervisor,
|
||||||
|
[ejabberd_tmp_sup]},
|
||||||
|
S2SInSupervisor =
|
||||||
|
{ejabberd_s2s_in_sup,
|
||||||
|
{ejabberd_tmp_sup, start_link,
|
||||||
|
[ejabberd_s2s_in_sup, ejabberd_s2s_in]},
|
||||||
|
permanent,
|
||||||
|
infinity,
|
||||||
|
supervisor,
|
||||||
|
[ejabberd_tmp_sup]},
|
||||||
|
S2SOutSupervisor =
|
||||||
|
{ejabberd_s2s_out_sup,
|
||||||
|
{ejabberd_tmp_sup, start_link,
|
||||||
|
[ejabberd_s2s_out_sup, ejabberd_s2s_out]},
|
||||||
|
permanent,
|
||||||
|
infinity,
|
||||||
|
supervisor,
|
||||||
|
[ejabberd_tmp_sup]},
|
||||||
|
ServiceSupervisor =
|
||||||
|
{ejabberd_service_sup,
|
||||||
|
{ejabberd_tmp_sup, start_link,
|
||||||
|
[ejabberd_service_sup, ejabberd_service]},
|
||||||
|
permanent,
|
||||||
|
infinity,
|
||||||
|
supervisor,
|
||||||
|
[ejabberd_tmp_sup]},
|
||||||
|
IQSupervisor =
|
||||||
|
{ejabberd_iq_sup,
|
||||||
|
{ejabberd_tmp_sup, start_link,
|
||||||
|
[ejabberd_iq_sup, gen_iq_handler]},
|
||||||
|
permanent,
|
||||||
|
infinity,
|
||||||
|
supervisor,
|
||||||
|
[ejabberd_tmp_sup]},
|
||||||
|
{ok, {{one_for_one, 10, 1},
|
||||||
|
[Router, SM, S2S, Local,
|
||||||
|
C2SSupervisor,
|
||||||
|
S2SInSupervisor,
|
||||||
|
S2SOutSupervisor,
|
||||||
|
ServiceSupervisor,
|
||||||
|
IQSupervisor,
|
||||||
|
Listener]}}.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
%%%----------------------------------------------------------------------
|
||||||
|
%%% File : ejabberd_tmp_sup.erl
|
||||||
|
%%% Author : Alexey Shchepin <alexey@sevcom.net>
|
||||||
|
%%% Purpose : Supervisor for temporary processess
|
||||||
|
%%% Created : 18 Jul 2003 by Alexey Shchepin <alexey@sevcom.net>
|
||||||
|
%%% Id : $Id$
|
||||||
|
%%%----------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(ejabberd_tmp_sup).
|
||||||
|
-author('alexey@sevcom.net').
|
||||||
|
-vsn('$Revision$ ').
|
||||||
|
|
||||||
|
-export([start_link/2, init/1]).
|
||||||
|
|
||||||
|
start_link(Name, Module) ->
|
||||||
|
supervisor:start_link({local, Name}, ?MODULE, Module).
|
||||||
|
|
||||||
|
|
||||||
|
init(Module) ->
|
||||||
|
{ok, {{simple_one_for_one, 10, 1},
|
||||||
|
[{undefined, {Module, start_link, []},
|
||||||
|
temporary, brutal_kill, worker, [Module]}]}}.
|
|
@ -11,6 +11,7 @@
|
||||||
-vsn('$Revision$ ').
|
-vsn('$Revision$ ').
|
||||||
|
|
||||||
-export([start/0,
|
-export([start/0,
|
||||||
|
start_link/2,
|
||||||
add_iq_handler/5,
|
add_iq_handler/5,
|
||||||
remove_iq_handler/2,
|
remove_iq_handler/2,
|
||||||
stop_iq_handler/3,
|
stop_iq_handler/3,
|
||||||
|
@ -28,7 +29,8 @@ add_iq_handler(Component, NS, Module, Function, Type) ->
|
||||||
no_queue ->
|
no_queue ->
|
||||||
Component:register_iq_handler(NS, Module, Function, no_queue);
|
Component:register_iq_handler(NS, Module, Function, no_queue);
|
||||||
one_queue ->
|
one_queue ->
|
||||||
Pid = spawn(?MODULE, queue_init, [Module, Function]),
|
{ok, Pid} = supervisor:start_child(ejabberd_iq_sup,
|
||||||
|
[Module, Function]),
|
||||||
Component:register_iq_handler(NS, Module, Function,
|
Component:register_iq_handler(NS, Module, Function,
|
||||||
{one_queue, Pid});
|
{one_queue, Pid});
|
||||||
parallel ->
|
parallel ->
|
||||||
|
@ -73,6 +75,9 @@ process_iq(Module, Function, From, To, IQ) ->
|
||||||
end
|
end
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
start_link(Module, Function) ->
|
||||||
|
{ok, proc_lib:spawn_link(?MODULE, queue_init, [Module, Function])}.
|
||||||
|
|
||||||
queue_init(Module, Function) ->
|
queue_init(Module, Function) ->
|
||||||
queue_loop(Module, Function).
|
queue_loop(Module, Function).
|
||||||
|
|
||||||
|
|
17
src/jlib.erl
17
src/jlib.erl
|
@ -238,13 +238,24 @@ is_nodename1([]) ->
|
||||||
% [?LOWER(Char) || Char <- S].
|
% [?LOWER(Char) || Char <- S].
|
||||||
|
|
||||||
% Not tail-recursive but it seems works faster than variants above
|
% 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]) ->
|
tolower([C | Cs]) ->
|
||||||
[C | tolower(Cs)];
|
if
|
||||||
|
C >= $A, C =< $Z ->
|
||||||
|
[C + 32 | tolower(Cs)];
|
||||||
|
true ->
|
||||||
|
[C | tolower(Cs)]
|
||||||
|
end;
|
||||||
tolower([]) ->
|
tolower([]) ->
|
||||||
[].
|
[].
|
||||||
|
|
||||||
|
%tolower([C | Cs]) when C >= $A, C =< $Z ->
|
||||||
|
% [C + 32 | tolower(Cs)];
|
||||||
|
%tolower([C | Cs]) ->
|
||||||
|
% [C | tolower(Cs)];
|
||||||
|
%tolower([]) ->
|
||||||
|
% [].
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
jid_tolower({U, S, R}) ->
|
jid_tolower({U, S, R}) ->
|
||||||
{tolower(U), tolower(S), R}.
|
{tolower(U), tolower(S), R}.
|
||||||
|
|
|
@ -26,7 +26,7 @@ start(Opts) ->
|
||||||
mnesia:create_table(private_storage,
|
mnesia:create_table(private_storage,
|
||||||
[{disc_only_copies, [node()]},
|
[{disc_only_copies, [node()]},
|
||||||
{attributes, record_info(fields, private_storage)}]),
|
{attributes, record_info(fields, private_storage)}]),
|
||||||
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_PRIVATE,
|
gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_PRIVATE,
|
||||||
?MODULE, process_local_iq, IQDisc).
|
?MODULE, process_local_iq, IQDisc).
|
||||||
|
|
||||||
stop() ->
|
stop() ->
|
||||||
|
|
|
@ -13,12 +13,12 @@
|
||||||
-behaviour(gen_mod).
|
-behaviour(gen_mod).
|
||||||
|
|
||||||
-export([start/1,
|
-export([start/1,
|
||||||
init/2,
|
init/3,
|
||||||
|
loop/2,
|
||||||
stop/0,
|
stop/0,
|
||||||
% TODO: remove
|
system_continue/3,
|
||||||
create_new_node/3,
|
system_terminate/4,
|
||||||
publish_item/5,
|
system_code_change/4]).
|
||||||
delete_item/4]).
|
|
||||||
|
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
-include("jlib.hrl").
|
-include("jlib.hrl").
|
||||||
|
@ -43,11 +43,12 @@ start(Opts) ->
|
||||||
mnesia:add_table_index(pubsub_node, parent),
|
mnesia:add_table_index(pubsub_node, parent),
|
||||||
Host = gen_mod:get_opt(host, Opts, "pubsub." ++ ?MYNAME),
|
Host = gen_mod:get_opt(host, Opts, "pubsub." ++ ?MYNAME),
|
||||||
ServedHosts = gen_mod:get_opt(served_hosts, Opts, [?MYNAME]),
|
ServedHosts = gen_mod:get_opt(served_hosts, Opts, [?MYNAME]),
|
||||||
register(ejabberd_mod_pubsub, spawn(?MODULE, init, [Host, ServedHosts])).
|
register(ejabberd_mod_pubsub,
|
||||||
|
proc_lib:spawn_link(?MODULE, init, [Host, ServedHosts, self()])).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
init(Host, ServedHosts) ->
|
init(Host, ServedHosts, Parent) ->
|
||||||
ejabberd_router:register_route(Host),
|
ejabberd_router:register_route(Host),
|
||||||
create_new_node(Host, ["pubsub"], {"", Host, ""}),
|
create_new_node(Host, ["pubsub"], {"", Host, ""}),
|
||||||
create_new_node(Host, ["pubsub", "nodes"], {"", Host, ""}),
|
create_new_node(Host, ["pubsub", "nodes"], {"", Host, ""}),
|
||||||
|
@ -55,9 +56,9 @@ init(Host, ServedHosts) ->
|
||||||
lists:foreach(fun(H) ->
|
lists:foreach(fun(H) ->
|
||||||
create_new_node(Host, ["home", H], {"", Host, ""})
|
create_new_node(Host, ["home", H], {"", Host, ""})
|
||||||
end, ServedHosts),
|
end, ServedHosts),
|
||||||
loop(Host).
|
loop(Host, Parent).
|
||||||
|
|
||||||
loop(Host) ->
|
loop(Host, Parent) ->
|
||||||
receive
|
receive
|
||||||
{route, From, To, Packet} ->
|
{route, From, To, Packet} ->
|
||||||
case catch do_route(Host, From, To, Packet) of
|
case catch do_route(Host, From, To, Packet) of
|
||||||
|
@ -66,17 +67,19 @@ loop(Host) ->
|
||||||
_ ->
|
_ ->
|
||||||
ok
|
ok
|
||||||
end,
|
end,
|
||||||
loop(Host);
|
loop(Host, Parent);
|
||||||
{room_destroyed, Room} ->
|
{room_destroyed, Room} ->
|
||||||
ets:delete(muc_online_room, Room),
|
ets:delete(muc_online_room, Room),
|
||||||
loop(Host);
|
loop(Host, Parent);
|
||||||
stop ->
|
stop ->
|
||||||
ejabberd_router:unregister_global_route(Host),
|
ejabberd_router:unregister_global_route(Host),
|
||||||
ok;
|
ok;
|
||||||
reload ->
|
reload ->
|
||||||
?MODULE:loop(Host);
|
?MODULE:loop(Host, Parent);
|
||||||
|
{system, From, Request} ->
|
||||||
|
sys:handle_system_msg(Request, From, Parent, ?MODULE, [], Host);
|
||||||
_ ->
|
_ ->
|
||||||
loop(Host)
|
loop(Host, Parent)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
@ -450,7 +453,9 @@ iq_pubsub(Host, From, Type, SubEl) ->
|
||||||
create_new_node(Host, Node, Owner) ->
|
create_new_node(Host, Node, Owner) ->
|
||||||
case Node of
|
case Node of
|
||||||
[] ->
|
[] ->
|
||||||
{error, ?ERR_CONFLICT};
|
{LOU, LOS, _} = jlib:jid_tolower(Owner),
|
||||||
|
NewNode = ["home", LOS, LOU, randoms:get_string()],
|
||||||
|
create_new_node(Host, NewNode, Owner);
|
||||||
_ ->
|
_ ->
|
||||||
LOwner = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
|
LOwner = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
|
||||||
Parent = lists:sublist(Node, length(Node) - 1),
|
Parent = lists:sublist(Node, length(Node) - 1),
|
||||||
|
@ -491,16 +496,20 @@ create_new_node(Host, Node, Owner) ->
|
||||||
{atomic, ok} ->
|
{atomic, ok} ->
|
||||||
Lang = "",
|
Lang = "",
|
||||||
broadcast_publish_item(
|
broadcast_publish_item(
|
||||||
Host, ["pubsub", "nodes"], "",
|
Host, ["pubsub", "nodes"], node_to_string(Node),
|
||||||
[{xmlelement, "x",
|
[{xmlelement, "x",
|
||||||
[{"xmlns", ?NS_PUBSUB_EVENT},
|
[{"xmlns", ?NS_XDATA},
|
||||||
{"type", "result"}],
|
{"type", "result"}],
|
||||||
[?XFIELD("hidden", "", "FORM_TYPE",
|
[?XFIELD("hidden", "", "FORM_TYPE",
|
||||||
?NS_PUBSUB_NMI),
|
?NS_PUBSUB_NMI),
|
||||||
?XFIELD("jid-single", "Node Creator",
|
?XFIELD("jid-single", "Node Creator",
|
||||||
"creator",
|
"creator",
|
||||||
jlib:jid_to_string(LOwner))]}]),
|
jlib:jid_to_string(LOwner))]}]),
|
||||||
{result, []};
|
{result,
|
||||||
|
[{xmlelement, "pubsub",
|
||||||
|
[{"xmlns", ?NS_PUBSUB}],
|
||||||
|
[{xmlelement, "create",
|
||||||
|
[{"node", node_to_string(Node)}], []}]}]};
|
||||||
{atomic, {error, _} = Error} ->
|
{atomic, {error, _} = Error} ->
|
||||||
Error;
|
Error;
|
||||||
_ ->
|
_ ->
|
||||||
|
@ -742,6 +751,9 @@ delete_node(Host, JID, Node) ->
|
||||||
Error;
|
Error;
|
||||||
{atomic, {removed, Removed}} ->
|
{atomic, {removed, Removed}} ->
|
||||||
broadcast_removed_node(Host, Removed),
|
broadcast_removed_node(Host, Removed),
|
||||||
|
Lang = "",
|
||||||
|
broadcast_retract_item(
|
||||||
|
Host, ["pubsub", "nodes"], node_to_string(Node)),
|
||||||
{result, []};
|
{result, []};
|
||||||
_ ->
|
_ ->
|
||||||
{error, ?ERR_INTERNAL_SERVER_ERROR}
|
{error, ?ERR_INTERNAL_SERVER_ERROR}
|
||||||
|
@ -1100,9 +1112,10 @@ broadcast_retract_item(Host, Node, ItemID) ->
|
||||||
{xmlelement, "message", [],
|
{xmlelement, "message", [],
|
||||||
[{xmlelement, "x",
|
[{xmlelement, "x",
|
||||||
[{"xmlns", ?NS_PUBSUB_EVENT}],
|
[{"xmlns", ?NS_PUBSUB_EVENT}],
|
||||||
[{xmlelement, "retract",
|
[{xmlelement, "items",
|
||||||
[{"node", node_to_string(Node)}],
|
[{"node", node_to_string(Node)}],
|
||||||
[]}]}]},
|
[{xmlelement, "retract",
|
||||||
|
ItemAttrs, []}]}]}]},
|
||||||
ejabberd_router:route({"", Host, ""},
|
ejabberd_router:route({"", Host, ""},
|
||||||
JID, Stanza);
|
JID, Stanza);
|
||||||
true ->
|
true ->
|
||||||
|
@ -1137,3 +1150,13 @@ broadcast_removed_node(Host, Removed) ->
|
||||||
end, ok, Entities)
|
end, ok, Entities)
|
||||||
end, Removed).
|
end, Removed).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
system_continue(Parent, _, State) ->
|
||||||
|
loop(State, Parent).
|
||||||
|
|
||||||
|
system_terminate(Reason, Parent, _, State) ->
|
||||||
|
exit(Reason).
|
||||||
|
|
||||||
|
system_code_change(State, _Mod, Ver, _Extra) ->
|
||||||
|
{ok, State}.
|
||||||
|
|
|
@ -68,8 +68,6 @@ process_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
|
||||||
[SubEl, ?ERR_BAD_REQUEST]}
|
[SubEl, ?ERR_BAD_REQUEST]}
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
{iq, ID, error, XMLNS,
|
|
||||||
[SubEl, ?ERR_FEATURE_NOT_IMPLEMENTED]};
|
|
||||||
(UTag /= false) and (PTag /= false) ->
|
(UTag /= false) and (PTag /= false) ->
|
||||||
User = xml:get_tag_cdata(UTag),
|
User = xml:get_tag_cdata(UTag),
|
||||||
Password = xml:get_tag_cdata(PTag),
|
Password = xml:get_tag_cdata(PTag),
|
||||||
|
@ -85,7 +83,10 @@ process_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
|
||||||
{iq, ID, error, XMLNS,
|
{iq, ID, error, XMLNS,
|
||||||
[SubEl, Error]}
|
[SubEl, Error]}
|
||||||
end
|
end
|
||||||
end
|
end;
|
||||||
|
true ->
|
||||||
|
{iq, ID, error, XMLNS,
|
||||||
|
[SubEl, ?ERR_BAD_REQUEST]}
|
||||||
end;
|
end;
|
||||||
get ->
|
get ->
|
||||||
{iq, ID, result, XMLNS, [{xmlelement,
|
{iq, ID, result, XMLNS, [{xmlelement,
|
||||||
|
|
|
@ -40,7 +40,7 @@ start(Opts) ->
|
||||||
mnesia:create_table(roster,[{disc_copies, [node()]},
|
mnesia:create_table(roster,[{disc_copies, [node()]},
|
||||||
{attributes, record_info(fields, roster)}]),
|
{attributes, record_info(fields, roster)}]),
|
||||||
mnesia:add_table_index(roster, user),
|
mnesia:add_table_index(roster, user),
|
||||||
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_ROSTER,
|
gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_ROSTER,
|
||||||
?MODULE, process_local_iq, IQDisc).
|
?MODULE, process_local_iq, IQDisc).
|
||||||
|
|
||||||
process_local_iq(From, To, {iq, _, Type, _, _} = IQ) ->
|
process_local_iq(From, To, {iq, _, Type, _, _} = IQ) ->
|
||||||
|
|
|
@ -22,23 +22,27 @@ start() ->
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
load_dir(Dir) ->
|
load_dir(Dir) ->
|
||||||
{ok, Files} = file:list_dir(Dir),
|
case file:list_dir(Dir) of
|
||||||
MsgFiles = lists:filter(
|
{ok, Files} ->
|
||||||
fun(FN) ->
|
MsgFiles = lists:filter(
|
||||||
case string:len(FN) > 4 of
|
fun(FN) ->
|
||||||
true ->
|
case string:len(FN) > 4 of
|
||||||
string:substr(FN,
|
true ->
|
||||||
string:len(FN) - 3) == ".msg";
|
string:substr(FN,
|
||||||
_ ->
|
string:len(FN) - 3) == ".msg";
|
||||||
false
|
_ ->
|
||||||
end
|
false
|
||||||
end, Files),
|
end
|
||||||
lists:foreach(
|
end, Files),
|
||||||
fun(FN) ->
|
lists:foreach(
|
||||||
load_file(string:substr(FN, 1, string:len(FN) - 4),
|
fun(FN) ->
|
||||||
Dir ++ "/" ++ FN)
|
load_file(string:substr(FN, 1, string:len(FN) - 4),
|
||||||
end, MsgFiles),
|
Dir ++ "/" ++ FN)
|
||||||
ok.
|
end, MsgFiles),
|
||||||
|
ok;
|
||||||
|
{error, Reason} ->
|
||||||
|
?ERROR_MSG("~p", [Reason])
|
||||||
|
end.
|
||||||
|
|
||||||
load_file(Lang, File) ->
|
load_file(Lang, File) ->
|
||||||
case file:consult(File) of
|
case file:consult(File) of
|
||||||
|
|
63
src/xml.erl
63
src/xml.erl
|
@ -65,23 +65,23 @@ attr_to_string({Name, Value}) ->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%crypt(S) ->
|
crypt(S) ->
|
||||||
% lists:reverse(crypt(S, "")).
|
lists:reverse(crypt(S, "")).
|
||||||
%
|
|
||||||
%crypt([$& | S], R) ->
|
crypt([$& | S], R) ->
|
||||||
% crypt(S, [$;, $p, $m, $a, $& | R]);
|
crypt(S, [$;, $p, $m, $a, $& | R]);
|
||||||
%crypt([$< | S], R) ->
|
crypt([$< | S], R) ->
|
||||||
% crypt(S, [$;, $t, $l, $& | R]);
|
crypt(S, [$;, $t, $l, $& | R]);
|
||||||
%crypt([$> | S], R) ->
|
crypt([$> | S], R) ->
|
||||||
% crypt(S, [$;, $t, $g, $& | R]);
|
crypt(S, [$;, $t, $g, $& | R]);
|
||||||
%crypt([$" | S], R) ->
|
crypt([$" | S], R) ->
|
||||||
% crypt(S, [$;, $t, $o, $u, $q, $& | R]);
|
crypt(S, [$;, $t, $o, $u, $q, $& | R]);
|
||||||
%crypt([$' | S], R) ->
|
crypt([$' | S], R) ->
|
||||||
% crypt(S, [$;, $s, $o, $p, $a, $& | R]);
|
crypt(S, [$;, $s, $o, $p, $a, $& | R]);
|
||||||
%crypt([C | S], R) ->
|
crypt([C | S], R) ->
|
||||||
% crypt(S, [C | R]);
|
crypt(S, [C | R]);
|
||||||
%crypt([], R) ->
|
crypt([], R) ->
|
||||||
% R.
|
R.
|
||||||
|
|
||||||
%crypt1(S) ->
|
%crypt1(S) ->
|
||||||
% lists:flatten([case C of
|
% lists:flatten([case C of
|
||||||
|
@ -93,21 +93,20 @@ attr_to_string({Name, Value}) ->
|
||||||
% _ -> C
|
% _ -> C
|
||||||
% end || C <- S]).
|
% end || C <- S]).
|
||||||
|
|
||||||
% Not tail-recursive but it seems works faster than variants above
|
%crypt([$& | S]) ->
|
||||||
crypt([$& | S]) ->
|
% [$&, $a, $m, $p, $; | crypt(S)];
|
||||||
[$&, $a, $m, $p, $; | crypt(S)];
|
%crypt([$< | S]) ->
|
||||||
crypt([$< | S]) ->
|
% [$&, $l, $t, $; | crypt(S)];
|
||||||
[$&, $l, $t, $; | crypt(S)];
|
%crypt([$> | S]) ->
|
||||||
crypt([$> | S]) ->
|
% [$&, $g, $t, $; | crypt(S)];
|
||||||
[$&, $g, $t, $; | crypt(S)];
|
%crypt([$" | S]) ->
|
||||||
crypt([$" | S]) ->
|
% [$&, $q, $u, $o, $t, $; | crypt(S)];
|
||||||
[$&, $q, $u, $o, $t, $; | crypt(S)];
|
%crypt([$' | S]) ->
|
||||||
crypt([$' | S]) ->
|
% [$&, $a, $p, $o, $s, $; | crypt(S)];
|
||||||
[$&, $a, $p, $o, $s, $; | crypt(S)];
|
%crypt([C | S]) ->
|
||||||
crypt([C | S]) ->
|
% [C | crypt(S)];
|
||||||
[C | crypt(S)];
|
%crypt([]) ->
|
||||||
crypt([]) ->
|
% [].
|
||||||
[].
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue