25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-11-24 16:23:40 +01:00

*** empty log message ***

SVN Revision: 49
This commit is contained in:
Alexey Shchepin 2003-01-24 20:18:33 +00:00
parent 66792183d0
commit 2aa3c1c720
24 changed files with 354 additions and 130 deletions

View File

@ -18,7 +18,10 @@
<H3 ALIGN=center>Alexey Shchepin<BR><A HREF="mailto:alexey@sevcom.net"><TT>mailto:alexey@sevcom.net</TT></A><BR><A HREF="xmpp:aleksey@jabber.ru"><TT>xmpp:aleksey@jabber.ru</TT></A></H3> <H3 ALIGN=center>Alexey Shchepin<BR><A HREF="mailto:alexey@sevcom.net"><TT>mailto:alexey@sevcom.net</TT></A><BR><A HREF="xmpp:aleksey@jabber.ru"><TT>xmpp:aleksey@jabber.ru</TT></A></H3>
<H3 ALIGN=center>January 23, 2003</H3> <DIV ALIGN=center><IMG SRC="logo.png"> <H3 ALIGN=center>January 23, 2003</H3> <DIV ALIGN=center><IMG SRC="logo.png">
</DIV>
</DIV><BR>
<BR>
<BR> <BR>
<BR> <BR>
@ -90,9 +93,7 @@ values.<BR>
serves. E.&nbsp;g. to use <TT>jabber.org</TT> domain add following line in config: serves. E.&nbsp;g. to use <TT>jabber.org</TT> domain add following line in config:
<PRE> <PRE>
{host, "jabber.org"}. {host, "jabber.org"}.
</PRE>This option is mandatory.<BR> </PRE><!--TOC subsubsection Listened Sockets-->
<BR>
<!--TOC subsubsection Listened Sockets-->
<H4>3.1.2&nbsp;&nbsp; Listened Sockets</H4><!--SEC END --> <H4>3.1.2&nbsp;&nbsp; Listened Sockets</H4><!--SEC END -->
@ -143,28 +144,30 @@ section&nbsp;<A HREF="#sec:modules">5</A> for detailed information on each modul
Example: Example:
<PRE> <PRE>
{modules, [ {modules, [
{mod_register, [one_queue]}, {mod_register, []},
{mod_roster, [one_queue]}, {mod_roster, []},
{mod_configure, [one_queue]}, {mod_configure, []},
{mod_disco, [one_queue]}, {mod_disco, []},
{mod_stats, [one_queue]}, {mod_stats, []},
{mod_vcard, [one_queue]}, {mod_vcard, []},
{mod_offline, []}, {mod_offline, []},
{mod_echo, []}, {mod_echo, [{host, "echo.e.localhost"}]},
{mod_private, [one_queue]}, {mod_private, []},
{mod_time, [one_queue]}, {mod_time, [{pdisc, no_queue}]},
{mod_version, [one_queue]} {mod_version, []}
]}. ]}.
</PRE><!--TOC subsection Online Configuration--> </PRE><!--TOC subsection Online Configuration-->
<H3>3.2&nbsp;&nbsp; Online Configuration</H3><!--SEC END --> <H3>3.2&nbsp;&nbsp; Online Configuration</H3><!--SEC END -->
<A NAME="sec:onlineconfig"></A>To use facility of online reconfiguration of <TT>ejabberd</TT> needed to have <A NAME="sec:onlineconfig"></A>To use facility of online reconfiguration of <TT>ejabberd</TT> needed to have
<TT>mod_configure</TT> loaded (section&nbsp;<A HREF="#sec:modconfigure">5.3</A>). Also highly <TT>mod_configure</TT> loaded (see section&nbsp;<A HREF="#sec:modconfigure">5.4</A>). Also highly
recommended to load <TT>mod_disco</TT> (section&nbsp;<A HREF="#sec:moddisco">5.4</A>), because recommended to load <TT>mod_disco</TT> (see section&nbsp;<A HREF="#sec:moddisco">5.5</A>), because
<TT>mod_configure</TT> highly integrates with it. Also recommended to use <TT>mod_configure</TT> highly integrates with it. Also recommended to use
disco-capable client.<BR> disco-capable client.<BR>
<BR> <BR>
TBD<BR>
<BR>
<!--TOC section Distribution--> <!--TOC section Distribution-->
<H2>4&nbsp;&nbsp; Distribution</H2><!--SEC END --> <H2>4&nbsp;&nbsp; Distribution</H2><!--SEC END -->
@ -173,49 +176,85 @@ disco-capable client.<BR>
<H2>5&nbsp;&nbsp; Built-in Modules</H2><!--SEC END --> <H2>5&nbsp;&nbsp; Built-in Modules</H2><!--SEC END -->
<A NAME="sec:modules"></A><!--TOC subsection <TT>mod_register</TT>--> <A NAME="sec:modules"></A><!--TOC subsection Common Options-->
<H3>5.1&nbsp;&nbsp; <TT>mod_register</TT></H3><!--SEC END --> <H3>5.1&nbsp;&nbsp; Common Options</H3><!--SEC END -->
<A NAME="sec:modcommonopts"></A>Following options used by many modules, so they described in separate section.<BR>
<BR>
<!--TOC subsubsection Option <TT>iqdisc</TT>-->
<H4>5.1.1&nbsp;&nbsp; Option <TT>iqdisc</TT></H4><!--SEC END -->
Many modules define handlers for processing IQ queries of different namespaces
to this server or to user (e.&nbsp;g. to <TT>myjabber.org</TT> or to
<TT>user@myjabber.org</TT>). This option defines processing discipline of this
queries. Possible values are:
<DL COMPACT=compact>
<DT>
<TT>no_queue</TT><DD> All queries of namespace with this processing
discipline processed immediately. This also means that no other packets can
be processed until finished this. Hence this discipline is not recommended
if processing of query can take relative many time.
<DT><TT>one_queue</TT><DD> In this case created separate queue for processing
IQ queries of namespace with this discipline, and processing of this queue
done in parallel with processing of other packets. This discipline is most
recommended.
<DT><TT>parallel</TT><DD> In this case for all packets of namespace with this
discipline spawned separate Erlang process, so all this packets processed in
parallel. Although spawning of Erlang process have relative low cost, this
can broke server normal work, because Erlang have limit of 32000 processes.
</DL>Example:
<PRE>
{modules, [
...
{mod_time, [{pdisc, no_queue}]},
...
]}.
</PRE><!--TOC subsection <TT>mod_register</TT>-->
<H3>5.2&nbsp;&nbsp; <TT>mod_register</TT></H3><!--SEC END -->
<A NAME="sec:modregister"></A><!--TOC subsection <TT>mod_roster</TT>--> <A NAME="sec:modregister"></A><!--TOC subsection <TT>mod_roster</TT>-->
<H3>5.2&nbsp;&nbsp; <TT>mod_roster</TT></H3><!--SEC END --> <H3>5.3&nbsp;&nbsp; <TT>mod_roster</TT></H3><!--SEC END -->
<A NAME="sec:modroster"></A><!--TOC subsection <TT>mod_configure</TT>--> <A NAME="sec:modroster"></A><!--TOC subsection <TT>mod_configure</TT>-->
<H3>5.3&nbsp;&nbsp; <TT>mod_configure</TT></H3><!--SEC END --> <H3>5.4&nbsp;&nbsp; <TT>mod_configure</TT></H3><!--SEC END -->
<A NAME="sec:modconfigure"></A><!--TOC subsection <TT>mod_disco</TT>--> <A NAME="sec:modconfigure"></A><!--TOC subsection <TT>mod_disco</TT>-->
<H3>5.4&nbsp;&nbsp; <TT>mod_disco</TT></H3><!--SEC END --> <H3>5.5&nbsp;&nbsp; <TT>mod_disco</TT></H3><!--SEC END -->
<A NAME="sec:moddisco"></A><!--TOC subsection <TT>mod_stats</TT>--> <A NAME="sec:moddisco"></A><!--TOC subsection <TT>mod_stats</TT>-->
<H3>5.5&nbsp;&nbsp; <TT>mod_stats</TT></H3><!--SEC END --> <H3>5.6&nbsp;&nbsp; <TT>mod_stats</TT></H3><!--SEC END -->
<A NAME="sec:modstats"></A><!--TOC subsection <TT>mod_vcard</TT>--> <A NAME="sec:modstats"></A><!--TOC subsection <TT>mod_vcard</TT>-->
<H3>5.6&nbsp;&nbsp; <TT>mod_vcard</TT></H3><!--SEC END --> <H3>5.7&nbsp;&nbsp; <TT>mod_vcard</TT></H3><!--SEC END -->
<A NAME="sec:modvcard"></A><!--TOC subsection <TT>mod_offline</TT>--> <A NAME="sec:modvcard"></A><!--TOC subsection <TT>mod_offline</TT>-->
<H3>5.7&nbsp;&nbsp; <TT>mod_offline</TT></H3><!--SEC END --> <H3>5.8&nbsp;&nbsp; <TT>mod_offline</TT></H3><!--SEC END -->
<A NAME="sec:modoffline"></A><!--TOC subsection <TT>mod_echo</TT>--> <A NAME="sec:modoffline"></A><!--TOC subsection <TT>mod_echo</TT>-->
<H3>5.8&nbsp;&nbsp; <TT>mod_echo</TT></H3><!--SEC END --> <H3>5.9&nbsp;&nbsp; <TT>mod_echo</TT></H3><!--SEC END -->
<A NAME="sec:modecho"></A><!--TOC subsection <TT>mod_private</TT>--> <A NAME="sec:modecho"></A><!--TOC subsection <TT>mod_private</TT>-->
<H3>5.9&nbsp;&nbsp; <TT>mod_private</TT></H3><!--SEC END --> <H3>5.10&nbsp;&nbsp; <TT>mod_private</TT></H3><!--SEC END -->
<A NAME="sec:modprivate"></A><!--TOC subsection <TT>mod_time</TT>--> <A NAME="sec:modprivate"></A><!--TOC subsection <TT>mod_time</TT>-->
<H3>5.10&nbsp;&nbsp; <TT>mod_time</TT></H3><!--SEC END --> <H3>5.11&nbsp;&nbsp; <TT>mod_time</TT></H3><!--SEC END -->
<A NAME="sec:modtime"></A><!--TOC subsection <TT>mod_version</TT>--> <A NAME="sec:modtime"></A><!--TOC subsection <TT>mod_version</TT>-->
<H3>5.11&nbsp;&nbsp; <TT>mod_version</TT></H3><!--SEC END --> <H3>5.12&nbsp;&nbsp; <TT>mod_version</TT></H3><!--SEC END -->
<A NAME="sec:modversion"></A><!--HTMLFOOT--> <A NAME="sec:modversion"></A><!--HTMLFOOT-->
<!--ENDHTML--> <!--ENDHTML-->

