From 2b4c710e3fd0405765567d044729a46ac360e942 Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Fri, 3 May 2019 10:41:12 +0200 Subject: [PATCH 1/3] Move mod/fetch to src/Module/Fetch --- mod/fetch.php | 61 ----------------------------- src/App/Router.php | 5 +++ src/Module/Diaspora/Fetch.php | 72 +++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 61 deletions(-) delete mode 100644 mod/fetch.php create mode 100644 src/Module/Diaspora/Fetch.php diff --git a/mod/fetch.php b/mod/fetch.php deleted file mode 100644 index 492f319efb..0000000000 --- a/mod/fetch.php +++ /dev/null @@ -1,61 +0,0 @@ -argc != 3) || (!in_array($a->argv[1], ["post", "status_message", "reshare"]))) { - throw new \Friendica\Network\HTTPException\NotFoundException(); - } - - $guid = $a->argv[2]; - - // Fetch the item - $fields = ['uid', 'title', 'body', 'guid', 'contact-id', 'private', 'created', 'app', 'location', 'coord', 'network', - 'event-id', 'resource-id', 'author-link', 'author-avatar', 'author-name', 'plink', 'owner-link', 'attach']; - $condition = ['wall' => true, 'private' => false, 'guid' => $guid, 'network' => [Protocol::DFRN, Protocol::DIASPORA]]; - $item = Item::selectFirst($fields, $condition); - if (!DBA::isResult($item)) { - $condition = ['guid' => $guid, 'network' => [Protocol::DFRN, Protocol::DIASPORA]]; - $item = Item::selectFirst(['author-link'], $condition); - if (DBA::isResult($item)) { - $parts = parse_url($item["author-link"]); - $host = $parts["scheme"]."://".$parts["host"]; - - if (Strings::normaliseLink($host) != Strings::normaliseLink(System::baseUrl())) { - $location = $host."/fetch/".$a->argv[1]."/".urlencode($guid); - - header("HTTP/1.1 301 Moved Permanently"); - header("Location:".$location); - exit(); - } - } - - throw new \Friendica\Network\HTTPException\NotFoundException(); - } - - // Fetch some data from the author (We could combine both queries - but I think this is more readable) - $user = User::getOwnerDataById($item["uid"]); - if (!$user) { - throw new \Friendica\Network\HTTPException\NotFoundException(); - } - - $status = Diaspora::buildStatus($item, $user); - $xml = Diaspora::buildPostXml($status["type"], $status["message"]); - - // Send the envelope - header("Content-Type: application/magic-envelope+xml; charset=utf-8"); - echo Diaspora::buildMagicEnvelope($xml, $user); - - exit(); -} diff --git a/src/App/Router.php b/src/App/Router.php index 34ca0df3dd..4e51ed75c4 100644 --- a/src/App/Router.php +++ b/src/App/Router.php @@ -103,6 +103,11 @@ class Router }); $this->routeCollector->addRoute(['GET'], '/directory', Module\Directory::class); $this->routeCollector->addRoute(['GET'], '/feedtest', Module\Feedtest::class); + $this->routeCollector->addGroup('/fetch', function (RouteCollector $collector) { + $collector->addRoute(['GET'], '/{guid}/post', Module\Diaspora\Fetch::class); + $collector->addRoute(['GET'], '/{guid}/status_message', Module\Diaspora\Fetch::class); + $collector->addRoute(['GET'], '/{guid}/reshare', Module\Diaspora\Fetch::class); + }); $this->routeCollector->addRoute(['GET'], '/filer[/{id:\d+}]', Module\Filer::class); $this->routeCollector->addRoute(['GET'], '/followers/{owner}', Module\Followers::class); $this->routeCollector->addRoute(['GET'], '/following/{owner}', Module\Following::class); diff --git a/src/Module/Diaspora/Fetch.php b/src/Module/Diaspora/Fetch.php new file mode 100644 index 0000000000..e6f94a958e --- /dev/null +++ b/src/Module/Diaspora/Fetch.php @@ -0,0 +1,72 @@ +argc != 3) || (!in_array($app->argv[1], ["post", "status_message", "reshare"]))) { + throw new HTTPException\NotFoundException(); + } + + // @TODO: Replace with parameter from router + $guid = $app->argv[2]; + + // Fetch the item + $fields = [ + 'uid', 'title', 'body', 'guid', 'contact-id', 'private', 'created', 'app', 'location', 'coord', 'network', + 'event-id', 'resource-id', 'author-link', 'author-avatar', 'author-name', 'plink', 'owner-link', 'attach' + ]; + $condition = ['wall' => true, 'private' => false, 'guid' => $guid, 'network' => [Protocol::DFRN, Protocol::DIASPORA]]; + $item = Item::selectFirst($fields, $condition); + if (empty($item)) { + $condition = ['guid' => $guid, 'network' => [Protocol::DFRN, Protocol::DIASPORA]]; + $item = Item::selectFirst(['author-link'], $condition); + if (empty($item)) { + $parts = parse_url($item["author-link"]); + $host = $parts["scheme"] . "://" . $parts["host"]; + + if (Strings::normaliseLink($host) != Strings::normaliseLink($app->getBaseURL())) { + $location = $host . "/fetch/" . $app->argv[1] . "/" . urlencode($guid); + + header("HTTP/1.1 301 Moved Permanently"); + header("Location:" . $location); + exit(); + } + } + + throw new HTTPException\NotFoundException(); + } + + // Fetch some data from the author (We could combine both queries - but I think this is more readable) + $user = User::getOwnerDataById($item["uid"]); + if (!$user) { + throw new HTTPException\NotFoundException(); + } + + $status = Diaspora::buildStatus($item, $user); + $xml = Diaspora::buildPostXml($status["type"], $status["message"]); + + // Send the envelope + header("Content-Type: application/magic-envelope+xml; charset=utf-8"); + echo Diaspora::buildMagicEnvelope($xml, $user); + + exit(); + } +} From 21aa82e06414fd5e937437602436157e09ef8745 Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Fri, 3 May 2019 15:08:50 +0200 Subject: [PATCH 2/3] Add redirect for fetch --- src/Module/Diaspora/Fetch.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Module/Diaspora/Fetch.php b/src/Module/Diaspora/Fetch.php index e6f94a958e..46d9388062 100644 --- a/src/Module/Diaspora/Fetch.php +++ b/src/Module/Diaspora/Fetch.php @@ -44,10 +44,7 @@ class Fetch extends BaseModule if (Strings::normaliseLink($host) != Strings::normaliseLink($app->getBaseURL())) { $location = $host . "/fetch/" . $app->argv[1] . "/" . urlencode($guid); - - header("HTTP/1.1 301 Moved Permanently"); - header("Location:" . $location); - exit(); + $app->redirect($location); } } From 6ff3389f6ef9fc008a6ce98efcd759eda440fa39 Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Sat, 4 May 2019 09:16:37 +0200 Subject: [PATCH 3/3] add status code to System::externalRedirect --- src/Core/System.php | 16 ++++++++++++++-- src/Module/Diaspora/Fetch.php | 3 ++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Core/System.php b/src/Core/System.php index e2966a9b0e..31934af5a7 100644 --- a/src/Core/System.php +++ b/src/Core/System.php @@ -223,15 +223,27 @@ class System extends BaseObject * Redirects to an external URL (fully qualified URL) * If you want to route relative to the current Friendica base, use App->internalRedirect() * - * @param string $url The new Location to redirect + * @param string $url The new Location to redirect + * @param int $code The redirection code, which is used (Default is 302) + * * @throws InternalServerErrorException If the URL is not fully qualified */ - public static function externalRedirect($url) + public static function externalRedirect($url, $code = 302) { if (empty(parse_url($url, PHP_URL_SCHEME))) { throw new InternalServerErrorException("'$url' is not a fully qualified URL, please use App->internalRedirect() instead"); } + switch ($code) { + case 302: + // this is the default code for a REDIRECT + // We don't need a extra header here + break; + case 301: + header('HTTP/1.1 301 Moved Permanently'); + break; + } + header("Location: $url"); exit(); } diff --git a/src/Module/Diaspora/Fetch.php b/src/Module/Diaspora/Fetch.php index 46d9388062..bcb33e3359 100644 --- a/src/Module/Diaspora/Fetch.php +++ b/src/Module/Diaspora/Fetch.php @@ -4,6 +4,7 @@ namespace Friendica\Module\Diaspora; use Friendica\BaseModule; use Friendica\Core\Protocol; +use Friendica\Core\System; use Friendica\Model\Item; use Friendica\Model\User; use Friendica\Network\HTTPException; @@ -44,7 +45,7 @@ class Fetch extends BaseModule if (Strings::normaliseLink($host) != Strings::normaliseLink($app->getBaseURL())) { $location = $host . "/fetch/" . $app->argv[1] . "/" . urlencode($guid); - $app->redirect($location); + System::externalRedirect($location, 301); } }