From 2173fb38e0d69074e5d1c4cb989f5834badc6019 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 27 Aug 2022 21:22:49 +0000 Subject: [PATCH 1/2] Issue 11853/11867: Fix reshare of public posts --- src/Database/Database.php | 30 +++++++++++++------------- src/Model/FContact.php | 2 ++ src/Model/Item.php | 13 ++++------- src/Module/Item/Activity.php | 4 ++-- src/Protocol/ActivityPub/Processor.php | 2 +- 5 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/Database/Database.php b/src/Database/Database.php index cd2803c0fc..fde5bd9f10 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -68,7 +68,7 @@ class Database protected $connection; protected $driver = ''; protected $pdo_emulate_prepares = false; - private $error = false; + private $error = ''; private $errorno = 0; private $affected_rows = 0; protected $in_transaction = false; @@ -558,8 +558,8 @@ class Database if (count($args) == 0) { if (!$retval = $this->connection->query($this->replaceParameters($sql, $args))) { $errorInfo = $this->connection->errorInfo(); - $this->error = $errorInfo[2]; - $this->errorno = (int) $errorInfo[1]; + $this->error = (string)$errorInfo[2]; + $this->errorno = (int)$errorInfo[1]; $retval = false; $is_error = true; break; @@ -571,8 +571,8 @@ class Database /** @var $stmt mysqli_stmt|PDOStatement */ if (!$stmt = $this->connection->prepare($sql)) { $errorInfo = $this->connection->errorInfo(); - $this->error = $errorInfo[2]; - $this->errorno = (int) $errorInfo[1]; + $this->error = (string)$errorInfo[2]; + $this->errorno = (int)$errorInfo[1]; $retval = false; $is_error = true; break; @@ -591,8 +591,8 @@ class Database if (!$stmt->execute()) { $errorInfo = $stmt->errorInfo(); - $this->error = $errorInfo[2]; - $this->errorno = (int) $errorInfo[1]; + $this->error = (string)$errorInfo[2]; + $this->errorno = (int)$errorInfo[1]; $retval = false; $is_error = true; } else { @@ -610,8 +610,8 @@ class Database if (!$can_be_prepared || (count($args) == 0)) { $retval = $this->connection->query($this->replaceParameters($sql, $args)); if ($this->connection->errno) { - $this->error = $this->connection->error; - $this->errorno = $this->connection->errno; + $this->error = (string)$this->connection->error; + $this->errorno = (int)$this->connection->errno; $retval = false; $is_error = true; } else { @@ -627,8 +627,8 @@ class Database $stmt = $this->connection->stmt_init(); if (!$stmt->prepare($sql)) { - $this->error = $stmt->error; - $this->errorno = $stmt->errno; + $this->error = (string)$stmt->error; + $this->errorno = (int)$stmt->errno; $retval = false; $is_error = true; break; @@ -658,8 +658,8 @@ class Database } if (!$stmt->execute()) { - $this->error = $this->connection->error; - $this->errorno = $this->connection->errno; + $this->error = (string)$this->connection->error; + $this->errorno = (int)$this->connection->errno; $retval = false; $is_error = true; } else { @@ -726,8 +726,8 @@ class Database } } - $this->error = $error; - $this->errorno = (int) $errorno; + $this->error = (string)$error; + $this->errorno = (int)$errorno; } $this->profiler->stopRecording(); diff --git a/src/Model/FContact.php b/src/Model/FContact.php index 62e609fbee..8bc696a466 100644 --- a/src/Model/FContact.php +++ b/src/Model/FContact.php @@ -24,6 +24,7 @@ namespace Friendica\Model; use Friendica\Core\Logger; use Friendica\Core\Protocol; use Friendica\Database\DBA; +use Friendica\DI; use Friendica\Network\Probe; use Friendica\Util\DateTimeFormat; use Friendica\Util\Strings; @@ -125,6 +126,7 @@ class FContact $condition = ['url' => $arr['url'], 'network' => $arr['network']]; + $fields = DI::dbaDefinition()->truncateFieldsForTable('fcontact', $fields); DBA::update('fcontact', $fields, $condition, true); } diff --git a/src/Model/Item.php b/src/Model/Item.php index 741594f228..598fca8407 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -33,7 +33,6 @@ use Friendica\Model\Tag; use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\DI; -use Friendica\Model\Post; use Friendica\Protocol\Activity; use Friendica\Protocol\ActivityPub; use Friendica\Protocol\Diaspora; @@ -2545,7 +2544,7 @@ class Item } // Retrieve the current logged in user's public contact - $author_id = Contact::getIdForURL($owner['url']); + $author_id = Contact::getPublicIdByUserId($uid); if (empty($author_id)) { Logger::info('Empty public contact'); return false; @@ -2652,7 +2651,7 @@ class Item $new_item = [ 'guid' => System::createUUID(), 'uri' => self::newURI(), - 'uid' => $item['uid'], + 'uid' => $uid, 'contact-id' => $owner['id'], 'wall' => $item['wall'], 'origin' => 1, @@ -2680,17 +2679,13 @@ class Item $new_item['diaspora_signed_text'] = json_encode($signed); } - $new_item_id = self::insert($new_item); + self::insert($new_item, true); // If the parent item isn't visible then set it to visible + // @todo Check if this is still needed if (!$item['visible']) { self::update(['visible' => true], ['id' => $item['id']]); } - - $new_item['id'] = $new_item_id; - - Hook::callAll('post_local_end', $new_item); - return true; } diff --git a/src/Module/Item/Activity.php b/src/Module/Item/Activity.php index 648ebfa08c..9f0b917869 100644 --- a/src/Module/Item/Activity.php +++ b/src/Module/Item/Activity.php @@ -51,9 +51,9 @@ class Activity extends BaseModule $itemId = $this->parameters['id']; if (in_array($verb, ['announce', 'unannounce'])) { - $item = Post::selectFirst(['network', 'uri-id', 'uid'], ['id' => $itemId]); + $item = Post::selectFirst(['network', 'uri-id'], ['id' => $itemId, 'uid' => [local_user(), 0]]); if ($item['network'] == Protocol::DIASPORA) { - Diaspora::performReshare($item['uri-id'], $item['uid']); + Diaspora::performReshare($item['uri-id'], local_user()); } } diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 61f625f597..668b8a5b89 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -228,7 +228,7 @@ class Processor { $item = Post::selectFirst(['uri', 'uri-id', 'thr-parent', 'gravity', 'post-type', 'private'], ['uri' => $activity['id']]); if (!DBA::isResult($item)) { - Logger::warning('No existing item, item will be created', ['uri' => $activity['id']]); + Logger::notice('No existing item, item will be created', ['uri' => $activity['id']]); $item = self::createItem($activity, false); if (empty($item)) { Queue::remove($activity); From d54cf9cc210188639a0ea6490650a7654f2ccee7 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 28 Aug 2022 04:00:18 +0000 Subject: [PATCH 2/2] Avoid warnings/fatal errors --- src/Contact/Avatar.php | 2 +- src/Util/ParseUrl.php | 50 +++++++++++++++++++++--------------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/Contact/Avatar.php b/src/Contact/Avatar.php index 1dd2f9cee6..d03a5f4e64 100644 --- a/src/Contact/Avatar.php +++ b/src/Contact/Avatar.php @@ -161,7 +161,7 @@ class Avatar $dirpath .= $part . '/'; if (!file_exists($dirpath)) { - if (!mkdir($dirpath, $dir_perm)) { + if (!@mkdir($dirpath, $dir_perm)) { Logger::warning('Directory could not be created', ['directory' => $dirpath]); } } elseif ((($old_perm = fileperms($dirpath) & 0777) != $dir_perm) && !chmod($dirpath, $dir_perm)) { diff --git a/src/Util/ParseUrl.php b/src/Util/ParseUrl.php index a0ff0f1773..d0b1682785 100644 --- a/src/Util/ParseUrl.php +++ b/src/Util/ParseUrl.php @@ -1040,17 +1040,17 @@ class ParseUrl } $content = JsonLD::fetchElement($jsonld, 'description'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['text'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'image'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['image'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'thumbnailUrl'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['image'] = trim($content); } @@ -1075,22 +1075,22 @@ class ParseUrl $jsonldinfo = []; $content = JsonLD::fetchElement($jsonld, 'name'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['publisher_name'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'description'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['publisher_description'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'url'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['publisher_url'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'thumbnailUrl'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['image'] = trim($content); } @@ -1114,32 +1114,32 @@ class ParseUrl $jsonldinfo = []; $content = JsonLD::fetchElement($jsonld, 'name'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['publisher_name'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'description'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['publisher_description'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'url'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['publisher_url'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'logo', 'url', '@type', 'ImageObject'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['publisher_img'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'brand', 'name', '@type', 'Organization'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['publisher_name'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'brand', 'url', '@type', 'Organization'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['publisher_url'] = trim($content); } @@ -1161,12 +1161,12 @@ class ParseUrl $jsonldinfo = []; $content = JsonLD::fetchElement($jsonld, 'name'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['author_name'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'description'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['author_description'] = trim($content); } @@ -1176,7 +1176,7 @@ class ParseUrl } $content = JsonLD::fetchElement($jsonld, 'url'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $jsonldinfo['author_url'] = trim($content); } @@ -1207,22 +1207,22 @@ class ParseUrl $media = []; $content = JsonLD::fetchElement($jsonld, 'caption'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $media['caption'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'url'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $media['url'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'mainEntityOfPage'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $media['main'] = Strings::compareLink($content, $siteinfo['url']); } $content = JsonLD::fetchElement($jsonld, 'description'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $media['description'] = trim($content); } @@ -1232,27 +1232,27 @@ class ParseUrl } $content = JsonLD::fetchElement($jsonld, 'contentUrl'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $media['content'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'embedUrl'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $media['embed'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'height'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $media['height'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'width'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $media['width'] = trim($content); } $content = JsonLD::fetchElement($jsonld, 'image'); - if (!empty($content)) { + if (!empty($content) && is_string($content)) { $media['image'] = trim($content); }