View File

@ -1,10 +1,13 @@
\documentclass[12pt]{article} \documentclass[12pt]{article}
%\usepackage{graphics} \usepackage{graphics}
\usepackage{hevea} \usepackage{hevea}
\usepackage{verbatim} \usepackage{verbatim}
\newcommand{\imgscale}{0.7}
\newcommand{\ejabberd}{\texttt{ejabberd}} \newcommand{\ejabberd}{\texttt{ejabberd}}
\newcommand{\Jabber}{Jabber} \newcommand{\Jabber}{Jabber}
@ -32,11 +35,12 @@
\begin{titlepage} \begin{titlepage}
\maketitle{} \maketitle{}
%\includegraphics{logo.png}
{\centering {\centering
\imgsrc{logo.png}{} \imgsrc{logo.png}{}
\begin{latexonly}
\scalebox{\imgscale}{\includegraphics{logo.png}}
\end{latexonly}
\par
} }
\end{titlepage} \end{titlepage}
%\newpage %\newpage
@ -119,7 +123,7 @@ serves. E.\,g. to use \texttt{jabber.org} domain add following line in config:
{host, "jabber.org"}. {host, "jabber.org"}.
\end{verbatim} \end{verbatim}
This option is mandatory. %This option is mandatory.
@ -172,17 +176,17 @@ section~\ref{sec:modules} for detailed information on each module.
Example: Example:
\begin{verbatim} \begin{verbatim}
{modules, [ {modules, [
{mod_register, [one_queue]}, {mod_register, []},
{mod_roster, [one_queue]}, {mod_roster, []},
{mod_configure, [one_queue]}, {mod_configure, []},
{mod_disco, [one_queue]}, {mod_disco, []},
{mod_stats, [one_queue]}, {mod_stats, []},
{mod_vcard, [one_queue]}, {mod_vcard, []},
{mod_offline, []}, {mod_offline, []},
{mod_echo, []}, {mod_echo, [{host, "echo.e.localhost"}]},
{mod_private, [one_queue]}, {mod_private, []},
{mod_time, [one_queue]}, {mod_time, [{iqdisc, no_queue}]},
{mod_version, [one_queue]} {mod_version, []}
]}. ]}.
\end{verbatim} \end{verbatim}
@ -210,6 +214,41 @@ TBD
\subsection{Common Options}
\label{sec:modcommonopts}
Following options used by many modules, so they described in separate section.
\subsubsection{Option \texttt{iqdisc}}
Many modules define handlers for processing IQ queries of different namespaces
to this server or to user (e.\,g. to \texttt{myjabber.org} or to
\texttt{user@myjabber.org}). This option defines processing discipline of this
queries. Possible values are:
\begin{description}
\item[\texttt{no\_queue}] All queries of namespace with this processing
discipline processed immediately. This also means that no other packets can
be processed until finished this. Hence this discipline is not recommended
if processing of query can take relative many time.
\item[\texttt{one\_queue}] In this case created separate queue for processing
IQ queries of namespace with this discipline, and processing of this queue
done in parallel with processing of other packets. This discipline is most
recommended.
\item[\texttt{parallel}] In this case for all packets of namespace with this
discipline spawned separate Erlang process, so all this packets processed in
parallel. Although spawning of Erlang process have relative low cost, this
can broke server normal work, because Erlang have limit of 32000 processes.
\end{description}
Example:
\begin{verbatim}
{modules, [
...
{mod_time, [{iqdisc, no_queue}]},
...
]}.
\end{verbatim}
\subsection{\modregister{}} \subsection{\modregister{}}
\label{sec:modregister} \label{sec:modregister}

