]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Contact.php
Rework Profile::sidebar profile link conditions
[friendica.git] / src / Model / Contact.php
index e75ac0394a69e1e84e4e3b63ea5d2d9238470c24..73118be0d04e92807f99e06bb2e1fc09551afbd8 100644 (file)
@@ -124,6 +124,20 @@ class Contact extends BaseObject
                return DBA::toArray($statement);
        }
 
+       /**
+        * @param array $fields    Array of selected fields, empty for all
+        * @param array $condition Array of fields for condition
+        * @param array $params    Array of several parameters
+        * @return array
+        * @throws \Exception
+        */
+       public static function selectFirst(array $fields = [], array $condition = [], array $params = [])
+       {
+               $contact = DBA::selectFirst('contact', $fields, $condition, $params);
+
+               return $contact;
+       }
+
        /**
         * @param integer $id     Contact ID
         * @param array   $fields Array of selected fields, empty for all
@@ -894,7 +908,7 @@ class Contact extends BaseObject
                        // If there is more than one entry we filter out the connector networks
                        if (count($r) > 1) {
                                foreach ($r as $id => $result) {
-                                       if ($result["network"] == Protocol::STATUSNET) {
+                                       if (!in_array($result["network"], Protocol::NATIVE_SUPPORT)) {
                                                unset($r[$id]);
                                        }
                                }
@@ -1078,7 +1092,7 @@ class Contact extends BaseObject
                        $profile_link = $profile_link . '?tab=profile';
                }
 
-               if (in_array($contact['network'], [Protocol::DFRN, Protocol::DIASPORA]) && !$contact['self']) {
+               if (self::canReceivePrivateMessages($contact)) {
                        $pm_url = System::baseUrl() . '/message/new/' . $contact['id'];
                }
 
@@ -2126,6 +2140,7 @@ class Contact extends BaseObject
         * @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
+        * @return bool|null True: follow request is accepted; False: relationship is rejected; Null: relationship is pending
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
@@ -2133,14 +2148,19 @@ class Contact extends BaseObject
        {
                // Should always be set
                if (empty($datarray['author-id'])) {
-                       return;
+                       return false;
                }
 
-               $fields = ['url', 'name', 'nick', 'photo', 'network'];
+               $fields = ['url', 'name', 'nick', 'photo', 'network', 'blocked'];
                $pub_contact = DBA::selectFirst('contact', $fields, ['id' => $datarray['author-id']]);
                if (!DBA::isResult($pub_contact)) {
                        // Should never happen
-                       return;
+                       return false;
+               }
+
+               // Contact is blocked at node-level
+               if (self::isBlocked($datarray['author-id'])) {
+                       return false;
                }
 
                $url = defaults($datarray, 'author-link', $pub_contact['url']);
@@ -2150,29 +2170,28 @@ class Contact extends BaseObject
                $network = $pub_contact['network'];
 
                if (!empty($contact)) {
+            // Contact is blocked at user-level
+                   if (self::isBlockedByUser($contact['id'], $importer['id'])) {
+                       return false;
+            }
+
                        // 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, 'pending' => false],
                                                ['id' => $contact['id'], 'uid' => $importer['uid']]);
                        }
 
-                       if ($protocol == Protocol::ACTIVITYPUB) {
-                               ActivityPub\Transmitter::sendContactAccept($contact['url'], $contact['hub-verify'], $importer['uid']);
-                       }
-
+                       return true;
                } 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;
+                               return null;
                        }
+
                        // create contact record
                        DBA::insert('contact', [
                                'uid'      => $importer['uid'],
@@ -2237,14 +2256,11 @@ class Contact extends BaseObject
                                $condition = ['uid' => $importer['uid'], 'url' => $url, 'pending' => true];
                                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 ($protocol == Protocol::ACTIVITYPUB) {
-                                       ActivityPub\Transmitter::sendContactAccept($contact['url'], $contact['hub-verify'], $importer['uid']);
-                               }
+                               return true;
                        }
                }
+
+               return null;
        }
 
        public static function removeFollower($importer, $contact, array $datarray = [], $item = "")
@@ -2353,6 +2369,9 @@ class Contact extends BaseObject
                        return $url ?: $contact_url; // Equivalent to: ($url != '') ? $url : $contact_url;
                }
 
+               // Prevents endless loop in case only a non-public contact exists for the contact URL
+               unset($data['uid']);
+
                return self::magicLinkByContact($data, $contact_url);
        }
 
@@ -2442,4 +2461,18 @@ class Contact extends BaseObject
                // Is it a forum?
                return ($contact['forum'] || $contact['prv']);
        }
+
+       /**
+        * Can the remote contact receive private messages?
+        *
+        * @param array $contact
+        * @return bool
+        */
+       public static function canReceivePrivateMessages(array $contact)
+       {
+               $protocol = $contact['network'] ?? $contact['protocol'] ?? Protocol::PHANTOM;
+               $self = $contact['self'] ?? false;
+
+               return in_array($protocol, [Protocol::DFRN, Protocol::DIASPORA, Protocol::ACTIVITYPUB]) && !$self;
+       }
 }