From a6698995b93a44ed07fe18d2004261eeb2a94ba0 Mon Sep 17 00:00:00 2001 From: Michael Thomas Date: Wed, 7 Sep 2022 13:04:05 +0200 Subject: [PATCH] feat: only redirect if shortlinkUrl is known --- src/services/ShortlinkService.php | 50 +++++++++++++------------------ 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/src/services/ShortlinkService.php b/src/services/ShortlinkService.php index 31b9574..0768bae 100644 --- a/src/services/ShortlinkService.php +++ b/src/services/ShortlinkService.php @@ -89,12 +89,14 @@ public function handleRedirect(): void $request = Craft::$app->getRequest(); // Only handle site requests, no live previews or console requests if ($request->getIsSiteRequest() && !$request->getIsLivePreview() && !$request->getIsConsoleRequest() && !$request->getIsCpRequest()) { - $host = urldecode($request->getHostInfo()); - $path = urldecode($request->getUrl()); - $url = urldecode($request->getAbsoluteUrl()); + $host = urldecode($request->getHostInfo()); + $path = urldecode($request->getUrl()); + $url = urldecode($request->getAbsoluteUrl()); $baseUrls = []; + $shortlinkUrls = []; $sites = Craft::$app->getSites()->allSites; + $shortlinks = Shortlink::$settings->shortlinkUrls; // host returns including trailing slash, make sure we check for that too if it's not site in the SITE_URL $needle = [ @@ -106,9 +108,14 @@ public function handleRedirect(): void $baseUrls[] = $site->baseUrl; } - // check if our hostname is not one of the existing Craft sites, if so redirect - // TODO add !array_intersect - if(!array_intersect($needle, $baseUrls)) { + // add all shortlinkUrls to an array to check if it's set + foreach($shortlinks as $shortlink) { + $shortlinkUrls[] = $shortlink['shortlinkUrl']; + } + + // check if our hostname is not one of the existing Craft sites and a url from our settings, if so redirect + if(!array_intersect($needle, $baseUrls) && array_intersect($needle, $shortlinkUrls)) { + // check if query string should be stripped or not if (!Shortlink::$settings->redirectQueryString) { $path = UrlHelper::stripQueryString($path); @@ -234,17 +241,7 @@ public function saveShortlink($entry = null, array $post): bool { $session = Craft::$app->getSession(); - if(!ElementHelper::isDraftOrRevision($entry)) { - $shortlink = ShortlinkElement::findOne(['ownerId' => $entry->id]); - } else { - $shortlink = ShortlinkElement::findOne(['ownerRevisionId' => $entry->id]); - } - - if(is_null($shortlink)) { - $shortlink = new ShortlinkElement(); - } - - //$shortlink = $this->_setShortlinkFromPost(); + $shortlink = $this->_setShortlinkFromPost(); $shortlink->shortlinkUri = $post['shortlinkUri'] ?? null; $shortlink->httpCode = $post['redirectType'] ?? null; $shortlink->shortlinkStatus = ShortlinkElement::STATUS_ACTIVE; @@ -257,8 +254,6 @@ public function saveShortlink($entry = null, array $post): bool $shortlink->ownerRevisionId = $entry->id; } - Craft::warning('Shortlink ID: ' . $shortlink->id . ' / Owner ID: ' . $shortlink->ownerId . ' / Owner Revision ID: ' . $shortlink->ownerRevisionId, __METHOD__); - if (!Craft::$app->getElements()->saveElement($shortlink)) { $session->setError(Craft::t('shortlink', 'Could not save the shortlink.')); return false; @@ -491,18 +486,15 @@ private function _generateUri(string $characters, int $length): string { * @return ShortlinkElement * @throws Exception */ - private function _setShortlinkFromPost(): ShortlinkElement + private function _setShortlinkFromPost(Entry $entry): ShortlinkElement { - $request = Craft::$app->getRequest(); - $shortlinkId = $request->getParam('shortlinkId'); - - if ($shortlinkId) { - $shortlink = $this->getShortlinkById($shortlinkId); - - if (!$shortlink) { - throw new Exception (Craft::t('shortlink', 'No shortlink with the ID “{id}”', ['id' => $shortlinkId])); - } + if(!ElementHelper::isDraftOrRevision($entry)) { + $shortlink = ShortlinkElement::findOne(['ownerId' => $entry->id]); } else { + $shortlink = ShortlinkElement::findOne(['ownerRevisionId' => $entry->id]); + } + + if(is_null($shortlink)) { $shortlink = new ShortlinkElement(); }