diff options
Diffstat (limited to 'src/mod_multicast.erl')
-rw-r--r-- | src/mod_multicast.erl | 92 |
1 files changed, 49 insertions, 43 deletions
diff --git a/src/mod_multicast.erl b/src/mod_multicast.erl index 509fe8893..ad2256af0 100644 --- a/src/mod_multicast.erl +++ b/src/mod_multicast.erl @@ -52,8 +52,8 @@ ts :: integer()}). -record(dest, {jid_string :: binary() | none, - jid_jid :: jid(), - type :: to | cc | bcc, + jid_jid :: jid() | undefined, + type :: bcc | cc | noreply | ofrom | replyroom | replyto | to, address :: address()}). -type limit_value() :: {default | custom, integer()}. @@ -67,9 +67,9 @@ -record(group, {server :: binary(), dests :: [#dest{}], - multicast :: routing(), - others :: [#address{}], - addresses :: [#address{}]}). + multicast :: routing() | undefined, + others :: [address()], + addresses :: [address()]}). -record(state, {lserver :: binary(), lservice :: binary(), @@ -153,9 +153,9 @@ user_send_packet(Acc) -> -spec init(list()) -> {ok, state()}. init([LServerS, Opts]) -> process_flag(trap_exit, true), - [LServiceS|_] = gen_mod:get_opt_hosts(LServerS, Opts), - Access = gen_mod:get_opt(access, Opts), - SLimits = build_service_limit_record(gen_mod:get_opt(limits, Opts)), + [LServiceS|_] = gen_mod:get_opt_hosts(Opts), + Access = mod_multicast_opt:access(Opts), + SLimits = build_service_limit_record(mod_multicast_opt:limits(Opts)), create_cache(), try_start_loop(), ejabberd_router_multicast:register_route(LServerS), @@ -171,9 +171,9 @@ handle_call(stop, _From, State) -> handle_cast({reload, NewOpts, NewOpts}, #state{lserver = LServerS, lservice = OldLServiceS} = State) -> - Access = gen_mod:get_opt(access, NewOpts), - SLimits = build_service_limit_record(gen_mod:get_opt(limits, NewOpts)), - [NewLServiceS|_] = gen_mod:get_opt_hosts(LServerS, NewOpts), + Access = mod_multicast_opt:access(NewOpts), + SLimits = build_service_limit_record(mod_multicast_opt:limits(NewOpts)), + [NewLServiceS|_] = gen_mod:get_opt_hosts(NewOpts), if NewLServiceS /= OldLServiceS -> ejabberd_router:register_route(NewLServiceS, LServerS), ejabberd_router:unregister_route(OldLServiceS); @@ -183,7 +183,7 @@ handle_cast({reload, NewOpts, NewOpts}, {noreply, State#state{lservice = NewLServiceS, access = Access, service_limits = SLimits}}; handle_cast(Msg, State) -> - ?WARNING_MSG("unexpected cast: ~p", [Msg]), + ?WARNING_MSG("Unexpected cast: ~p", [Msg]), {noreply, State}. %%-------------------------------------------------------------------- @@ -283,7 +283,7 @@ process_iq(_, _) -> -define(FEATURE(Feat), Feat). iq_disco_info(From, Lang, State) -> - Name = gen_mod:get_module_opt(State#state.lserver, ?MODULE, name), + Name = mod_multicast_opt:name(State#state.lserver), #disco_info{ identities = [#identity{category = <<"service">>, type = <<"multicast">>, @@ -322,27 +322,27 @@ route_untrusted(LServiceS, LServerS, Access, SLimits, Packet) -> catch adenied -> route_error(Packet, forbidden, - <<"Access denied by service policy">>); + ?T("Access denied by service policy")); eadsele -> route_error(Packet, bad_request, - <<"No addresses element found">>); + ?T("No addresses element found")); eadeles -> route_error(Packet, bad_request, - <<"No address elements found">>); + ?T("No address elements found")); ewxmlns -> route_error(Packet, bad_request, - <<"Wrong xmlns">>); + ?T("Wrong xmlns")); etoorec -> route_error(Packet, not_acceptable, - <<"Too many receiver fields were specified">>); + ?T("Too many receiver fields were specified")); edrelay -> route_error(Packet, forbidden, - <<"Packet relay is denied by service policy">>); + ?T("Packet relay is denied by service policy")); EType:EReason -> ?ERROR_MSG("Multicast unknown error: Type: ~p~nReason: ~p", [EType, EReason]), route_error(Packet, internal_server_error, - <<"Unknown problem">>) + ?T("Internal server error")) end. -spec route_untrusted2(binary(), binary(), atom(), #service_limits{}, stanza()) -> 'ok'. @@ -459,8 +459,9 @@ check_limit_dests(SLimits, FromJID, Packet, -spec convert_dest_record([address()]) -> [#dest{}]. convert_dest_record(Addrs) -> lists:map( - fun(#address{jid = undefined} = Addr) -> - #dest{jid_string = none, address = Addr}; + fun(#address{jid = undefined, type = Type} = Addr) -> + #dest{jid_string = none, + type = Type, address = Addr}; (#address{jid = JID, type = Type} = Addr) -> #dest{jid_string = jid:encode(JID), jid_jid = JID, type = Type, address = Addr} @@ -485,9 +486,9 @@ split_dests_jid(Dests) -> report_not_jid(From, Packet, Dests) -> Dests2 = [fxml:element_to_binary(xmpp:encode(Dest#dest.address)) || Dest <- Dests], - [route_error(xmpp:set_from_to(Packet, From, From), jid_malformed, - <<"This service can not process the address: ", - D/binary>>) + [route_error( + xmpp:set_from_to(Packet, From, From), jid_malformed, + str:format(?T("This service can not process the address: ~s"), [D])) || D <- Dests2]. %%%------------------------- @@ -502,7 +503,8 @@ group_dests(Dests) -> end, dict:new(), Dests), Keys = dict:fetch_keys(D), - [#group{server = Key, dests = dict:fetch(Key, D)} + [#group{server = Key, dests = dict:fetch(Key, D), + addresses = [], others = []} || Key <- Keys]. %%%------------------------- @@ -1074,7 +1076,7 @@ iq_disco_info_extras(From, State) -> end. sender_type(From) -> - Local_hosts = ejabberd_config:get_myhosts(), + Local_hosts = ejabberd_option:hosts(), case lists:member(From#jid.lserver, Local_hosts) of true -> local; false -> remote @@ -1124,23 +1126,27 @@ depends(_Host, _Opts) -> []. mod_opt_type(access) -> - fun acl:access_rules_validator/1; -mod_opt_type(host) -> fun ejabberd_config:v_host/1; -mod_opt_type(hosts) -> fun ejabberd_config:v_hosts/1; -mod_opt_type(name) -> fun iolist_to_binary/1; -mod_opt_type({limits, Type}) when (Type == local) or (Type == remote) -> - fun(L) -> - lists:map( - fun ({message, infinite} = O) -> O; - ({presence, infinite} = O) -> O; - ({message, I} = O) when is_integer(I) -> O; - ({presence, I} = O) when is_integer(I) -> O - end, L) - end. - -mod_options(_Host) -> + econf:acl(); +mod_opt_type(name) -> + econf:binary(); +mod_opt_type(limits) -> + econf:options( + #{local => + econf:options( + #{message => econf:non_neg_int(infinite), + presence => econf:non_neg_int(infinite)}), + remote => + econf:options( + #{message => econf:non_neg_int(infinite), + presence => econf:non_neg_int(infinite)})}); +mod_opt_type(host) -> + econf:host(); +mod_opt_type(hosts) -> + econf:hosts(). + +mod_options(Host) -> [{access, all}, - {host, <<"multicast.@HOST@">>}, + {host, <<"multicast.", Host/binary>>}, {hosts, []}, {limits, [{local, []}, {remote, []}]}, {name, ?T("Multicast")}]. |