*** empty log message ***

SVN Revision: 62
This commit is contained in:
Alexey Shchepin 2003-02-06 19:09:22 +00:00
parent 6ea9a6aa17
commit a8a8e3b5a6
11 changed files with 168 additions and 61 deletions

3
TODO
View File

@ -5,9 +5,10 @@ admin interface
S2S timeouts S2S timeouts
rewrite S2S key validation rewrite S2S key validation
iq:browse (?) iq:browse (?)
SRV DNS records more correctly work with SRV DNS records (priority, weight, etc...)
karma karma
SSL SSL
SASL
JEP-62,63 (?) JEP-62,63 (?)
make roster set work in one transaction make roster set work in one transaction

View File

@ -178,23 +178,23 @@ Declaration of ACL in config file have following syntax:
<DT><TT>{user_regexp, &lt;regexp&gt;}</TT><DD> Matches local user with name that <DT><TT>{user_regexp, &lt;regexp&gt;}</TT><DD> Matches local user with name that
mathes <TT>&lt;regexp&gt;</TT>. Example: mathes <TT>&lt;regexp&gt;</TT>. Example:
<PRE> <PRE>
{acl, tests, {user, "test.*"}}. {acl, tests, {user, "^test[0-9]*$"}}.
</PRE> </PRE>
<DT><TT>{user_regexp, &lt;regexp&gt;, &lt;server&gt;}</TT><DD> Matches user with name <DT><TT>{user_regexp, &lt;regexp&gt;, &lt;server&gt;}</TT><DD> Matches user with name
that mathes <TT>&lt;regexp&gt;</TT> and from server <TT>&lt;server&gt;</TT>. Example: that mathes <TT>&lt;regexp&gt;</TT> and from server <TT>&lt;server&gt;</TT>. Example:
<PRE> <PRE>
{acl, tests, {user, "test.*", "localhost"}}. {acl, tests, {user, "^test", "localhost"}}.
</PRE> </PRE>
<DT><TT>{server_regexp, &lt;regexp&gt;}</TT><DD> Matches any JID from server that <DT><TT>{server_regexp, &lt;regexp&gt;}</TT><DD> Matches any JID from server that
matches <TT>&lt;regexp&gt;</TT>. Example: matches <TT>&lt;regexp&gt;</TT>. Example:
<PRE> <PRE>
{acl, icq, {server, "icq.*"}}. {acl, icq, {server, "^icq\\."}}.
</PRE> </PRE>
<DT><TT>{node_regexp, &lt;user_regexp&gt;, &lt;server_regexp&gt;}</TT><DD> Matches user <DT><TT>{node_regexp, &lt;user_regexp&gt;, &lt;server_regexp&gt;}</TT><DD> Matches user
with name that mathes <TT>&lt;user_regexp&gt;</TT> and from server that matches with name that mathes <TT>&lt;user_regexp&gt;</TT> and from server that matches
<TT>&lt;server_regexp&gt;</TT>. Example: <TT>&lt;server_regexp&gt;</TT>. Example:
<PRE> <PRE>
{acl, aleksey, {node_regexp, "aleksey.*", "jabber.(ru|org)"}}. {acl, aleksey, {node_regexp, "^aleksey", "^jabber.(ru|org)$"}}.
</PRE> </PRE>
<DT><TT>{user_glob, &lt;glob&gt;}</TT><DD> <DT><TT>{user_glob, &lt;glob&gt;}</TT><DD>
@ -357,7 +357,7 @@ correctly only after restart)
<DIV ALIGN=center><HR WIDTH="80%" SIZE=2></DIV></DIV></BLOCKQUOTE><!--TOC paragraph Node <TT>config/acls</TT>--> <DIV ALIGN=center><HR WIDTH="80%" SIZE=2></DIV></DIV></BLOCKQUOTE><!--TOC paragraph Node <TT>config/acls</TT>-->
<H5> Node <TT>config/acls</TT></H5><!--SEC END --> <H5> Node <TT>config/acls</TT></H5><!--SEC END -->
Via <TT>jabber:x:data</TT> queries to this node possible edit ACLs list. (See Via <TT>jabber:x:data</TT> queries to this node possible to edit ACLs list. (See
figure&nbsp;<A HREF="#fig:acls">2</A>) figure&nbsp;<A HREF="#fig:acls">2</A>)
<BLOCKQUOTE><DIV ALIGN=center><DIV ALIGN=center><HR WIDTH="80%" SIZE=2></DIV> <BLOCKQUOTE><DIV ALIGN=center><DIV ALIGN=center><HR WIDTH="80%" SIZE=2></DIV>
[acls editing window] [acls editing window]
@ -369,8 +369,7 @@ figure&nbsp;<A HREF="#fig:acls">2</A>)
<DIV ALIGN=center><HR WIDTH="80%" SIZE=2></DIV></DIV></BLOCKQUOTE><!--TOC paragraph Node <TT>config/access</TT>--> <DIV ALIGN=center><HR WIDTH="80%" SIZE=2></DIV></DIV></BLOCKQUOTE><!--TOC paragraph Node <TT>config/access</TT>-->
<H5> Node <TT>config/access</TT></H5><!--SEC END --> <H5> Node <TT>config/access</TT></H5><!--SEC END -->
Via <TT>jabber:x:data</TT> queries to this node possible edit access rules. Via <TT>jabber:x:data</TT> queries to this node possible to edit access rules.<BR>
<B>Not work yet</B>.<BR>
<BR> <BR>
<!--TOC paragraph Node <TT>config/remusers</TT>--> <!--TOC paragraph Node <TT>config/remusers</TT>-->

