Add tracking for referer on the import-binfile

This commit is contained in:
Andrey Antukh 2025-07-04 11:01:25 +02:00
parent a7e0cfc609
commit 77741b49a7
2 changed files with 34 additions and 26 deletions

View file

@ -12,7 +12,6 @@
[app.binfile.common :as bfc] [app.binfile.common :as bfc]
[app.binfile.migrations :as bfm] [app.binfile.migrations :as bfm]
[app.common.data :as d] [app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex] [app.common.exceptions :as ex]
[app.common.features :as cfeat] [app.common.features :as cfeat]
[app.common.files.migrations :as-alias fmg] [app.common.files.migrations :as-alias fmg]
@ -373,6 +372,7 @@
params {:type "penpot/export-files" params {:type "penpot/export-files"
:version 1 :version 1
:generated-by (str "penpot/" (:full cf/version)) :generated-by (str "penpot/" (:full cf/version))
:refer "penpot"
:files (vec (vals files)) :files (vec (vals files))
:relations rels}] :relations rels}]
(write-entry! output "manifest.json" params)))) (write-entry! output "manifest.json" params))))
@ -878,13 +878,8 @@
(defn- import-files (defn- import-files
[{:keys [::bfc/timestamp ::bfc/input ::bfc/name] :or {timestamp (dt/now)} :as cfg}] [{:keys [::bfc/timestamp ::bfc/input ::bfc/name] :or {timestamp (dt/now)} :as cfg}]
(dm/assert! (assert (instance? ZipFile input) "expected zip file")
"expected zip file" (assert (dt/instant? timestamp) "expected valid instant")
(instance? ZipFile input))
(dm/assert!
"expected valid instant"
(dt/instant? timestamp))
(let [manifest (-> (read-manifest input) (let [manifest (-> (read-manifest input)
(validate-manifest)) (validate-manifest))
@ -896,6 +891,7 @@
:hint "unexpected type on manifest" :hint "unexpected type on manifest"
:manifest manifest)) :manifest manifest))
;; Check if all files referenced on manifest are present ;; Check if all files referenced on manifest are present
(doseq [{file-id :id features :features} (:files manifest)] (doseq [{file-id :id features :features} (:files manifest)]
(let [path (str "files/" file-id ".json")] (let [path (str "files/" file-id ".json")]
@ -956,14 +952,13 @@
[{:keys [::bfc/ids] :as cfg} output] [{:keys [::bfc/ids] :as cfg} output]
(dm/assert! (assert
"expected a set of uuid's for `::bfc/ids` parameter" (and (set? ids) (every? uuid? ids))
(and (set? ids) "expected a set of uuid's for `::bfc/ids` parameter")
(every? uuid? ids)))
(dm/assert! (assert
"expected instance of jio/IOFactory for `input`" (satisfies? jio/IOFactory output)
(satisfies? jio/IOFactory output)) "expected instance of jio/IOFactory for `input`")
(let [id (uuid/next) (let [id (uuid/next)
tp (dt/tpoint) tp (dt/tpoint)
@ -1002,14 +997,14 @@
(defn import-files! (defn import-files!
[{:keys [::bfc/input] :as cfg}] [{:keys [::bfc/input] :as cfg}]
(dm/assert! (assert
"expected valid profile-id and project-id on `cfg`"
(and (uuid? (::bfc/profile-id cfg)) (and (uuid? (::bfc/profile-id cfg))
(uuid? (::bfc/project-id cfg)))) (uuid? (::bfc/project-id cfg)))
"expected valid profile-id and project-id on `cfg`")
(dm/assert! (assert
"expected instance of jio/IOFactory for `input`" (io/coercible? input)
(io/coercible? input)) "expected instance of jio/IOFactory for `input`")
(let [id (uuid/next) (let [id (uuid/next)
tp (dt/tpoint) tp (dt/tpoint)
@ -1029,3 +1024,9 @@
:id (str id) :id (str id)
:elapsed (dt/format-duration (tp)) :elapsed (dt/format-duration (tp))
:error? (some? @cs)))))) :error? (some? @cs))))))
(defn get-manifest
[path]
(with-open [input (ZipFile. (fs/file path))]
(-> (read-manifest input)
(validate-manifest))))

View file

@ -134,11 +134,18 @@
::webhooks/event? true ::webhooks/event? true
::sse/stream? true ::sse/stream? true
::sm/params schema:import-binfile} ::sm/params schema:import-binfile}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id project-id version] :as params}] [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id project-id version file] :as params}]
(projects/check-edition-permissions! pool profile-id project-id) (projects/check-edition-permissions! pool profile-id project-id)
(let [params (-> params (let [version (or version 1)
(assoc :profile-id profile-id) params (-> params
(assoc :version (or version 1)))] (assoc :profile-id profile-id)
(assoc :version version))
manifest (case (int version)
1 nil
3 (bf.v3/get-manifest (:path file)))]
(with-meta (with-meta
(sse/response (partial import-binfile cfg params)) (sse/response (partial import-binfile cfg params))
{::audit/props {:file nil}}))) {::audit/props {:file nil
:generated-by (:generated-by manifest)
:referer (:referer manifest)}})))