]> git.mxchange.org Git - friendica.git/commitdiff
Ward againt contact_id = 0 in UpdateContact worker
authorHypolite Petovan <hypolite@mrpetovan.com>
Thu, 29 Dec 2022 00:09:34 +0000 (19:09 -0500)
committerHypolite Petovan <hypolite@mrpetovan.com>
Fri, 30 Dec 2022 07:10:29 +0000 (02:10 -0500)
- Add parameter validation in Worker\UpdateContact::add
- Address https://github.com/friendica/friendica/issues/12487#issuecomment-1366833644

src/Model/Contact.php
src/Module/Contact.php
src/Module/Photo.php
src/Worker/UpdateContact.php
src/Worker/UpdateContacts.php

index bf90edcd4c3e20fd78a60677e653d158b228e7ec..7a0debc98aa05f63764ccbfb89eada09495edf6b 100644 (file)
@@ -47,6 +47,7 @@ use Friendica\Util\Images;
 use Friendica\Util\Network;
 use Friendica\Util\Proxy;
 use Friendica\Util\Strings;
+use Friendica\Worker\UpdateContact;
 
 /**
  * functions for interacting with a contact
@@ -362,7 +363,11 @@ class Contact
 
                // Update the contact in the background if needed
                if ($background_update && !self::isLocal($url) && Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) {
-                       Worker::add(['priority' => Worker::PRIORITY_LOW, 'dont_fork' => true], 'UpdateContact', $contact['id']);
+                       try {
+                               UpdateContact::add(['priority' => Worker::PRIORITY_LOW, 'dont_fork' => true], $contact['id']);
+                       } catch (\InvalidArgumentException $e) {
+                               Logger::notice($e->getMessage(), ['contact' => $contact]);
+                       }
                }
 
                // Remove the internal fields
@@ -1276,7 +1281,11 @@ class Contact
                        $background_update = DI::config()->get('system', 'update_active_contacts') ? $contact['local-data'] : true;
 
                        if ($background_update && !self::isLocal($url) && Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) {
-                               Worker::add(['priority' => Worker::PRIORITY_LOW, 'dont_fork' => true], 'UpdateContact', $contact['id']);
+                               try {
+                                       UpdateContact::add(['priority' => Worker::PRIORITY_LOW, 'dont_fork' => true], $contact['id']);
+                               } catch (\InvalidArgumentException $e) {
+                                       Logger::notice($e->getMessage(), ['contact' => $contact]);
+                               }
                        }
 
                        if (empty($update) && (!empty($contact['uri-id']) || is_bool($update))) {
@@ -3078,7 +3087,11 @@ class Contact
                if ($probed) {
                        self::updateFromProbeArray($contact_id, $ret);
                } else {
-                       Worker::add(Worker::PRIORITY_HIGH, 'UpdateContact', $contact_id);
+                       try {
+                               UpdateContact::add(Worker::PRIORITY_HIGH, $contact['id']);
+                       } catch (\InvalidArgumentException $e) {
+                               Logger::notice($e->getMessage(), ['contact' => $contact]);
+                       }
                }
 
                $result['success'] = Protocol::follow($uid, $contact, $protocol);
@@ -3549,8 +3562,12 @@ class Contact
                                Worker::add(Worker::PRIORITY_LOW, 'AddContact', 0, $url);
                                ++$added;
                        } elseif (!empty($contact['network']) && Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) {
-                               Worker::add(['priority' => Worker::PRIORITY_LOW, 'dont_fork' => true], 'UpdateContact', $contact['id']);
-                               ++$updated;
+                               try {
+                                       UpdateContact::add(['priority' => Worker::PRIORITY_LOW, 'dont_fork' => true], $contact['id']);
+                                       ++$updated;
+                               } catch (\InvalidArgumentException $e) {
+                                       Logger::notice($e->getMessage(), ['contact' => $contact]);
+                               }
                        } else {
                                ++$unchanged;
                        }
index e8c9d2241a43a0577c7da637cbcb7dfa20a2c9a9..4b2d8edad7458c4c1dca1c9fd3c16213df59b1a7 100644 (file)
@@ -26,8 +26,10 @@ use Friendica\Content\ContactSelector;
 use Friendica\Content\Nav;
 use Friendica\Content\Pager;
 use Friendica\Content\Widget;
+use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
 use Friendica\Core\Renderer;
+use Friendica\Core\System;
 use Friendica\Core\Theme;
 use Friendica\Core\Worker;
 use Friendica\Database\DBA;
@@ -37,6 +39,7 @@ use Friendica\Model\User;
 use Friendica\Module\Security\Login;
 use Friendica\Network\HTTPException\InternalServerErrorException;
 use Friendica\Network\HTTPException\NotFoundException;
+use Friendica\Worker\UpdateContact;
 
 /**
  *  Manages and show Contacts and their content
@@ -129,7 +132,11 @@ class Contact extends BaseModule
                        // pull feed and consume it, which should subscribe to the hub.
                        Worker::add(Worker::PRIORITY_HIGH, 'OnePoll', $contact_id, 'force');
                } else {
-                       Worker::add(Worker::PRIORITY_HIGH, 'UpdateContact', $contact_id);
+                       try {
+                               UpdateContact::add(Worker::PRIORITY_HIGH, $contact_id);
+                       } catch (\InvalidArgumentException $e) {
+                               Logger::notice($e->getMessage(), ['contact' => $contact, 'callstack' => System::callstack()]);
+                       }
                }
        }
 
index 35348be70799789fb444a70d30181b8d01131ee0..caab13edafb830cee4bab68284383e6abd96c10e 100644 (file)
@@ -44,6 +44,7 @@ use Friendica\Util\Images;
 use Friendica\Util\Network;
 use Friendica\Util\ParseUrl;
 use Friendica\Util\Proxy;
+use Friendica\Worker\UpdateContact;
 
 /**
  * Photo Module
@@ -351,8 +352,12 @@ class Photo extends BaseModule
                                                        Logger::debug('Got return code for avatar', ['return code' => $curlResult->getReturnCode(), 'cid' => $id, 'url' => $contact['url'], 'avatar' => $url]);
                                                }
                                                if ($update) {
-                                                       Logger::info('Invalid file, contact update initiated', ['cid' => $id, 'url' => $contact['url'], 'avatar' => $url]);
-                                                       Worker::add(Worker::PRIORITY_LOW, 'UpdateContact', $id);
+                                                       try {
+                                                               UpdateContact::add(Worker::PRIORITY_LOW, $id);
+                                                               Logger::info('Invalid file, contact update initiated', ['cid' => $id, 'url' => $contact['url'], 'avatar' => $url]);
+                                                       } catch (\InvalidArgumentException $e) {
+                                                               Logger::notice($e->getMessage(), ['id' => $id, 'contact' => $contact]);
+                                                       }
                                                } else {
                                                        Logger::info('Invalid file', ['cid' => $id, 'url' => $contact['url'], 'avatar' => $url]);
                                                }
index 8de3629cafdca24ce8b0d04c60024dd46ff0b09b..a20642f0a75f98c3e3557e96454b71ab1bb09343 100644 (file)
 namespace Friendica\Worker;
 
 use Friendica\Core\Logger;
+use Friendica\Core\Worker;
 use Friendica\Model\Contact;
+use Friendica\Network\HTTPException\InternalServerErrorException;
 
 class UpdateContact
 {
        /**
         * Update contact data via probe
         *
-        * @param int    $contact_id Contact ID
+        * @param int $contact_id Contact ID
         * @return void
+        * @throws InternalServerErrorException
+        * @throws \ImagickException
         */
        public static function execute(int $contact_id)
        {
@@ -38,4 +42,19 @@ class UpdateContact
 
                Logger::info('Updated from probe', ['id' => $contact_id, 'success' => $success]);
        }
