X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2FProbe.php;h=008106ec3f41f6f60fd2b56d23286219465c803b;hb=a60a440c9af0caf5127c47bb59531138c906ea75;hp=9c57d624f89356d670c7e4f202d740282110ac95;hpb=d577ab98eb0f28f9f807795f54c87d80ef9c0dc2;p=friendica.git diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 9c57d624f8..008106ec3f 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -28,8 +28,6 @@ use Friendica\Util\Strings; use Friendica\Util\XML; use DomXPath; -require_once 'include/dba.php'; - /** * @brief This class contain functions for probing URL * @@ -37,6 +35,7 @@ require_once 'include/dba.php'; class Probe { private static $baseurl; + private static $istimeout; /** * @brief Rearrange the array so that it always has the same order @@ -76,7 +75,7 @@ class Probe */ private static function ownHost($host) { - $own_host = get_app()->getHostName(); + $own_host = \get_app()->getHostName(); $parts = parse_url($host); @@ -99,6 +98,7 @@ class Probe * @param string $host The host part of an url * * @return array with template and type of the webfinger template for JSON or XML + * @throws HTTPException\InternalServerErrorException */ private static function hostMeta($host) { @@ -125,6 +125,7 @@ class Probe $curlResult = Network::curl($url, false, $redirects, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']); if ($curlResult->isTimeout()) { Logger::log("Probing timeout for " . $url, Logger::DEBUG); + self::$istimeout = true; return false; } $xml = $curlResult->getBody(); @@ -157,14 +158,14 @@ class Probe continue; } - if (($attributes["rel"] == "lrdd") && !empty($attributes["template"])) { + if (!empty($attributes["rel"]) && $attributes["rel"] == "lrdd" && !empty($attributes["template"])) { $type = (empty($attributes["type"]) ? '' : $attributes["type"]); $lrdd[$type] = $attributes["template"]; } } - self::$baseurl = "http://".$host; + self::$baseurl = $host_url; Logger::log("Probing successful for ".$host, Logger::DEBUG); @@ -190,6 +191,7 @@ class Probe * @param string $hcard_url Link to the hcard - is returned by reference * * @return string profile link + * @throws HTTPException\InternalServerErrorException */ public static function webfingerDfrn($webbie, &$hcard_url) { @@ -223,6 +225,7 @@ class Probe * @param string $uri Address that should be probed * * @return array uri data + * @throws HTTPException\InternalServerErrorException */ public static function lrdd($uri) { @@ -317,6 +320,8 @@ class Probe * @param boolean $cache Use cached values? * * @return array uri data + * @throws HTTPException\InternalServerErrorException + * @throws \ImagickException */ public static function uri($uri, $network = '', $uid = -1, $cache = true) { @@ -331,23 +336,31 @@ class Probe $uid = local_user(); } + self::$istimeout = false; + if ($network != Protocol::ACTIVITYPUB) { $data = self::detect($uri, $network, $uid); } else { $data = null; } - $ap_profile = ActivityPub::probeProfile($uri); + // When the previous detection process had got a time out + // we could falsely detect a Friendica profile as AP profile. + if (!self::$istimeout) { + $ap_profile = ActivityPub::probeProfile($uri); - if (!empty($ap_profile) && (defaults($data, 'network', '') != Protocol::DFRN)) { - $data = $ap_profile; + if (!empty($ap_profile) && empty($network) && (defaults($data, 'network', '') != Protocol::DFRN)) { + $data = $ap_profile; + } + } else { + Logger::notice('Time out detected. AP will not be probed.', ['uri' => $uri]); } if (!isset($data['url'])) { $data['url'] = $uri; } - if (x($data, 'photo')) { + if (!empty($data['photo'])) { $data['baseurl'] = Network::getUrlMatch(Strings::normaliseLink(defaults($data, 'baseurl', '')), Strings::normaliseLink($data['photo'])); } else { $data['photo'] = System::baseUrl() . '/images/person-300.jpg'; @@ -358,7 +371,7 @@ class Probe $data['name'] = $data['nick']; } - if (!x($data, 'name')) { + if (empty($data['name'])) { $data['name'] = $data['url']; } } @@ -414,7 +427,7 @@ class Probe // This doesn't cover the case when a community isn't a community anymore if (!empty($data['community']) && $data['community']) { $fields['community'] = $data['community']; - $fields['contact-type'] = Contact::ACCOUNT_TYPE_COMMUNITY; + $fields['contact-type'] = Contact::TYPE_COMMUNITY; } $fieldnames = []; @@ -529,6 +542,7 @@ class Probe * @param string $type type * * @return array fixed webfinger data + * @throws HTTPException\InternalServerErrorException */ private static function fixOStatus($webfinger, $lrdd, $type) { @@ -574,6 +588,7 @@ class Probe * @param integer $uid User ID for the probe (only used for mails) * * @return array uri data + * @throws HTTPException\InternalServerErrorException */ private static function detect($uri, $network, $uid) { @@ -742,6 +757,7 @@ class Probe * @param string $type type * * @return array webfinger data + * @throws HTTPException\InternalServerErrorException */ private static function webfinger($url, $type) { @@ -750,6 +766,7 @@ class Probe $curlResult = Network::curl($url, false, $redirects, ['timeout' => $xrd_timeout, 'accept_content' => $type]); if ($curlResult->isTimeout()) { + self::$istimeout = true; return false; } $data = $curlResult->getBody(); @@ -812,11 +829,13 @@ class Probe * @param array $data The already fetched data * * @return array noscrape data + * @throws HTTPException\InternalServerErrorException */ private static function pollNoscrape($noscrape_url, $data) { $curlResult = Network::curl($noscrape_url); if ($curlResult->isTimeout()) { + self::$istimeout = true; return false; } $content = $curlResult->getBody(); @@ -928,6 +947,8 @@ class Probe * @param string $profile_link Link to the profile page * * @return array profile data + * @throws HTTPException\InternalServerErrorException + * @throws \ImagickException */ public static function profile($profile_link) { @@ -978,6 +999,7 @@ class Probe * @param array $webfinger Webfinger data * * @return array DFRN data + * @throws HTTPException\InternalServerErrorException */ private static function dfrn($webfinger) { @@ -1059,11 +1081,13 @@ class Probe * @param boolean $dfrn Poll DFRN specific data * * @return array hcard data + * @throws HTTPException\InternalServerErrorException */ private static function pollHcard($hcard_url, $data, $dfrn = false) { $curlResult = Network::curl($hcard_url); if ($curlResult->isTimeout()) { + self::$istimeout = true; return false; } $content = $curlResult->getBody(); @@ -1183,6 +1207,7 @@ class Probe * @param array $webfinger Webfinger data * * @return array Diaspora data + * @throws HTTPException\InternalServerErrorException */ private static function diaspora($webfinger) { @@ -1270,6 +1295,7 @@ class Probe * @param bool $short Short detection mode * * @return array|bool OStatus data or "false" on error or "true" on short mode + * @throws HTTPException\InternalServerErrorException */ private static function ostatus($webfinger, $short = false) { @@ -1289,7 +1315,6 @@ class Probe $data["addr"] = str_replace('acct:', '', $webfinger["subject"]); } - $pubkey = ""; if (is_array($webfinger["links"])) { // The array is reversed to take into account the order of preference for same-rel links // See: https://tools.ietf.org/html/rfc7033#section-4.4.4 @@ -1315,9 +1340,10 @@ class Probe } elseif (Strings::normaliseLink($pubkey) == 'http://') { $curlResult = Network::curl($pubkey); if ($curlResult->isTimeout()) { + self::$istimeout = true; return false; } - $pubkey = $curlResult['body']; + $pubkey = $curlResult->getBody(); } $key = explode(".", $pubkey); @@ -1347,6 +1373,7 @@ class Probe // Fetch all additional data from the feed $curlResult = Network::curl($data["poll"]); if ($curlResult->isTimeout()) { + self::$istimeout = true; return false; } $feed = $curlResult->getBody(); @@ -1452,6 +1479,7 @@ class Probe * * @param array $webfinger Webfinger data * + * @param $addr * @return array pump.io data */ private static function pumpio($webfinger, $addr) @@ -1554,11 +1582,13 @@ class Probe * @param boolean $probe Do a probe if the page contains a feed link * * @return array feed data + * @throws HTTPException\InternalServerErrorException */ private static function feed($url, $probe = true) { $curlResult = Network::curl($url); if ($curlResult->isTimeout()) { + self::$istimeout = true; return false; } $feed = $curlResult->getBody(); @@ -1616,6 +1646,7 @@ class Probe * @param integer $uid User ID * * @return array mail data + * @throws \Exception */ private static function mail($uri, $uid) { @@ -1703,6 +1734,7 @@ class Probe * @param string $base Another path that is hopefully complete * * @return string fixed avatar path + * @throws \Exception */ public static function fixAvatar($avatar, $base) {