From b1b9141dcc2a595bbd79997ee0428ea34195ac0b Mon Sep 17 00:00:00 2001 From: fansaien Date: Fri, 21 Jun 2019 00:24:08 -0600 Subject: [PATCH] Improve support for protected files on S3 (#4390) Credit to @fansaien. S3 supports generating temporaryUrls to files that don't exist yet so this adds a check to make sure temp URLs are only generated for valid files. --- modules/backend/controllers/Files.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/backend/controllers/Files.php b/modules/backend/controllers/Files.php index 2ac62a722..51fcded78 100644 --- a/modules/backend/controllers/Files.php +++ b/modules/backend/controllers/Files.php @@ -77,11 +77,18 @@ class Files extends Controller if (empty($path)) { $path = $file->getDiskPath(); } - $expires = now()->addSeconds(Config::get('cms.storage.uploads.temporaryUrlTTL', 3600)); - $url = Cache::remember('backend.file:' . $path, $expires, function () use ($disk, $path, $expires) { - return $disk->temporaryUrl($path, $expires); - }); + // Check to see if the URL has already been generated + $pathKey = 'backend.file:' . $path; + $url = Cache::get($pathKey); + + // The AWS S3 storage drivers will return a valid temporary URL even if the file does not exist + if (is_null($url) && $disk->exists($path)) { + $expires = now()->addSeconds(Config::get('cms.storage.uploads.temporaryUrlTTL', 3600)); + $url = Cache::remember($pathKey, $expires, function () use ($disk, $path, $expires) { + return $disk->temporaryUrl($path, $expires); + }); + } } return $url;