]> git.mxchange.org Git - friendica.git/commitdiff
Avoid return type exeption in HTTPSignature->post
authorHypolite Petovan <hypolite@mrpetovan.com>
Fri, 30 Dec 2022 06:45:04 +0000 (01:45 -0500)
committerHypolite Petovan <hypolite@mrpetovan.com>
Fri, 30 Dec 2022 22:23:22 +0000 (17:23 -0500)
- Prefer passing the owner record array instead of just the uid
- +4/-7 calls to User::getOwnerDataById

src/Core/Protocol.php
src/Model/Contact/Introduction.php
src/Protocol/ActivityPub/Delivery.php
src/Protocol/ActivityPub/Transmitter.php
src/Util/HTTPSignature.php
src/Worker/APDelivery.php
src/Worker/Contact/RevokeFollow.php

index e4490da73265342405cd27f049a479e71439b33b..98eb386c34aa3936c1b446d9b4261b802c35fbd6 100644 (file)
@@ -174,12 +174,12 @@ class Protocol
         * Sends an unfollow message. Does not remove the contact
         *
         * @param array $contact Target public contact (uid = 0) array
-        * @param array $user    Source local user array
+        * @param array $owner   Source owner-view record
         * @return bool|null true if successful, false if not, null if no remote action was performed
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function unfollow(array $contact, array $user): ?bool
+       public static function unfollow(array $contact, array $owner): ?bool
        {
                if (empty($contact['network'])) {
                        Logger::notice('Contact has got no network, we quit here', ['id' => $contact['id']]);
@@ -203,24 +203,24 @@ class Protocol
                                'uri-id'  => 0,
                        ];
 
-                       $slap = OStatus::salmon($item, $user);
+                       $slap = OStatus::salmon($item, $owner);
 
                        if (empty($contact['notify'])) {
                                Logger::notice('OStatus/DFRN Contact is missing notify, we quit here', ['id' => $contact['id']]);
                                return null;
                        }
 
-                       return Salmon::slapper($user, $contact['notify'], $slap) === 0;
+                       return Salmon::slapper($owner, $contact['notify'], $slap) === 0;
                } elseif ($protocol == Protocol::DIASPORA) {
-                       return Diaspora::sendUnshare($user, $contact) > 0;
+                       return Diaspora::sendUnshare($owner, $contact) > 0;
                } elseif ($protocol == Protocol::ACTIVITYPUB) {
-                       return ActivityPub\Transmitter::sendContactUndo($contact['url'], $contact['id'], $user['uid']);
+                       return ActivityPub\Transmitter::sendContactUndo($contact['url'], $contact['id'], $owner);
                }
 
                // Catch-all hook for connector addons
                $hook_data = [
                        'contact' => $contact,
-                       'uid'     => $user['uid'],
+                       'uid'     => $owner['uid'],
                        'result'  => null,
                ];
                Hook::callAll('unfollow', $hook_data);
@@ -232,12 +232,12 @@ class Protocol
         * Revoke an incoming follow from the provided contact
         *
         * @param array $contact Target public contact (uid == 0) array
-        * @param int   $uid     Source local user id
+        * @param array $owner   Source owner-view record
         * @return bool|null true if successful, false if not, null if no action was performed
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function revokeFollow(array $contact, int $uid): ?bool
+       public static function revokeFollow(array $contact, array $owner): ?bool
        {
                if (empty($contact['network'])) {
                        throw new \InvalidArgumentException('Missing network key in contact array');
@@ -249,13 +249,13 @@ class Protocol
                }
 
                if ($protocol == Protocol::ACTIVITYPUB) {
-                       return ActivityPub\Transmitter::sendContactReject($contact['url'], $contact['hub-verify'], $uid);
+                       return ActivityPub\Transmitter::sendContactReject($contact['url'], $contact['hub-verify'], $owner);
                }
 
                // Catch-all hook for connector addons
                $hook_data = [
                        'contact' => $contact,
-                       'uid'     => $uid,
+                       'uid'     => $owner['uid'],
                        'result'  => null,
                ];
                Hook::callAll('revoke_follow', $hook_data);
index 7b2f7ebc507178e5325ce829163df9b4059cb626..902726413ce138799c7e04bbc3f7f18978634f29 100644 (file)
@@ -122,7 +122,10 @@ class Introduction
                        }
 
                        if ($protocol == Protocol::ACTIVITYPUB) {
-                               ActivityPub\Transmitter::sendContactReject($contact['url'], $contact['hub-verify'], $contact['uid']);
+                               $owner = User::getOwnerDataById($contact['uid']);
+                               if ($owner) {
+                                       ActivityPub\Transmitter::sendContactReject($contact['url'], $contact['hub-verify'], $owner);
+                               }
                        }
                }
        }
