aboutsummaryrefslogtreecommitdiff
path: root/src/mod_pubsub.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_pubsub.erl')
-rw-r--r--src/mod_pubsub.erl16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl
index 0063df8d9..48a19b99f 100644
--- a/src/mod_pubsub.erl
+++ b/src/mod_pubsub.erl
@@ -498,6 +498,7 @@ disco_sm_items(Acc, _From, _To, _Node, _Lang) -> Acc.
-spec disco_items(ljid(), binary(), jid()) -> [disco_item()].
disco_items(Host, <<>>, From) ->
+ MaxNodes = mod_pubsub_opt:max_nodes_discoitems(serverhost(Host)),
Action =
fun(#pubsub_node{nodeid = {_, Node}, options = Options,
type = Type, id = Nidx, owners = O}, Acc) ->
@@ -513,7 +514,7 @@ disco_items(Host, <<>>, From) ->
end
end,
NodeBloc = fun() ->
- case tree_call(Host, get_nodes, [Host]) of
+ case tree_call(Host, get_nodes, [Host, MaxNodes]) of
Nodes when is_list(Nodes) ->
{result, lists:foldl(Action, [], Nodes)};
Error ->
@@ -1007,8 +1008,9 @@ iq_disco_info(ServerHost, Host, SNode, From, Lang) ->
-spec iq_disco_items(host(), binary(), jid(), undefined | rsm_set()) ->
{result, disco_items()} | {error, stanza_error()}.
-iq_disco_items(Host, <<>>, From, _RSM) ->
- case tree_action(Host, get_subnodes, [Host, <<>>, From]) of
+iq_disco_items(Host, <<>>, _From, _RSM) ->
+ MaxNodes = mod_pubsub_opt:max_nodes_discoitems(serverhost(Host)),
+ case tree_action(Host, get_subnodes, [Host, <<>>, MaxNodes]) of
{error, #stanza_error{}} = Err ->
Err;
Nodes when is_list(Nodes) ->
@@ -1039,6 +1041,7 @@ iq_disco_items(Host, Item, From, RSM) ->
[_Node, _ItemId] ->
{result, #disco_items{}};
[Node] ->
+ MaxNodes = mod_pubsub_opt:max_nodes_discoitems(serverhost(Host)),
Action = fun(#pubsub_node{id = Nidx, type = Type, options = Options, owners = O}) ->
Owners = node_owners_call(Host, Type, Nidx, O),
{NodeItems, RsmOut} = case get_allowed_items_call(
@@ -1046,7 +1049,7 @@ iq_disco_items(Host, Item, From, RSM) ->
{result, R} -> R;
_ -> {[], undefined}
end,
- case tree_call(Host, get_subnodes, [Host, Node, From]) of
+ case tree_call(Host, get_subnodes, [Host, Node, MaxNodes]) of
SubNodes when is_list(SubNodes) ->
Nodes = lists:map(
fun(#pubsub_node{nodeid = {_, SubNode}, options = SubOptions}) ->
@@ -3154,7 +3157,7 @@ send_last_pep(From, To) ->
Host = host(ServerHost),
Publisher = jid:tolower(From),
Owner = jid:remove_resource(Publisher),
- case tree_action(Host, get_nodes, [Owner, From]) of
+ case tree_action(Host, get_nodes, [Owner, infinity]) of
Nodes when is_list(Nodes) ->
lists:foreach(
fun(#pubsub_node{nodeid = {_, Node}, type = Type, id = Nidx, options = Options}) ->
@@ -4123,6 +4126,8 @@ mod_opt_type(last_item_cache) ->
econf:bool();
mod_opt_type(max_items_node) ->
econf:non_neg_int();
+mod_opt_type(max_nodes_discoitems) ->
+ econf:non_neg_int(infinity);
mod_opt_type(max_subscriptions_node) ->
econf:non_neg_int();
mod_opt_type(force_node_config) ->
@@ -4168,6 +4173,7 @@ mod_options(Host) ->
{ignore_pep_from_offline, true},
{last_item_cache, false},
{max_items_node, ?MAXITEMS},
+ {max_nodes_discoitems, 100},
{nodetree, ?STDTREE},
{pep_mapping, []},
{plugins, [?STDNODE]},