aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd.app2
-rw-r--r--src/ejabberd.cfg2
-rw-r--r--src/ejabberd.erl2
-rw-r--r--src/ejabberd_c2s.erl30
-rw-r--r--src/ejabberd_listener.erl46
-rw-r--r--src/ejabberd_s2s_in.erl6
-rw-r--r--src/ejabberd_service.erl6
-rw-r--r--src/mod_configure.erl103
8 files changed, 151 insertions, 46 deletions
diff --git a/src/ejabberd.app b/src/ejabberd.app
index a90fbaeb4..894141e54 100644
--- a/src/ejabberd.app
+++ b/src/ejabberd.app
@@ -43,7 +43,7 @@
ejabberd_mod_roster,
ejabberd_listeners
]},
- {applications, [kernel, stdlib, mnesia]},
+ {applications, [kernel, stdlib, mnesia, crypto, ssl]},
{env, []},
{mod, {ejabberd_app, []}}]}.
diff --git a/src/ejabberd.cfg b/src/ejabberd.cfg
index 6cc428f35..c91c71139 100644
--- a/src/ejabberd.cfg
+++ b/src/ejabberd.cfg
@@ -29,6 +29,8 @@ override_acls.
{host, "e.localhost"}.
{listen, [{5522, ejabberd_c2s, start, [{access, c2s}]},
+ %{5523, ejabberd_c2s, start,
+ % [{access, c2s}, {ssl, [{certfile, "./ssl.pem"}]}]},
{5269, ejabberd_s2s_in, start, []},
{8888, ejabberd_service, start,
[{host, "asd.e.localhost", [{password, "asdqwe"}]}]}
diff --git a/src/ejabberd.erl b/src/ejabberd.erl
index ef3b85c15..c34430fc3 100644
--- a/src/ejabberd.erl
+++ b/src/ejabberd.erl
@@ -14,6 +14,8 @@
start() ->
application:start(mnesia),
+ application:start(crypto),
+ application:start(ssl),
application:start(ejabberd).
stop() ->
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 2fa3e1d2e..13e7cc169 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -13,7 +13,7 @@
-behaviour(gen_fsm).
%% 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
-export([init/1, wait_for_stream/2, wait_for_auth/2, session_established/2,
@@ -61,8 +61,8 @@
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
-start(Socket, Opts) ->
- gen_fsm:start(ejabberd_c2s, [Socket, Opts], ?FSMOPTS).
+start(SockData, Opts) ->
+ gen_fsm:start(ejabberd_c2s, [SockData, Opts], ?FSMOPTS).
%%%----------------------------------------------------------------------
%%% Callback functions from gen_fsm
@@ -75,9 +75,9 @@ start(Socket, Opts) ->
%% ignore |
%% {stop, StopReason}
%%----------------------------------------------------------------------
-init([Socket, Opts]) ->
- SenderPid = spawn(?MODULE, sender, [Socket]),
- ReceiverPid = spawn(?MODULE, receiver, [Socket, self()]),
+init([{SockMod, Socket}, Opts]) ->
+ SenderPid = spawn(?MODULE, sender, [Socket, SockMod]),
+ ReceiverPid = spawn(?MODULE, receiver, [Socket, SockMod, self()]),
Access = case lists:keysearch(access, 1, Opts) of
{value, {_, A}} ->
A;
@@ -367,28 +367,28 @@ terminate(Reason, StateName, StateData) ->
%%% Internal functions
%%%----------------------------------------------------------------------
-receiver(Socket, C2SPid) ->
+receiver(Socket, SockMod, C2SPid) ->
XMLStreamPid = xml_stream:start(C2SPid),
- receiver(Socket, C2SPid, XMLStreamPid).
+ receiver(Socket, SockMod, C2SPid, XMLStreamPid).
-receiver(Socket, C2SPid, XMLStreamPid) ->
- case gen_tcp:recv(Socket, 0) of
+receiver(Socket, SockMod, C2SPid, XMLStreamPid) ->
+ case SockMod:recv(Socket, 0) of
{ok, Text} ->
xml_stream:send_text(XMLStreamPid, Text),
- receiver(Socket, C2SPid, XMLStreamPid);
+ receiver(Socket, SockMod, C2SPid, XMLStreamPid);
{error, Reason} ->
exit(XMLStreamPid, closed),
gen_fsm:send_event(C2SPid, closed),
ok
end.
-sender(Socket) ->
+sender(Socket, SockMod) ->
receive
{send_text, Text} ->
- gen_tcp:send(Socket,Text),
- sender(Socket);
+ SockMod:send(Socket,Text),
+ sender(Socket, SockMod);
close ->
- gen_tcp:close(Socket),
+ SockMod:close(Socket),
ok
end.
diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl
index 3ed030c7b..004ddba38 100644
--- a/src/ejabberd_listener.erl
+++ b/src/ejabberd_listener.erl
@@ -10,7 +10,10 @@
-author('alexey@sevcom.net').
-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() ->
supervisor:start_link({local, ejabberd_listeners}, ?MODULE, []).
@@ -25,7 +28,7 @@ init(_) ->
lists:map(
fun({Port, Module, Fun, Opts}) ->
{Port,
- {?MODULE, start, [Port, Module, Fun, [Opts]]},
+ {?MODULE, start, [Port, Module, Fun, Opts]},
permanent,
brutal_kill,
worker,
@@ -34,22 +37,45 @@ init(_) ->
end.
-start(Port, Module, Fun, Args) ->
- {ok, spawn_link(?MODULE, init, [Port, Module, Fun, Args])}.
+start(Port, Module, Fun, Opts) ->
+ 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,
{packet, 0},
{active, false},
{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
{ok,Socket} ->
- apply(Module, Fun, [Socket] ++ Args),
- %ejabberd_c2s:start(Socket),
- accept(ListenSocket, Module, Fun, Args)
+ apply(Module, Fun, [{gen_tcp, Socket}, Opts]),
+ accept(ListenSocket, Module, Fun, Opts)
+ 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.
diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl
index 388030549..2f25c267b 100644
--- a/src/ejabberd_s2s_in.erl
+++ b/src/ejabberd_s2s_in.erl
@@ -65,8 +65,8 @@
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
-start(Socket, Opts) ->
- gen_fsm:start(ejabberd_s2s_in, [Socket], ?FSMOPTS).
+start(SockData, Opts) ->
+ gen_fsm:start(ejabberd_s2s_in, [SockData], ?FSMOPTS).
%%%----------------------------------------------------------------------
%%% Callback functions from gen_fsm
@@ -79,7 +79,7 @@ start(Socket, Opts) ->
%% ignore |
%% {stop, StopReason}
%%----------------------------------------------------------------------
-init([Socket]) ->
+init([{SockMod, Socket}]) ->
ReceiverPid = spawn(?MODULE, receiver, [Socket, self()]),
{ok, wait_for_stream, #state{socket = Socket,
receiver = ReceiverPid,
diff --git a/src/ejabberd_service.erl b/src/ejabberd_service.erl
index 78e7a9c9a..455885f50 100644
--- a/src/ejabberd_service.erl
+++ b/src/ejabberd_service.erl
@@ -63,8 +63,8 @@
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
-start(Socket, Opts) ->
- gen_fsm:start(ejabberd_service, [Socket, Opts], ?FSMOPTS).
+start(SockData, Opts) ->
+ gen_fsm:start(ejabberd_service, [SockData, Opts], ?FSMOPTS).
%%%----------------------------------------------------------------------
%%% Callback functions from gen_fsm
@@ -77,7 +77,7 @@ start(Socket, Opts) ->
%% ignore |
%% {stop, StopReason}
%%----------------------------------------------------------------------
-init([Socket, Opts]) ->
+init([{SockMod, Socket}, Opts]) ->
{Host, Password} =
case lists:keysearch(host, 1, Opts) of
{value, {_, H, HOpts}} ->
diff --git a/src/mod_configure.erl b/src/mod_configure.erl
index 7e62bff99..3f6c09a08 100644
--- a/src/mod_configure.erl
+++ b/src/mod_configure.erl
@@ -283,7 +283,36 @@ get_form(["config", "acls"], Lang) ->
lists:flatten(io_lib:format("~p.",
[ets:tab2list(acl)])),
"\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) ->
case lists:keysearch("acls", 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, ACLs} ->
- case acl:add_list(ACLs, true) of
- ok ->
- {result, []};
- _ ->
- {error, "406", "Not Acceptable"}
- end;
+ 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, ACLs} ->
+ case acl:add_list(ACLs, true) of
+ ok ->
+ {result, []};
_ ->
{error, "406", "Not Acceptable"}
end;
_ ->
{error, "406", "Not Acceptable"}
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"}
end;