From 9fd864df0b4b0dae2288bab9957df36ddc045f40 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 9 Mar 2024 09:30:05 +0100 Subject: [PATCH 1/2] Make sure GeoLite2 db file is always read from the filesystem befor etrying to operate on it --- composer.json | 2 +- module/CLI/config/dependencies.config.php | 4 ++-- module/CLI/src/GeoLite/GeolocationDbUpdater.php | 12 ++++++++++-- module/CLI/test/GeoLite/GeolocationDbUpdaterTest.php | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 7c336b05..3d13c0fc 100644 --- a/composer.json +++ b/composer.json @@ -50,7 +50,7 @@ "shlinkio/shlink-event-dispatcher": "^3.1", "shlinkio/shlink-importer": "^5.2.1", "shlinkio/shlink-installer": "^8.7", - "shlinkio/shlink-ip-geolocation": "^3.4", + "shlinkio/shlink-ip-geolocation": "^4.0", "shlinkio/shlink-json": "^1.1", "spiral/roadrunner": "^2023.2", "spiral/roadrunner-cli": "^2.5", diff --git a/module/CLI/config/dependencies.config.php b/module/CLI/config/dependencies.config.php index 2736a21e..163583b0 100644 --- a/module/CLI/config/dependencies.config.php +++ b/module/CLI/config/dependencies.config.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace Shlinkio\Shlink\CLI; -use GeoIp2\Database\Reader; use Laminas\ServiceManager\AbstractFactory\ConfigAbstractFactory; use Laminas\ServiceManager\Factory\InvokableFactory; use Shlinkio\Shlink\Common\Doctrine\NoDbNameConnectionFactory; @@ -17,6 +16,7 @@ use Shlinkio\Shlink\Core\Tag\TagService; use Shlinkio\Shlink\Core\Visit; use Shlinkio\Shlink\Installer\Factory\ProcessHelperFactory; use Shlinkio\Shlink\IpGeolocation\GeoLite2\DbUpdater; +use Shlinkio\Shlink\IpGeolocation\GeoLite2\GeoLite2ReaderFactory; use Shlinkio\Shlink\Rest\Service\ApiKeyService; use Symfony\Component\Console as SymfonyCli; use Symfony\Component\Lock\LockFactory; @@ -72,7 +72,7 @@ return [ ConfigAbstractFactory::class => [ GeoLite\GeolocationDbUpdater::class => [ DbUpdater::class, - Reader::class, + GeoLite2ReaderFactory::class, LOCAL_LOCK_FACTORY, TrackingOptions::class, ], diff --git a/module/CLI/src/GeoLite/GeolocationDbUpdater.php b/module/CLI/src/GeoLite/GeolocationDbUpdater.php index b377c14b..ff42c930 100644 --- a/module/CLI/src/GeoLite/GeolocationDbUpdater.php +++ b/module/CLI/src/GeoLite/GeolocationDbUpdater.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Shlinkio\Shlink\CLI\GeoLite; use Cake\Chronos\Chronos; +use Closure; use GeoIp2\Database\Reader; use MaxMind\Db\Reader\Metadata; use Shlinkio\Shlink\CLI\Exception\GeolocationDbUpdateFailedException; @@ -21,12 +22,19 @@ class GeolocationDbUpdater implements GeolocationDbUpdaterInterface { private const LOCK_NAME = 'geolocation-db-update'; + /** @var Closure(): Reader */ + private readonly Closure $geoLiteDbReaderFactory; + + /** + * @param callable(): Reader $geoLiteDbReaderFactory + */ public function __construct( private readonly DbUpdaterInterface $dbUpdater, - private readonly Reader $geoLiteDbReader, + callable $geoLiteDbReaderFactory, private readonly LockFactory $locker, private readonly TrackingOptions $trackingOptions, ) { + $this->geoLiteDbReaderFactory = $geoLiteDbReaderFactory(...); } /** @@ -57,7 +65,7 @@ class GeolocationDbUpdater implements GeolocationDbUpdaterInterface return $this->downloadNewDb(false, $beforeDownload, $handleProgress); } - $meta = $this->geoLiteDbReader->metadata(); + $meta = ($this->geoLiteDbReaderFactory)()->metadata(); if ($this->buildIsTooOld($meta)) { return $this->downloadNewDb(true, $beforeDownload, $handleProgress); } diff --git a/module/CLI/test/GeoLite/GeolocationDbUpdaterTest.php b/module/CLI/test/GeoLite/GeolocationDbUpdaterTest.php index 0f911db8..b7d30d24 100644 --- a/module/CLI/test/GeoLite/GeolocationDbUpdaterTest.php +++ b/module/CLI/test/GeoLite/GeolocationDbUpdaterTest.php @@ -187,7 +187,7 @@ class GeolocationDbUpdaterTest extends TestCase return new GeolocationDbUpdater( $this->dbUpdater, - $this->geoLiteDbReader, + fn () => $this->geoLiteDbReader, $locker, $options ?? new TrackingOptions(), ); From 250f9f2d89b763553c4c6cad3bca2c3a78a1598b Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 9 Mar 2024 09:37:28 +0100 Subject: [PATCH 2/2] Update changelog --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81281802..65f4020f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,23 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com), and this project adheres to [Semantic Versioning](https://semver.org). +## [3.7.4] - 2024-03-09 +### Added +* *Nothing* + +### Changed +* *Nothing* + +### Deprecated +* *Nothing* + +### Removed +* *Nothing* + +### Fixed +* [#2021](https://github.com/shlinkio/shlink/issues/2021) Fix infinite GeoLite2 downloads. + + ## [3.7.3] - 2024-01-04 ### Added * *Nothing*