View File

@ -8,7 +8,8 @@ LIBDIRS = -L/usr/lib/erlang/lib/erl_interface-3.3.0/lib
ERLSHLIBS = expat_erl.so ERLSHLIBS = expat_erl.so
all: $(ERLSHLIBS) all: $(ERLSHLIBS)
erl -make erl -s make all report -noinput -s erlang halt
etags *.erl
$(ERLSHLIBS): %.so: %.c $(ERLSHLIBS): %.so: %.c
gcc -Wall $(INCLUDES) $(LIBDIRS) \ gcc -Wall $(INCLUDES) $(LIBDIRS) \
@ -18,3 +19,6 @@ $(ERLSHLIBS): %.so: %.c
-lei \ -lei \
-o $@ -fpic -shared \ -o $@ -fpic -shared \
clean:
rm -f *.beam

View File

@ -22,17 +22,17 @@
]}. ]}.
{modules, [ {modules, [
{mod_register, [one_queue]}, {mod_register, []},
{mod_roster, [one_queue]}, {mod_roster, []},
{mod_configure, [one_queue]}, {mod_configure, []},
{mod_disco, [one_queue]}, {mod_disco, []},
{mod_stats, [one_queue]}, {mod_stats, []},
{mod_vcard, [one_queue]}, {mod_vcard, []},
{mod_offline, []}, {mod_offline, []},
{mod_echo, []}, {mod_echo, [{host, "echo.e.localhost"}]},
{mod_private, [one_queue]}, {mod_private, []},
{mod_time, [one_queue]}, {mod_time, [{iqdisc, no_queue}]},
{mod_version, [one_queue]} {mod_version, []}
]}. ]}.

