From 7736d3085cce0eb1e6370db1ae8919c919f16fa8 Mon Sep 17 00:00:00 2001 From: Reyzis2021 Date: Mon, 4 Nov 2024 15:06:10 +0300 Subject: [PATCH] SHORTY-81 Fix case with loops in URL redirection are not avoided --- .../zufar/urlshortener/shorten/controller/UrlController.kt | 7 +++++++ .../zufar/urlshortener/shorten/repository/UrlRepository.kt | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/main/kotlin/com/zufar/urlshortener/shorten/controller/UrlController.kt b/src/main/kotlin/com/zufar/urlshortener/shorten/controller/UrlController.kt index b149550..f807386 100644 --- a/src/main/kotlin/com/zufar/urlshortener/shorten/controller/UrlController.kt +++ b/src/main/kotlin/com/zufar/urlshortener/shorten/controller/UrlController.kt @@ -1,6 +1,7 @@ package com.zufar.urlshortener.shorten.controller import com.zufar.urlshortener.common.exception.ErrorResponse +import com.zufar.urlshortener.common.exception.InvalidRequestException import com.zufar.urlshortener.shorten.dto.* import com.zufar.urlshortener.shorten.repository.UrlRepository import com.zufar.urlshortener.shorten.service.* @@ -164,6 +165,12 @@ class UrlController( httpServletRequest.getHeader("User-Agent") ) + val existingMapping = urlRepository.findByShortUrl(originalUrl) + if (existingMapping.isPresent) { + log.warn("Loop detected: originalUrl='{}' points to another short URL.", originalUrl) + throw InvalidRequestException("URL cannot point to a loop back address") + } + val urlHash = StringEncoder.encode(originalUrl) val urlMapping = urlRepository.findByUrlHash(urlHash) val shortUrl: String diff --git a/src/main/kotlin/com/zufar/urlshortener/shorten/repository/UrlRepository.kt b/src/main/kotlin/com/zufar/urlshortener/shorten/repository/UrlRepository.kt index 6f3af2e..8160b8b 100644 --- a/src/main/kotlin/com/zufar/urlshortener/shorten/repository/UrlRepository.kt +++ b/src/main/kotlin/com/zufar/urlshortener/shorten/repository/UrlRepository.kt @@ -11,4 +11,6 @@ interface UrlRepository : MongoRepository { fun findByUrlHash(urlHash: String): Optional fun findAllByUserId(userId: String, pageable: Pageable): Page + + fun findByShortUrl(shortUrl: String): Optional } \ No newline at end of file