[FIX #2565] data-store: escape leading tildes in message content
This commit is contained in:
parent
c8168e9ff0
commit
b0b4226680
|
@ -84,11 +84,33 @@
|
||||||
(defn write [realm f]
|
(defn write [realm f]
|
||||||
(.write realm f))
|
(.write realm f))
|
||||||
|
|
||||||
|
|
||||||
|
(def transit-special-chars #{"~" "^" "`"})
|
||||||
|
(def transit-escape-char "~")
|
||||||
|
|
||||||
|
(defn to-be-escaped?
|
||||||
|
"Check if element is a string that begins
|
||||||
|
with a character recognized as special by Transit"
|
||||||
|
[e]
|
||||||
|
(and (string? e)
|
||||||
|
(contains? transit-special-chars (first e))))
|
||||||
|
|
||||||
|
(defn prepare-for-transit
|
||||||
|
"Following Transit documentation, escape leading special characters
|
||||||
|
in strings by prepending a ~. This prepares for subsequent
|
||||||
|
fetching from Realm where Transit is used for JSON parsing"
|
||||||
|
[message]
|
||||||
|
(let [walk-fn (fn [e]
|
||||||
|
(cond->> e
|
||||||
|
(to-be-escaped? e)
|
||||||
|
(str transit-escape-char)))]
|
||||||
|
(walk/postwalk walk-fn message)))
|
||||||
|
|
||||||
(defn create
|
(defn create
|
||||||
([realm schema-name obj]
|
([realm schema-name obj]
|
||||||
(create realm schema-name obj false))
|
(create realm schema-name obj false))
|
||||||
([realm schema-name obj update?]
|
([realm schema-name obj update?]
|
||||||
(.create realm (to-string schema-name) (clj->js obj) update?)))
|
(.create realm (to-string schema-name) (clj->js (prepare-for-transit obj)) update?)))
|
||||||
|
|
||||||
(defn save
|
(defn save
|
||||||
([realm schema-name obj]
|
([realm schema-name obj]
|
||||||
|
|
|
@ -1,9 +1,25 @@
|
||||||
(ns status-im.test.data-store.realm.core
|
(ns status-im.test.data-store.realm.core
|
||||||
(:require [cljs.test :refer-macros [deftest is]]
|
(:require [cljs.test :refer-macros [deftest is testing]]
|
||||||
[status-im.data-store.realm.core :as core]))
|
[status-im.data-store.realm.core :as core]))
|
||||||
|
|
||||||
(deftest serilization
|
(deftest serialization
|
||||||
(is (nil? (core/deserialize "")))
|
(is (nil? (core/deserialize "")))
|
||||||
(is (nil? (core/deserialize "giberrish")))
|
(is (nil? (core/deserialize "giberrish")))
|
||||||
(is (nil? (core/deserialize nil)))
|
(is (nil? (core/deserialize nil)))
|
||||||
(is (nil? (core/deserialize (core/serialize nil)))))
|
(is (nil? (core/deserialize (core/serialize nil)))))
|
||||||
|
|
||||||
|
(deftest transit-preparation
|
||||||
|
(testing "Check if leading Transit special characters are properly escaped with tildes"
|
||||||
|
(let [data {:to-be-escaped1 "~bad string"
|
||||||
|
:to-be-escaped2 "^another bad string"
|
||||||
|
:to-be-escaped3 "`and another bad string"
|
||||||
|
:no-escaping "no escaping"
|
||||||
|
:vector-content ["a" "b" "c"]}
|
||||||
|
prepared-data (core/prepare-for-transit data)]
|
||||||
|
(is (= "~~bad string" (:to-be-escaped1 prepared-data)))
|
||||||
|
(is (= "~^another bad string" (:to-be-escaped2 prepared-data)))
|
||||||
|
(is (= "~`and another bad string" (:to-be-escaped3 prepared-data)))
|
||||||
|
(is (= "no escaping" (:no-escaping prepared-data)))
|
||||||
|
(is (= data (-> prepared-data
|
||||||
|
clj->js
|
||||||
|
core/internal-convert))))))
|
||||||
|
|
Loading…
Reference in New Issue