]> git.mxchange.org Git - friendica.git/commitdiff
in "getidforurl" "no update" is now "update"
authorMichael <heluecht@pirati.ca>
Wed, 15 Jul 2020 21:08:42 +0000 (21:08 +0000)
committerMichael <heluecht@pirati.ca>
Wed, 15 Jul 2020 21:08:42 +0000 (21:08 +0000)
14 files changed:
boot.php
include/api.php
include/conversation.php
mod/match.php
src/Content/Widget.php
src/Database/PostUpdate.php
src/Model/Contact.php
src/Model/Item.php
src/Model/Tag.php
src/Module/Debug/Feed.php
src/Protocol/ActivityPub/Processor.php
src/Protocol/ActivityPub/Transmitter.php
src/Protocol/OStatus.php
update.php

index b07ad8483f72701d2367513465c2ce4922531126..512238b52eb07b45632fd189f595c9fa122bb17a 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -253,10 +253,10 @@ function public_contact()
        if (!$public_contact_id && !empty($_SESSION['authenticated'])) {
                if (!empty($_SESSION['my_address'])) {
                        // Local user
-                       $public_contact_id = intval(Contact::getIdForURL($_SESSION['my_address'], 0, true));
+                       $public_contact_id = intval(Contact::getIdForURL($_SESSION['my_address'], 0, false));
                } elseif (!empty($_SESSION['visitor_home'])) {
                        // Remote user
-                       $public_contact_id = intval(Contact::getIdForURL($_SESSION['visitor_home'], 0, true));
+                       $public_contact_id = intval(Contact::getIdForURL($_SESSION['visitor_home'], 0, false));
                }
        } elseif (empty($_SESSION['authenticated'])) {
                $public_contact_id = false;
index 53d00b27de67245d421d177d406254729dc0a359..86cda0b1bb688e915e150c6e14c7f27e555c108f 100644 (file)
@@ -654,8 +654,8 @@ function api_get_user(App $a, $contact_id = null)
                                'notifications' => false,
                                'statusnet_profile_url' => $contact["url"],
                                'uid' => 0,
-                               'cid' => Contact::getIdForURL($contact["url"], api_user(), true),
-                               'pid' => Contact::getIdForURL($contact["url"], 0, true),
+                               'cid' => Contact::getIdForURL($contact["url"], api_user(), false),
+                               'pid' => Contact::getIdForURL($contact["url"], 0, false),
                                'self' => 0,
                                'network' => $contact["network"],
                        ];
@@ -679,7 +679,7 @@ function api_get_user(App $a, $contact_id = null)
        $countfollowers = 0;
        $starred = 0;
 
-       $pcontact_id  = Contact::getIdForURL($uinfo[0]['url'], 0, true);
+       $pcontact_id  = Contact::getIdForURL($uinfo[0]['url'], 0, false);
 
        if (!empty($profile['about'])) {
                $description = $profile['about'];
@@ -731,7 +731,7 @@ function api_get_user(App $a, $contact_id = null)
                'statusnet_profile_url' => $uinfo[0]['url'],
                'uid' => intval($uinfo[0]['uid']),
                'cid' => intval($uinfo[0]['cid']),
-               'pid' => Contact::getIdForURL($uinfo[0]["url"], 0, true),
+               'pid' => Contact::getIdForURL($uinfo[0]["url"], 0, false),
                'self' => $uinfo[0]['self'],
                'network' => $uinfo[0]['network'],
        ];
@@ -5052,7 +5052,7 @@ function api_share_as_retweet(&$item)
 
        $reshared_item["share-pre-body"] = $reshared['comment'];
        $reshared_item["body"] = $reshared['shared'];
-       $reshared_item["author-id"] = Contact::getIdForURL($reshared['profile'], 0, true);
+       $reshared_item["author-id"] = Contact::getIdForURL($reshared['profile'], 0, false);
        $reshared_item["author-name"] = $reshared['author'];
        $reshared_item["author-link"] = $reshared['profile'];
        $reshared_item["author-avatar"] = $reshared['avatar'];