View File

@ -218,27 +218,29 @@ Declaration of ACL in config file have following syntax:
\item[\texttt{\{user\_regexp, <regexp>\}}] Matches local user with name that \item[\texttt{\{user\_regexp, <regexp>\}}] Matches local user with name that
mathes \texttt{<regexp>}. Example: mathes \texttt{<regexp>}. Example:
\begin{verbatim} \begin{verbatim}
{acl, tests, {user, "test.*"}}. {acl, tests, {user, "^test[0-9]*$"}}.
\end{verbatim} \end{verbatim}
%$
\item[\texttt{\{user\_regexp, <regexp>, <server>\}}] Matches user with name \item[\texttt{\{user\_regexp, <regexp>, <server>\}}] Matches user with name
that mathes \texttt{<regexp>} and from server \texttt{<server>}. Example: that mathes \texttt{<regexp>} and from server \texttt{<server>}. Example:
\begin{verbatim} \begin{verbatim}
{acl, tests, {user, "test.*", "localhost"}}. {acl, tests, {user, "^test", "localhost"}}.
\end{verbatim} \end{verbatim}
\item[\texttt{\{server\_regexp, <regexp>\}}] Matches any JID from server that \item[\texttt{\{server\_regexp, <regexp>\}}] Matches any JID from server that
matches \texttt{<regexp>}. Example: matches \texttt{<regexp>}. Example:
\begin{verbatim} \begin{verbatim}
{acl, icq, {server, "icq.*"}}. {acl, icq, {server, "^icq\\."}}.
\end{verbatim} \end{verbatim}
\item[\texttt{\{node\_regexp, <user\_regexp>, <server\_regexp>\}}] Matches user \item[\texttt{\{node\_regexp, <user\_regexp>, <server\_regexp>\}}] Matches user
with name that mathes \texttt{<user\_regexp>} and from server that matches with name that mathes \texttt{<user\_regexp>} and from server that matches
\texttt{<server\_regexp>}. Example: \texttt{<server\_regexp>}. Example:
\begin{verbatim} \begin{verbatim}
{acl, aleksey, {node_regexp, "aleksey.*", "jabber.(ru|org)"}}. {acl, aleksey, {node_regexp, "^aleksey", "^jabber.(ru|org)$"}}.
\end{verbatim} \end{verbatim}
%$
\item[\texttt{\{user\_glob, <glob>\}}] \item[\texttt{\{user\_glob, <glob>\}}]
\item[\texttt{\{user\_glob, <glob>, <server>\}}] \item[\texttt{\{user\_glob, <glob>, <server>\}}]
@ -400,7 +402,7 @@ correctly only after restart)
\paragraph{Node \texttt{config/acls}} \paragraph{Node \texttt{config/acls}}
Via \ns{jabber:x:data} queries to this node possible edit ACLs list. (See Via \ns{jabber:x:data} queries to this node possible to edit ACLs list. (See
figure~\ref{fig:acls}) figure~\ref{fig:acls})
\begin{figure}[htbp] \begin{figure}[htbp]
\centering \centering
@ -412,8 +414,8 @@ figure~\ref{fig:acls})
\paragraph{Node \texttt{config/access}} \paragraph{Node \texttt{config/access}}
Via \ns{jabber:x:data} queries to this node possible edit access rules. Via \ns{jabber:x:data} queries to this node possible to edit access rules.
\textbf{Not work yet}.
\paragraph{Node \texttt{config/remusers}} \paragraph{Node \texttt{config/remusers}}

