diff --git a/src/Model/Item.php b/src/Model/Item.php index 2db3d1d89..8cca6f693 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -1234,18 +1234,35 @@ class Item extends BaseObject private static function contactId($item) { - if (!empty($item['uid']) && !Contact::isSharing($item['author-id'], $item['uid'])) { - return $item['author-id']; - } elseif (!empty($item['contact-id'])) { - return $item['contact-id']; - } else { + $contact_id = (int)$item["contact-id"]; + + if (!empty($contact_id)) { + return $contact_id; + } + Logger::log('Missing contact-id. Called by: '.System::callstack(), Logger::DEBUG); + /* + * First we are looking for a suitable contact that matches with the author of the post + * This is done only for comments + */ + if ($item['parent-uri'] != $item['uri']) { $contact_id = Contact::getIdForURL($item['author-link'], $item['uid']); - if (!empty($contact_id)) { - return $contact_id; - } } - return $item['author-id']; + // If not present then maybe the owner was found + if ($contact_id == 0) { + $contact_id = Contact::getIdForURL($item['owner-link'], $item['uid']); + } + + // Still missing? Then use the "self" contact of the current user + if ($contact_id == 0) { + $self = DBA::selectFirst('contact', ['id'], ['self' => true, 'uid' => $item['uid']]); + if (DBA::isResult($self)) { + $contact_id = $self["id"]; + } + } + Logger::log("Contact-id was missing for post ".$item['guid']." from user id ".$item['uid']." - now set to ".$contact_id, Logger::DEBUG); + + return $contact_id; } // This function will finally cover most of the preparation functionality in mod/item.php @@ -1470,6 +1487,9 @@ class Item extends BaseObject $item['plink'] = defaults($item, 'plink', System::baseUrl() . '/display/' . urlencode($item['guid'])); + // The contact-id should be set before "self::insert" was called - but there seems to be issues sometimes + $item["contact-id"] = self::contactId($item); + $default = ['url' => $item['author-link'], 'name' => $item['author-name'], 'photo' => $item['author-avatar'], 'network' => $item['network']]; @@ -1525,9 +1545,6 @@ class Item extends BaseObject unset($item['causer-id']); unset($item['causer-link']); - // The contact-id should be set before "self::insert" was called - but there seems to be issues sometimes - $item['contact-id'] = self::contactId($item); - if ($item['network'] == Protocol::PHANTOM) { $item['network'] = Protocol::DFRN; Logger::notice('Missing network, setting to {network}.', [ diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 65dd6d3e6..7639d0f2a 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -419,8 +419,8 @@ class Processor $item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver, true); } - if (empty($item['contact-id'])) { - $item['contact-id'] = $item['author-id']; + if (($receiver != 0) && empty($item['contact-id'])) { + $item['contact-id'] = Contact::getIdForURL($activity['author'], 0, true); } if (!empty($activity['directmessage'])) {