]> git.mxchange.org Git - friendica.git/blobdiff - src/Util/HTTPSignature.php
Avoid "Duplicate entry"
[friendica.git] / src / Util / HTTPSignature.php
index 5b7bb02a3ec9252ec1082355da352c18a04ad929..cede21b3c40039a6cd6d421aeebb2b272a7676f0 100644 (file)
 namespace Friendica\Util;
 
 use Friendica\Core\Logger;
+use Friendica\Database\Database;
 use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Model\APContact;
+use Friendica\Model\Contact;
 use Friendica\Model\User;
 
 /**
@@ -322,7 +324,7 @@ class HTTPSignature
 
                $status = DBA::selectFirst('inbox-status', [], ['url' => $url]);
                if (!DBA::isResult($status)) {
-                       DBA::insert('inbox-status', ['url' => $url, 'created' => $now, 'shared' => $shared]);
+                       DBA::insert('inbox-status', ['url' => $url, 'created' => $now, 'shared' => $shared], Database::INSERT_IGNORE);
                        $status = DBA::selectFirst('inbox-status', [], ['url' => $url]);
                }
 
@@ -376,8 +378,7 @@ class HTTPSignature
         */
        public static function fetch($request, $uid)
        {
-               $opts = ['accept_content' => 'application/activity+json, application/ld+json'];
-               $curlResult = self::fetchRaw($request, $uid, false, $opts);
+               $curlResult = self::fetchRaw($request, $uid);
 
                if (empty($curlResult)) {
                        return false;
@@ -410,7 +411,7 @@ class HTTPSignature
         * @return object CurlResult
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function fetchRaw($request, $uid = 0, $binary = false, $opts = [])
+       public static function fetchRaw($request, $uid = 0, $opts = ['accept_content' => 'application/activity+json, application/ld+json'])
        {
                $header = [];
 
@@ -544,11 +545,22 @@ class HTTPSignature
                }
 
                $key = self::fetchKey($sig_block['keyId'], $actor);
-
                if (empty($key)) {
                        return false;
                }
 
+               if (!empty($key['url']) && !empty($key['type']) && ($key['type'] == 'Tombstone')) {
+                       Logger::info('Actor is a tombstone', ['key' => $key]);
+
+                       // We now delete everything that we possibly knew from this actor
+                       Contact::deleteContactByUrl($key['url']);
+                       return false;
+               }
+
+               if (empty($key['pubkey'])) {
+                       return false;
+               }
+
                if (!Crypto::rsaVerify($signed_data, $sig_block['signature'], $key['pubkey'], $algorithm)) {
                        return false;
                }
@@ -616,12 +628,12 @@ class HTTPSignature
                $profile = APContact::getByURL($url);
                if (!empty($profile)) {
                        Logger::log('Taking key from id ' . $id, Logger::DEBUG);
-                       return ['url' => $url, 'pubkey' => $profile['pubkey']];
+                       return ['url' => $url, 'pubkey' => $profile['pubkey'], 'type' => $profile['type']];
                } elseif ($url != $actor) {
                        $profile = APContact::getByURL($actor);
                        if (!empty($profile)) {
                                Logger::log('Taking key from actor ' . $actor, Logger::DEBUG);
-                               return ['url' => $actor, 'pubkey' => $profile['pubkey']];
+                               return ['url' => $actor, 'pubkey' => $profile['pubkey'], 'type' => $profile['type']];
                        }
                }