]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/APContact.php
Changed double-quotes to single
[friendica.git] / src / Model / APContact.php
index 76ca3aaed9fb2d4fa9121ffff70cb898fa0b8db4..baa364e940636a4e1d39ea7e40cadd5fed0e7bdb 100644 (file)
@@ -48,7 +48,7 @@ class APContact
         * @param string $addr Address
         * @return array webfinger data
         */
-       private static function fetchWebfingerData(string $addr)
+       private static function fetchWebfingerData(string $addr): array
        {
                $addr_parts = explode('@', $addr);
                if (count($addr_parts) != 2) {
@@ -116,15 +116,16 @@ class APContact
         * @return array profile array
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
+        * @todo Rewrite parameter $update to avoid true|false|null (boolean is binary, null adds a third case)
         */
-       public static function getByURL($url, $update = null)
+       public static function getByURL(string $url, $update = null): array
        {
                if (empty($url) || Network::isUrlBlocked($url)) {
                        Logger::info('Domain is blocked', ['url' => $url]);
                        return [];
                }
 
-               $fetched_contact = false;
+               $fetched_contact = [];
 
                if (empty($update)) {
                        if (is_null($update)) {
@@ -164,6 +165,8 @@ class APContact
                                return $fetched_contact;
                        }
                        $url = $apcontact['url'];
+               } elseif (empty(parse_url($url, PHP_URL_PATH))) {
+                       $apcontact['baseurl'] = $url;
                }
 
                // Detect multiple fast repeating request to the same address
@@ -220,14 +223,14 @@ class APContact
                $apcontact['type'] = str_replace('as:', '', JsonLD::fetchElement($compacted, '@type'));
                $apcontact['following'] = JsonLD::fetchElement($compacted, 'as:following', '@id');
                $apcontact['followers'] = JsonLD::fetchElement($compacted, 'as:followers', '@id');
-               $apcontact['inbox'] = JsonLD::fetchElement($compacted, 'ldp:inbox', '@id');
+               $apcontact['inbox'] = (JsonLD::fetchElement($compacted, 'ldp:inbox', '@id') ?? '');
                self::unarchiveInbox($apcontact['inbox'], false);
 
                $apcontact['outbox'] = JsonLD::fetchElement($compacted, 'as:outbox', '@id');
 
                $apcontact['sharedinbox'] = '';
                if (!empty($compacted['as:endpoints'])) {
-                       $apcontact['sharedinbox'] = JsonLD::fetchElement($compacted['as:endpoints'], 'as:sharedInbox', '@id');
+                       $apcontact['sharedinbox'] = (JsonLD::fetchElement($compacted['as:endpoints'], 'as:sharedInbox', '@id') ?? '');
                        self::unarchiveInbox($apcontact['sharedinbox'], true);
                }
 
@@ -241,9 +244,10 @@ class APContact
                        $apcontact['name'] = $apcontact['nick'];
                }
 
-               $apcontact['about'] = HTML::toBBCode(JsonLD::fetchElement($compacted, 'as:summary', '@value'));
+               $apcontact['about'] = HTML::toBBCode(JsonLD::fetchElement($compacted, 'as:summary', '@value') ?? '');
 
                $ims = JsonLD::fetchElementArray($compacted, 'vcard:hasInstantMessage');
+
                if (!empty($ims)) {
                        foreach ($ims as $link) {
                                if (substr($link, 0, 5) == 'xmpp:') {
@@ -365,7 +369,7 @@ class APContact
                // To-Do
 
                // Unhandled
-               // tag, attachment, image, nomadicLocations, signature, featured, movedTo, liked
+               // tag, attachment, image, nomadicLocations, signature, movedTo, liked
 
                // Unhandled from Misskey
                // sharedInbox, isCat
@@ -431,6 +435,30 @@ class APContact
                        $apcontact['uri-id'] = ItemURI::insert(['uri' => $apcontact['url'], 'guid' => $apcontact['uuid']]);
                }
 
+               foreach (APContact\Endpoint::ENDPOINT_NAMES as $type => $name) {
+                       $value = JsonLD::fetchElement($compacted, $name, '@id');
+                       if (empty($value)) {
+                               continue;
+                       }
+                       APContact\Endpoint::update($apcontact['uri-id'], $type, $value);
+               }
+
+               if (!empty($compacted['as:endpoints'])) {
+                       foreach ($compacted['as:endpoints'] as $name => $endpoint) {
+                               if (empty($endpoint['@id']) || !is_string($endpoint['@id'])) {
+                                       continue;
+                               }
+
+                               if (in_array($name, APContact\Endpoint::ENDPOINT_NAMES)) {
+                                       $key = array_search($name, APContact\Endpoint::ENDPOINT_NAMES);
+                                       APContact\Endpoint::update($apcontact['uri-id'], $key, $endpoint['@id']);
+                                       Logger::debug('Store endpoint', ['key' => $key, 'name' => $name, 'endpoint' => $endpoint['@id']]);
+                               } elseif (!in_array($name, ['as:sharedInbox', 'as:uploadMedia', 'as:oauthTokenEndpoint', 'as:oauthAuthorizationEndpoint', 'litepub:oauthRegistrationEndpoint'])) {
+                                       Logger::debug('Unknown endpoint', ['name' => $name, 'endpoint' => $endpoint['@id']]);
+                               }
+                       }
+               }
+
                $apcontact['updated'] = DateTimeFormat::utcNow();
 
                // We delete the old entry when the URL is changed
@@ -440,7 +468,7 @@ class APContact
                }
 
                // Limit the length on incoming fields
-               $apcontact = DBStructure::getFieldsForTable('apcontact', $apcontact);
+               $apcontact = DI::dbaDefinition()->truncateFieldsForTable('apcontact', $apcontact);
 
                if (DBA::exists('apcontact', ['url' => $apcontact['url']])) {
                        DBA::update('apcontact', $apcontact, ['url' => $apcontact['url']]);
@@ -501,8 +529,9 @@ class APContact
         *
         * @param string  $url    inbox url
         * @param boolean $shared Shared Inbox
+        * @return void
         */
-       private static function unarchiveInbox($url, $shared)
+       private static function unarchiveInbox(string $url, bool $shared)
        {
                if (empty($url)) {
                        return;