diff --git a/src/Model/Contact.php b/src/Model/Contact.php index ce3aeac560..e75ac0394a 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -2120,7 +2120,17 @@ class Contact extends BaseObject return $contact; } - public static function addRelationship($importer, $contact, $datarray, $item = '', $sharing = false, $note = '') { + /** + * @param array $importer Owner (local user) data + * @param array $contact Existing owner-specific contact data we want to expand the relationship with. Optional. + * @param array $datarray An item-like array with at least the 'author-id' and 'author-url' keys for the contact. Mandatory. + * @param bool $sharing True: Contact is now sharing with Owner; False: Contact is now following Owner (default) + * @param string $note Introduction additional message + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException + */ + public static function addRelationship(array $importer, array $contact, array $datarray, $sharing = false, $note = '') + { // Should always be set if (empty($datarray['author-id'])) { return; @@ -2139,7 +2149,7 @@ class Contact extends BaseObject $nick = $pub_contact['nick']; $network = $pub_contact['network']; - if (is_array($contact)) { + if (!empty($contact)) { // Make sure that the existing contact isn't archived self::unmarkForArchival($contact); @@ -2155,28 +2165,30 @@ class Contact extends BaseObject ActivityPub\Transmitter::sendContactAccept($contact['url'], $contact['hub-verify'], $importer['uid']); } - // send email notification to owner? } else { $protocol = self::getProtocol($url, $network); + // send email notification to owner? if (DBA::exists('contact', ['nurl' => Strings::normaliseLink($url), 'uid' => $importer['uid'], 'pending' => true])) { Logger::log('ignoring duplicated connection request from pending contact ' . $url); return; } // create contact record - q("INSERT INTO `contact` (`uid`, `created`, `url`, `nurl`, `name`, `nick`, `photo`, `network`, `rel`, - `blocked`, `readonly`, `pending`, `writable`) - VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, 0, 0, 1, 1)", - intval($importer['uid']), - DBA::escape(DateTimeFormat::utcNow()), - DBA::escape($url), - DBA::escape(Strings::normaliseLink($url)), - DBA::escape($name), - DBA::escape($nick), - DBA::escape($photo), - DBA::escape($network), - intval(self::FOLLOWER) - ); + DBA::insert('contact', [ + 'uid' => $importer['uid'], + 'created' => DateTimeFormat::utcNow(), + 'url' => $url, + 'nurl' => Strings::normaliseLink($url), + 'name' => $name, + 'nick' => $nick, + 'photo' => $photo, + 'network' => $network, + 'rel' => self::FOLLOWER, + 'blocked' => 0, + 'readonly' => 0, + 'pending' => 1, + 'writable' => 1, + ]); $contact_record = [ 'id' => DBA::lastInsertId(), @@ -2220,7 +2232,6 @@ class Contact extends BaseObject 'verb' => ($sharing ? ACTIVITY_FRIEND : ACTIVITY_FOLLOW), 'otype' => 'intro' ]); - } } elseif (DBA::isResult($user) && in_array($user['page-flags'], [User::PAGE_FLAGS_SOAPBOX, User::PAGE_FLAGS_FREELOVE, User::PAGE_FLAGS_COMMUNITY])) { $condition = ['uid' => $importer['uid'], 'url' => $url, 'pending' => true]; diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 045c48a4c1..c63300e84b 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -530,7 +530,7 @@ class Processor DBA::update('contact', ['hub-verify' => $activity['id'], 'protocol' => Protocol::ACTIVITYPUB], ['id' => $cid]); $contact = DBA::selectFirst('contact', [], ['id' => $cid, 'network' => Protocol::NATIVE_SUPPORT]); } else { - $contact = false; + $contact = []; } $item = ['author-id' => Contact::getIdForURL($activity['actor']), @@ -541,7 +541,7 @@ class Processor // Ensure that the contact has got the right network type self::switchContact($item['author-id']); - Contact::addRelationship($owner, $contact, $item, '', false, $note); + $result = Contact::addRelationship($owner, $contact, $item, false, $note); $cid = Contact::getIdForURL($activity['actor'], $uid); if (empty($cid)) { return; diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index f74b572949..01159b1bae 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -2247,13 +2247,12 @@ class DFRN // The functions below are partly used by ostatus.php as well - where we have this variable $r = q("SELECT * FROM `contact` WHERE `id` = %d", intval($importer["id"])); $contact = $r[0]; - $nickname = $contact["nick"]; // Big question: Do we need these functions? They were part of the "consume_feed" function. // This function once was responsible for DFRN and OStatus. if (activity_match($item["verb"], ACTIVITY_FOLLOW)) { Logger::log("New follower"); - Contact::addRelationship($importer, $contact, $item, $nickname); + Contact::addRelationship($importer, $contact, $item); return false; } if (activity_match($item["verb"], ACTIVITY_UNFOLLOW)) { @@ -2263,7 +2262,7 @@ class DFRN } if (activity_match($item["verb"], ACTIVITY_REQ_FRIEND)) { Logger::log("New friend request"); - Contact::addRelationship($importer, $contact, $item, $nickname, true); + Contact::addRelationship($importer, $contact, $item, true); return false; } if (activity_match($item["verb"], ACTIVITY_UNFRIEND)) { diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index dec5c4c80b..180ef4e372 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -417,13 +417,6 @@ class OStatus $author = self::fetchAuthor($xpath, $entry, $importer, $contact, $stored); } - $value = XML::getFirstNodeValue($xpath, 'atom:author/poco:preferredUsername/text()', $entry); - if ($value != "") { - $nickname = $value; - } else { - $nickname = $author["author-name"]; - } - $item = array_merge($header, $author); $item["uri"] = XML::getFirstNodeValue($xpath, 'atom:id/text()', $entry); @@ -463,7 +456,7 @@ class OStatus } if ($item["verb"] == ACTIVITY_FOLLOW) { - Contact::addRelationship($importer, $contact, $item, $nickname); + Contact::addRelationship($importer, $contact, $item); continue; }