mirror of
https://github.com/penpot/penpot.git
synced 2026-11-05 09:30:38 +00:00
* 🐛 Confine upload paths to temp dirs Reject upload maps whose path leaves the server temp dirs. Transit bodies can forge a Path such as /etc/passwd and the handlers open it directly. Centralize the realpath prefix check in media validation and apply it to all nine upload fields. Legit multipart files under /tmp/undertow/ or /tmp/penpot/ still pass. AI-assisted-by: muse-spark-1.3-contributor * ♻️ Rename upload validators to check-* Drop the validate prefix and the bang from the media validation helpers for a consistent check naming. Move the temp dir confinement into validation and cover all nine upload fields. Add unit tests for each helper. AI-assisted-by: muse-spark-1.3-contributor * 🐛 Fix svg upload tests to use penpot tmp dir SVG upload tests wrote tempfiles to the system tmp dir, outside the allowed upload prefixes, so check-upload-path rejected them. Point write-temp-svg at /tmp/penpot like the other upload tests. AI-assisted-by: muse-spark-1.3-contributor
69 lines
3.4 KiB
Clojure
69 lines
3.4 KiB
Clojure
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
;;
|
|
;; Copyright (c) KALEIDOS INC Sucursal en España SL
|
|
|
|
(ns backend-tests.media-validation-test
|
|
(:require
|
|
[app.media.validation :as media.v]
|
|
[backend-tests.helpers :as th]
|
|
[clojure.test :as t]
|
|
[datoteka.fs :as fs]))
|
|
|
|
(t/deftest check-media-type
|
|
(t/testing "allowed mtype passes through"
|
|
(let [upload {:filename "a.png" :size 1 :path (fs/path "/tmp/penpot/a.png") :mtype "image/png"}]
|
|
(t/is (= upload (media.v/check-media-type upload)))))
|
|
(t/testing "disallowed mtype is rejected"
|
|
(let [upload {:filename "a.txt" :size 1 :path (fs/path "/tmp/penpot/a.txt") :mtype "text/plain"}
|
|
error (try (media.v/check-media-type upload) nil
|
|
(catch clojure.lang.ExceptionInfo e e))]
|
|
(t/is (some? error))
|
|
(t/is (th/ex-of-type? error :validation))
|
|
(t/is (th/ex-of-code? error :media-type-not-allowed)))))
|
|
|
|
(t/deftest check-media-size
|
|
(t/testing "small file passes through"
|
|
(let [upload {:filename "a.png" :size 1 :path (fs/path "/tmp/penpot/a.png") :mtype "image/png"}]
|
|
(t/is (= upload (media.v/check-media-size upload)))))
|
|
(t/testing "oversized file is rejected"
|
|
(let [upload {:filename "a.png" :size (* 1024 1024 31) :path (fs/path "/tmp/penpot/a.png") :mtype "image/png"}
|
|
error (try (media.v/check-media-size upload) nil
|
|
(catch clojure.lang.ExceptionInfo e e))]
|
|
(t/is (some? error))
|
|
(t/is (th/ex-of-type? error :restriction))
|
|
(t/is (th/ex-of-code? error :media-max-file-size-reached)))))
|
|
|
|
(t/deftest check-font-size
|
|
(t/testing "small font passes through"
|
|
(let [upload {:filename "a.ttf" :size 1 :path (fs/path "/tmp/penpot/a.ttf") :mtype "font/ttf"}]
|
|
(t/is (= upload (media.v/check-font-size upload)))))
|
|
(t/testing "oversized font is rejected"
|
|
(let [upload {:filename "a.ttf" :size (* 1024 1024 31) :path (fs/path "/tmp/penpot/a.ttf") :mtype "font/ttf"}
|
|
error (try (media.v/check-font-size upload) nil
|
|
(catch clojure.lang.ExceptionInfo e e))]
|
|
(t/is (some? error))
|
|
(t/is (th/ex-of-type? error :restriction))
|
|
(t/is (th/ex-of-code? error :font-max-file-size-reached)))))
|
|
|
|
(t/deftest check-upload-path
|
|
(t/testing "tempfile under /tmp/penpot passes through"
|
|
(let [path (th/tempfile "backend_tests/test_files/sample.jpg")
|
|
upload {:filename "sample.jpg" :size 7923 :path path :mtype "image/jpeg"}]
|
|
(t/is (= upload (media.v/check-upload-path upload)))))
|
|
(t/testing "system file outside temp is rejected"
|
|
(let [upload {:filename "x.png" :size 1 :path (fs/path "/etc/passwd") :mtype "image/png"}
|
|
error (try (media.v/check-upload-path upload) nil
|
|
(catch clojure.lang.ExceptionInfo e e))]
|
|
(t/is (some? error))
|
|
(t/is (th/ex-of-type? error :validation))
|
|
(t/is (th/ex-of-code? error :params-validation))))
|
|
(t/testing "missing file is rejected"
|
|
(let [upload {:filename "x.png" :size 1 :path (fs/path "/tmp/penpot/no-such-file-12345.png") :mtype "image/png"}
|
|
error (try (media.v/check-upload-path upload) nil
|
|
(catch clojure.lang.ExceptionInfo e e))]
|
|
(t/is (some? error))
|
|
(t/is (th/ex-of-type? error :validation))
|
|
(t/is (th/ex-of-code? error :params-validation)))))
|