View File

@ -43,7 +43,7 @@
ejabberd_mod_roster, ejabberd_mod_roster,
ejabberd_listeners ejabberd_listeners
]}, ]},
{applications, [kernel, stdlib, mnesia]}, {applications, [kernel, stdlib, mnesia, crypto, ssl]},
{env, []}, {env, []},
{mod, {ejabberd_app, []}}]}. {mod, {ejabberd_app, []}}]}.

View File

@ -29,6 +29,8 @@ override_acls.
{host, "e.localhost"}. {host, "e.localhost"}.
{listen, [{5522, ejabberd_c2s, start, [{access, c2s}]}, {listen, [{5522, ejabberd_c2s, start, [{access, c2s}]},
%{5523, ejabberd_c2s, start,
% [{access, c2s}, {ssl, [{certfile, "./ssl.pem"}]}]},
{5269, ejabberd_s2s_in, start, []}, {5269, ejabberd_s2s_in, start, []},
{8888, ejabberd_service, start, {8888, ejabberd_service, start,
[{host, "asd.e.localhost", [{password, "asdqwe"}]}]} [{host, "asd.e.localhost", [{password, "asdqwe"}]}]}

View File

@ -14,6 +14,8 @@
start() -> start() ->
application:start(mnesia), application:start(mnesia),
application:start(crypto),
application:start(ssl),
application:start(ejabberd). application:start(ejabberd).
stop() -> stop() ->

View File

@ -13,7 +13,7 @@
-behaviour(gen_fsm). -behaviour(gen_fsm).
%% External exports %% External exports
-export([start/2, receiver/2, sender/1, send_text/2, send_element/2]). -export([start/2, receiver/3, sender/2, send_text/2, send_element/2]).
%% gen_fsm callbacks %% gen_fsm callbacks
-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,
@ -61,8 +61,8 @@
%%%---------------------------------------------------------------------- %%%----------------------------------------------------------------------
%%% API %%% API
%%%---------------------------------------------------------------------- %%%----------------------------------------------------------------------
start(Socket, Opts) -> start(SockData, Opts) ->
gen_fsm:start(ejabberd_c2s, [Socket, Opts], ?FSMOPTS). gen_fsm:start(ejabberd_c2s, [SockData, Opts], ?FSMOPTS).
%%%---------------------------------------------------------------------- %%%----------------------------------------------------------------------
%%% Callback functions from gen_fsm %%% Callback functions from gen_fsm
@ -75,9 +75,9 @@ start(Socket, Opts) ->
%% ignore | %% ignore |
%% {stop, StopReason} %% {stop, StopReason}
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
init([Socket, Opts]) -> init([{SockMod, Socket}, Opts]) ->
SenderPid = spawn(?MODULE, sender, [Socket]), SenderPid = spawn(?MODULE, sender, [Socket, SockMod]),
ReceiverPid = spawn(?MODULE, receiver, [Socket, self()]), ReceiverPid = spawn(?MODULE, receiver, [Socket, SockMod, self()]),
Access = case lists:keysearch(access, 1, Opts) of Access = case lists:keysearch(access, 1, Opts) of
{value, {_, A}} -> {value, {_, A}} ->
A; A;
@ -367,28 +367,28 @@ terminate(Reason, StateName, StateData) ->
%%% Internal functions %%% Internal functions
%%%---------------------------------------------------------------------- %%%----------------------------------------------------------------------
receiver(Socket, C2SPid) -> receiver(Socket, SockMod, C2SPid) ->
XMLStreamPid = xml_stream:start(C2SPid), XMLStreamPid = xml_stream:start(C2SPid),
receiver(Socket, C2SPid, XMLStreamPid). receiver(Socket, SockMod, C2SPid, XMLStreamPid).
receiver(Socket, C2SPid, XMLStreamPid) -> receiver(Socket, SockMod, C2SPid, XMLStreamPid) ->
case gen_tcp:recv(Socket, 0) of case SockMod:recv(Socket, 0) of
{ok, Text} -> {ok, Text} ->
xml_stream:send_text(XMLStreamPid, Text), xml_stream:send_text(XMLStreamPid, Text),
receiver(Socket, C2SPid, XMLStreamPid); receiver(Socket, SockMod, C2SPid, XMLStreamPid);
{error, Reason} -> {error, Reason} ->
exit(XMLStreamPid, closed), exit(XMLStreamPid, closed),
gen_fsm:send_event(C2SPid, closed), gen_fsm:send_event(C2SPid, closed),
ok ok
end. end.
sender(Socket) -> sender(Socket, SockMod) ->
receive receive
{send_text, Text} -> {send_text, Text} ->
gen_tcp:send(Socket,Text), SockMod:send(Socket,Text),
sender(Socket); sender(Socket, SockMod);
close -> close ->
gen_tcp:close(Socket), SockMod:close(Socket),
ok ok
end. end.

View File

@ -10,7 +10,10 @@
-author('alexey@sevcom.net'). -author('alexey@sevcom.net').
-vsn('$Revision$ '). -vsn('$Revision$ ').
-export([start_link/0, init/1, start/4, init/4]). -export([start_link/0, init/1, start/4,
init/4,
init_ssl/5
]).
start_link() -> start_link() ->
supervisor:start_link({local, ejabberd_listeners}, ?MODULE, []). supervisor:start_link({local, ejabberd_listeners}, ?MODULE, []).
@ -25,7 +28,7 @@ init(_) ->
lists:map( lists:map(
fun({Port, Module, Fun, Opts}) -> fun({Port, Module, Fun, Opts}) ->
{Port, {Port,
{?MODULE, start, [Port, Module, Fun, [Opts]]}, {?MODULE, start, [Port, Module, Fun, Opts]},
permanent, permanent,
brutal_kill, brutal_kill,
worker, worker,
@ -34,22 +37,45 @@ init(_) ->
end. end.
start(Port, Module, Fun, Args) -> start(Port, Module, Fun, Opts) ->
{ok, spawn_link(?MODULE, init, [Port, Module, Fun, Args])}. case lists:keysearch(ssl, 1, Opts) of
{value, {ssl, SSLOpts}} ->
{ok, spawn_link(?MODULE, init_ssl,
[Port, Module, Fun, Opts, SSLOpts])};
_ ->
{ok, spawn_link(?MODULE, init, [Port, Module, Fun, Opts])}
end.
init(Port, Module, Fun, Args) -> init(Port, Module, Fun, Opts) ->
{ok, ListenSocket} = gen_tcp:listen(Port, [binary, {ok, ListenSocket} = gen_tcp:listen(Port, [binary,
{packet, 0}, {packet, 0},
{active, false}, {active, false},
{reuseaddr, true}]), {reuseaddr, true}]),
accept(ListenSocket, Module, Fun, Args). accept(ListenSocket, Module, Fun, Opts).
accept(ListenSocket, Module, Fun, Args) -> accept(ListenSocket, Module, Fun, Opts) ->
case gen_tcp:accept(ListenSocket) of case gen_tcp:accept(ListenSocket) of
{ok,Socket} -> {ok,Socket} ->
apply(Module, Fun, [Socket] ++ Args), apply(Module, Fun, [{gen_tcp, Socket}, Opts]),
%ejabberd_c2s:start(Socket), accept(ListenSocket, Module, Fun, Opts)
accept(ListenSocket, Module, Fun, Args) end.
init_ssl(Port, Module, Fun, Opts, SSLOpts) ->
{ok, ListenSocket} = ssl:listen(Port, [binary,
{packet, 0},
{active, false},
{nodelay, true},
{backlog, 0},
{cachetimout, 0} |
SSLOpts]),
accept_ssl(ListenSocket, Module, Fun, Opts).
accept_ssl(ListenSocket, Module, Fun, Opts) ->
case ssl:accept(ListenSocket) of
{ok,Socket} ->
apply(Module, Fun, [{ssl, Socket}, Opts]),
accept_ssl(ListenSocket, Module, Fun, Opts)
end. end.

View File

@ -65,8 +65,8 @@
%%%---------------------------------------------------------------------- %%%----------------------------------------------------------------------
%%% API %%% API
%%%---------------------------------------------------------------------- %%%----------------------------------------------------------------------
start(Socket, Opts) -> start(SockData, Opts) ->
gen_fsm:start(ejabberd_s2s_in, [Socket], ?FSMOPTS). gen_fsm:start(ejabberd_s2s_in, [SockData], ?FSMOPTS).
%%%---------------------------------------------------------------------- %%%----------------------------------------------------------------------
%%% Callback functions from gen_fsm %%% Callback functions from gen_fsm
@ -79,7 +79,7 @@ start(Socket, Opts) ->
%% ignore | %% ignore |
%% {stop, StopReason} %% {stop, StopReason}
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
init([Socket]) -> init([{SockMod, Socket}]) ->
ReceiverPid = spawn(?MODULE, receiver, [Socket, self()]), ReceiverPid = spawn(?MODULE, receiver, [Socket, self()]),
{ok, wait_for_stream, #state{socket = Socket, {ok, wait_for_stream, #state{socket = Socket,
receiver = ReceiverPid, receiver = ReceiverPid,

View File

@ -63,8 +63,8 @@
%%%---------------------------------------------------------------------- %%%----------------------------------------------------------------------
%%% API %%% API
%%%---------------------------------------------------------------------- %%%----------------------------------------------------------------------
start(Socket, Opts) -> start(SockData, Opts) ->
gen_fsm:start(ejabberd_service, [Socket, Opts], ?FSMOPTS). gen_fsm:start(ejabberd_service, [SockData, Opts], ?FSMOPTS).
%%%---------------------------------------------------------------------- %%%----------------------------------------------------------------------
%%% Callback functions from gen_fsm %%% Callback functions from gen_fsm
@ -77,7 +77,7 @@ start(Socket, Opts) ->
%% ignore | %% ignore |
%% {stop, StopReason} %% {stop, StopReason}
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
init([Socket, Opts]) -> init([{SockMod, Socket}, Opts]) ->
{Host, Password} = {Host, Password} =
case lists:keysearch(host, 1, Opts) of case lists:keysearch(host, 1, Opts) of
{value, {_, H, HOpts}} -> {value, {_, H, HOpts}} ->

View File

@ -283,7 +283,36 @@ get_form(["config", "acls"], Lang) ->
lists:flatten(io_lib:format("~p.", lists:flatten(io_lib:format("~p.",
[ets:tab2list(acl)])), [ets:tab2list(acl)])),
"\n")) "\n"))
%{xmlelement, "value", [], [{xmlcdata, ?MYNAME}]} }
]};
get_form(["config", "access"], Lang) ->
{result, [{xmlelement, "title", [],
[{xmlcdata,
translate:translate(
Lang, "Access Configuration")}]},
%{xmlelement, "instructions", [],
% [{xmlcdata,
% translate:translate(
% Lang, "")}]},
{xmlelement, "field", [{"type", "text-multi"},
{"label",
translate:translate(
Lang, "Access Rules")},
{"var", "access"}],
lists:map(fun(S) ->
{xmlelement, "value", [], [{xmlcdata, S}]}
end,
string:tokens(
lists:flatten(
io_lib:format(
"~p.",
[ets:select(config,
[{{config, {access, '$1'}, '$2'},
[],
[{{access, '$1', '$2'}}]}])
])),
"\n"))
} }
]}; ]};
@ -447,25 +476,71 @@ set_form(["config", "hostname"], Lang, XData) ->
set_form(["config", "acls"], Lang, XData) -> set_form(["config", "acls"], Lang, XData) ->
case lists:keysearch("acls", 1, XData) of case lists:keysearch("acls", 1, XData) of
{value, {_, Strings}} -> {value, {_, Strings}} ->
String = lists:foldl(fun(S, Res) -> String = lists:foldl(fun(S, Res) ->
Res ++ S ++ "\n" Res ++ S ++ "\n"
end, "", Strings), end, "", Strings),
case erl_scan:string(String) of case erl_scan:string(String) of
{ok, Tokens, _} -> {ok, Tokens, _} ->
case erl_parse:parse_term(Tokens) of case erl_parse:parse_term(Tokens) of
{ok, ACLs} -> {ok, ACLs} ->
case acl:add_list(ACLs, true) of case acl:add_list(ACLs, true) of
ok -> ok ->
{result, []}; {result, []};
_ ->
{error, "406", "Not Acceptable"}
end;
_ -> _ ->
{error, "406", "Not Acceptable"} {error, "406", "Not Acceptable"}
end; end;
_ -> _ ->
{error, "406", "Not Acceptable"} {error, "406", "Not Acceptable"}
end; end;
_ ->
{error, "406", "Not Acceptable"}
end;
_ ->
{error, "406", "Not Acceptable"}
end;
set_form(["config", "access"], Lang, XData) ->
SetAccess =
fun(Rs) ->
mnesia:transaction(
fun() ->
Os = mnesia:select(config,
[{{config, {access, '$1'}, '$2'},
[],
['$_']}]),
lists:foreach(fun(O) ->
mnesia:delete_object(O)
end, Os),
lists:foreach(
fun({access, Name, Rules}) ->
mnesia:write({config,
{access, Name},
Rules})
end, Rs)
end)
end,
case lists:keysearch("access", 1, XData) of
{value, {_, Strings}} ->
String = lists:foldl(fun(S, Res) ->
Res ++ S ++ "\n"
end, "", Strings),
case erl_scan:string(String) of
{ok, Tokens, _} ->
case erl_parse:parse_term(Tokens) of
{ok, Rs} ->
case SetAccess(Rs) of
{atomic, _} ->
{result, []};
E ->
io:format("A: ~p~n", [E]),
{error, "406", "Not Acceptable"}
end;
_ ->
{error, "406", "Not Acceptable"}
end;
_ ->
{error, "406", "Not Acceptable"}
end;
_ -> _ ->
{error, "406", "Not Acceptable"} {error, "406", "Not Acceptable"}
end; end;