]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/GServer.php
Use the cached activity function
[friendica.git] / src / Model / GServer.php
index 1986e478317296c35813791797750a9b996fcc85..6192075f9618b699ad3293c96577dae9678f1b79 100644 (file)
@@ -93,6 +93,7 @@ class GServer
         *
         * @param string $url
         * @param boolean $only_nodeinfo
+        *
         * @return void
         */
        public static function add(string $url, bool $only_nodeinfo = false)
@@ -109,9 +110,10 @@ class GServer
         *
         * @param string $url
         * @param boolean $no_check Don't check if the server hadn't been found
+        *
         * @return int|null gserver id or NULL on empty URL or failed check
         */
-       public static function getID(string $url, bool $no_check = false)
+       public static function getID(string $url, bool $no_check = false): ?int
        {
                if (empty($url)) {
                        return null;
@@ -138,7 +140,9 @@ class GServer
         * The pattern is a simple fnmatch() pattern with ? for single wildcard and * for multiple wildcard
         *
         * @param string $pattern
+        *
         * @return array
+        *
         * @throws Exception
         */
        public static function listByDomainPattern(string $pattern): array
@@ -185,7 +189,19 @@ class GServer
                return self::check($server, $network, $force);
        }
 
-       public static function getNextUpdateDate(bool $success, string $created = '', string $last_contact = '', bool $undetected = false)
+       /**
+        * Calculate the next update day
+        *
+        * @param bool $success
+        * @param string $created
+        * @param string $last_contact
+        * @param bool $undetected
+        *
+        * @return string
+        *
+        * @throws Exception
+        */
+       public static function getNextUpdateDate(bool $success, string $created = '', string $last_contact = '', bool $undetected = false): string
        {
                // On successful contact process check again next week when it is a detected system.
                // When we haven't detected the system, it could be a static website or a really old system.
@@ -288,7 +304,7 @@ class GServer
                        Logger::info('Set failed status for existing server', ['url' => $url]);
                        return;
                }
-               DBA::insert('gserver', ['url' => $url, 'nurl' => Strings::normaliseLink($url),
+               self::insert(['url' => $url, 'nurl' => Strings::normaliseLink($url),
                        'network' => Protocol::PHANTOM, 'created' => DateTimeFormat::utcNow(),
                        'failed' => true, 'last_failure' => DateTimeFormat::utcNow()]);
                Logger::info('Set failed status for new server', ['url' => $url]);
@@ -298,6 +314,7 @@ class GServer
         * Remove unwanted content from the given URL
         *
         * @param string $url
+        *
         * @return string cleaned URL
         */
        public static function cleanURL(string $url): string
@@ -377,7 +394,7 @@ class GServer
                                if (!self::getID($valid_url, true)) {
                                        self::detect($valid_url, $network, $only_nodeinfo);
                                }
-                               return false;   
+                               return false;
                        }
                        Logger::debug('Found redirect, but ignore it.', ['old' => $url, 'new' => $valid_url]);
                }
@@ -546,8 +563,13 @@ class GServer
 
                $serverdata['registered-users'] = $serverdata['registered-users'] ?? 0;
 
+               // Numbers above a reasonable value (10 millions) are ignored
+               if ($serverdata['registered-users'] > 10000000) {
+                       $serverdata['registered-users'] = 0;
+               }
+
                // On an active server there has to be at least a single user
-               if (!in_array($serverdata['network'], [Protocol::PHANTOM, Protocol::FEED]) && ($serverdata['registered-users'] == 0)) {
+               if (!in_array($serverdata['network'], [Protocol::PHANTOM, Protocol::FEED]) && ($serverdata['registered-users'] <= 0)) {
                        $serverdata['registered-users'] = 1;
                } elseif (in_array($serverdata['network'], [Protocol::PHANTOM, Protocol::FEED])) {
                        $serverdata['registered-users'] = 0;
@@ -561,7 +583,7 @@ class GServer
                $gserver = DBA::selectFirst('gserver', ['network'], ['nurl' => Strings::normaliseLink($url)]);
                if (!DBA::isResult($gserver)) {
                        $serverdata['created'] = DateTimeFormat::utcNow();
-                       $ret = DBA::insert('gserver', $serverdata);
+                       $ret = self::insert($serverdata);
                        $id = DBA::lastInsertId();
                } else {
                        $ret = self::update($serverdata, ['nurl' => $serverdata['nurl']]);
@@ -614,7 +636,9 @@ class GServer
         * Fetch relay data from a given server url
         *
         * @param string $server_url address of the server
+        *
         * @return void
+        *
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        private static function discoverRelay(string $server_url)
@@ -711,9 +735,10 @@ class GServer
         * Fetch server data from '/statistics.json' on the given server
         *
         * @param string $url URL of the given server
+        *
         * @return array server data
         */
-       private static function fetchStatistics(string $url, array $serverdata)
+       private static function fetchStatistics(string $url, array $serverdata): array
        {
                $curlResult = DI::httpClient()->get($url . '/statistics.json', HttpClientAccept::JSON);
                if (!$curlResult->isSuccess()) {
@@ -803,6 +828,7 @@ class GServer
         * @param ICanHandleHttpResponses $httpResult
         *
         * @return array Server data
+        *
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        private static function fetchNodeinfo(string $url, ICanHandleHttpResponses $httpResult): array
@@ -853,7 +879,9 @@ class GServer
         * Parses Nodeinfo 1
         *
         * @param string $nodeinfo_url address of the nodeinfo path
+        *
         * @return array Server data
+        *
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        private static function parseNodeinfo1(string $nodeinfo_url): array
@@ -949,8 +977,11 @@ class GServer
         * Parses Nodeinfo 2
         *
         * @see https://git.feneas.org/jaywink/nodeinfo2
+        *
         * @param string $nodeinfo_url address of the nodeinfo path
+        *
         * @return array Server data
+        *
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        private static function parseNodeinfo2(string $nodeinfo_url): array
@@ -1055,11 +1086,14 @@ class GServer
         * Parses NodeInfo2 protocol 1.0
         *
         * @see https://github.com/jaywink/nodeinfo2/blob/master/PROTOCOL.md
+        *
         * @param string $nodeinfo_url address of the nodeinfo path
+        *
         * @return array Server data
+        *
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       private static function parseNodeinfo210(ICanHandleHttpResponses $httpResult)
+       private static function parseNodeinfo210(ICanHandleHttpResponses $httpResult): array
        {
                if (!$httpResult->isSuccess()) {
                        return [];
@@ -1154,6 +1188,7 @@ class GServer
         *
         * @param string $url        URL of the given server
         * @param array  $serverdata array with server data
+        *
         * @return array server data
         */
        private static function fetchSiteinfo(string $url, array $serverdata): array
@@ -1233,7 +1268,17 @@ class GServer
                return $serverdata;
        }
 
-       private static function fetchDataFromSystemActor(array $data, array $serverdata)
+       /**
+        * Fetches server data via an ActivityPub account with url of that server
+        *
+        * @param string $url        URL of the given server
+        * @param array  $serverdata array with server data
+        *
+        * @return array server data
+        *
+        * @throws Exception
+        */
+       private static function fetchDataFromSystemActor(array $data, array $serverdata): array
        {
                if (empty($data)) {
                        return ['server' => $serverdata, 'actor' => ''];
@@ -1274,6 +1319,7 @@ class GServer
         * Checks if the server contains a valid host meta file
         *
         * @param string $url URL of the given server
+        *
         * @return boolean 'true' if the server seems to be vital
         */
        private static function validHostMeta(string $url): bool
@@ -1284,7 +1330,7 @@ class GServer
                        return false;
                }
 
-               $xrd = XML::parseString($curlResult->getBody());
+               $xrd = XML::parseString($curlResult->getBody(), true);
                if (!is_object($xrd)) {
                        return false;
                }
@@ -1319,6 +1365,7 @@ class GServer
         *
         * @param string $url        URL of the given server
         * @param array  $serverdata array with server data
+        *
         * @return array server data
         */
        private static function detectNetworkViaContacts(string $url, array $serverdata): array
@@ -1370,6 +1417,7 @@ class GServer
         *
         * @param string $url        URL of the given server
         * @param array  $serverdata array with server data
+        *
         * @return array server data
         */
        private static function checkPoCo(string $url, array $serverdata): array
@@ -1401,6 +1449,7 @@ class GServer
         *
         * @param string $url        URL of the given server
         * @param array  $serverdata array with server data
+        *
         * @return array server data
         */
        public static function checkMastodonDirectory(string $url, array $serverdata): array
@@ -1478,7 +1527,7 @@ class GServer
         *
         * @return array server data
         */
-       private static function detectNextcloud(string $url, array $serverdata, bool $validHostMeta)
+       private static function detectNextcloud(string $url, array $serverdata, bool $validHostMeta): array
        {
                $curlResult = DI::httpClient()->get($url . '/status.php', HttpClientAccept::JSON);
                if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
@@ -1511,6 +1560,7 @@ class GServer
         *
         * @param string $url        URL of the given server
         * @param array  $serverdata array with server data
+        *
         * @return array server data
         */
        private static function fetchWeeklyUsage(string $url, array $serverdata): array
@@ -1550,6 +1600,7 @@ class GServer
         *
         * @param string $url        URL of the given server
         * @param array  $serverdata array with server data
+        *
         * @return array server data
         */
        private static function detectMastodonAlikes(string $url, array $serverdata): array
@@ -1621,6 +1672,7 @@ class GServer
         *
         * @param string $url        URL of the given server
         * @param array  $serverdata array with server data
+        *
         * @return array server data
         */
        private static function detectHubzilla(string $url, array $serverdata): array
@@ -1697,6 +1749,7 @@ class GServer
         * Converts input value to a boolean value
         *
         * @param string|integer $val
+        *
         * @return boolean
         */
        private static function toBoolean($val): bool
@@ -1715,6 +1768,7 @@ class GServer
         *
         * @param string $url        URL of the given server
         * @param array  $serverdata array with server data
+        *
         * @return array server data
         */
        private static function detectGNUSocial(string $url, array $serverdata): array
@@ -1769,6 +1823,7 @@ class GServer
         *
         * @param string $url        URL of the given server
         * @param array  $serverdata array with server data
+        *
         * @return array server data
         */
        private static function detectFriendica(string $url, array $serverdata): array
@@ -1846,16 +1901,16 @@ class GServer
         *
         * @return array server data
         */
-        private static function analyseRootBody($curlResult, array $serverdata): array
+       private static function analyseRootBody($curlResult, array $serverdata): array
        {
                if (empty($curlResult->getBody())) {
                        return $serverdata;
                }
 
-               if (file_exists(__DIR__ . '/../../static/generator.config.php')) {
-                       require __DIR__ . '/../../static/generator.config.php';
+               if (file_exists(__DIR__ . '/../../static/platforms.config.php')) {
+                       require __DIR__ . '/../../static/platforms.config.php';
                } else {
-                       throw new HTTPException\InternalServerErrorException('Invalid generator file');
+                       throw new HTTPException\InternalServerErrorException('Invalid platform file');
                }
 
                $platforms = array_merge($ap_platforms, $dfrn_platforms, $zap_platforms, $platforms);
@@ -2124,7 +2179,7 @@ class GServer
         *
         * @param int $gsid     Server id
         * @param int $protocol Protocol id
-        * @return void
+        *
         * @throws Exception
         */
        public static function setProtocol(int $gsid, int $protocol)
@@ -2184,7 +2239,9 @@ class GServer
         * Fetch the protocol of the given server
         *
         * @param int $gsid Server id
+        *
         * @return ?int One of Post\DeliveryData protocol constants or null if unknown or gserver is missing
+        *
         * @throws Exception
         */
        public static function getProtocol(int $gsid): ?int
@@ -2202,11 +2259,14 @@ class GServer
        }
 
        /**
+        * Update rows in the gserver table.
         * Enforces gserver table field maximum sizes to avoid "Data too long" database errors
         *
         * @param array $fields
         * @param array $condition
+        *
         * @return bool
+        *
         * @throws Exception
         */
        public static function update(array $fields, array $condition): bool
@@ -2215,4 +2275,22 @@ class GServer
 
                return DBA::update('gserver', $fields, $condition);
        }
+
+       /**
+        * Insert a row into the gserver table.
+        * Enforces gserver table field maximum sizes to avoid "Data too long" database errors
+        *
+        * @param array $fields
+        * @param int   $duplicate_mode What to do on a duplicated entry
+        *
+        * @return bool
+        *
+        * @throws Exception
+        */
+       public static function insert(array $fields, int $duplicate_mode = Database::INSERT_DEFAULT): bool
+       {
+               $fields = DI::dbaDefinition()->truncateFieldsForTable('gserver', $fields);
+
+               return DBA::insert('gserver', $fields, $duplicate_mode);
+       }
 }