+
+       /**
+        * @param array|int $run_parameters Priority constant or array of options described in Worker::add
+        * @param int       $contact_id
+        * @return int
+        * @throws InternalServerErrorException
+        */
+       public static function add($run_parameters, int $contact_id): int
+       {
+               if (!$contact_id) {
+                       throw new \InvalidArgumentException('Invalid value provided for contact_id');
+               }
+
+               return Worker::add($run_parameters, 'UpdateContact', $contact_id);
+       }
 }
index 881418dc11f6f3cfed82add4c1188d199ab0cf8d..138d3e9abddacdba8709de570a96527a6e861fc7 100644 (file)
@@ -63,15 +63,21 @@ class UpdateContacts
                        if (Contact::isLocal($contact['url'])) {
                                continue;
                        }
-                       if ((!empty($contact['gsid']) || !empty($contact['baseurl'])) && GServer::reachable($contact)) {
-                               $stamp = (float)microtime(true);
-                               $success = Contact::updateFromProbe($contact['id']);
-                               Logger::debug('Direct update', ['id' => $contact['id'], 'count' => $count, 'duration' => round((float)microtime(true) - $stamp, 3), 'success' => $success]);
-                               ++$count;
-                       } elseif (Worker::add(['priority' => Worker::PRIORITY_LOW, 'dont_fork' => true], 'UpdateContact', $contact['id'])) {
-                               Logger::debug('Update by worker', ['id' => $contact['id'], 'count' => $count]);
-                               ++$count;
+
+                       try {
+                               if ((!empty($contact['gsid']) || !empty($contact['baseurl'])) && GServer::reachable($contact)) {
+                                       $stamp = (float)microtime(true);
+                                       $success = Contact::updateFromProbe($contact['id']);
+                                       Logger::debug('Direct update', ['id' => $contact['id'], 'count' => $count, 'duration' => round((float)microtime(true) - $stamp, 3), 'success' => $success]);
+                                       ++$count;
+                               } elseif (UpdateContact::add(['priority' => Worker::PRIORITY_LOW, 'dont_fork' => true], $contact['id'])) {
+                                       Logger::debug('Update by worker', ['id' => $contact['id'], 'count' => $count]);
+                                       ++$count;
+                               }
+                       } catch (\InvalidArgumentException $e) {
+                               Logger::notice($e->getMessage(), ['contact' => $contact]);
                        }
+
                        Worker::coolDown();
                }
                DBA::close($contacts);