use Friendica\Core\System;
use Friendica\Database\Database;
use Friendica\Model\Contact;
+use Friendica\Model\GServer;
use Friendica\Model\User;
use Friendica\Network\HTTPClient\Capability\ICanSendHttpRequests;
use Friendica\Network\HTTPClient\Client\HttpClientOptions;
use Friendica\Util\HTTPSignature;
use Friendica\Util\Profiler;
use Friendica\Util\Strings;
+use GuzzleHttp\Psr7\Uri;
use Psr\Log\LoggerInterface;
/**
$this->logger->debug('bdest detected', ['dest' => $dest]);
}
- if (!empty($addr ?: $dest)) {
+ $target = $dest ?: $addr;
+
+ if ($addr ?: $dest) {
$contact = Contact::getByURL($addr ?: $dest);
}
// OpenWebAuth
$owner = User::getOwnerDataById($this->userSession->getLocalUserId());
- $gserver = $this->dba->selectFirst('gserver', ['url'], ['id' => $contact['gsid']]);
- if (empty($gserver)) {
- $this->logger->notice('Server not found, redirecting to destination.', ['gsid' => $contact['gsid'], 'dest' => $dest]);
+ if (!empty($contact['gsid'])) {
+ $gserver = $this->dba->selectFirst('gserver', ['url'], ['id' => $contact['gsid']]);
+ if (empty($gserver)) {
+ $this->logger->notice('Server not found, redirecting to destination.', ['gsid' => $contact['gsid'], 'dest' => $dest]);
+ System::externalRedirect($dest);
+ }
+
+ $basepath = $gserver['url'];
+ } elseif (GServer::check($target)) {
+ $basepath = (string)GServer::cleanUri(new Uri($target));
+ } else {
+ $this->logger->notice('The target is not a server path, redirecting to destination.', ['target' => $target]);
System::externalRedirect($dest);
}
- $basepath = $gserver['url'];
-
$header = [
- 'Accept' => ['application/x-dfrn+json', 'application/x-zot+json'],
- 'X-Open-Web-Auth' => [Strings::getRandomHex()],
+ 'Accept' => 'application/x-dfrn+json, application/x-zot+json',
+ 'X-Open-Web-Auth' => Strings::getRandomHex()
];
// Create a header that is signed with the local users private key.