View File

@ -61,7 +61,7 @@ load_modules() ->
ok; ok;
Modules -> Modules ->
lists:foreach(fun({Module, Args}) -> lists:foreach(fun({Module, Args}) ->
apply(Module, start, Args) gen_mod:start_module(Module, Args)
end, Modules) end, Modules)
end. end.

View File

@ -19,7 +19,7 @@
-endif. -endif.
-define(ERROR_MSG(Format, Args), -define(ERROR_MSG(Format, Args),
error_logger:format("D(~p:~p:~p) : "++Format++"~n", error_logger:format("E(~p:~p:~p): "++Format++"~n",
[self(),?MODULE,?LINE]++Args)). [self(),?MODULE,?LINE]++Args)).

View File

@ -26,7 +26,12 @@
is_user_exists/1]). is_user_exists/1]).
%% gen_server callbacks %% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2]). -export([init/1,
handle_call/3,
handle_cast/2,
code_change/3,
handle_info/2,
terminate/2]).
-record(state, {}). -record(state, {}).
@ -78,6 +83,10 @@ handle_call(Request, From, State) ->
handle_cast(Msg, State) -> handle_cast(Msg, State) ->
{noreply, State}. {noreply, State}.
code_change(OldVsn, State, Extra) ->
{ok, State}.
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
%% Func: handle_info/2 %% Func: handle_info/2
%% Returns: {noreply, State} | %% Returns: {noreply, State} |

View File

@ -20,6 +20,9 @@
% handle_sync_event/4, handle_info/3, terminate/3]). % handle_sync_event/4, handle_info/3, terminate/3]).
% %
-export([init/1, wait_for_stream/2, wait_for_auth/2, session_established/2, -export([init/1, wait_for_stream/2, wait_for_auth/2, session_established/2,
handle_event/3,
handle_sync_event/4,
code_change/4,
handle_info/3, handle_info/3,
terminate/3]). terminate/3]).
@ -88,8 +91,6 @@ init([Socket]) ->
%% {next_state, NextStateName, NextStateData, Timeout} | %% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData} %% {stop, Reason, NewStateData}
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
state_name(Event, StateData) ->
{next_state, state_name, StateData}.
wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) -> wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) ->
% TODO % TODO
@ -212,9 +213,9 @@ session_established(closed, StateData) ->
%% {stop, Reason, NewStateData} | %% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData} %% {stop, Reason, Reply, NewStateData}
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
state_name(Event, From, StateData) -> %state_name(Event, From, StateData) ->
Reply = ok, % Reply = ok,
{reply, Reply, state_name, StateData}. % {reply, Reply, state_name, StateData}.
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
%% Func: handle_event/3 %% Func: handle_event/3
@ -238,6 +239,9 @@ handle_sync_event(Event, From, StateName, StateData) ->
Reply = ok, Reply = ok,
{reply, Reply, StateName, StateData}. {reply, Reply, StateName, StateData}.
code_change(OldVsn, StateName, StateData, Extra) ->
{ok, StateName, StateData}.
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
%% Func: handle_info/3 %% Func: handle_info/3
%% Returns: {next_state, NextStateName, NextStateData} | %% Returns: {next_state, NextStateName, NextStateData} |

