X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FGServer.php;h=d7a6cacbdc250aaca26d70523cd0676c7311d104;hb=caa1a5aeacaf617c2f852b45e2ed891dd8be358c;hp=86893529177b1e078fb113889684e4c9d270059b;hpb=bf563a1a39043e015f881e797299c9e49f135ac9;p=friendica.git diff --git a/src/Model/GServer.php b/src/Model/GServer.php index 8689352917..d7a6cacbdc 100644 --- a/src/Model/GServer.php +++ b/src/Model/GServer.php @@ -1,6 +1,6 @@ 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,10 +1749,10 @@ class GServer * * @param int $gsid Server id * @param int $protocol Protocol id - * @return void - * @throws Exception + * @return void + * @throws Exception */ - static function setProtocol(int $gsid, int $protocol) + public static function setProtocol(int $gsid, int $protocol) { if (empty($gsid)) { return; @@ -1793,7 +1801,28 @@ class GServer } } - Logger::info('Protocol for server', ['protocol' => $protocol, 'old' => $old, 'id' => $gsid, 'url' => $gserver['url']]); + Logger::info('Protocol for server', ['protocol' => $protocol, 'old' => $old, 'id' => $gsid, 'url' => $gserver['url'], 'callstack' => System::callstack(20)]); DBA::update('gserver', ['protocol' => $protocol], ['id' => $gsid]); } + + /** + * Fetch the protocol of the given server + * + * @param int $gsid Server id + * @return int + * @throws Exception + */ + public static function getProtocol(int $gsid) + { + if (empty($gsid)) { + return null; + } + + $gserver = DBA::selectFirst('gserver', ['protocol'], ['id' => $gsid]); + if (DBA::isResult($gserver)) { + return $gserver['protocol']; + } + + return null; + } }