From f9a141960854a6a5ea51c90a24984f873de70e75 Mon Sep 17 00:00:00 2001 From: overflowerror Date: Sun, 3 Dec 2023 13:36:47 +0100 Subject: [PATCH] feat: Add return existing slug if available --- controllers/manage/POST.php | 28 +++++++++++++++++++--------- persistence/repositories/URLs.php | 14 ++++++++++++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/controllers/manage/POST.php b/controllers/manage/POST.php index c4ecc92..42473a5 100644 --- a/controllers/manage/POST.php +++ b/controllers/manage/POST.php @@ -86,6 +86,10 @@ function generateSlug(URLs $repository) { return $candidates[0]; } +function generateAccessKey(string $slug, string $url) { + return sha1($url . "-" . $url . "-" . microtime() . "-" . rand()); +} + return function (array &$context) { $url = $_POST["url"] ?? ""; $url = validateInput($url); @@ -94,19 +98,25 @@ return function (array &$context) { } $repository = $context[REPOSITORIES]->urls; - $slug = generateSlug($repository); - $accessKey = sha1($url . "-" . $url . "-" . microtime() . "-" . rand()); + $result = $repository->getByUrl($url); + if ($result) { + // don't leak existing access key + $result->accessKey = ""; + } else { + $slug = generateSlug($repository); + $accessKey = generateAccessKey($slug, $url); - $result = $context[REPOSITORIES]->urls->add(new URL( - $slug, - $url, - $accessKey - )); + $result = $repository->add(new URL( + $slug, + $url, + $accessKey + )); + } $data = [ - "url" => "https://drnk.me/$slug", - "accessKey" => $accessKey, + "url" => "https://drnk.me/" . $result->slug, + "accessKey" => $result->accessKey, ]; require(ROOT . "/templates/pages/components/creation-successful.php"); }; diff --git a/persistence/repositories/URLs.php b/persistence/repositories/URLs.php index a9ec1ed..941d571 100644 --- a/persistence/repositories/URLs.php +++ b/persistence/repositories/URLs.php @@ -71,4 +71,18 @@ class URLs { return $this->entityFromRow($statement->fetch()); } } + + public function getByUrl(string $url) { + $statement = $this->connection->prepare(<<table` + WHERE `url` = ? + EOF); + $statement->execute([$url]); + + if ($statement->rowCount() == 0) { + return null; + } else { + return $this->entityFromRow($statement->fetch()); + } + } }