View File

@ -38,6 +38,7 @@ load_file(File) ->
{ok, Terms} -> {ok, Terms} ->
lists:foreach(fun process_term/1, Terms); lists:foreach(fun process_term/1, Terms);
{error, Reason} -> {error, Reason} ->
?ERROR_MSG("~p", [Reason]),
exit(file:format_error(Reason)) exit(file:format_error(Reason))
end. end.

View File

@ -21,6 +21,9 @@
wait_for_key/2, wait_for_key/2,
wait_for_verification/2, wait_for_verification/2,
stream_established/2, stream_established/2,
handle_event/3,
handle_sync_event/4,
code_change/4,
handle_info/3, handle_info/3,
terminate/3]). terminate/3]).
@ -89,8 +92,6 @@ init([Socket]) ->
%% {next_state, NextStateName, NextStateData, Timeout} | %% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData} %% {stop, Reason, NewStateData}
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
state_name(Event, StateData) ->
{next_state, state_name, StateData}.
wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) -> wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) ->
% TODO % TODO
@ -270,9 +271,9 @@ stream_established(closed, StateData) ->
%% {stop, Reason, NewStateData} | %% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData} %% {stop, Reason, Reply, NewStateData}
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
state_name(Event, From, StateData) -> %state_name(Event, From, StateData) ->
Reply = ok, % Reply = ok,
{reply, Reply, state_name, StateData}. % {reply, Reply, state_name, StateData}.
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
%% Func: handle_event/3 %% Func: handle_event/3
@ -296,6 +297,9 @@ handle_sync_event(Event, From, StateName, StateData) ->
Reply = ok, Reply = ok,
{reply, Reply, StateName, StateData}. {reply, Reply, StateName, StateData}.
code_change(OldVsn, StateName, StateData, Extra) ->
{ok, StateName, StateData}.
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
%% Func: handle_info/3 %% Func: handle_info/3
%% Returns: {next_state, NextStateName, NextStateData} | %% Returns: {next_state, NextStateName, NextStateData} |

View File

