diff options
Diffstat (limited to 'src/mod_proxy65.erl')
-rw-r--r-- | src/mod_proxy65.erl | 139 |
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}]. |