]> git.mxchange.org Git - friendica.git/blobdiff - src/Util/HTTPSignature.php
Avoid "Duplicate entry"
[friendica.git] / src / Util / HTTPSignature.php
index e3244fade3a7030e6ba8fc5a745fcc9cfe63d1c9..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;
 
 /**
@@ -314,14 +316,15 @@ class HTTPSignature
         *
         * @param string  $url     The URL of the inbox
         * @param boolean $success Transmission status
+        * @param boolean $shared  The inbox is a shared inbox
         */
-       static private function setInboxStatus($url, $success)
+       static public function setInboxStatus($url, $success, $shared = false)
        {
                $now = DateTimeFormat::utcNow();
 
                $status = DBA::selectFirst('inbox-status', [], ['url' => $url]);
                if (!DBA::isResult($status)) {
-                       DBA::insert('inbox-status', ['url' => $url, 'created' => $now]);
+                       DBA::insert('inbox-status', ['url' => $url, 'created' => $now, 'shared' => $shared], Database::INSERT_IGNORE);
                        $status = DBA::selectFirst('inbox-status', [], ['url' => $url]);
                }
 
@@ -375,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;
@@ -409,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 = [];
 
@@ -447,7 +449,7 @@ class HTTPSignature
                $curl_opts = $opts;
                $curl_opts['header'] = $header;
 
-               if ($opts['nobody']) {
+               if (!empty($opts['nobody'])) {
                        $curlResult = DI::httpRequest()->head($request, $curl_opts);
                } else {
                        $curlResult = DI::httpRequest()->get($request, $curl_opts);
@@ -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']];
                        }
                }