-export([riak_server/0]).
-export([riak_start_interval/0]).
-export([riak_username/0]).
--export([route_subdomains/0, route_subdomains/1]).
-export([router_cache_life_time/0]).
-export([router_cache_missed/0]).
-export([router_cache_size/0]).
riak_username() ->
ejabberd_config:get_option({riak_username, global}).
--spec route_subdomains() -> 'local' | 's2s'.
-route_subdomains() ->
- route_subdomains(global).
--spec route_subdomains(global | binary()) -> 'local' | 's2s'.
-route_subdomains(Host) ->
- ejabberd_config:get_option({route_subdomains, Host}).
-
-spec router_cache_life_time() -> 'infinity' | pos_integer().
router_cache_life_time() ->
ejabberd_config:get_option({router_cache_life_time, global}).
{error, Reason} ->
Lang = xmpp:get_lang(Packet),
Err = case Reason of
- policy_violation ->
- xmpp:err_policy_violation(
- ?T("Server connections to local "
- "subdomains are forbidden"), Lang);
forbidden ->
xmpp:err_forbidden(?T("Access denied by service policy"), Lang);
internal_server_error ->
end.
-spec start_connection(jid(), jid())
- -> {ok, pid()} | {error, policy_violation | forbidden | internal_server_error}.
+ -> {ok, pid()} | {error, forbidden | internal_server_error}.
start_connection(From, To) ->
start_connection(From, To, []).
-spec start_connection(jid(), jid(), [proplists:property()])
- -> {ok, pid()} | {error, policy_violation | forbidden | internal_server_error}.
+ -> {ok, pid()} | {error, forbidden | internal_server_error}.
start_connection(From, To, Opts) ->
#jid{lserver = MyServer} = From,
#jid{lserver = Server} = To,
%% service and if the s2s host is not blacklisted or
%% is in whitelist:
LServer = ejabberd_router:host_of_route(MyServer),
- case is_service(From, To) of
- true ->
- {error, policy_violation};
- false ->
- case allow_host(LServer, Server) of
- true ->
- NeededConnections = needed_connections_number(
- [],
- MaxS2SConnectionsNumber,
- MaxS2SConnectionsNumberPerNode),
- open_several_connections(NeededConnections, MyServer,
- Server, From, FromTo,
- MaxS2SConnectionsNumber,
- MaxS2SConnectionsNumberPerNode, Opts);
- false ->
- {error, forbidden}
- end
- end;
+ case allow_host(LServer, Server) of
+ true ->
+ NeededConnections = needed_connections_number(
+ [],
+ MaxS2SConnectionsNumber,
+ MaxS2SConnectionsNumberPerNode),
+ open_several_connections(NeededConnections, MyServer,
+ Server, From, FromTo,
+ MaxS2SConnectionsNumber,
+ MaxS2SConnectionsNumberPerNode, Opts);
+ false ->
+ {error, forbidden}
+ end;
L when is_list(L) ->
NeededConnections = needed_connections_number(L,
MaxS2SConnectionsNumber,
lists:min([MaxS2SConnectionsNumber - length(Ls),
MaxS2SConnectionsNumberPerNode - length(LocalLs)]).
-%%--------------------------------------------------------------------
-%% Function: is_service(From, To) -> true | false
-%% Description: Return true if the destination must be considered as a
-%% service.
-%% --------------------------------------------------------------------
--spec is_service(jid(), jid()) -> boolean().
-is_service(From, To) ->
- LFromDomain = From#jid.lserver,
- case ejabberd_option:route_subdomains(LFromDomain) of
- s2s -> % bypass RFC 3920 10.3
- false;
- local ->
- Hosts = ejabberd_option:hosts(),
- P = fun (ParentDomain) ->
- lists:member(ParentDomain, Hosts)
- end,
- lists:any(P, parent_domains(To#jid.lserver))
- end.
-
-parent_domains(Domain) ->
- lists:foldl(fun (Label, []) -> [Label];
- (Label, [Head | Tail]) ->
- [<<Label/binary, ".", Head/binary>>, Head | Tail]
- end,
- [], lists:reverse(str:tokens(Domain, <<".">>))).
-
%%%----------------------------------------------------------------------
%%% ejabberd commands