]> git.mxchange.org Git - friendica.git/commitdiff
Issue 13955: Check for publish date upon receival
authorMichael <heluecht@pirati.ca>
Sat, 2 Mar 2024 19:21:14 +0000 (19:21 +0000)
committerMichael <heluecht@pirati.ca>
Sat, 2 Mar 2024 19:21:14 +0000 (19:21 +0000)
src/Content/Item.php
src/Model/Item.php
src/Protocol/ActivityPub/Receiver.php
src/Protocol/Diaspora.php
src/Protocol/Feed.php

index e9f4ef87389c16017f4bd74b7b106f1740f5d495..bfc3979c5a6b8c8643460c7056fb613f2dd9c345 100644 (file)
@@ -1105,4 +1105,35 @@ class Item
                        Tag::store($toUriId, $receiver['type'], $receiver['name'], $receiver['url']);
                }
        }
+
+       /**
+        * Check if the item is too old
+        *
+        * @param string $created
+        * @param integer $uid
+        * @return boolean item is too old
+        */
+       public function isTooOld(string $created, int $uid = 0): bool
+       {
+               // check for create date and expire time
+               $expire_interval = DI::config()->get('system', 'dbclean-expire-days', 0);
+
+               if ($uid) {
+                       $user = DBA::selectFirst('user', ['expire'], ['uid' => $uid]);
+                       if (DBA::isResult($user) && ($user['expire'] > 0) && (($user['expire'] < $expire_interval) || ($expire_interval == 0))) {
+                               $expire_interval = $user['expire'];
+                       }
+               }
+
+               if (($expire_interval > 0) && !empty($created)) {
+                       $expire_date = time() - ($expire_interval * 86400);
+                       $created_date = strtotime($created);
+                       if ($created_date < $expire_date) {
+                               Logger::notice('Item created before expiration interval.', ['created' => date('c', $created_date), 'expired' => date('c', $expire_date)]);
+                               return true;
+                       }
+               }
+
+               return false;
+       }
 }
index 3d748abfba486598fe1fe7b3361c38e688dd3992..6fba99853b85149438528e808ac8f984a4bc0c94 100644 (file)
@@ -689,38 +689,6 @@ class Item
                return true;
        }
 