index 6e024fe20f1cb72a1c14e6c8dc10aaefc8a88010..8507c5ba977919407f46ff50004f373154959b15 100644 (file)
@@ -325,7 +325,7 @@ function conv_get_blocklist()
 
        foreach (explode(',', $str_blocked) as $entry) {
                // The 4th parameter guarantees that there always will be a public contact entry
-               $cid = Contact::getIdForURL(trim($entry), 0, true, ['url' => trim($entry)]);
+               $cid = Contact::getIdForURL(trim($entry), 0, false, ['url' => trim($entry)]);
                if (!empty($cid)) {
                        $blocklist[] = $cid;
                }
@@ -837,7 +837,7 @@ function item_photo_menu($item) {
        $sparkle = (strpos($profile_link, 'redir/') === 0);
 
        $cid = 0;
-       $pcid = Contact::getIdForURL($item['author-link'], 0, true);
+       $pcid = Contact::getIdForURL($item['author-link'], 0, false);
        $network = '';
        $rel = 0;
        $condition = ['uid' => local_user(), 'nurl' => Strings::normaliseLink($item['author-link'])];
index b54be01347bb03a4302708b1dbcfde0a707f5cd2..747e0b2f0379f7211521b49b8707bcd1cb37ec31 100644 (file)
@@ -89,7 +89,7 @@ function match_content(App $a)
                        $profile = $msearch->results[$i];
 
                        // Already known contact
-                       if (!$profile || Contact::getIdForURL($profile->url, local_user(), true)) {
+                       if (!$profile || Contact::getIdForURL($profile->url, local_user(), false)) {
                                continue;
                        }
 
index ffc5debb3361a20544c69c8af2c8e25c2d9f346f..fad863fbeb23b13075c93463bc30b8bc5b2a3597 100644 (file)
@@ -471,7 +471,7 @@ class Widget
                }
 
                if (Feature::isEnabled($uid, 'tagadelic')) {
-                       $owner_id = Contact::getIdForURL($a->profile['url'], 0, true);
+                       $owner_id = Contact::getIdForURL($a->profile['url'], 0, false);
 
                        if (!$owner_id) {
                                return '';
index 0ceae07f708e18a66b2eaab8cc912d80c63022e6..6d8b197db145def8d7117cf3ed0b66d47edba589 100644 (file)
@@ -245,14 +245,14 @@ class PostUpdate
                                $default = ['url' => $item['author-link'], 'name' => $item['author-name'],
                                        'photo' => $item['author-avatar'], 'network' => $item['network']];
 
-                               $item['author-id'] = Contact::getIdForURL($item["author-link"], 0, false, $default);
+                               $item['author-id'] = Contact::getIdForURL($item["author-link"], 0, null, $default);
                        }
 
                        if (empty($item['owner-id'])) {
                                $default = ['url' => $item['owner-link'], 'name' => $item['owner-name'],
                                        'photo' => $item['owner-avatar'], 'network' => $item['network']];
 
-                               $item['owner-id'] = Contact::getIdForURL($item["owner-link"], 0, false, $default);
+                               $item['owner-id'] = Contact::getIdForURL($item["owner-link"], 0, null, $default);
                        }
 
                        if (empty($item['psid'])) {
index 15e4e57035c3f3ecb255e80a2d978efb010e9aec..179126ff10a644e2240411f8b391e0141d56dd17 100644 (file)
@@ -194,21 +194,30 @@ class Contact
         * Fetches a contact by a given url
         *
         * @param string  $url    profile url
-        * @param integer $uid    User ID of the contact
-        * @param array   $fields Field list
         * @param boolean $update true = always update, false = never update, null = update when not found or outdated
+        * @param array   $fields Field list
+        * @param integer $uid    User ID of the contact
         * @return array contact array
         */
        public static function getByURL(string $url, $update = null, array $fields = [], int $uid = 0)
        {
                if ($update || is_null($update)) {
-                       $cid = self::getIdForURL($url, $uid, !($update ?? false));
+                       $cid = self::getIdForURL($url, $uid, $update);
                        if (empty($cid)) {
                                return [];
                        }
                        return self::getById($cid, $fields);
                }
 
+               // Add internal fields
+               $removal = [];
+               foreach (['id', 'updated', 'network'] as $internal) {
+                       if (!in_array($internal, $fields)) {
+                               $fields[] = $internal;
+                               $removal[] = $internal;
+                       }       
+               }
+
                // We first try the nurl (http://server.tld/nick), most common case
                $options = ['order' => ['id']];
                $contact = DBA::selectFirst('contact', $fields, ['nurl' => Strings::normaliseLink($url), 'uid' => $uid, 'deleted' => false], $options);
@@ -225,6 +234,18 @@ class Contact
                        $condition = ['`alias` IN (?, ?, ?) AND `uid` = ? AND NOT `deleted`', $url, Strings::normaliseLink($url), $ssl_url, $uid];
                        $contact = DBA::selectFirst('contact', $fields, $condition, $options);
                }
+               
+               // Update the contact in the background if needed
+               if ((($contact['updated'] < DateTimeFormat::utc('now -7 days')) || empty($contact['avatar'])) &&
+                       in_array($contact['network'], Protocol::FEDERATED)) {
+                       Worker::add(PRIORITY_LOW, "UpdateContact", $contact['id'], ($uid == 0 ? 'force' : ''));
+               }
+
+               // Remove the internal fields
+               foreach ($removal as $internal) {
+                       unset($contact[$internal]);
+               }
+
                return $contact;
        }
 
@@ -234,8 +255,8 @@ class Contact
         *
         * @param string  $url    profile url
         * @param integer $uid    User ID of the contact
-        * @param array   $fields Field list
         * @param boolean $update true = always update, false = never update, null = update when not found or outdated
+        * @param array   $fields Field list
         * @return array contact array
         */
        public static function getByURLForUser(string $url, int $uid = 0, $update = false, array $fields = [])
@@ -296,7 +317,7 @@ class Contact
         */
        public static function isFollowerByURL($url, $uid)
        {
-               $cid = self::getIdForURL($url, $uid, true);
+               $cid = self::getIdForURL($url, $uid, false);
 
                if (empty($cid)) {
                        return false;
@@ -342,7 +363,7 @@ class Contact
         */
        public static function isSharingByURL($url, $uid)
        {
-               $cid = self::getIdForURL($url, $uid, true);
+               $cid = self::getIdForURL($url, $uid, false);
 
                if (empty($cid)) {
                        return false;
@@ -437,7 +458,7 @@ class Contact
                if (!DBA::isResult($self)) {
                        return false;
                }
-               return self::getIdForURL($self['url'], 0, true);
+               return self::getIdForURL($self['url'], 0, false);
        }
 
        /**
@@ -467,14 +488,14 @@ class Contact
                }
 
                if ($contact['uid'] != 0) {
-                       $pcid = Contact::getIdForURL($contact['url'], 0, true, ['url' => $contact['url']]);
+                       $pcid = Contact::getIdForURL($contact['url'], 0, false, ['url' => $contact['url']]);
                        if (empty($pcid)) {
                                return [];
                        }
                        $ucid = $contact['id'];
                } else {
                        $pcid = $contact['id'];
-                       $ucid = Contact::getIdForURL($contact['url'], $uid, true);
+                       $ucid = Contact::getIdForURL($contact['url'], $uid, false);
                }
 
                return ['public' => $pcid, 'user' => $ucid];
@@ -1300,7 +1321,7 @@ class Contact
         *
         * @param string  $url       Contact URL
         * @param integer $uid       The user id for the contact (0 = public contact)
-        * @param boolean $no_update Don't update the contact
+        * @param boolean $update    true = always update, false = never update, null = update when not found or outdated
         * @param array   $default   Default value for creating the contact when every else fails
         * @param boolean $in_loop   Internally used variable to prevent an endless loop
         *
@@ -1308,7 +1329,7 @@ class Contact
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function getIdForURL($url, $uid = 0, $no_update = false, $default = [], $in_loop = false)
+       public static function getIdForURL($url, $uid = 0, $update = null, $default = [], $in_loop = false)
        {
                Logger::info('Get contact data', ['url' => $url, 'user' => $uid]);
 
@@ -1322,17 +1343,8 @@ class Contact
 
                if (!empty($contact)) {
                        $contact_id = $contact["id"];
-                       $update_contact = false;
-
-                       // Update the contact every 7 days (Don't update mail or feed contacts)
-                       if (in_array($contact['network'], Protocol::FEDERATED)) {
-                               $update_contact = ($contact['updated'] < DateTimeFormat::utc('now -7 days'));
 
-                               // We force the update if the avatar is empty
-                               if (empty($contact['avatar'])) {
-                                       $update_contact = true;
-                               }
-                       } elseif (empty($default) && in_array($contact['network'], [Protocol::MAIL, Protocol::PHANTOM]) && ($uid == 0)) {
+                       if (empty($default) && in_array($contact['network'], [Protocol::MAIL, Protocol::PHANTOM]) && ($uid == 0)) {
                                // Update public mail accounts via their user's accounts
                                $fields = ['network', 'addr', 'name', 'nick', 'avatar', 'photo', 'thumb', 'micro'];
                                $mailcontact = DBA::selectFirst('contact', $fields, ["`addr` = ? AND `network` = ? AND `uid` != 0", $url, Protocol::MAIL]);
@@ -1345,12 +1357,7 @@ class Contact
                                }
                        }
 
-                       // Update the contact in the background if needed but it is called by the frontend
-                       if ($update_contact && $no_update && in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
-                               Worker::add(PRIORITY_LOW, "UpdateContact", $contact_id, ($uid == 0 ? 'force' : ''));
-                       }
-
-                       if (!$update_contact || $no_update) {
+                       if (empty($update)) {
                                return $contact_id;
                        }
                } elseif ($uid != 0) {
@@ -1358,11 +1365,11 @@ class Contact
                        return 0;
                }
 
-               if ($no_update && empty($default)) {
+               if (!$update && empty($default)) {
                        // When we don't want to update, we look if we know this contact in any way
                        $data = self::getProbeDataFromDatabase($url, $contact_id);
                        $background_update = true;
-               } elseif ($no_update && !empty($default['network'])) {
+               } elseif (!$update && !empty($default['network'])) {
                        // If there are default values, take these
                        $data = $default;
                        $background_update = false;
@@ -1371,7 +1378,7 @@ class Contact
                        $background_update = false;
                }
 
-               if (empty($data)) {
+               if ((empty($data) && is_null($update)) || $update) {
                        $data = Probe::uri($url, "", $uid);
                }
 
@@ -1394,7 +1401,7 @@ class Contact
                }
 
                if (!$contact_id && !empty($data['alias']) && ($data['alias'] != $data['url']) && !$in_loop) {
-                       $contact_id = self::getIdForURL($data["alias"], $uid, true, $default, true);
+                       $contact_id = self::getIdForURL($data["alias"], $uid, false, $default, true);
                }
 
                if (!$contact_id) {
index 4fff3655626d8af82e3d60e3b20b49de222320be..332c734fa5b8db976fe97c92b7a6239af285b4d6 100644 (file)
@@ -1680,11 +1680,11 @@ class Item
 
                $default = ['url' => $item['author-link'], 'name' => $item['author-name'],
                        'photo' => $item['author-avatar'], 'network' => $item['network']];
-               $item['author-id'] = ($item['author-id'] ?? 0) ?: Contact::getIdForURL($item['author-link'], 0, false, $default);
+               $item['author-id'] = ($item['author-id'] ?? 0) ?: Contact::getIdForURL($item['author-link'], 0, null, $default);
 
                $default = ['url' => $item['owner-link'], 'name' => $item['owner-name'],
                        'photo' => $item['owner-avatar'], 'network' => $item['network']];
-               $item['owner-id'] = ($item['owner-id'] ?? 0) ?: Contact::getIdForURL($item['owner-link'], 0, false, $default);
+               $item['owner-id'] = ($item['owner-id'] ?? 0) ?: Contact::getIdForURL($item['owner-link'], 0, null, $default);
 
                // The contact-id should be set before "self::insert" was called - but there seems to be issues sometimes
                $item["contact-id"] = self::contactId($item);
@@ -2976,7 +2976,7 @@ class Item
                if (local_user() == $uid) {
                        $item_contact_id = $owner_self_contact['id'];
                } else {
-                       $item_contact_id = Contact::getIdForURL($author_contact['url'], $uid, true);
+                       $item_contact_id = Contact::getIdForURL($author_contact['url'], $uid, false);
                        $item_contact = DBA::selectFirst('contact', [], ['id' => $item_contact_id]);
                        if (!DBA::isResult($item_contact)) {
                                Logger::log('like: unknown item contact ' . $item_contact_id);
index d8c252ca2b7344f6bf59b68b033094c1466d47af..3424a2377110d7e32aca51b9b864d2220038412d 100644 (file)
@@ -111,7 +111,7 @@ class Tag
                                        }
                                }
                        } else {
-                               $cid = Contact::getIdForURL($url, 0, true);
+                               $cid = Contact::getIdForURL($url, 0, false);
                                Logger::info('Got id by probing', ['cid' => $cid, 'url' => $url]);
                        }
 
index 4f17b70e682679db692861abc65739539814df03..e969de9cc3889a419bcaf0db3195e6aedfeb9162 100644 (file)
@@ -47,8 +47,7 @@ class Feed extends BaseModule
                if (!empty($_REQUEST['url'])) {
                        $url = $_REQUEST['url'];
 
-                       $contact_id = Model\Contact::getIdForURL($url, local_user(), true);
-                       $contact = Model\Contact::getById($contact_id);
+                       $contact = Model\Contact::getByURLForUser($url, local_user(), false);
 
                        $xml = Network::fetchUrl($contact['poll']);
 
index 0e4aca4a5a4868e0eb931e72c5a7f038fd0eb710..745a56c2a50f9c35828896eadf02dbf70ad41786 100644 (file)
@@ -445,9 +445,9 @@ class Processor
 
                $item['network'] = Protocol::ACTIVITYPUB;
                $item['author-link'] = $activity['author'];
-               $item['author-id'] = Contact::getIdForURL($activity['author'], 0, true);
+               $item['author-id'] = Contact::getIdForURL($activity['author'], 0, false);
                $item['owner-link'] = $activity['actor'];
-               $item['owner-id'] = Contact::getIdForURL($activity['actor'], 0, true);
+               $item['owner-id'] = Contact::getIdForURL($activity['actor'], 0, false);
 
                if (in_array(0, $activity['receiver']) && !empty($activity['unlisted'])) {
                        $item['private'] = Item::UNLISTED;
@@ -511,13 +511,13 @@ class Processor
                        $item['uid'] = $receiver;
 
                        if ($isForum) {
-                               $item['contact-id'] = Contact::getIdForURL($activity['actor'], $receiver, true);
+                               $item['contact-id'] = Contact::getIdForURL($activity['actor'], $receiver, false);
                        } else {
-                               $item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver, true);
+                               $item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver, false);
                        }
 
                        if (($receiver != 0) && empty($item['contact-id'])) {
-                               $item['contact-id'] = Contact::getIdForURL($activity['author'], 0, true);
+                               $item['contact-id'] = Contact::getIdForURL($activity['author'], 0, false);
                        }
 
                        if (!empty($activity['directmessage'])) {
index bd6f67128f3924182bb0a457c594b4b09c1533e6..6bf507ed8f8d614287847c9add52d0ea8dc4c4f0 100644 (file)
@@ -150,7 +150,7 @@ class Transmitter
         */
        public static function getOutbox($owner, $page = null)
        {
-               $public_contact = Contact::getIdForURL($owner['url'], 0, true);
+               $public_contact = Contact::getIdForURL($owner['url'], 0, false);
 
                $condition = ['uid' => 0, 'contact-id' => $public_contact, 'author-id' => $public_contact,
                        'private' => [Item::PUBLIC, Item::UNLISTED], 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT],
index dc9182009acb8d91428d23badd2ce42b973142d2..1ab8f9b80011c6025fb18a8a4c9adf34c65e14ba 100644 (file)
@@ -221,7 +221,7 @@ class OStatus
                        }
 
                        // Ensure that we are having this contact (with uid=0)
-                       $cid = Contact::getIdForURL($aliaslink, 0, true);
+                       $cid = Contact::getIdForURL($aliaslink, 0, false);
 
                        if ($cid) {
                                $fields = ['url', 'nurl', 'name', 'nick', 'alias', 'about', 'location'];
@@ -2220,7 +2220,7 @@ class OStatus
                }
 
                $check_date = $feed_mode ? '' : DateTimeFormat::utc($last_update);
-               $authorid = Contact::getIdForURL($owner["url"], 0, true);
+               $authorid = Contact::getIdForURL($owner["url"], 0, false);
 
                $condition = ["`uid` = ? AND `received` > ? AND NOT `deleted`
                        AND `private` != ? AND `visible` AND `wall` AND `parent-network` IN (?, ?)",
index 83011108b539b6dcaafcd7b724e01d33bd9e4584..82c34f9ddaf0a494006a3e116d44c0f8447b7fdf 100644 (file)
@@ -203,7 +203,7 @@ function update_1260()
        while ($item = DBA::fetch($items)) {
                $contact = ['url' => $item['owner-link'], 'name' => $item['owner-name'],
                        'photo' => $item['owner-avatar'], 'network' => $item['network']];
-               $cid = Contact::getIdForURL($item['owner-link'], 0, false, $contact);
+               $cid = Contact::getIdForURL($item['owner-link'], 0, null, $contact);
                if (empty($cid)) {
                        continue;
                }
@@ -219,7 +219,7 @@ function update_1260()
        while ($item = DBA::fetch($items)) {
                $contact = ['url' => $item['author-link'], 'name' => $item['author-name'],
                        'photo' => $item['author-avatar'], 'network' => $item['network']];
-               $cid = Contact::getIdForURL($item['author-link'], 0, false, $contact);
+               $cid = Contact::getIdForURL($item['author-link'], 0, null, $contact);
                if (empty($cid)) {
                        continue;
                }