aboutsummaryrefslogtreecommitdiff
path: root/src/mod_s2s_dialback.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_s2s_dialback.erl')
-rw-r--r--src/mod_s2s_dialback.erl84
1 files changed, 44 insertions, 40 deletions
diff --git a/src/mod_s2s_dialback.erl b/src/mod_s2s_dialback.erl
index 55854a82b..0237f6666 100644
--- a/src/mod_s2s_dialback.erl
+++ b/src/mod_s2s_dialback.erl
@@ -21,49 +21,45 @@
%%%-------------------------------------------------------------------
-module(mod_s2s_dialback).
-behaviour(gen_mod).
-
-protocol({xep, 220, '1.1.1'}).
-protocol({xep, 185, '1.0'}).
%% gen_mod API
--export([start/2, stop/1, reload/3, depends/2, mod_options/1]).
+-export([start/2, stop/1, reload/3, depends/2, mod_opt_type/1, mod_options/1]).
%% Hooks
-export([s2s_out_auth_result/2, s2s_out_downgraded/2,
s2s_in_packet/2, s2s_out_packet/2, s2s_in_recv/3,
- s2s_in_features/2, s2s_out_init/2, s2s_out_closed/2]).
+ s2s_in_features/2, s2s_out_init/2, s2s_out_closed/2,
+ s2s_out_tls_verify/2]).
-include("xmpp.hrl").
-include("logger.hrl").
+-include("translate.hrl").
%%%===================================================================
%%% API
%%%===================================================================
start(Host, _Opts) ->
- case ejabberd_s2s:tls_verify(Host) of
- true ->
- ?ERROR_MSG("disabling ~s for host ~s because option "
- "'s2s_use_starttls' is set to 'required_trusted'",
- [?MODULE, Host]);
- false ->
- ejabberd_hooks:add(s2s_out_init, Host, ?MODULE, s2s_out_init, 50),
- ejabberd_hooks:add(s2s_out_closed, Host, ?MODULE, s2s_out_closed, 50),
- ejabberd_hooks:add(s2s_in_pre_auth_features, Host, ?MODULE,
- s2s_in_features, 50),
- ejabberd_hooks:add(s2s_in_post_auth_features, Host, ?MODULE,
- s2s_in_features, 50),
- ejabberd_hooks:add(s2s_in_handle_recv, Host, ?MODULE,
- s2s_in_recv, 50),
- ejabberd_hooks:add(s2s_in_unauthenticated_packet, Host, ?MODULE,
- s2s_in_packet, 50),
- ejabberd_hooks:add(s2s_in_authenticated_packet, Host, ?MODULE,
- s2s_in_packet, 50),
- ejabberd_hooks:add(s2s_out_packet, Host, ?MODULE,
- s2s_out_packet, 50),
- ejabberd_hooks:add(s2s_out_downgraded, Host, ?MODULE,
- s2s_out_downgraded, 50),
- ejabberd_hooks:add(s2s_out_auth_result, Host, ?MODULE,
- s2s_out_auth_result, 50)
- end.
+ ejabberd_hooks:add(s2s_out_init, Host, ?MODULE, s2s_out_init, 50),
+ ejabberd_hooks:add(s2s_out_closed, Host, ?MODULE, s2s_out_closed, 50),
+ ejabberd_hooks:add(s2s_in_pre_auth_features, Host, ?MODULE,
+ s2s_in_features, 50),
+ ejabberd_hooks:add(s2s_in_post_auth_features, Host, ?MODULE,
+ s2s_in_features, 50),
+ ejabberd_hooks:add(s2s_in_handle_recv, Host, ?MODULE,
+ s2s_in_recv, 50),
+ ejabberd_hooks:add(s2s_in_unauthenticated_packet, Host, ?MODULE,
+ s2s_in_packet, 50),
+ ejabberd_hooks:add(s2s_in_authenticated_packet, Host, ?MODULE,
+ s2s_in_packet, 50),
+ ejabberd_hooks:add(s2s_out_packet, Host, ?MODULE,
+ s2s_out_packet, 50),
+ ejabberd_hooks:add(s2s_out_downgraded, Host, ?MODULE,
+ s2s_out_downgraded, 50),
+ ejabberd_hooks:add(s2s_out_auth_result, Host, ?MODULE,
+ s2s_out_auth_result, 50),
+ ejabberd_hooks:add(s2s_out_tls_verify, Host, ?MODULE,
+ s2s_out_tls_verify, 50).
stop(Host) ->
ejabberd_hooks:delete(s2s_out_init, Host, ?MODULE, s2s_out_init, 50),
@@ -83,21 +79,21 @@ stop(Host) ->
ejabberd_hooks:delete(s2s_out_downgraded, Host, ?MODULE,
s2s_out_downgraded, 50),
ejabberd_hooks:delete(s2s_out_auth_result, Host, ?MODULE,
- s2s_out_auth_result, 50).
+ s2s_out_auth_result, 50),
+ ejabberd_hooks:delete(s2s_out_tls_verify, Host, ?MODULE,
+ s2s_out_tls_verify, 50).
-reload(Host, NewOpts, _OldOpts) ->
- case ejabberd_s2s:tls_verify(Host) of
- false ->
- start(Host, NewOpts);
- true ->
- stop(Host)
- end.
+reload(_Host, _NewOpts, _OldOpts) ->
+ ok.
depends(_Host, _Opts) ->
[].
+mod_opt_type(access) ->
+ econf:acl().
+
mod_options(_Host) ->
- [].
+ [{access, all}].
s2s_in_features(Acc, _) ->
[#db_feature{errors = true}|Acc].
@@ -258,12 +254,20 @@ s2s_out_packet(State, Pkt) when is_record(Pkt, db_result);
s2s_out_packet(State, _) ->
State.
+-spec s2s_out_tls_verify(boolean(), ejabberd_s2s_out:state()) -> boolean().
+s2s_out_tls_verify(_, #{server_host := ServerHost, remote_server := RServer}) ->
+ Access = mod_s2s_dialback_opt:access(ServerHost),
+ case acl:match_rule(ServerHost, Access, jid:make(RServer)) of
+ allow -> false;
+ deny -> true
+ end.
+
%%%===================================================================
%%% Internal functions
%%%===================================================================
-spec make_key(binary(), binary(), binary()) -> binary().
make_key(From, To, StreamID) ->
- Secret = ejabberd_config:get_option(shared_key),
+ Secret = ejabberd_config:get_shared_key(),
str:to_hexlist(
crypto:hmac(sha256, str:to_hexlist(crypto:hash(sha256, Secret)),
[To, " ", From, " ", StreamID])).
@@ -318,9 +322,9 @@ check_from_to(From, To) ->
-spec mk_error(term(), binary()) -> stanza_error().
mk_error(forbidden, Lang) ->
- xmpp:err_forbidden(<<"Access denied by service policy">>, Lang);
+ xmpp:err_forbidden(?T("Access denied by service policy"), Lang);
mk_error(host_unknown, Lang) ->
- xmpp:err_not_allowed(<<"Host unknown">>, Lang);
+ xmpp:err_not_allowed(?T("Host unknown"), Lang);
mk_error({codec_error, Why}, Lang) ->
xmpp:err_bad_request(xmpp:io_format_error(Why), Lang);
mk_error({_Class, _Reason} = Why, Lang) ->