use Friendica\Core\Cache\Duration;
use Friendica\Core\Logger;
use Friendica\Core\Protocol;
+use Friendica\Core\System;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Contact;
private static $baseurl;
private static $istimeout;
+ /**
+ * Remove stuff from an URI that doesn't belong there
+ *
+ * @param string $URI
+ * @return string Cleaned URI
+ */
+ public static function cleanURI(string $URI)
+ {
+ // At first remove leading and trailing junk
+ $URI = trim($URI, "@#?:/ \t\n\r\0\x0B");
+
+ $parts = parse_url($URI);
+
+ if (empty($parts['scheme'])) {
+ return $URI;
+ }
+
+ // Remove the URL fragment, since these shouldn't be part of any profile URL
+ unset($parts['fragment']);
+
+ $URI = Network::unparseURL($parts);
+
+ return $URI;
+ }
+
/**
* Rearrange the array so that it always has the same order
*
// Reset the static variable
self::$baseurl = '';
- $ssl_url = "https://".$host."/.well-known/host-meta";
- $url = "http://".$host."/.well-known/host-meta";
+ // Handles the case when the hostname contains the scheme
+ if (!parse_url($host, PHP_URL_SCHEME)) {
+ $ssl_url = "https://" . $host . "/.well-known/host-meta";
+ $url = "http://" . $host . "/.well-known/host-meta";
+ } else {
+ $ssl_url = $host . "/.well-known/host-meta";
+ $url = '';
+ }
$xrd_timeout = DI::config()->get('system', 'xrd_timeout', 20);
- Logger::log("Probing for ".$host, Logger::DEBUG);
+ Logger::info('Probing', ['host' => $host, 'ssl_url' => $ssl_url, 'url' => $url, 'callstack' => System::callstack(20)]);
$xrd = null;
$curlResult = Network::curl($ssl_url, false, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
$ssl_connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
if ($curlResult->isSuccess()) {
$xml = $curlResult->getBody();
- $xrd = XML::parseString($xml, false);
- $host_url = 'https://'.$host;
+ $xrd = XML::parseString($xml, true);
+ if (!empty($url)) {
+ $host_url = 'https://' . $host;
+ } else {
+ $host_url = $host;
+ }
} elseif ($curlResult->isTimeout()) {
Logger::info('Probing timeout', ['url' => $ssl_url], Logger::DEBUG);
self::$istimeout = true;
return false;
}
- if (!is_object($xrd)) {
+ if (!is_object($xrd) && !empty($url)) {
$curlResult = Network::curl($url, false, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
$connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
if ($curlResult->isTimeout()) {
}
$xml = $curlResult->getBody();
- $xrd = XML::parseString($xml, false);
+ $xrd = XML::parseString($xml, true);
$host_url = 'http://'.$host;
}
if (!is_object($xrd)) {
/**
* Check an URI for LRDD data
*
- * this is a replacement for the "lrdd" function.
- * It isn't used in this class and has some redundancies in the code.
- * When time comes we can check the existing calls for "lrdd" if we can rework them.
- *
* @param string $uri Address that should be probed
*
* @return array uri data
return [];
}
- $host = $parts["host"];
+ $host = $parts['scheme'] . '://' . $parts["host"];
if (!empty($parts["port"])) {
$host .= ':'.$parts["port"];
}
}
// If it is not JSON, maybe it is XML
- $xrd = XML::parseString($data, false);
+ $xrd = XML::parseString($data, true);
if (!is_object($xrd)) {
Logger::log("No webfinger data retrievable for ".$url, Logger::DEBUG);
return false;