]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/GServer.php
Raw content is now stored with announce messages as well
[friendica.git] / src / Model / GServer.php
index fe5ef6d6f018c353faa3fd7262952fd8388a2478..0f5f55ab671a19979fd4b1a02659d199a889fb24 100644 (file)
@@ -1,17 +1,32 @@
 <?php
-
 /**
- * @file src/Model/GServer.php
- * This file includes the GServer class to handle with servers
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
  */
+
 namespace Friendica\Model;
 
 use DOMDocument;
 use DOMXPath;
-use Friendica\Core\Config;
 use Friendica\Core\Protocol;
 use Friendica\Core\Worker;
 use Friendica\Database\DBA;
+use Friendica\DI;
 use Friendica\Module\Register;
 use Friendica\Network\CurlResult;
 use Friendica\Util\Network;
@@ -192,7 +207,7 @@ class GServer
                }
 
                // When a nodeinfo is present, we don't need to dig further
-               $xrd_timeout = Config::get('system', 'xrd_timeout');
+               $xrd_timeout = DI::config()->get('system', 'xrd_timeout');
                $curlResult = Network::curl($url . '/.well-known/nodeinfo', false, ['timeout' => $xrd_timeout]);
                if ($curlResult->isTimeout()) {
                        DBA::update('gserver', ['last_failure' => DateTimeFormat::utcNow()], ['nurl' => Strings::normaliseLink($url)]);
@@ -217,7 +232,7 @@ class GServer
                                        $serverdata = self::analyseRootBody($curlResult, $serverdata, $url);
                                }
 
-                               if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
+                               if (!$curlResult->isSuccess() || empty($curlResult->getBody()) || self::invalidBody($curlResult->getBody())) {
                                        DBA::update('gserver', ['last_failure' => DateTimeFormat::utcNow()], ['nurl' => Strings::normaliseLink($url)]);
                                        return false;
                                }
