]> git.mxchange.org Git - friendica.git/commitdiff
Improved basepath detection for Magic Auth
authorMichael <heluecht@pirati.ca>
Sun, 18 Jun 2023 17:18:40 +0000 (17:18 +0000)
committerMichael <heluecht@pirati.ca>
Sun, 18 Jun 2023 17:18:40 +0000 (17:18 +0000)
src/Module/Magic.php

index 5276252de25c57930f5803f766a9effd10a3a3e5..3000e953cdd6d8154652e3b679b6e2fccfd9af11 100644 (file)
@@ -29,12 +29,14 @@ use Friendica\Core\Session\Capability\IHandleUserSessions;
 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;
 
 /**
@@ -83,6 +85,8 @@ class Magic extends BaseModule
                        $this->logger->debug('bdest detected', ['dest' => $dest]);
                }
 
+               $target = $dest ?: $addr;
+
                if ($addr ?: $dest) {
                        $contact = Contact::getByURL($addr ?: $dest);
                }
@@ -110,14 +114,21 @@ class Magic extends BaseModule
                // 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()],