]> BookStack Code Mirror - bookstack/blobdiff - app/References/ModelResolvers/ImageModelResolver.php
Perms: Fixed some issues made when adding transactions
[bookstack] / app / References / ModelResolvers / ImageModelResolver.php
index 331dd593b7389c1e9f0d699ecfc2f860996889ef..2c6c9fecd74b4cf33a51a334cd1136a7779c34d5 100644 (file)
@@ -3,19 +3,22 @@
 namespace BookStack\References\ModelResolvers;
 
 use BookStack\Uploads\Image;
+use BookStack\Uploads\ImageStorage;
 
 class ImageModelResolver implements CrossLinkModelResolver
 {
+    protected ?string $pattern = null;
+
     public function resolve(string $link): ?Image
     {
-        $pattern = '/^' . preg_quote(url('/uploads/images'), '/') . '\/(.+)/';
+        $pattern = $this->getUrlPattern();
         $matches = [];
         $match = preg_match($pattern, $link, $matches);
         if (!$match) {
             return null;
         }
 
-        $path = $matches[1];
+        $path = $matches[2];
 
         // Strip thumbnail element from path if existing
         $originalPathSplit = array_filter(explode('/', $path), function (string $part) {
@@ -30,4 +33,26 @@ class ImageModelResolver implements CrossLinkModelResolver
 
         return Image::query()->where('path', '=', $fullPath)->first();
     }
+
+    /**
+     * Get the regex pattern to identify image URLs.
+     * Caches the pattern since it requires looking up to settings/config.
+     */
+    protected function getUrlPattern(): string
+    {
+        if ($this->pattern) {
+            return $this->pattern;
+        }
+
+        $urls = [url('/uploads/images')];
+        $baseImageUrl = ImageStorage::getPublicUrl('/uploads/images');
+        if ($baseImageUrl !== $urls[0]) {
+            $urls[] = $baseImageUrl;
+        }
+
+        $imageUrlRegex = implode('|', array_map(fn ($url) => preg_quote($url, '/'), $urls));
+        $this->pattern = '/^(' . $imageUrlRegex . ')\/(.+)/';
+
+        return $this->pattern;
+    }
 }