From 9474700d09a3b8c15792a96cda53854d2b49e13a Mon Sep 17 00:00:00 2001 From: Aitor Date: Tue, 5 Dec 2023 15:20:36 +0100 Subject: [PATCH 1/3] :bug: Fix color picker not rendering Latin1 svgs --- .../main/ui/workspace/viewport/pixel_overlay.cljs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/viewport/pixel_overlay.cljs b/frontend/src/app/main/ui/workspace/viewport/pixel_overlay.cljs index ec83437d9..8c133aeec 100644 --- a/frontend/src/app/main/ui/workspace/viewport/pixel_overlay.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/pixel_overlay.cljs @@ -7,6 +7,7 @@ (ns app.main.ui.workspace.viewport.pixel-overlay (:require [app.common.data :as d] + [app.common.data.macros :as dm] [app.common.pages.helpers :as cph] [app.common.uuid :as uuid] [app.main.data.modal :as modal] @@ -33,7 +34,7 @@ (let [image-nodes (dom/query-all svg-node "image:not([href^=data])") noop-fn (constantly nil)] (if (empty? image-nodes) - (rx/of nil) + (rx/of svg-node) (->> (rx/from image-nodes) (rx/mapcat (fn [image] @@ -43,7 +44,8 @@ (rx/mapcat wapi/read-file-as-data-url) (rx/tap (fn [data] (dom/set-attribute! image "href" data))) - (rx/reduce noop-fn))))))))) + (rx/reduce noop-fn))))) + (rx/map (fn [_] svg-node)))))) (defn- svg-as-data-url "Transforms SVG as data-url resolving any blob, http or https url to @@ -51,7 +53,11 @@ [svg] (let [svg-clone (.cloneNode svg true)] (->> (resolve-svg-images! svg-clone) - (rx/map (fn [_] (dom/svg-node->data-uri svg-clone)))))) + (rx/mapcat (fn [svg-node] + (let [xml (js/XMLSerializer.) + xmlstr (.serializeToString xml svg-node)] + (->> (rx/of xmlstr) + (rx/map #(dm/str "data:image/svg+xml;charset=utf-8," (js/encodeURIComponent %)))))))))) (defn format-viewbox [vbox] (str/join " " [(:x vbox 0) From 2fa06baa36bb87b5100f0615f753197de8af258a Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 24 Jan 2024 17:10:56 +0100 Subject: [PATCH 2/3] :bug: Fix incorrect props handling on profile registration --- backend/src/app/rpc/commands/auth.clj | 4 +- .../test/backend_tests/rpc_profile_test.clj | 50 +++++++------------ 2 files changed, 20 insertions(+), 34 deletions(-) diff --git a/backend/src/app/rpc/commands/auth.clj b/backend/src/app/rpc/commands/auth.clj index d765a5598..fd0e20600 100644 --- a/backend/src/app/rpc/commands/auth.clj +++ b/backend/src/app/rpc/commands/auth.clj @@ -325,7 +325,9 @@ (defn register-profile [{:keys [::db/conn] :as cfg} {:keys [token fullname] :as params}] (let [claims (tokens/verify (::main/props cfg) {:token token :iss :prepared-register}) - params (assoc claims :fullname fullname) + params (-> claims + (into params) + (assoc :fullname fullname)) is-active (or (:is-active params) (not (contains? cf/flags :email-verification))) diff --git a/backend/test/backend_tests/rpc_profile_test.clj b/backend/test/backend_tests/rpc_profile_test.clj index a28f186c8..d7180461b 100644 --- a/backend/test/backend_tests/rpc_profile_test.clj +++ b/backend/test/backend_tests/rpc_profile_test.clj @@ -11,6 +11,7 @@ [app.db :as db] [app.rpc :as-alias rpc] [app.auth :as auth] + [app.rpc.commands.profile :as profile] [app.tokens :as tokens] [app.util.time :as dt] [backend-tests.helpers :as th] @@ -240,41 +241,12 @@ token (get-in out [:result :token])] (t/is (string? token)) - - ;; try register without token - (let [data {::th/type :register-profile - :fullname "foobar" - :accept-terms-and-privacy true} - out (th/command! data)] - (let [error (:error out)] - (t/is (th/ex-info? error)) - (t/is (th/ex-of-type? error :validation)) - (t/is (th/ex-of-code? error :spec-validation)))) - - ;; try correct register - (let [data {::th/type :register-profile - :token token - :fullname "foobar" - :accept-terms-and-privacy true - :accept-newsletter-subscription true}] - (let [{:keys [result error]} (th/command! data)] - (t/is (nil? error)))) - )) - -(t/deftest prepare-register-and-register-profile-1 - (let [data {::th/type :prepare-register-profile - :email "user@example.com" - :password "foobar"} - out (th/command! data) - token (get-in out [:result :token])] - (t/is (string? token)) - - ;; try register without token (let [data {::th/type :register-profile :fullname "foobar" :accept-terms-and-privacy true} out (th/command! data)] + ;; (th/print-result! out) (let [error (:error out)] (t/is (th/ex-info? error)) (t/is (th/ex-of-type? error :validation)) @@ -284,12 +256,24 @@ (let [data {::th/type :register-profile :token token :fullname "foobar" + :utm_campaign "utma" + :mtm_campaign "mtma" :accept-terms-and-privacy true :accept-newsletter-subscription true}] - (let [{:keys [result error] :as out} (th/command! data)] - ;; (th/print-result! out) + (let [{:keys [result error]} (th/command! data)] (t/is (nil? error)))) - )) + + (let [profile (some-> (th/db-get :profile {:email "user@example.com"}) + (profile/decode-row))] + (t/is (= "penpot" (:auth-backend profile))) + (t/is (= "foobar" (:fullname profile))) + (t/is (false? (:is-active profile))) + (t/is (uuid? (:default-team-id profile))) + (t/is (uuid? (:default-project-id profile))) + + (let [props (:props profile)] + (t/is (= "utma" (:penpot/utm-campaign props))) + (t/is (= "mtma" (:penpot/mtm-campaign props))))))) (t/deftest prepare-register-and-register-profile-2 (with-redefs [app.rpc.commands.auth/register-retry-threshold (dt/duration 500)] From 00b4013385a23c388ce4d837e8753cfbf4954d45 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 18 Jun 2024 20:57:45 +0200 Subject: [PATCH 3/3] :sparkles: Forward external session id to backend --- backend/src/app/loggers/audit.clj | 7 +++++-- frontend/src/app/config.cljs | 13 ++++++++++--- frontend/src/app/main/data/events.cljs | 6 ++++-- frontend/src/app/main/repo.cljs | 3 ++- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/backend/src/app/loggers/audit.clj b/backend/src/app/loggers/audit.clj index d89809f37..10797f41c 100644 --- a/backend/src/app/loggers/audit.clj +++ b/backend/src/app/loggers/audit.clj @@ -141,6 +141,7 @@ (::rpc/profile-id params) uuid/zero) + session-id (rreq/get-header request "x-external-session-id") props (-> (or (::replace-props resultm) (-> params (merge (::props resultm)) @@ -150,8 +151,10 @@ (clean-props)) token-id (::actoken/id request) - context (d/without-nils - {:access-token-id (some-> token-id str)})] + context (-> (::context resultm) + (assoc :external-session-id session-id) + (assoc :access-token-id (some-> token-id str)) + (d/without-nils))] {::type (or (::type resultm) (::rpc/type cfg)) diff --git a/frontend/src/app/config.cljs b/frontend/src/app/config.cljs index 4cfa49985..54ad1b37a 100644 --- a/frontend/src/app/config.cljs +++ b/frontend/src/app/config.cljs @@ -130,9 +130,16 @@ (def worker-uri (obj/get global "penpotWorkerURI" "/js/worker.js")) -(defn external-feature-flag [flag value] - (when-let [fn (obj/get global "externalFeatureFlag")] - (fn flag value))) +(defn external-feature-flag + [flag value] + (let [f (obj/get global "externalFeatureFlag")] + (when (fn? f) + (f flag value)))) + +(defn external-session-id + [] + (let [f (obj/get global "externalSessionId")] + (when (fn? f) (f)))) ;; --- Helper Functions diff --git a/frontend/src/app/main/data/events.cljs b/frontend/src/app/main/data/events.cljs index ec217339c..1e0cc623f 100644 --- a/frontend/src/app/main/data/events.cljs +++ b/frontend/src/app/main/data/events.cljs @@ -168,7 +168,7 @@ ptk/EffectEvent (effect [_ _ stream] (let [session (atom nil) - stopper (rx/filter (ptk/type? ::initialize) stream) + stopper (rx/filter (ptk/type? ::initialize) stream) buffer (atom #queue []) profile (->> (rx/from-atom storage {:emit-current-value? true}) (rx/map :profile) @@ -213,7 +213,9 @@ (let [session* (or @session (dt/now)) context (-> @context (merge (:context event)) - (assoc :session session*))] + (assoc :session session*) + (assoc :external-session-id (cf/external-session-id)) + (d/without-nils))] (reset! session session*) (-> event (assoc :timestamp (dt/now)) diff --git a/frontend/src/app/main/repo.cljs b/frontend/src/app/main/repo.cljs index ed71b827a..b6ff8dc1e 100644 --- a/frontend/src/app/main/repo.cljs +++ b/frontend/src/app/main/repo.cljs @@ -97,7 +97,8 @@ request {:method method :uri (u/join cf/public-uri "api/rpc/command/" nid) :credentials "include" - :headers {"accept" "application/transit+json,text/event-stream,*/*"} + :headers {"accept" "application/transit+json,text/event-stream,*/*" + "x-external-session-id" (cf/external-session-id)} :body (when (= method :post) (if form-data? (http/form-data params)