@ -21,8 +21,11 @@
wait_for_stream/2, wait_for_stream/2,
wait_for_validation/2, wait_for_validation/2,
stream_established/2, stream_established/2,
handle_event/3,
handle_sync_event/4,
handle_info/3, handle_info/3,
terminate/3]). terminate/3,
code_change/4]).
-include("ejabberd.hrl"). -include("ejabberd.hrl").
@ -268,9 +271,9 @@ stream_established(closed, StateData) ->
%% {stop, Reason, NewStateData} | %% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData} %% {stop, Reason, Reply, NewStateData}
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
state_name(Event, From, StateData) -> %state_name(Event, From, StateData) ->
Reply = ok, % Reply = ok,
{reply, Reply, state_name, StateData}. % {reply, Reply, state_name, StateData}.
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
%% Func: handle_event/3 %% Func: handle_event/3
@ -294,6 +297,9 @@ handle_sync_event(Event, From, StateName, StateData) ->
Reply = ok, Reply = ok,
{reply, Reply, StateName, StateData}. {reply, Reply, StateName, StateData}.
code_change(OldVsn, StateName, StateData, Extra) ->
{ok, StateName, StateData}.
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
%% Func: handle_info/3 %% Func: handle_info/3
%% Returns: {next_state, NextStateName, NextStateData} | %% Returns: {next_state, NextStateName, NextStateData} |
@ -400,20 +406,20 @@ bounce_messages(Reason) ->
ok ok
end. end.
is_key_packet({xmlelement, Name, Attrs, Els}) when Name == "db:result" -> %is_key_packet({xmlelement, Name, Attrs, Els}) when Name == "db:result" ->
{key, % {key,
xml:get_attr_s("to", Attrs), % xml:get_attr_s("to", Attrs),
xml:get_attr_s("from", Attrs), % xml:get_attr_s("from", Attrs),
xml:get_attr_s("id", Attrs), % xml:get_attr_s("id", Attrs),
xml:get_cdata(Els)}; % xml:get_cdata(Els)};
is_key_packet({xmlelement, Name, Attrs, Els}) when Name == "db:verify" -> %is_key_packet({xmlelement, Name, Attrs, Els}) when Name == "db:verify" ->
{verify, % {verify,
xml:get_attr_s("to", Attrs), % xml:get_attr_s("to", Attrs),
xml:get_attr_s("from", Attrs), % xml:get_attr_s("from", Attrs),
xml:get_attr_s("id", Attrs), % xml:get_attr_s("id", Attrs),
xml:get_cdata(Els)}; % xml:get_cdata(Els)};
is_key_packet(_) -> %is_key_packet(_) ->
false. % false.
is_verify_res({xmlelement, Name, Attrs, Els}) when Name == "db:result" -> is_verify_res({xmlelement, Name, Attrs, Els}) when Name == "db:result" ->
{result, {result,

58
src/gen_mod.erl Normal file
View File

@ -0,0 +1,58 @@
%%%----------------------------------------------------------------------
%%% File : gen_mod.erl
%%% Author : Alexey Shchepin <alexey@sevcom.net>
%%% Purpose :
%%% Created : 24 Jan 2003 by Alexey Shchepin <alexey@sevcom.net>
%%% Id : $Id$
%%%----------------------------------------------------------------------
-module(gen_mod).
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
-export([start_module/2,
stop_module/1,
get_opt/2,
get_opt/3]).
-export([behaviour_info/1]).
-include("ejabberd.hrl").
behaviour_info(callbacks) ->
[{start, 1},
{stop, 0}];
behaviour_info(Other) ->
undefined.
start_module(Module, Opts) ->
case catch Module:start(Opts) of
{'EXIT', Reason} ->
?ERROR_MSG("~p", [Reason]);
_ ->
ok
end.
stop_module(Module) ->
Module:stop().
get_opt(Opt, Opts) ->
case lists:keysearch(Opt, 1, Opts) of
false ->
% TODO: replace with more appropriate function
[] = {undefined_option, Opt};
{value, {_, Val}} ->
Val
end.
get_opt(Opt, Opts, Default) ->
case lists:keysearch(Opt, 1, Opts) of
false ->
Default;
{value, {_, Val}} ->
Val
end.

View File

@ -19,6 +19,7 @@
remove_attr/2, remove_attr/2,
string_to_jid/1, string_to_jid/1,
jid_to_string/1, jid_to_string/1,
is_nodename/1,
tolower/1, tolower/1,
jid_tolower/1, jid_tolower/1,
jid_remove_resource/1, jid_remove_resource/1,
@ -133,6 +134,17 @@ string_to_jid1([$/ | J], "") ->
error; error;
string_to_jid1([$/ | J], N) -> string_to_jid1([$/ | J], N) ->
string_to_jid3(J, "", lists:reverse(N), ""); string_to_jid3(J, "", lists:reverse(N), "");
string_to_jid1([C | J], N)
when (C =< 32) or
(C == $") or
(C == $&) or
(C == $') or
(C == $:) or
(C == $<) or
(C == $>) or
(C == 127)
->
error;
string_to_jid1([C | J], N) -> string_to_jid1([C | J], N) ->
string_to_jid1(J, [C | N]); string_to_jid1(J, [C | N]);
string_to_jid1([], "") -> string_to_jid1([], "") ->
@ -173,6 +185,30 @@ jid_to_string({Node, Server, Resource}) ->
S3. S3.
is_nodename([]) ->
false;
is_nodename(J) ->
is_nodename1(J).
is_nodename1([C | J])
when (C =< 32) or
(C == $") or
(C == $&) or
(C == $') or
(C == $:) or
(C == $<) or
(C == $>) or
(C == $@) or
(C == $/) or
(C == 127)
->
false;
is_nodename1([C | J]) ->
is_nodename1(J);
is_nodename1([]) ->
true.
% TODO: UNICODE support % TODO: UNICODE support
tolower_c(C) when C >= $A, C =< $Z -> tolower_c(C) when C >= $A, C =< $Z ->

View File

@ -10,6 +10,8 @@
-author('alexey@sevcom.net'). -author('alexey@sevcom.net').
-vsn('$Revision$ '). -vsn('$Revision$ ').
-behaviour(gen_mod).
-export([start/1, -export([start/1,
process_local_iq/3, process_local_iq/3,
process_sm_iq/3]). process_sm_iq/3]).
@ -18,11 +20,12 @@
-include("namespaces.hrl"). -include("namespaces.hrl").
start(Type) -> start(Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_XDATA, gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_XDATA,
?MODULE, process_local_iq, Type), ?MODULE, process_local_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_XDATA, gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_XDATA,
?MODULE, process_sm_iq, Type), ?MODULE, process_sm_iq, IQDisc),
ok. ok.

View File

@ -10,6 +10,8 @@
-author('alexey@sevcom.net'). -author('alexey@sevcom.net').
-vsn('$Revision$ '). -vsn('$Revision$ ').
-behaviour(gen_mod).
-export([start/1, -export([start/1,
process_local_iq_items/3, process_local_iq_items/3,
process_local_iq_info/3, process_local_iq_info/3,
@ -24,23 +26,16 @@
{iq, ID, result, XMLNS, [{xmlelement, "query", {iq, ID, result, XMLNS, [{xmlelement, "query",
[{"xmlns", ?NS_DISCO_INFO}], []}]}). [{"xmlns", ?NS_DISCO_INFO}], []}]}).
start(Type) -> start(Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_DISCO_ITEMS, gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_DISCO_ITEMS,
?MODULE, process_local_iq_items, Type), ?MODULE, process_local_iq_items, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_DISCO_INFO, gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_DISCO_INFO,
?MODULE, process_local_iq_info, Type), ?MODULE, process_local_iq_info, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_DISCO_ITEMS, gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_DISCO_ITEMS,
?MODULE, process_sm_iq_items, Type), ?MODULE, process_sm_iq_items, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_DISCO_INFO, gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_DISCO_INFO,
?MODULE, process_sm_iq_info, Type), ?MODULE, process_sm_iq_info, IQDisc),
%ejabberd_local:register_iq_handler(?NS_DISCO_ITEMS,
% ?MODULE, process_local_iq_items),
%ejabberd_local:register_iq_handler(?NS_DISCO_INFO,
% ?MODULE, process_local_iq_info),
%ejabberd_sm:register_iq_handler(?NS_DISCO_ITEMS,
% ?MODULE, process_sm_iq_items),
%ejabberd_sm:register_iq_handler(?NS_DISCO_INFO,
% ?MODULE, process_sm_iq_info),
register_feature("iq"), register_feature("iq"),
register_feature("presence"), register_feature("presence"),
register_feature("presence-invisible"), register_feature("presence-invisible"),

View File

@ -10,18 +10,22 @@
-author('alexey@sevcom.net'). -author('alexey@sevcom.net').
-vsn('$Revision$ '). -vsn('$Revision$ ').
-export([start/0, init/0]). -behaviour(gen_mod).
-export([start/1, init/1]).
-include("ejabberd.hrl"). -include("ejabberd.hrl").
-include("namespaces.hrl"). -include("namespaces.hrl").
start() -> start(Opts) ->
spawn(?MODULE, init, []). %Host = gen_mod:get_opt(host, Opts),
Host = gen_mod:get_opt(host, Opts, "echo." ++ ?MYNAME),
spawn(?MODULE, init, [Host]).
init() -> init(Host) ->
ejabberd_router:register_local_route("echo." ++ ?MYNAME), ejabberd_router:register_local_route(Host),
loop(). loop().
loop() -> loop() ->

View File

@ -9,7 +9,9 @@
-module(mod_offline). -module(mod_offline).
-author('alexey@sevcom.net'). -author('alexey@sevcom.net').
-export([start/0, -behaviour(gen_mod).
-export([start/1,
store_packet/3, store_packet/3,
resend_offline_messages/1]). resend_offline_messages/1]).
@ -18,7 +20,7 @@
-record(offline_msg, {user, timestamp, from, to, packet}). -record(offline_msg, {user, timestamp, from, to, packet}).
start() -> start(_) ->
mnesia:create_table(offline_msg, mnesia:create_table(offline_msg,
[{disc_only_copies, [node()]}, [{disc_only_copies, [node()]},
{type, bag}, {type, bag},

View File

@ -10,6 +10,8 @@
-author('alexey@sevcom.net'). -author('alexey@sevcom.net').
-vsn('$Revision$ '). -vsn('$Revision$ ').
-behaviour(gen_mod).
-export([start/1, -export([start/1,
process_local_iq/3]). process_local_iq/3]).
@ -18,12 +20,13 @@
-record(private_storage, {userns, xml}). -record(private_storage, {userns, xml}).
start(Type) -> start(Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
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_local, ?NS_PRIVATE,
?MODULE, process_local_iq, Type). ?MODULE, process_local_iq, IQDisc).
process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->

View File

@ -10,14 +10,17 @@
-author('alexey@sevcom.net'). -author('alexey@sevcom.net').
-vsn('$Revision$ '). -vsn('$Revision$ ').
-behaviour(gen_mod).
-export([start/1, init/0, process_iq/3]). -export([start/1, init/0, process_iq/3]).
-include("ejabberd.hrl"). -include("ejabberd.hrl").
-include("namespaces.hrl"). -include("namespaces.hrl").
start(Type) -> start(Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_REGISTER, gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_REGISTER,
?MODULE, process_iq, Type), ?MODULE, process_iq, IQDisc),
ok. ok.
init() -> init() ->
@ -71,8 +74,8 @@ process_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
try_register(User, Password) -> try_register(User, Password) ->
case jlib:string_to_jid(User ++ "@" ++ "x") of case jlib:is_nodename(User) of
error -> false ->
{error, "406", "Not Acceptable"}; {error, "406", "Not Acceptable"};
_ -> _ ->
case ejabberd_auth:try_register(User, Password) of case ejabberd_auth:try_register(User, Password) of

View File

@ -10,7 +10,7 @@
-author('alexey@sevcom.net'). -author('alexey@sevcom.net').
-vsn('$Revision$ '). -vsn('$Revision$ ').
-export([]). -behaviour(gen_mod).
-export([start/1, -export([start/1,
process_iq/3, process_iq/3,
@ -33,12 +33,13 @@
xattrs = [], xattrs = [],
xs = []}). xs = []}).
start(Type) -> start(Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
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_local, ?NS_ROSTER,
?MODULE, process_local_iq, Type). ?MODULE, process_local_iq, IQDisc).
process_local_iq(From, To, {iq, _, Type, _, _} = IQ) -> process_local_iq(From, To, {iq, _, Type, _, _} = IQ) ->
case Type of case Type of

View File

@ -10,14 +10,17 @@
-author('alexey@sevcom.net'). -author('alexey@sevcom.net').
-vsn('$Revision$ '). -vsn('$Revision$ ').
-behaviour(gen_mod).
-export([start/1, -export([start/1,
process_local_iq/3]). process_local_iq/3]).
-include("namespaces.hrl"). -include("namespaces.hrl").
start(Type) -> start(Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_STATS, gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_STATS,
?MODULE, process_local_iq, Type). ?MODULE, process_local_iq, IQDisc).
process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->

View File

@ -10,6 +10,8 @@
-author('alexey@sevcom.net'). -author('alexey@sevcom.net').
-vsn('$Revision$ '). -vsn('$Revision$ ').
-behaviour(gen_mod).
-export([start/1, -export([start/1,
process_local_iq/3]). process_local_iq/3]).
@ -17,9 +19,10 @@
-include("namespaces.hrl"). -include("namespaces.hrl").
start(Type) -> start(Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_TIME, gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_TIME,
?MODULE, process_local_iq, Type). ?MODULE, process_local_iq, IQDisc).
process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->

View File

@ -10,7 +10,9 @@
-author('alexey@sevcom.net'). -author('alexey@sevcom.net').
-vsn('$Revision$ '). -vsn('$Revision$ ').
-export([start/1, init/0, -behaviour(gen_mod).
-export([start/1, init/1,
process_local_iq/3, process_local_iq/3,
process_sm_iq/3, process_sm_iq/3,
reindex_vcards/0]). reindex_vcards/0]).
@ -35,7 +37,7 @@
-record(vcard, {user, vcard}). -record(vcard, {user, vcard}).
start(Type) -> start(Opts) ->
mnesia:create_table(vcard, [{disc_only_copies, [node()]}, mnesia:create_table(vcard, [{disc_only_copies, [node()]},
{attributes, record_info(fields, vcard)}]), {attributes, record_info(fields, vcard)}]),
mnesia:create_table(vcard_search, mnesia:create_table(vcard_search,
@ -53,15 +55,17 @@ start(Type) ->
mnesia:add_table_index(vcard_search, lorgname), mnesia:add_table_index(vcard_search, lorgname),
mnesia:add_table_index(vcard_search, lorgunit), mnesia:add_table_index(vcard_search, lorgunit),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_VCARD, gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_VCARD,
?MODULE, process_local_iq, Type), ?MODULE, process_local_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_VCARD, gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_VCARD,
?MODULE, process_sm_iq, Type), ?MODULE, process_sm_iq, IQDisc),
spawn(?MODULE, init, []). Host = gen_mod:get_opt(host, Opts, "vjud." ++ ?MYNAME),
spawn(?MODULE, init, [Host]).
init() -> init(Host) ->
ejabberd_router:register_local_route("vjud." ++ ?MYNAME), ejabberd_router:register_local_route(Host),
loop(). loop().
loop() -> loop() ->

View File

@ -10,6 +10,8 @@
-author('alexey@sevcom.net'). -author('alexey@sevcom.net').
-vsn('$Revision$ '). -vsn('$Revision$ ').
-behaviour(gen_mod).
-export([start/1, -export([start/1,
process_local_iq/3]). process_local_iq/3]).
@ -18,9 +20,10 @@
start(Type) -> start(Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_VERSION, gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_VERSION,
?MODULE, process_local_iq, Type). ?MODULE, process_local_iq, IQDisc).