-       /**
-        * Check if the item array is too old
-        *
-        * @param array $item Item record
-        * @return boolean item is too old
-        */
-       public static function isTooOld(array $item): bool
-       {
-               // check for create date and expire time
-               $expire_interval = DI::config()->get('system', 'dbclean-expire-days', 0);
-
-               $user = DBA::selectFirst('user', ['expire'], ['uid' => $item['uid']]);
-               if (DBA::isResult($user) && ($user['expire'] > 0) && (($user['expire'] < $expire_interval) || ($expire_interval == 0))) {
-                       $expire_interval = $user['expire'];
-               }
-
-               if (($expire_interval > 0) && !empty($item['created'])) {
-                       $expire_date = time() - ($expire_interval * 86400);
-                       $created_date = strtotime($item['created']);
-                       if ($created_date < $expire_date) {
-                               Logger::notice('Item created before expiration interval.', [
-                                       'created' => date('c', $created_date),
-                                       'expired' => date('c', $expire_date),
-                                       '$item' => $item
-                               ]);
-                               return true;
-                       }
-               }
-
-               return false;
-       }
-
        /**
         * Return the id of the given item array if it has been stored before
         *
@@ -1032,7 +1000,7 @@ class Item
 
                if (
                        !empty($item['direction']) && in_array($item['direction'], [Conversation::PUSH, Conversation::RELAY]) &&
-                       empty($item['origin']) && self::isTooOld($item)
+                       empty($item['origin']) && DI::contentItem()->isTooOld($item['created'], $item['uid'])
                ) {
                        Logger::info('Item is too old', ['item' => $item]);
                        return 0;
index 07eca4a3e7fdf84f17d9cd9cc3d982caab5617e2..fd5e05fb6208f704405cfba8866c938df16dbe63 100644 (file)
@@ -634,6 +634,16 @@ class Receiver
 
                if (is_array($activity['as:object'])) {
                        $attributed_to = JsonLD::fetchElement($activity['as:object'], 'as:attributedTo', '@id');
+                       $published     = JsonLD::fetchElement($activity['as:object'], 'as:published', '@value');
+                       $object_type   = JsonLD::fetchElement($activity['as:object'], '@type');
+                       $id            = JsonLD::fetchElement($activity, '@id');
+                       $object_id     = JsonLD::fetchElement($activity, 'as:object', '@id');
+
+                       if (!empty($published) && !empty($object_id) && in_array($type, ['as:Create', 'as:Update']) && in_array($object_type, self::CONTENT_TYPES)
+                               && ($push || ($completion != self::COMPLETION_MANUAL)) && DI::contentItem()->isTooOld($published) && !Post::exists(['uri' => $object_id])) {
+                               Logger::debug('Activity is too old. It will not be processed', ['push' => $push, 'completion' => $completion, 'type' =>  $type,  'object-type' => $object_type, 'published' => $published, 'id' => $id, 'object-id' => $object_id]);
+                               return true;
+                       }
                } else {
                        $attributed_to = '';
                }
@@ -652,7 +662,6 @@ class Receiver
                // For announced "create" activities we remove the middle layer.
                // For the rest (like, dislike, update, ...) we just process the activity directly.
                $original_actor = '';
-               $object_type = JsonLD::fetchElement($activity['as:object'] ?? [], '@type');
                if (($type == 'as:Announce') && !empty($object_type) && !in_array($object_type, self::CONTENT_TYPES) && self::isGroup($actor)) {
                        $object_object_type = JsonLD::fetchElement($activity['as:object']['as:object'] ?? [], '@type');
                        if (in_array($object_type, ['as:Create']) && in_array($object_object_type, self::CONTENT_TYPES)) {
index 5df05736cc3b284afc2ae77879b565a7098d6205..15068fd8ad855ca0bb364083a04d9adba62da981 100644 (file)
@@ -1602,7 +1602,7 @@ class Diaspora
                        $datarray['diaspora_signed_text'] = json_encode($data);
                }
 
-               if (Item::isTooOld($datarray)) {
+               if (DI::contentItem()->isTooOld($datarray['created'], $datarray['uid'])) {
                        Logger::info('Comment is too old', ['created' => $datarray['created'], 'uid' => $datarray['uid'], 'guid' => $datarray['guid']]);
                        return false;
                }
@@ -1860,7 +1860,7 @@ class Diaspora
                        $datarray['diaspora_signed_text'] = json_encode($data);
                }
 
-               if (Item::isTooOld($datarray)) {
+               if (DI::contentItem()->isTooOld($datarray['created'], $datarray['uid'])) {
                        Logger::info('Like is too old', ['created' => $datarray['created'], 'uid' => $datarray['uid'], 'guid' => $datarray['guid']]);
                        return false;
                }
@@ -2023,7 +2023,7 @@ class Diaspora
                // Diaspora doesn't provide a date for a participation
                $datarray['changed'] = $datarray['created'] = $datarray['edited'] = DateTimeFormat::utcNow();
 
-               if (Item::isTooOld($datarray)) {
+               if (DI::contentItem()->isTooOld($datarray['created'], $datarray['uid'])) {
                        Logger::info('Participation is too old', ['created' => $datarray['created'], 'uid' => $datarray['uid'], 'guid' => $datarray['guid']]);
                        return false;
                }
@@ -2393,7 +2393,7 @@ class Diaspora
 
                self::fetchGuid($datarray);
 
-               if (Item::isTooOld($datarray)) {
+               if (DI::contentItem()->isTooOld($datarray['created'], $datarray['uid'])) {
                        Logger::info('Reshare is too old', ['created' => $datarray['created'], 'uid' => $datarray['uid'], 'guid' => $datarray['guid']]);
                        return false;
                }
@@ -2738,7 +2738,7 @@ class Diaspora
 
                self::fetchGuid($datarray);
 
-               if (Item::isTooOld($datarray)) {
+               if (DI::contentItem()->isTooOld($datarray['created'], $datarray['uid'])) {
                        Logger::info('Status is too old', ['created' => $datarray['created'], 'uid' => $datarray['uid'], 'guid' => $datarray['guid']]);
                        return false;
                }
index e0ab3dd49a34ad7af0249057b1f6cb01ab2d5c36..127b3342e97bbf72d38cfaee19113b85a16c20ad 100644 (file)
@@ -563,7 +563,7 @@ class Feed
                        } elseif (!Item::isValid($item)) {
                                Logger::info('Feed item is invalid', ['created' => $item['created'], 'uid' => $item['uid'], 'uri' => $item['uri']]);
                                continue;
-                       } elseif (Item::isTooOld($item)) {
+                       } elseif (DI::contentItem()->isTooOld($item['created'], $item['uid'])) {
                                Logger::info('Feed is too old', ['created' => $item['created'], 'uid' => $item['uid'], 'uri' => $item['uri']]);
                                continue;
                        }