mirror of
https://github.com/penpot/penpot.git
synced 2026-08-26 14:48:43 +00:00
🐛 Preserve public URI subpath in asset download URLs (#11234)
Join asset download paths relative to PENPOT_PUBLIC_URI so temporary exports and binary file downloads retain configured subpaths. Add regression coverage for both URL generation paths. AI-assisted-by: gpt-5.6-sol
This commit is contained in:
parent
fb9f92ae6a
commit
7f2dc66e86
@ -63,7 +63,8 @@
|
|||||||
:bucket "tempfile"})]
|
:bucket "tempfile"})]
|
||||||
|
|
||||||
(-> (cf/get :public-uri)
|
(-> (cf/get :public-uri)
|
||||||
(u/join "/assets/by-id/")
|
(u/ensure-path-slash)
|
||||||
|
(u/join "assets/by-id/")
|
||||||
(u/join (str (:id object)))))
|
(u/join (str (:id object)))))
|
||||||
|
|
||||||
(finally
|
(finally
|
||||||
|
|||||||
@ -47,5 +47,6 @@
|
|||||||
object (sto/put-object! storage content)]
|
object (sto/put-object! storage content)]
|
||||||
{:id (:id object)
|
{:id (:id object)
|
||||||
:uri (-> (cf/get :public-uri)
|
:uri (-> (cf/get :public-uri)
|
||||||
(u/join "/assets/by-id/")
|
(u/ensure-path-slash)
|
||||||
|
(u/join "assets/by-id/")
|
||||||
(u/join (str (:id object))))}))
|
(u/join (str (:id object))))}))
|
||||||
|
|||||||
@ -16,10 +16,12 @@
|
|||||||
[app.common.thumbnails :as thc]
|
[app.common.thumbnails :as thc]
|
||||||
[app.common.types.shape :as cts]
|
[app.common.types.shape :as cts]
|
||||||
[app.common.uuid :as uuid]
|
[app.common.uuid :as uuid]
|
||||||
|
[app.config :as cf]
|
||||||
[app.db :as db]
|
[app.db :as db]
|
||||||
[app.db.sql :as sql]
|
[app.db.sql :as sql]
|
||||||
[app.http :as http]
|
[app.http :as http]
|
||||||
[app.rpc :as-alias rpc]
|
[app.rpc :as-alias rpc]
|
||||||
|
[app.rpc.commands.binfile :as binfile]
|
||||||
[app.storage :as sto]
|
[app.storage :as sto]
|
||||||
[app.storage.tmp :as tmp]
|
[app.storage.tmp :as tmp]
|
||||||
[backend-tests.helpers :as th]
|
[backend-tests.helpers :as th]
|
||||||
@ -207,6 +209,18 @@
|
|||||||
(t/is (= (count result) 1))
|
(t/is (= (count result) 1))
|
||||||
(t/is (every? uuid? result)))))
|
(t/is (every? uuid? result)))))
|
||||||
|
|
||||||
|
(t/deftest export-binfile-preserves-public-uri-subpath
|
||||||
|
(let [profile (th/create-profile* 1)
|
||||||
|
file (prepare-simple-file profile)
|
||||||
|
config (assoc cf/config :public-uri "https://example.com/penpot")
|
||||||
|
params {:file-id (:id file)
|
||||||
|
:include-libraries false
|
||||||
|
:embed-assets false}
|
||||||
|
uri (binding [cf/config config]
|
||||||
|
(#'binfile/export-binfile th/*system* params))]
|
||||||
|
(t/is (str/starts-with? (str uri)
|
||||||
|
"https://example.com/penpot/assets/by-id/"))))
|
||||||
|
|
||||||
(t/deftest read-obj-rejects-oversized-buffer
|
(t/deftest read-obj-rejects-oversized-buffer
|
||||||
;; N1-07: read-obj! must reject objects exceeding max-object-size
|
;; N1-07: read-obj! must reject objects exceeding max-object-size
|
||||||
;; before attempting to allocate the buffer
|
;; before attempting to allocate the buffer
|
||||||
|
|||||||
@ -11,6 +11,7 @@
|
|||||||
[app.common.pprint :as pp]
|
[app.common.pprint :as pp]
|
||||||
[app.common.types.shape :as cts]
|
[app.common.types.shape :as cts]
|
||||||
[app.common.uuid :as uuid]
|
[app.common.uuid :as uuid]
|
||||||
|
[app.config :as cf]
|
||||||
[app.db :as db]
|
[app.db :as db]
|
||||||
[app.http :as http]
|
[app.http :as http]
|
||||||
[app.rpc :as-alias rpc]
|
[app.rpc :as-alias rpc]
|
||||||
@ -19,6 +20,7 @@
|
|||||||
[backend-tests.storage-test :refer [configure-storage-backend]]
|
[backend-tests.storage-test :refer [configure-storage-backend]]
|
||||||
[buddy.core.bytes :as b]
|
[buddy.core.bytes :as b]
|
||||||
[clojure.test :as t]
|
[clojure.test :as t]
|
||||||
|
[cuerdas.core :as str]
|
||||||
[datoteka.fs :as fs]
|
[datoteka.fs :as fs]
|
||||||
[datoteka.io :as io]))
|
[datoteka.io :as io]))
|
||||||
|
|
||||||
@ -50,10 +52,15 @@
|
|||||||
:path path
|
:path path
|
||||||
:mtype "image/png"
|
:mtype "image/png"
|
||||||
:size 7}}
|
:size 7}}
|
||||||
out1 (th/management-command! params)
|
config (assoc cf/config :public-uri "https://example.com/penpot")
|
||||||
out2 (th/management-command! params)]
|
out1 (binding [cf/config config]
|
||||||
|
(th/management-command! params))
|
||||||
|
out2 (binding [cf/config config]
|
||||||
|
(th/management-command! params))]
|
||||||
(t/is (nil? (:error out1)))
|
(t/is (nil? (:error out1)))
|
||||||
(t/is (nil? (:error out2)))
|
(t/is (nil? (:error out2)))
|
||||||
|
(t/is (str/starts-with? (str (get-in out1 [:result :uri]))
|
||||||
|
"https://example.com/penpot/assets/by-id/"))
|
||||||
(t/is (not= (get-in out1 [:result :id])
|
(t/is (not= (get-in out1 [:result :id])
|
||||||
(get-in out2 [:result :id])))))
|
(get-in out2 [:result :id])))))
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user