]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/GServer.php
Merge pull request #10818 from MrPetovan/task/10691-remove-event-adjust
[friendica.git] / src / Model / GServer.php
index 6b018c30317213314674afed4bda637180370474..d7a6cacbdc250aaca26d70523cd0676c7311d104 100644 (file)
@@ -32,7 +32,8 @@ use Friendica\Database\Database;
 use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Module\Register;
-use Friendica\Network\CurlResult;
+use Friendica\Network\HTTPClientOptions;
+use Friendica\Network\IHTTPResult;
 use Friendica\Protocol\Relay;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Network;
@@ -171,7 +172,7 @@ class GServer
                if (($now - $contact_time) < (60 * 60 * 24)) {
                        return DateTimeFormat::utc('now +1 day');
                }
-               
+
                // If the last contact was less than a week before then try again in a week
                if (($now - $contact_time) < (60 * 60 * 24 * 7)) {
                        return DateTimeFormat::utc('now +1 week');
@@ -314,7 +315,7 @@ class GServer
 
                // When a nodeinfo is present, we don't need to dig further
                $xrd_timeout = DI::config()->get('system', 'xrd_timeout');
-               $curlResult = DI::httpRequest()->get($url . '/.well-known/nodeinfo', ['timeout' => $xrd_timeout]);
+               $curlResult = DI::httpClient()->get($url . '/.well-known/nodeinfo', [HTTPClientOptions::TIMEOUT => $xrd_timeout]);
                if ($curlResult->isTimeout()) {
                        self::setFailure($url);
                        return false;
@@ -322,7 +323,7 @@ class GServer
 
                // On a redirect follow the new host but mark the old one as failure
                if ($curlResult->isSuccess() && (parse_url($url, PHP_URL_HOST) != parse_url($curlResult->getRedirectUrl(), PHP_URL_HOST))) {
-                       $curlResult = DI::httpRequest()->get($url, ['timeout' => $xrd_timeout]);
+                       $curlResult = DI::httpClient()->get($url, [HTTPClientOptions::TIMEOUT => $xrd_timeout]);
                        if (parse_url($url, PHP_URL_HOST) != parse_url($curlResult->getRedirectUrl(), PHP_URL_HOST)) {
                                Logger::info('Found redirect. Mark old entry as failure', ['old' => $url, 'new' => $curlResult->getRedirectUrl()]);
                                self::setFailure($url);
@@ -358,7 +359,7 @@ class GServer
                                        $basedata = ['detection-method' => self::DETECT_MANUAL];
                                }
 
-                               $curlResult = DI::httpRequest()->get($baseurl, ['timeout' => $xrd_timeout]);
+                               $curlResult = DI::httpClient()->get($baseurl, [HTTPClientOptions::TIMEOUT => $xrd_timeout]);
                                if ($curlResult->isSuccess()) {
                                        if ((parse_url($baseurl, PHP_URL_HOST) != parse_url($curlResult->getRedirectUrl(), PHP_URL_HOST))) {
                                                Logger::info('Found redirect. Mark old entry as failure', ['old' => $url, 'new' => $curlResult->getRedirectUrl()]);
@@ -382,7 +383,7 @@ class GServer
                                        // When the base path doesn't seem to contain a social network we try the complete path.
                                        // Most detectable system have to be installed in the root directory.
                                        // We checked the base to avoid false positives.
-                                       $curlResult = DI::httpRequest()->get($url, ['timeout' => $xrd_timeout]);
+                                       $curlResult = DI::httpClient()->get($url, [HTTPClientOptions::TIMEOUT => $xrd_timeout]);
                                        if ($curlResult->isSuccess()) {
                                                $urldata = self::analyseRootHeader($curlResult, $serverdata);
                                                $urldata = self::analyseRootBody($curlResult, $urldata, $url);
@@ -526,7 +527,7 @@ class GServer
        {
                Logger::info('Discover relay data', ['server' => $server_url]);
 
-               $curlResult = DI::httpRequest()->get($server_url . '/.well-known/x-social-relay');
+               $curlResult = DI::httpClient()->get($server_url . '/.well-known/x-social-relay');
                if (!$curlResult->isSuccess()) {
                        return;
                }
@@ -621,7 +622,7 @@ class GServer
         */
        private static function fetchStatistics(string $url)
        {
-               $curlResult = DI::httpRequest()->get($url . '/statistics.json');
+               $curlResult = DI::httpClient()->get($url . '/statistics.json');
                if (!$curlResult->isSuccess()) {
                        return [];
                }
@@ -671,18 +672,19 @@ class GServer
        /**
         * Detect server type by using the nodeinfo data
         *
-        * @param string     $url        address of the server
-        * @param CurlResult $curlResult
+        * @param string      $url        address of the server
+        * @param IHTTPResult $httpResult
+        *
         * @return array Server data
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       private static function fetchNodeinfo(string $url, CurlResult $curlResult)
+       private static function fetchNodeinfo(string $url, IHTTPResult $httpResult)
        {
-               if (!$curlResult->isSuccess()) {
+               if (!$httpResult->isSuccess()) {
                        return [];
                }
 
-               $nodeinfo = json_decode($curlResult->getBody(), true);
+               $nodeinfo = json_decode($httpResult->getBody(), true);
 
                if (!is_array($nodeinfo) || empty($nodeinfo['links'])) {
                        return [];
@@ -731,7 +733,7 @@ class GServer
         */
        private static function parseNodeinfo1(string $nodeinfo_url)
        {
-               $curlResult = DI::httpRequest()->get($nodeinfo_url);
+               $curlResult = DI::httpClient()->get($nodeinfo_url);
 
                if (!$curlResult->isSuccess()) {
                        return [];
@@ -802,13 +804,14 @@ 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)
        {
-               $curlResult = DI::httpRequest()->get($nodeinfo_url);
+               $curlResult = DI::httpClient()->get($nodeinfo_url);
                if (!$curlResult->isSuccess()) {
                        return [];
                }
@@ -850,7 +853,9 @@ class GServer
                if (!empty($nodeinfo['protocols'])) {
                        $protocols = [];
                        foreach ($nodeinfo['protocols'] as $protocol) {
-                               $protocols[$protocol] = true;
+                               if (is_string($protocol)) {
+                                       $protocols[$protocol] = true;
+                               }
                        }
 
                        if (!empty($protocols['dfrn'])) {
@@ -885,7 +890,7 @@ class GServer
         */
        private static function fetchSiteinfo(string $url, array $serverdata)
        {
-               $curlResult = DI::httpRequest()->get($url . '/siteinfo.json');
+               $curlResult = DI::httpClient()->get($url . '/siteinfo.json');
                if (!$curlResult->isSuccess()) {
                        return $serverdata;
                }
@@ -954,7 +959,7 @@ class GServer
        private static function validHostMeta(string $url)
        {
                $xrd_timeout = DI::config()->get('system', 'xrd_timeout');
-               $curlResult = DI::httpRequest()->get($url . '/.well-known/host-meta', ['timeout' => $xrd_timeout]);
+               $curlResult = DI::httpClient()->get($url . '/.well-known/host-meta', [HTTPClientOptions::TIMEOUT => $xrd_timeout]);
                if (!$curlResult->isSuccess()) {
                        return false;
                }
@@ -1044,7 +1049,7 @@ class GServer
        {
                $serverdata['poco'] = '';
 
-               $curlResult = DI::httpRequest()->get($url . '/poco');
+               $curlResult = DI::httpClient()->get($url . '/poco');
                if (!$curlResult->isSuccess()) {
                        return $serverdata;
                }
@@ -1074,7 +1079,7 @@ class GServer
         */
        public static function checkMastodonDirectory(string $url, array $serverdata)
        {
-               $curlResult = DI::httpRequest()->get($url . '/api/v1/directory?limit=1');
+               $curlResult = DI::httpClient()->get($url . '/api/v1/directory?limit=1');
                if (!$curlResult->isSuccess()) {
                        return $serverdata;
                }
@@ -1101,7 +1106,7 @@ class GServer
         */
        private static function detectPeertube(string $url, array $serverdata)
        {
-               $curlResult = DI::httpRequest()->get($url . '/api/v1/config');
+               $curlResult = DI::httpClient()->get($url . '/api/v1/config');
 
                if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
                        return $serverdata;
@@ -1149,7 +1154,7 @@ class GServer
         */
        private static function detectNextcloud(string $url, array $serverdata)
        {
-               $curlResult = DI::httpRequest()->get($url . '/status.php');
+               $curlResult = DI::httpClient()->get($url . '/status.php');
 
                if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
                        return $serverdata;
@@ -1183,7 +1188,7 @@ class GServer
         */
        private static function detectMastodonAlikes(string $url, array $serverdata)
        {
-               $curlResult = DI::httpRequest()->get($url . '/api/v1/instance');
+               $curlResult = DI::httpClient()->get($url . '/api/v1/instance');
 
                if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
                        return $serverdata;
@@ -1249,7 +1254,7 @@ class GServer
         */
        private static function detectHubzilla(string $url, array $serverdata)
        {
-               $curlResult = DI::httpRequest()->get($url . '/api/statusnet/config.json');
+               $curlResult = DI::httpClient()->get($url . '/api/statusnet/config.json');
                if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
                        return $serverdata;
                }
@@ -1347,7 +1352,7 @@ class GServer
        private static function detectGNUSocial(string $url, array $serverdata)
        {
                // Test for GNU Social
-               $curlResult = DI::httpRequest()->get($url . '/api/gnusocial/version.json');
+               $curlResult = DI::httpClient()->get($url . '/api/gnusocial/version.json');
                if ($curlResult->isSuccess() && ($curlResult->getBody() != '{"error":"not implemented"}') &&
                        ($curlResult->getBody() != '') && (strlen($curlResult->getBody()) < 30)) {
                        $serverdata['platform'] = 'gnusocial';
@@ -1365,7 +1370,7 @@ class GServer
                }
 
                // Test for Statusnet
-               $curlResult = DI::httpRequest()->get($url . '/api/statusnet/version.json');
+               $curlResult = DI::httpClient()->get($url . '/api/statusnet/version.json');
                if ($curlResult->isSuccess() && ($curlResult->getBody() != '{"error":"not implemented"}') &&
                        ($curlResult->getBody() != '') && (strlen($curlResult->getBody()) < 30)) {
 
@@ -1401,9 +1406,9 @@ class GServer
         */
        private static function detectFriendica(string $url, array $serverdata)
        {
-               $curlResult = DI::httpRequest()->get($url . '/friendica/json');
+               $curlResult = DI::httpClient()->get($url . '/friendica/json');
                if (!$curlResult->isSuccess()) {
-                       $curlResult = DI::httpRequest()->get($url . '/friendika/json');
+                       $curlResult = DI::httpClient()->get($url . '/friendika/json');
                        $friendika = true;
                        $platform = 'Friendika';
                } else {
@@ -1475,6 +1480,10 @@ class GServer
         */
        private static function analyseRootBody($curlResult, array $serverdata, string $url)
        {
+               if (empty($curlResult->getBody())) {
+                       return $serverdata;
+               }
+
                $doc = new DOMDocument();
                @$doc->loadHTML($curlResult->getBody());
                $xpath = new DOMXPath($doc);
@@ -1611,11 +1620,11 @@ class GServer
                } elseif ($curlResult->inHeader('x-diaspora-version')) {
                        $serverdata['platform'] = 'diaspora';
                        $serverdata['network'] = Protocol::DIASPORA;
-                       $serverdata['version'] = $curlResult->getHeader('x-diaspora-version');
+                       $serverdata['version'] = $curlResult->getHeader('x-diaspora-version')[0] ?? '';
                } elseif ($curlResult->inHeader('x-friendica-version')) {
                        $serverdata['platform'] = 'friendica';
                        $serverdata['network'] = Protocol::DFRN;
-                       $serverdata['version'] = $curlResult->getHeader('x-friendica-version');
+                       $serverdata['version'] = $curlResult->getHeader('x-friendica-version')[0] ?? '';
                } else {
                        return $serverdata;
                }
@@ -1703,7 +1712,7 @@ class GServer
                $protocols = ['activitypub', 'diaspora', 'dfrn', 'ostatus'];
                foreach ($protocols as $protocol) {
                        $query = '{nodes(protocol:"' . $protocol . '"){host}}';
-                       $curlResult = DI::httpRequest()->fetch('https://the-federation.info/graphql?query=' . urlencode($query));
+                       $curlResult = DI::httpClient()->fetch('https://the-federation.info/graphql?query=' . urlencode($query));
                        if (!empty($curlResult)) {
                                $data = json_decode($curlResult, true);
                                if (!empty($data['data']['nodes'])) {
@@ -1720,8 +1729,7 @@ class GServer
 
                if (!empty($accesstoken)) {
                        $api = 'https://instances.social/api/1.0/instances/list?count=0';
-                       $header = ['Authorization: Bearer '.$accesstoken];
-                       $curlResult = DI::httpRequest()->get($api, ['header' => $header]);
+                       $curlResult = DI::httpClient()->get($api, [HTTPClientOptions::HEADERS => ['Authorization' => ['Bearer ' . $accesstoken]]]);
 
                        if ($curlResult->isSuccess()) {
                                $servers = json_decode($curlResult->getBody(), true);
@@ -1741,8 +1749,8 @@ class GServer
         *
         * @param int $gsid     Server id
         * @param int $protocol Protocol id
-        * @return void 
-        * @throws Exception 
+        * @return void
+        * @throws Exception
         */
        public static function setProtocol(int $gsid, int $protocol)
        {
@@ -1801,8 +1809,8 @@ class GServer
         * Fetch the protocol of the given server
         *
         * @param int $gsid Server id
-        * @return int 
-        * @throws Exception 
+        * @return int
+        * @throws Exception
         */
        public static function getProtocol(int $gsid)
        {