X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FContact.php;h=27ac3d33e1fec3669d71e66ef00177022879906a;hb=e17db489eee549f47c39c9b5494063476ed4aeb0;hp=f4c62fea809d554e220e180b292a9e1004f9268f;hpb=155d5418602b2e6c8bd2e17a87d8a2a51d39d684;p=friendica.git diff --git a/src/Model/Contact.php b/src/Model/Contact.php index f4c62fea80..27ac3d33e1 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -689,9 +689,15 @@ class Contact extends BaseObject if (empty($contact['network'])) { return; } - if (($contact['network'] == Protocol::DFRN) && $dissolve) { + + $protocol = $contact['network']; + if (($protocol == Protocol::DFRN) && !self::isLegacyDFRNContact($contact)) { + $protocol = Protocol::ACTIVITYPUB; + } + + if (($protocol == Protocol::DFRN) && $dissolve) { DFRN::deliver($user, $contact, 'placeholder', true); - } elseif (in_array($contact['network'], [Protocol::OSTATUS, Protocol::DFRN])) { + } elseif (in_array($protocol, [Protocol::OSTATUS, Protocol::DFRN])) { // create an unfollow slap $item = []; $item['verb'] = NAMESPACE_OSTATUS . "/unfollow"; @@ -706,9 +712,9 @@ class Contact extends BaseObject if (!empty($contact['notify'])) { Salmon::slapper($user, $contact['notify'], $slap); } - } elseif ($contact['network'] == Protocol::DIASPORA) { + } elseif ($protocol == Protocol::DIASPORA) { Diaspora::sendUnshare($user, $contact); - } elseif ($contact['network'] == Protocol::ACTIVITYPUB) { + } elseif ($protocol == Protocol::ACTIVITYPUB) { ActivityPub\Transmitter::sendContactUndo($contact['url'], $contact['id'], $user['uid']); if ($dissolve) { @@ -1804,6 +1810,40 @@ class Contact extends BaseObject return true; } + /** + * Detects if a given contact array belongs to a legacy DFRN connection + * + * @param array $contact + * @return boolean + */ + public static function isLegacyDFRNContact($contact) + { + // Newer Friendica contacts are connected via AP, then these fields aren't set + return !empty($contact['dfrn-id']) || !empty($contact['issued-id']); + } + + /** + * Detects the communication protocol for a given contact url. + * This is used to detect Friendica contacts that we can communicate via AP. + * + * @param string $url contact url + * @param string $network Network of that contact + * @return string with protocol + */ + public static function getProtocol($url, $network) + { + if ($network != Protocol::DFRN) { + return $network; + } + + $apcontact = APContact::getByURL($url); + if (!empty($apcontact) && !empty($apcontact['generator'])) { + return Protocol::ACTIVITYPUB; + } else { + return $network; + } + } + /** * Takes a $uid and a url/handle and adds a new contact * Currently if the contact is DFRN, interactive needs to be true, to redirect to the @@ -1879,7 +1919,9 @@ class Contact extends BaseObject $contact = DBA::selectFirst('contact', ['id', 'rel'], $condition); } - if (($ret['network'] === Protocol::DFRN) && !DBA::isResult($contact)) { + $protocol = self::getProtocol($url, $ret['network']); + + if (($protocol === Protocol::DFRN) && !DBA::isResult($contact)) { if ($interactive) { if (strlen($a->getURLPath())) { $myaddr = bin2hex(System::baseUrl() . '/profile/' . $a->user['nickname']); @@ -1898,7 +1940,7 @@ class Contact extends BaseObject } // This extra param just confuses things, remove it - if ($ret['network'] === Protocol::DIASPORA) { + if ($protocol === Protocol::DIASPORA) { $ret['url'] = str_replace('?absolute=true', '', $ret['url']); } @@ -1921,7 +1963,7 @@ class Contact extends BaseObject return $result; } - if ($ret['network'] === Protocol::OSTATUS && Config::get('system', 'ostatus_disabled')) { + if ($protocol === Protocol::OSTATUS && Config::get('system', 'ostatus_disabled')) { $result['message'] .= L10n::t('The profile address specified belongs to a network which has been disabled on this site.') . EOL; $ret['notify'] = ''; } @@ -1930,15 +1972,15 @@ class Contact extends BaseObject $result['message'] .= L10n::t('Limited profile. This person will be unable to receive direct/personal notifications from you.') . EOL; } - $writeable = ((($ret['network'] === Protocol::OSTATUS) && ($ret['notify'])) ? 1 : 0); + $writeable = ((($protocol === Protocol::OSTATUS) && ($ret['notify'])) ? 1 : 0); - $subhub = (($ret['network'] === Protocol::OSTATUS) ? true : false); + $subhub = (($protocol === Protocol::OSTATUS) ? true : false); - $hidden = (($ret['network'] === Protocol::MAIL) ? 1 : 0); + $hidden = (($protocol === Protocol::MAIL) ? 1 : 0); - $pending = in_array($ret['network'], [Protocol::ACTIVITYPUB]); + $pending = in_array($protocol, [Protocol::ACTIVITYPUB]); - if (in_array($ret['network'], [Protocol::MAIL, Protocol::DIASPORA, Protocol::ACTIVITYPUB])) { + if (in_array($protocol, [Protocol::MAIL, Protocol::DIASPORA, Protocol::ACTIVITYPUB])) { $writeable = 1; } @@ -1949,7 +1991,7 @@ class Contact extends BaseObject $fields = ['rel' => $new_relation, 'subhub' => $subhub, 'readonly' => false]; DBA::update('contact', $fields, ['id' => $contact['id']]); } else { - $new_relation = (in_array($ret['network'], [Protocol::MAIL]) ? self::FRIEND : self::SHARING); + $new_relation = (in_array($protocol, [Protocol::MAIL]) ? self::FRIEND : self::SHARING); // create contact record DBA::insert('contact', [ @@ -1966,6 +2008,7 @@ class Contact extends BaseObject 'name' => $ret['name'], 'nick' => $ret['nick'], 'network' => $ret['network'], + 'protocol' => $protocol, 'pubkey' => $ret['pubkey'], 'rel' => $new_relation, 'priority'=> $ret['priority'], @@ -1999,7 +2042,7 @@ class Contact extends BaseObject $owner = User::getOwnerDataById($uid); if (DBA::isResult($owner)) { - if (in_array($contact['network'], [Protocol::OSTATUS, Protocol::DFRN])) { + if (in_array($protocol, [Protocol::OSTATUS, Protocol::DFRN])) { // create a follow slap $item = []; $item['verb'] = ACTIVITY_FOLLOW; @@ -2015,10 +2058,10 @@ class Contact extends BaseObject if (!empty($contact['notify'])) { Salmon::slapper($owner, $contact['notify'], $slap); } - } elseif ($contact['network'] == Protocol::DIASPORA) { + } elseif ($protocol == Protocol::DIASPORA) { $ret = Diaspora::sendShare($a->user, $contact); Logger::log('share returns: ' . $ret); - } elseif ($contact['network'] == Protocol::ACTIVITYPUB) { + } elseif ($protocol == Protocol::ACTIVITYPUB) { $activity_id = ActivityPub\Transmitter::activityIDFromContact($contact_id); if (empty($activity_id)) { // This really should never happen @@ -2076,7 +2119,7 @@ class Contact extends BaseObject return $contact; } - public static function addRelationship($importer, $contact, $datarray, $item = '', $sharing = false) { + public static function addRelationship($importer, $contact, $datarray, $item = '', $sharing = false, $note = '') { // Should always be set if (empty($datarray['author-id'])) { return; @@ -2096,18 +2139,25 @@ class Contact extends BaseObject $network = $pub_contact['network']; if (is_array($contact)) { + // Make sure that the existing contact isn't archived + self::unmarkForArchival($contact); + + $protocol = self::getProtocol($url, $contact['network']); + if (($contact['rel'] == self::SHARING) || ($sharing && $contact['rel'] == self::FOLLOWER)) { - DBA::update('contact', ['rel' => self::FRIEND, 'writable' => true], + DBA::update('contact', ['rel' => self::FRIEND, 'writable' => true, 'pending' => false], ['id' => $contact['id'], 'uid' => $importer['uid']]); } - if ($contact['network'] == Protocol::ACTIVITYPUB) { + if ($protocol == Protocol::ACTIVITYPUB) { ActivityPub\Transmitter::sendContactAccept($contact['url'], $contact['hub-verify'], $importer['uid']); } // send email notification to owner? } else { + $protocol = self::getProtocol($url, $network); + if (DBA::exists('contact', ['nurl' => Strings::normaliseLink($url), 'uid' => $importer['uid'], 'pending' => true])) { Logger::log('ignoring duplicated connection request from pending contact ' . $url); return; @@ -2146,7 +2196,7 @@ class Contact extends BaseObject if (is_array($contact_record)) { DBA::insert('intro', ['uid' => $importer['uid'], 'contact-id' => $contact_record['id'], - 'blocked' => false, 'knowyou' => false, + 'blocked' => false, 'knowyou' => false, 'note' => $note, 'hash' => $hash, 'datetime' => DateTimeFormat::utcNow()]); } @@ -2176,8 +2226,9 @@ class Contact extends BaseObject DBA::update('contact', ['pending' => false], $condition); $contact = DBA::selectFirst('contact', ['url', 'network', 'hub-verify'], ['id' => $contact_record['id']]); + $protocol = self::getProtocol($contact['url'], $contact['network']); - if ($contact['network'] == Protocol::ACTIVITYPUB) { + if ($protocol == Protocol::ACTIVITYPUB) { ActivityPub\Transmitter::sendContactAccept($contact['url'], $contact['hub-verify'], $importer['uid']); } }