index 785c626ce7fd6b69f2f1b46827480f9bcbe51727..d0721bcf12be8d6ac1e8511a3f126557203d2e19 100644 (file)
@@ -29,6 +29,7 @@ use Friendica\Model\Contact;
 use Friendica\Model\GServer;
 use Friendica\Model\Item;
 use Friendica\Model\Post;
+use Friendica\Model\User;
 use Friendica\Protocol\ActivityPub;
 use Friendica\Protocol\Delivery as ProtocolDelivery;
 use Friendica\Util\HTTPSignature;
@@ -48,8 +49,15 @@ class Delivery
                $serverfail = false;
 
                foreach ($posts as $post) {
+                       $owner = User::getOwnerDataById($post['uid']);
+                       if (!$owner) {
+                               Post\Delivery::remove($post['uri-id'], $inbox);
+                               Post\Delivery::incrementFailed($post['uri-id'], $inbox);
+                               continue;
+                       }
+
                        if (!$serverfail) {
-                               $result = self::deliverToInbox($post['command'], 0, $inbox, $post['uid'], $post['receivers'], $post['uri-id']);
+                               $result = self::deliverToInbox($post['command'], 0, $inbox, $owner, $post['receivers'], $post['uri-id']);
 
                                if ($result['serverfailure']) {
                                        // In a timeout situation we assume that every delivery to that inbox will time out.
@@ -75,13 +83,16 @@ class Delivery
         * @param string $cmd
         * @param integer $item_id
         * @param string $inbox
-        * @param integer $uid
+        * @param array $owner Sender owner-view record
         * @param array $receivers
         * @param integer $uri_id
         * @return array
         */
-       public static function deliverToInbox(string $cmd, int $item_id, string $inbox, int $uid, array $receivers, int $uri_id): array
+       public static function deliverToInbox(string $cmd, int $item_id, string $inbox, array $owner, array $receivers, int $uri_id): array
        {
+               /** @var int $uid */
+               $uid = $owner['uid'];
+
                if (empty($item_id) && !empty($uri_id) && !empty($uid)) {
                        $item = Post::selectFirst(['id', 'parent', 'origin', 'gravity', 'verb'], ['uri-id' => $uri_id, 'uid' => [$uid, 0]], ['order' => ['uid' => true]]);
                        if (empty($item['id'])) {
@@ -104,21 +115,21 @@ class Delivery
                if ($cmd == ProtocolDelivery::MAIL) {
                        $data = ActivityPub\Transmitter::createActivityFromMail($item_id);
                        if (!empty($data)) {
-                               $success = HTTPSignature::transmit($data, $inbox, $uid);
+                               $success = HTTPSignature::transmit($data, $inbox, $owner);
                        }
                } elseif ($cmd == ProtocolDelivery::SUGGESTION) {
-                       $success = ActivityPub\Transmitter::sendContactSuggestion($uid, $inbox, $item_id);
+                       $success = ActivityPub\Transmitter::sendContactSuggestion($owner, $inbox, $item_id);
                } elseif ($cmd == ProtocolDelivery::RELOCATION) {
                        // @todo Implementation pending
                } elseif ($cmd == ProtocolDelivery::REMOVAL) {
-                       $success = ActivityPub\Transmitter::sendProfileDeletion($uid, $inbox);
+                       $success = ActivityPub\Transmitter::sendProfileDeletion($owner, $inbox);
                } elseif ($cmd == ProtocolDelivery::PROFILEUPDATE) {
-                       $success = ActivityPub\Transmitter::sendProfileUpdate($uid, $inbox);
+                       $success = ActivityPub\Transmitter::sendProfileUpdate($owner, $inbox);
                } else {
                        $data = ActivityPub\Transmitter::createCachedActivityFromItem($item_id);
                        if (!empty($data)) {
                                $timestamp  = microtime(true);
-                               $response   = HTTPSignature::post($data, $inbox, $uid);
+                               $response   = HTTPSignature::post($data, $inbox, $owner);
                                $runtime    = microtime(true) - $timestamp;
                                $success    = $response->isSuccess();
                                $serverfail = $response->isTimeout();
index 66ee9e4b5cb623d8dbc591642578306d1aa4e58e..9a68bc33512efbd69a485e5e077dc166f9b55bf7 100644 (file)
@@ -138,7 +138,7 @@ class Transmitter
                        return false;
                }
 
-               $success = self::sendContactUndo($url, $contact['id'], 0);
+               $success = self::sendContactUndo($url, $contact['id'], User::getSystemAccount());
 
                if ($success || $force) {
                        Contact::update(['rel' => Contact::NOTHING], ['id' => $contact['id']]);
@@ -1903,16 +1903,14 @@ class Transmitter
        /**
         * Transmits a contact suggestion to a given inbox
         *
-        * @param integer $uid           User ID
+        * @param array   $owner         Sender owner-view record
         * @param string  $inbox         Target inbox
         * @param integer $suggestion_id Suggestion ID
         * @return boolean was the transmission successful?
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \Exception
         */
-       public static function sendContactSuggestion(int $uid, string $inbox, int $suggestion_id): bool
+       public static function sendContactSuggestion(array $owner, string $inbox, int $suggestion_id): bool
        {
-               $owner = User::getOwnerDataById($uid);
-
                $suggestion = DI::fsuggest()->selectOneById($suggestion_id);
 
                $data = [
@@ -1929,22 +1927,20 @@ class Transmitter
 
                $signed = LDSignature::sign($data, $owner);
 
-               Logger::info('Deliver profile deletion for user ' . $uid . ' to ' . $inbox . ' via ActivityPub');
-               return HTTPSignature::transmit($signed, $inbox, $uid);
+               Logger::info('Deliver profile deletion for user ' . $owner['uid'] . ' to ' . $inbox . ' via ActivityPub');
+               return HTTPSignature::transmit($signed, $inbox, $owner);
        }
 
        /**
         * Transmits a profile relocation to a given inbox
         *
-        * @param integer $uid   User ID
-        * @param string  $inbox Target inbox
+        * @param array  $owner Sender owner-view record
+        * @param string $inbox Target inbox
         * @return boolean was the transmission successful?
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \Exception
         */
-       public static function sendProfileRelocation(int $uid, string $inbox): bool
+       public static function sendProfileRelocation(array $owner, string $inbox): bool
        {
-               $owner = User::getOwnerDataById($uid);
-
                $data = [
                        '@context' => ActivityPub::CONTEXT,
                        'id' => DI::baseUrl() . '/activity/' . System::createGUID(),
@@ -1959,29 +1955,22 @@ class Transmitter
 
                $signed = LDSignature::sign($data, $owner);
 
-               Logger::info('Deliver profile relocation for user ' . $uid . ' to ' . $inbox . ' via ActivityPub');
-               return HTTPSignature::transmit($signed, $inbox, $uid);
+               Logger::info('Deliver profile relocation for user ' . $owner['uid'] . ' to ' . $inbox . ' via ActivityPub');
+               return HTTPSignature::transmit($signed, $inbox, $owner);
        }
 
        /**
         * Transmits a profile deletion to a given inbox
         *
-        * @param integer $uid   User ID
-        * @param string  $inbox Target inbox
+        * @param array  $owner Sender owner-view record
+        * @param string $inbox Target inbox
         * @return boolean was the transmission successful?
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \Exception
         */
-       public static function sendProfileDeletion(int $uid, string $inbox): bool
+       public static function sendProfileDeletion(array $owner, string $inbox): bool
        {
-               $owner = User::getOwnerDataById($uid);
-
-               if (empty($owner)) {
-                       Logger::error('No owner data found, the deletion message cannot be processed.', ['user' => $uid]);
-                       return false;
-               }
-
                if (empty($owner['uprvkey'])) {
-                       Logger::error('No private key for owner found, the deletion message cannot be processed.', ['user' => $uid]);
+                       Logger::error('No private key for owner found, the deletion message cannot be processed.', ['user' => $owner['uid']]);
                        return false;
                }
 
@@ -1997,30 +1986,29 @@ class Transmitter
 
                $signed = LDSignature::sign($data, $owner);
 
-               Logger::info('Deliver profile deletion for user ' . $uid . ' to ' . $inbox . ' via ActivityPub');
-               return HTTPSignature::transmit($signed, $inbox, $uid);
+               Logger::info('Deliver profile deletion for user ' . $owner['uid'] . ' to ' . $inbox . ' via ActivityPub');
+               return HTTPSignature::transmit($signed, $inbox, $owner);
        }
 
        /**
         * Transmits a profile change to a given inbox
         *
-        * @param integer $uid   User ID
-        * @param string  $inbox Target inbox
+        * @param array  $owner Sender owner-view record
+        * @param string $inbox Target inbox
         * @return boolean was the transmission successful?
         * @throws HTTPException\InternalServerErrorException
         * @throws HTTPException\NotFoundException
         * @throws \ImagickException
         */
-       public static function sendProfileUpdate(int $uid, string $inbox): bool
+       public static function sendProfileUpdate(array $owner, string $inbox): bool
        {
-               $owner = User::getOwnerDataById($uid);
                $profile = APContact::getByURL($owner['url']);
 
                $data = ['@context' => ActivityPub::CONTEXT,
                        'id' => DI::baseUrl() . '/activity/' . System::createGUID(),
                        'type' => 'Update',
                        'actor' => $owner['url'],
-                       'object' => self::getProfile($uid),
+                       'object' => self::getProfile($owner['uid']),
                        'published' => DateTimeFormat::utcNow(DateTimeFormat::ATOM),
                        'instrument' => self::getService(),
                        'to' => [$profile['followers']],
@@ -2028,8 +2016,8 @@ class Transmitter
 
                $signed = LDSignature::sign($data, $owner);
 
-               Logger::info('Deliver profile update for user ' . $uid . ' to ' . $inbox . ' via ActivityPub');
-               return HTTPSignature::transmit($signed, $inbox, $uid);
+               Logger::info('Deliver profile update for user ' . $owner['uid'] . ' to ' . $inbox . ' via ActivityPub');
+               return HTTPSignature::transmit($signed, $inbox, $owner);
        }
 
        /**
@@ -2075,7 +2063,7 @@ class Transmitter
                Logger::info('Sending activity ' . $activity . ' to ' . $target . ' for user ' . $uid);
 
                $signed = LDSignature::sign($data, $owner);
-               return HTTPSignature::transmit($signed, $profile['inbox'], $uid);
+               return HTTPSignature::transmit($signed, $profile['inbox'], $owner);
        }
 
        /**
@@ -2131,7 +2119,7 @@ class Transmitter
                Logger::info('Sending follow ' . $object . ' to ' . $target . ' for user ' . $uid);
 
                $signed = LDSignature::sign($data, $owner);
-               return HTTPSignature::transmit($signed, $profile['inbox'], $uid);
+               return HTTPSignature::transmit($signed, $profile['inbox'], $owner);
        }
 
        /**
@@ -2153,6 +2141,11 @@ class Transmitter
                }
 
                $owner = User::getOwnerDataById($uid);
+               if (!$owner) {
+                       Logger::notice('No user found for actor', ['uid' => $uid]);
+                       return;
+               }
+
                $data = [
                        '@context' => ActivityPub::CONTEXT,
                        'id' => DI::baseUrl() . '/activity/' . System::createGUID(),
@@ -2171,7 +2164,7 @@ class Transmitter
                Logger::debug('Sending accept to ' . $target . ' for user ' . $uid . ' with id ' . $id);
 
                $signed = LDSignature::sign($data, $owner);
-               HTTPSignature::transmit($signed, $profile['inbox'], $uid);
+               HTTPSignature::transmit($signed, $profile['inbox'], $owner);
        }
 
        /**
@@ -2179,12 +2172,12 @@ class Transmitter
         *
         * @param string $target   Target profile
         * @param string $objectId Object id
-        * @param int    $uid      User ID
+        * @param array  $owner    Sender owner-view record
         * @return bool Operation success
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function sendContactReject(string $target, string $objectId, int $uid): bool
+       public static function sendContactReject(string $target, string $objectId, array $owner): bool
        {
                $profile = APContact::getByURL($target);
                if (empty($profile['inbox'])) {
@@ -2192,12 +2185,6 @@ class Transmitter
                        return false;
                }
 
-               $owner = User::getOwnerDataById($uid);
-               if (empty($owner)) {
-                       Logger::notice('No user found for actor', ['uid' => $uid]);
-                       return false;
-               }
-
                $data = [
                        '@context' => ActivityPub::CONTEXT,
                        'id' => DI::baseUrl() . '/activity/' . System::createGUID(),
@@ -2213,10 +2200,10 @@ class Transmitter
                        'to' => [$profile['url']],
                ];
 
-               Logger::debug('Sending reject to ' . $target . ' for user ' . $uid . ' with id ' . $objectId);
+               Logger::debug('Sending reject to ' . $target . ' for user ' . $owner['uid'] . ' with id ' . $objectId);
 
                $signed = LDSignature::sign($data, $owner);
-               return HTTPSignature::transmit($signed, $profile['inbox'], $uid);
+               return HTTPSignature::transmit($signed, $profile['inbox'], $owner);
        }
 
        /**
@@ -2224,13 +2211,13 @@ class Transmitter
         *
         * @param string  $target Target profile
         * @param integer $cid    Contact id
-        * @param integer $uid    User ID
+        * @param array   $owner  Sender owner-view record
         * @return bool success
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         * @throws \Exception
         */
-       public static function sendContactUndo(string $target, int $cid, int $uid): bool
+       public static function sendContactUndo(string $target, int $cid, array $owner): bool
        {
                $profile = APContact::getByURL($target);
                if (empty($profile['inbox'])) {
@@ -2245,7 +2232,6 @@ class Transmitter
 
                $objectId = DI::baseUrl() . '/activity/' . System::createGUID();
 
-               $owner = User::getOwnerDataById($uid);
                $data = [
                        '@context' => ActivityPub::CONTEXT,
                        'id' => $objectId,
@@ -2261,10 +2247,10 @@ class Transmitter
                        'to' => [$profile['url']],
                ];
 
-               Logger::info('Sending undo to ' . $target . ' for user ' . $uid . ' with id ' . $objectId);
+               Logger::info('Sending undo to ' . $target . ' for user ' . $owner['uid'] . ' with id ' . $objectId);
 
                $signed = LDSignature::sign($data, $owner);
-               return HTTPSignature::transmit($signed, $profile['inbox'], $uid);
+               return HTTPSignature::transmit($signed, $profile['inbox'], $owner);
        }
 
        /**
index 225a2bcf20f16081b97d7f7f392311aeb75ebad9..47000f5c7455686a21bfb6374dd07587bc9be6e2 100644 (file)
@@ -267,21 +267,14 @@ class HTTPSignature
        /**
         * Post given data to a target for a user, returns the result class
         *
-        * @param array   $data   Data that is about to be send
-        * @param string  $target The URL of the inbox
-        * @param integer $uid    User id of the sender
+        * @param array  $data   Data that is about to be sent
+        * @param string $target The URL of the inbox
+        * @param array  $owner  Sender owner-view record
         *
         * @return ICanHandleHttpResponses
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function post(array $data, string $target, int $uid): ICanHandleHttpResponses
+       public static function post(array $data, string $target, array $owner): ICanHandleHttpResponses
        {
-               $owner = User::getOwnerDataById($uid);
-
-               if (!$owner) {
-                       return null;
-               }
-
                $content = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
 
                // Header data that is about to be signed.
@@ -319,16 +312,15 @@ class HTTPSignature
        /**
         * Transmit given data to a target for a user
         *
-        * @param array   $data   Data that is about to be send
-        * @param string  $target The URL of the inbox
-        * @param integer $uid    User id of the sender
+        * @param array  $data   Data that is about to be sent
+        * @param string $target The URL of the inbox
+        * @param array  $owner  Sender owner-vew record
         *
         * @return boolean Was the transmission successful?
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function transmit(array $data, string $target, int $uid): bool
+       public static function transmit(array $data, string $target, array $owner): bool
        {
-               $postResult = self::post($data, $target, $uid);
+               $postResult = self::post($data, $target, $owner);
                $return_code = $postResult->getReturnCode();
 
                return ($return_code >= 200) && ($return_code <= 299);
index 203c4097612d97fd04812d0dae80c8c57c50bfb3..16c8290382c4ab12d6db04724e1c499ff2f6133d 100644 (file)
@@ -24,6 +24,7 @@ namespace Friendica\Worker;
 use Friendica\Core\Logger;
 use Friendica\Core\Worker;
 use Friendica\Model\Post;
+use Friendica\Model\User;
 use Friendica\Protocol\ActivityPub;
 class APDelivery
 {
@@ -69,7 +70,14 @@ class APDelivery
                        $drop    = false;
                        $uri_ids = $result['uri_ids'];
                } else {
-                       $result  = ActivityPub\Delivery::deliverToInbox($cmd, $item_id, $inbox, $uid, $receivers, $uri_id);
+                       $owner = User::getOwnerDataById($uid);
+                       if (!$owner) {
+                               Post\Delivery::remove($uri_id, $inbox);
+                               Post\Delivery::incrementFailed($uri_id, $inbox);
+                               return;
+                       }
+
+                       $result  = ActivityPub\Delivery::deliverToInbox($cmd, $item_id, $inbox, $owner, $receivers, $uri_id);
                        $success = $result['success'];
                        $drop    = $result['drop'];
                        $uri_ids = [$uri_id];
index 726a69b8da3ca8954d3f072ecadb594ffb0d9aa3..f44ac59dfb2a3d45ff0a4da139618cf7779d35e0 100644 (file)
@@ -24,6 +24,8 @@ namespace Friendica\Worker\Contact;
 use Friendica\Core\Protocol;
 use Friendica\Core\Worker;
 use Friendica\Model\Contact;
+use Friendica\Model\User;
+use Friendica\Network\HTTPException;
 
 class RevokeFollow
 {
@@ -43,8 +45,12 @@ class RevokeFollow
                        return;
                }
 
-               $result = Protocol::revokeFollow($contact, $uid);
-               if ($result === false) {
+               $owner = User::getOwnerDataById($uid, false);
+               if (empty($owner)) {
+                       return;
+               }
+
+               if (!Protocol::revokeFollow($contact, $owner)) {
                        Worker::defer();
                }
        }