aboutsummaryrefslogtreecommitdiff
path: root/src/mod_proxy65.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_proxy65.erl')
-rw-r--r--src/mod_proxy65.erl139
1 files changed, 80 insertions, 59 deletions
diff --git a/src/mod_proxy65.erl b/src/mod_proxy65.erl
index beea35725..718f49cb4 100644
--- a/src/mod_proxy65.erl
+++ b/src/mod_proxy65.erl
@@ -5,7 +5,7 @@
%%% Created : 12 Oct 2006 by Evgeniy Khramtsov <xram@jabber.ru>
%%%
%%%
-%%% ejabberd, Copyright (C) 2002-2016 ProcessOne
+%%% ejabberd, Copyright (C) 2002-2019 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -34,87 +34,108 @@
-behaviour(supervisor).
%% gen_mod callbacks.
--export([start/2, stop/1, transform_module_options/1]).
+-export([start/2, stop/1, reload/3]).
%% supervisor callbacks.
-export([init/1]).
--export([start_link/2, mod_opt_type/1, depends/2]).
+-export([start_link/1, mod_opt_type/1, mod_options/1, depends/2]).
-define(PROCNAME, ejabberd_mod_proxy65).
+-include("translate.hrl").
+
+-callback init() -> any().
+-callback register_stream(binary(), pid()) -> ok | {error, any()}.
+-callback unregister_stream(binary()) -> ok | {error, any()}.
+-callback activate_stream(binary(), binary(), pos_integer() | infinity, node()) ->
+ ok | {error, limit | conflict | notfound | term()}.
+
start(Host, Opts) ->
case mod_proxy65_service:add_listener(Host, Opts) of
- {error, _} = Err -> erlang:error(Err);
- _ ->
- Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
- ChildSpec = {Proc, {?MODULE, start_link, [Host, Opts]},
- transient, infinity, supervisor, [?MODULE]},
- supervisor:start_child(ejabberd_sup, ChildSpec)
+ {error, _} = Err ->
+ Err;
+ _ ->
+ Mod = gen_mod:ram_db_mod(global, ?MODULE),
+ Mod:init(),
+ Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
+ ChildSpec = {Proc, {?MODULE, start_link, [Host]},
+ transient, infinity, supervisor, [?MODULE]},
+ supervisor:start_child(ejabberd_gen_mod_sup, ChildSpec)
end.
stop(Host) ->
- mod_proxy65_service:delete_listener(Host),
+ case gen_mod:is_loaded_elsewhere(Host, ?MODULE) of
+ false ->
+ mod_proxy65_service:delete_listener(Host);
+ true ->
+ ok
+ end,
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
- supervisor:terminate_child(ejabberd_sup, Proc),
- supervisor:delete_child(ejabberd_sup, Proc).
+ supervisor:terminate_child(ejabberd_gen_mod_sup, Proc),
+ supervisor:delete_child(ejabberd_gen_mod_sup, Proc).
-start_link(Host, Opts) ->
- Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
- supervisor:start_link({local, Proc}, ?MODULE,
- [Host, Opts]).
+reload(Host, NewOpts, OldOpts) ->
+ Mod = gen_mod:ram_db_mod(global, ?MODULE),
+ Mod:init(),
+ mod_proxy65_service:reload(Host, NewOpts, OldOpts).
-transform_module_options(Opts) ->
- mod_proxy65_service:transform_module_options(Opts).
+start_link(Host) ->
+ Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
+ supervisor:start_link({local, Proc}, ?MODULE, [Host]).
-init([Host, Opts]) ->
+init([Host]) ->
Service = {mod_proxy65_service,
- {mod_proxy65_service, start_link, [Host, Opts]},
+ {mod_proxy65_service, start_link, [Host]},
transient, 5000, worker, [mod_proxy65_service]},
- StreamSupervisor = {ejabberd_mod_proxy65_sup,
- {ejabberd_tmp_sup, start_link,
- [gen_mod:get_module_proc(Host,
- ejabberd_mod_proxy65_sup),
- mod_proxy65_stream]},
- transient, infinity, supervisor, [ejabberd_tmp_sup]},
- StreamManager = {mod_proxy65_sm,
- {mod_proxy65_sm, start_link, [Host, Opts]}, transient,
- 5000, worker, [mod_proxy65_sm]},
- {ok,
- {{one_for_one, 10, 1},
- [StreamManager, StreamSupervisor, Service]}}.
+ {ok, {{one_for_one, 10, 1}, [Service]}}.
depends(_Host, _Opts) ->
[].
-mod_opt_type(auth_type) ->
- fun (plain) -> plain;
- (anonymous) -> anonymous
- end;
-mod_opt_type(recbuf) ->
- fun (I) when is_integer(I), I > 0 -> I end;
-mod_opt_type(shaper) ->
- fun (A) when is_atom(A) -> A end;
-mod_opt_type(sndbuf) ->
- fun (I) when is_integer(I), I > 0 -> I end;
mod_opt_type(access) ->
- fun (A) when is_atom(A) -> A end;
-mod_opt_type(host) -> fun iolist_to_binary/1;
-mod_opt_type(hostname) -> fun iolist_to_binary/1;
+ econf:acl();
+mod_opt_type(hostname) ->
+ econf:host();
mod_opt_type(ip) ->
- fun (S) ->
- {ok, Addr} =
- inet_parse:address(binary_to_list(iolist_to_binary(S))),
- Addr
- end;
-mod_opt_type(name) -> fun iolist_to_binary/1;
+ econf:ip();
+mod_opt_type(name) ->
+ econf:binary();
mod_opt_type(port) ->
- fun (P) when is_integer(P), P > 0, P < 65536 -> P end;
+ econf:port();
mod_opt_type(max_connections) ->
- fun (I) when is_integer(I), I > 0 -> I;
- (infinity) -> infinity
- end;
-mod_opt_type(_) ->
- [auth_type, recbuf, shaper, sndbuf,
- access, host, hostname, ip, name, port,
- max_connections].
+ econf:pos_int(infinity);
+mod_opt_type(host) ->
+ econf:host();
+mod_opt_type(hosts) ->
+ econf:hosts();
+mod_opt_type(ram_db_type) ->
+ econf:db_type(?MODULE);
+mod_opt_type(server_host) ->
+ econf:binary();
+mod_opt_type(auth_type) ->
+ econf:enum([plain, anonymous]);
+mod_opt_type(recbuf) ->
+ econf:pos_int();
+mod_opt_type(shaper) ->
+ econf:shaper();
+mod_opt_type(sndbuf) ->
+ econf:pos_int();
+mod_opt_type(vcard) ->
+ econf:vcard_temp().
+
+mod_options(Host) ->
+ [{ram_db_type, ejabberd_config:default_ram_db(Host, ?MODULE)},
+ {access, all},
+ {host, <<"proxy.", Host/binary>>},
+ {hosts, []},
+ {hostname, undefined},
+ {ip, undefined},
+ {port, 7777},
+ {name, ?T("SOCKS5 Bytestreams")},
+ {vcard, undefined},
+ {max_connections, infinity},
+ {auth_type, anonymous},
+ {recbuf, 65536},
+ {sndbuf, 65536},
+ {shaper, none}].