]> git.mxchange.org Git - friendica.git/blobdiff - src/Util/HTTPSignature.php
Avoid "Duplicate entry"
[friendica.git] / src / Util / HTTPSignature.php
index 1ede550885a27117f86f089517dd749b151be270..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]);
                }
 
@@ -543,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;
                }
@@ -615,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']];
                        }
                }