From bb8164ff91f52befbb844926f906a03efbed9c5a Mon Sep 17 00:00:00 2001
From: kobros-tech
Date: Thu, 10 Oct 2024 22:16:53 +0300
Subject: [PATCH] [FIX] fs_attachment: fix fs_url computing
---
fs_attachment/README.rst | 1 +
fs_attachment/models/fs_storage.py | 7 ++++
fs_attachment/readme/CONTRIBUTORS.rst | 1 +
fs_attachment/static/description/index.html | 3 +-
fs_attachment/tests/test_fs_storage.py | 40 +++++++++++++++++++++
5 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/fs_attachment/README.rst b/fs_attachment/README.rst
index 5965312ff9..536cb02ddb 100644
--- a/fs_attachment/README.rst
+++ b/fs_attachment/README.rst
@@ -423,6 +423,7 @@ Laurent Mignon
Marie Lejeune
Wolfgang Pichler
Nans Lefebvre
+Mohamed Alkobrosli
Maintainers
~~~~~~~~~~~
diff --git a/fs_attachment/models/fs_storage.py b/fs_attachment/models/fs_storage.py
index eb234a5e33..325240223c 100644
--- a/fs_attachment/models/fs_storage.py
+++ b/fs_attachment/models/fs_storage.py
@@ -417,6 +417,13 @@ def _get_url_for_attachment(
):
fs_filename = fs_filename.replace(fs_storage.directory_path, "")
parts = [base_url, fs_filename]
+ if attachment.fs_storage_id:
+ if (
+ fs_storage.optimizes_directory_path
+ and not fs_storage.use_filename_obfuscation
+ ):
+ checksum = attachment.checksum
+ parts = [base_url, checksum[:2], checksum[2:4], fs_filename]
return self._normalize_url("/".join(parts))
@api.model
diff --git a/fs_attachment/readme/CONTRIBUTORS.rst b/fs_attachment/readme/CONTRIBUTORS.rst
index d8537f5671..260fad9600 100644
--- a/fs_attachment/readme/CONTRIBUTORS.rst
+++ b/fs_attachment/readme/CONTRIBUTORS.rst
@@ -12,3 +12,4 @@ Laurent Mignon
Marie Lejeune
Wolfgang Pichler
Nans Lefebvre
+Mohamed Alkobrosli
diff --git a/fs_attachment/static/description/index.html b/fs_attachment/static/description/index.html
index af0cfb7bb6..0d61a106bc 100644
--- a/fs_attachment/static/description/index.html
+++ b/fs_attachment/static/description/index.html
@@ -763,7 +763,8 @@
Laurent Mignon <laurent.mignon@acsone.eu>
Marie Lejeune <marie.lejeune@acsone.eu>
Wolfgang Pichler <wpichler@callino.at>
-Nans Lefebvre <len@lambdao.dev>
+Nans Lefebvre <
diff --git a/fs_attachment/tests/test_fs_storage.py b/fs_attachment/tests/test_fs_storage.py
index 0538dcf0ac..2dc0b5ad89 100644
--- a/fs_attachment/tests/test_fs_storage.py
+++ b/fs_attachment/tests/test_fs_storage.py
@@ -1,5 +1,6 @@
# Copyright 2023 ACSONE SA/NV (http://acsone.eu).
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+import base64
import os
from odoo.exceptions import ValidationError
@@ -372,3 +373,42 @@ def test_recompute_urls(self):
"""
)
self.assertEqual(self.env.cr.dictfetchall()[0].get("count"), 2)
+
+ def test_url_for_image_dir_optimized_and_not_obfuscated(self):
+ # Create a base64 encoded mock image (1x1 pixel transparent PNG)
+ image_data = base64.b64encode(
+ b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08"
+ b"\x06\x00\x00\x00\x1f\x15\xc4\x89\x00\x00\x00\nIDAT\x08\xd7c\xf8\x0f\x00"
+ b"\x01\x01\x01\x00\xd1\x8d\xcd\xbf\x00\x00\x00\x00IEND\xaeB`\x82"
+ )
+
+ # Create a mock image filestore
+ fs_storage = self.env["fs.storage"].create(
+ {
+ "name": "FS Product Image Backend",
+ "code": "file",
+ "base_url": "https://localhost/images",
+ "optimizes_directory_path": True,
+ "use_filename_obfuscation": False,
+ }
+ )
+
+ # Create a mock image attachment
+ attachment = self.env["ir.attachment"].create(
+ {"name": "test_image.png", "datas": image_data, "mimetype": "image/png"}
+ )
+
+ # Get the url from the model
+ fs_url_1 = fs_storage._get_url_for_attachment(attachment)
+
+ # Generate the url that should be accessed
+ base_url = fs_storage.base_url_for_files
+ fs_filename = attachment.fs_filename
+ checksum = attachment.checksum
+ parts = [base_url, checksum[:2], checksum[2:4], fs_filename]
+ fs_url_2 = fs_storage._normalize_url("/".join(parts))
+
+ # Make some checks and asset if the two urls are equal
+ self.assertTrue(parts)
+ self.assertTrue(checksum)
+ self.assertEqual(fs_url_1, fs_url_2)