@@ -424,11 +439,11 @@ class GServer
                }
 
                if (!empty($data['network'])) {
-                       $serverdata['platform'] = $data['network'];
+                       $serverdata['platform'] = strtolower($data['network']);
 
-                       if ($serverdata['platform'] == 'Diaspora') {
+                       if ($serverdata['platform'] == 'diaspora') {
                                $serverdata['network'] = Protocol::DIASPORA;
-                       } elseif ($serverdata['platform'] == 'Friendica') {
+                       } elseif ($serverdata['platform'] == 'friendica') {
                                $serverdata['network'] = Protocol::DFRN;
                        } elseif ($serverdata['platform'] == 'hubzilla') {
                                $serverdata['network'] = Protocol::ZOT;
@@ -528,7 +543,7 @@ class GServer
 
                if (is_array($nodeinfo['software'])) {
                        if (!empty($nodeinfo['software']['name'])) {
-                               $server['platform'] = $nodeinfo['software']['name'];
+                               $server['platform'] = strtolower($nodeinfo['software']['name']);
                        }
 
                        if (!empty($nodeinfo['software']['version'])) {
@@ -605,7 +620,7 @@ class GServer
 
                if (is_array($nodeinfo['software'])) {
                        if (!empty($nodeinfo['software']['name'])) {
-                               $server['platform'] = $nodeinfo['software']['name'];
+                               $server['platform'] = strtolower($nodeinfo['software']['name']);
                        }
 
                        if (!empty($nodeinfo['software']['version'])) {
@@ -673,7 +688,7 @@ class GServer
                }
 
                if (!empty($data['url'])) {
-                       $serverdata['platform'] = $data['platform'];
+                       $serverdata['platform'] = strtolower($data['platform']);
                        $serverdata['version'] = $data['version'];
                }
 
@@ -726,7 +741,7 @@ class GServer
         */
        private static function validHostMeta(string $url)
        {
-               $xrd_timeout = Config::get('system', 'xrd_timeout');
+               $xrd_timeout = DI::config()->get('system', 'xrd_timeout');
                $curlResult = Network::curl($url . '/.well-known/host-meta', false, ['timeout' => $xrd_timeout]);
                if (!$curlResult->isSuccess()) {
                        return false;
@@ -931,6 +946,11 @@ class GServer
                        $serverdata['site_name'] = $data['title'];
                }
 
+               if (!empty($data['title']) && empty($serverdata['platform']) && empty($serverdata['network'])) {
+                       $serverdata['platform'] = 'mastodon';
+                       $serverdata['network'] = Protocol::ACTIVITYPUB;
+               }
+
                if (!empty($data['description'])) {
                        $serverdata['info'] = trim($data['description']);
                }
@@ -940,13 +960,18 @@ class GServer
                }
 
                if (!empty($serverdata['version']) && preg_match('/.*?\(compatible;\s(.*)\s(.*)\)/ism', $serverdata['version'], $matches)) {
-                       $serverdata['platform'] = $matches[1];
+                       $serverdata['platform'] = strtolower($matches[1]);
                        $serverdata['version'] = $matches[2];
                }
 
-               if (!empty($serverdata['version']) && strstr($serverdata['version'], 'Pleroma')) {
+               if (!empty($serverdata['version']) && strstr(strtolower($serverdata['version']), 'pleroma')) {
+                       $serverdata['platform'] = 'pleroma';
+                       $serverdata['version'] = trim(str_ireplace('pleroma', '', $serverdata['version']));
+               }
+
+               if (!empty($serverdata['platform']) && strstr($serverdata['platform'], 'pleroma')) {
+                       $serverdata['version'] = trim(str_ireplace('pleroma', '', $serverdata['platform']));
                        $serverdata['platform'] = 'pleroma';
-                       $serverdata['version'] = trim(str_replace('Pleroma', '', $serverdata['version']));
                }
 
                return $serverdata;
@@ -977,22 +1002,22 @@ class GServer
                }
 
                if (!empty($data['site']['platform'])) {
-                       $serverdata['platform'] = $data['site']['platform']['PLATFORM_NAME'];
+                       $serverdata['platform'] = strtolower($data['site']['platform']['PLATFORM_NAME']);
                        $serverdata['version'] = $data['site']['platform']['STD_VERSION'];
                        $serverdata['network'] = Protocol::ZOT;
                }
 
                if (!empty($data['site']['hubzilla'])) {
-                       $serverdata['platform'] = $data['site']['hubzilla']['PLATFORM_NAME'];
+                       $serverdata['platform'] = strtolower($data['site']['hubzilla']['PLATFORM_NAME']);
                        $serverdata['version'] = $data['site']['hubzilla']['RED_VERSION'];
                        $serverdata['network'] = Protocol::ZOT;
                }
 
                if (!empty($data['site']['redmatrix'])) {
                        if (!empty($data['site']['redmatrix']['PLATFORM_NAME'])) {
-                               $serverdata['platform'] = $data['site']['redmatrix']['PLATFORM_NAME'];
+                               $serverdata['platform'] = strtolower($data['site']['redmatrix']['PLATFORM_NAME']);
                        } elseif (!empty($data['site']['redmatrix']['RED_PLATFORM'])) {
-                               $serverdata['platform'] = $data['site']['redmatrix']['RED_PLATFORM'];
+                               $serverdata['platform'] = strtolower($data['site']['redmatrix']['RED_PLATFORM']);
                        }
 
                        $serverdata['version'] = $data['site']['redmatrix']['RED_VERSION'];
@@ -1061,6 +1086,7 @@ class GServer
                        $serverdata['platform'] = 'gnusocial';
                        // Remove junk that some GNU Social servers return
                        $serverdata['version'] = str_replace(chr(239) . chr(187) . chr(191), '', $curlResult->getBody());
+                       $serverdata['version'] = str_replace(["\r", "\n", "\t"], '', $serverdata['version']);
                        $serverdata['version'] = trim($serverdata['version'], '"');
                        $serverdata['network'] = Protocol::OSTATUS;
                        return $serverdata;
@@ -1070,11 +1096,20 @@ class GServer
                $curlResult = Network::curl($url . '/api/statusnet/version.json');
                if ($curlResult->isSuccess() && ($curlResult->getBody() != '{"error":"not implemented"}') &&
                        ($curlResult->getBody() != '') && (strlen($curlResult->getBody()) < 30)) {
-                       $serverdata['platform'] = 'statusnet';
+
                        // Remove junk that some GNU Social servers return
                        $serverdata['version'] = str_replace(chr(239).chr(187).chr(191), '', $curlResult->getBody());
+                       $serverdata['version'] = str_replace(["\r", "\n", "\t"], '', $serverdata['version']);
                        $serverdata['version'] = trim($serverdata['version'], '"');
-                       $serverdata['network'] = Protocol::OSTATUS;
+
+                       if (!empty($serverdata['version']) && strtolower(substr($serverdata['version'], 0, 7)) == 'pleroma') {
+                               $serverdata['platform'] = 'pleroma';
+                               $serverdata['version'] = trim(str_ireplace('pleroma', '', $serverdata['version']));
+                               $serverdata['network'] = Protocol::ACTIVITYPUB;
+                       } else {
+                               $serverdata['platform'] = 'statusnet';
+                               $serverdata['network'] = Protocol::OSTATUS;
+                       }
                }
 
                return $serverdata;
@@ -1139,7 +1174,7 @@ class GServer
                                break;
                }
 
-               $serverdata['platform'] = $data['platform'] ?? '';
+               $serverdata['platform'] = strtolower($data['platform'] ?? '');
 
                return $serverdata;
        }
@@ -1188,20 +1223,18 @@ class GServer
                        }
 
                        if ($attr['name'] == 'application-name') {
-                               $serverdata['platform'] = $attr['content'];
+                               $serverdata['platform'] = strtolower($attr['content']);
                                if (in_array($attr['content'], ['Misskey', 'Write.as'])) {
                                        $serverdata['network'] = Protocol::ACTIVITYPUB;
                                }
                        }
-
-                       if ($attr['name'] == 'generator') {
-                               $serverdata['platform'] = $attr['content'];
-
+                       if (($attr['name'] == 'generator') && (empty($serverdata['platform']) || (substr(strtolower($attr['content']), 0, 9) == 'wordpress'))) {
+                               $serverdata['platform'] = strtolower($attr['content']);
                                $version_part = explode(' ', $attr['content']);
 
                                if (count($version_part) == 2) {
                                        if (in_array($version_part[0], ['WordPress'])) {
-                                               $serverdata['platform'] = $version_part[0];
+                                               $serverdata['platform'] = strtolower($version_part[0]);
                                                $serverdata['version'] = $version_part[1];
 
                                                // We still do need a reliable test if some AP plugin is activated
@@ -1212,7 +1245,7 @@ class GServer
                                                }
                                        }
                                        if (in_array($version_part[0], ['Friendika', 'Friendica'])) {
-                                               $serverdata['platform'] = $version_part[0];
+                                               $serverdata['platform'] = strtolower($version_part[0]);
                                                $serverdata['version'] = $version_part[1];
                                                $serverdata['network'] = Protocol::DFRN;
                                        }
@@ -1248,7 +1281,7 @@ class GServer
                        }
 
                        if ($attr['property'] == 'og:platform') {
-                               $serverdata['platform'] = $attr['content'];
+                               $serverdata['platform'] = strtolower($attr['content']);
 
                                if (in_array($attr['content'], ['PeerTube'])) {
                                        $serverdata['network'] = Protocol::ACTIVITYPUB;
@@ -1256,7 +1289,7 @@ class GServer
                        }
 
                        if ($attr['property'] == 'generator') {
-                               $serverdata['platform'] = $attr['content'];
+                               $serverdata['platform'] = strtolower($attr['content']);
 
                                if (in_array($attr['content'], ['hubzilla'])) {
                                        // We later check which compatible protocol modules are loaded.
@@ -1285,7 +1318,6 @@ class GServer
                        $serverdata['platform'] = 'diaspora';
                        $serverdata['network'] = $network = Protocol::DIASPORA;
                        $serverdata['version'] = $curlResult->getHeader('x-diaspora-version');
-
                } elseif ($curlResult->inHeader('x-friendica-version')) {
                        $serverdata['platform'] = 'friendica';
                        $serverdata['network'] = $network = Protocol::DFRN;
@@ -1294,6 +1326,19 @@ class GServer
                return $serverdata;
        }
 
+       /**
+        * Test if the body contains valid content
+        *
+        * @param string $body
+        * @return boolean
+        */
+       private static function invalidBody(string $body)
+       {
+               // Currently we only test for a HTML element.
+               // Possibly we enhance this in the future.
+               return !strpos($body, '>');
+       }
+
        /**
         * Update the user directory of a given gserver record
         *
@@ -1318,7 +1363,7 @@ class GServer
 
                $no_of_queries = 5;
 
-               $requery_days = intval(Config::get('system', 'poco_requery_days'));
+               $requery_days = intval(DI::config()->get('system', 'poco_requery_days'));
 
                if ($requery_days == 0) {
                        $requery_days = 7;
@@ -1358,7 +1403,7 @@ class GServer
         */
        private static function discoverFederation()
        {
-               $last = Config::get('poco', 'last_federation_discovery');
+               $last = DI::config()->get('poco', 'last_federation_discovery');
 
                if ($last) {
                        $next = $last + (24 * 60 * 60);
@@ -1382,7 +1427,7 @@ class GServer
                }
 
                // Disvover Mastodon servers
-               $accesstoken = Config::get('system', 'instances_social_key');
+               $accesstoken = DI::config()->get('system', 'instances_social_key');
 
                if (!empty($accesstoken)) {
                        $api = 'https://instances.social/api/1.0/instances/list?count=0';
@@ -1399,6 +1444,6 @@ class GServer
                        }
                }
 
-               Config::set('poco', 'last_federation_discovery', time());
+               DI::config()->set('poco', 'last_federation_discovery', time());
        }
 }