Prevent endless loops and long running feed processing

This commit is contained in:
Michael 2020-03-22 13:05:35 +00:00
parent 7bc4427c09
commit bc069c8ebf
4 changed files with 16 additions and 4 deletions

View File

@ -884,11 +884,11 @@ class GContact
$items = $outbox['orderedItems']; $items = $outbox['orderedItems'];
} elseif (!empty($outbox['first']['orderedItems'])) { } elseif (!empty($outbox['first']['orderedItems'])) {
$items = $outbox['first']['orderedItems']; $items = $outbox['first']['orderedItems'];
} elseif (!empty($outbox['first']['href'])) { } elseif (!empty($outbox['first']['href']) && ($outbox['first']['href'] != $feed)) {
self::updateFromOutbox($outbox['first']['href'], $data); self::updateFromOutbox($outbox['first']['href'], $data);
return; return;
} elseif (!empty($outbox['first'])) { } elseif (!empty($outbox['first'])) {
if (is_string($outbox['first'])) { if (is_string($outbox['first']) && ($outbox['first'] != $feed)) {
self::updateFromOutbox($outbox['first'], $data); self::updateFromOutbox($outbox['first'], $data);
} else { } else {
Logger::warning('Unexpected data', ['outbox' => $outbox]); Logger::warning('Unexpected data', ['outbox' => $outbox]);

View File

@ -231,7 +231,7 @@ class ActivityPub
$items = $data['orderedItems']; $items = $data['orderedItems'];
} elseif (!empty($data['first']['orderedItems'])) { } elseif (!empty($data['first']['orderedItems'])) {
$items = $data['first']['orderedItems']; $items = $data['first']['orderedItems'];
} elseif (!empty($data['first']) && is_string($data['first'])) { } elseif (!empty($data['first']) && is_string($data['first']) && ($data['first'] != $url)) {
return self::fetchItems($data['first'], $uid); return self::fetchItems($data['first'], $uid);
} else { } else {
$items = []; $items = [];

View File

@ -232,8 +232,16 @@ class Feed {
} }
$items = []; $items = [];
// Limit the number of items that are about to be fetched
$total_items = ($entries->length - 1);
$max_items = DI::config()->get('system', 'max_feed_items');
if (($max_items > 0) && ($total_items > $max_items)) {
$total_items = $max_items;
}
// Importing older entries first // Importing older entries first
for ($i = $entries->length - 1; $i >= 0; --$i) { for ($i = $total_items; $i >= 0; --$i) {
$entry = $entries->item($i); $entry = $entries->item($i);
$item = array_merge($header, $author); $item = array_merge($header, $author);

View File

@ -273,6 +273,10 @@ return [
// Maximum number of queue items for a single contact before subsequent messages are discarded. // Maximum number of queue items for a single contact before subsequent messages are discarded.
'max_contact_queue' => 500, 'max_contact_queue' => 500,
// max_feed_items (Integer)
// Maximum number of feed items that are fetched and processed. For unlimited items set to 0.
'max_feed_items' => 10,
// max_image_length (Integer) // max_image_length (Integer)
// An alternate way of limiting picture upload sizes. // An alternate way of limiting picture upload sizes.
// Specify the maximum pixel length that pictures are allowed to be (for non-square pictures, it will apply to the longest side). // Specify the maximum pixel length that pictures are allowed to be (for non-square pictures, it will apply to the longest side).