fix(sync): tolerate legacy plaintext decrypt values

This commit is contained in:
Tienson Qin
2026-04-07 17:12:48 +08:00
parent f654bdee9b
commit 5d883bb3fd
2 changed files with 29 additions and 4 deletions

View File

@@ -27,6 +27,13 @@
(def ^:private invalid-coerce ::invalid-coerce)
(def ^:private invalid-transit ::invalid-transit)
(defn- read-transit-safe
[value]
(try
(ldb/read-transit-str value)
(catch :default _
invalid-transit)))
(defn- native-worker?
[]
native-env?)
@@ -504,12 +511,17 @@
(defn <decrypt-text-value
[aes-key value]
(assert (string? value) (str "encrypted value should be a string, value: " value))
(let [decoded (ldb/read-transit-str value)]
(let [decoded (read-transit-safe value)]
(if (= decoded invalid-transit)
(p/resolved value)
(p/let [value (crypt/<decrypt-text-if-encrypted aes-key decoded)
value' (ldb/read-transit-str value)]
value'))))
(p/let [value (or (crypt/<decrypt-text-if-encrypted aes-key decoded)
decoded)
value' (if (string? value)
(read-transit-safe value)
value)]
(if (= value' invalid-transit)
value
value')))))
(defn- encrypt-tx-item
[aes-key item]

View File

@@ -115,3 +115,16 @@
(is (= "decrypt-aes-key" (ex-message e)))
(is (zero? @clear-user-rsa-cache-calls*))
(done)))))))
(deftest decrypt-text-value-legacy-plaintext-test
(async done
(-> (p/let [aes-key (crypt/<generate-aes-key)
plaintext "$$$favorites"
encrypted (crypt/<encrypt-uint8array aes-key (.encode (js/TextEncoder.) plaintext))
encrypted-str (ldb/write-transit-str encrypted)
decrypted (sync-crypt/<decrypt-text-value aes-key encrypted-str)]
(is (= plaintext decrypted))
(done))
(p/catch (fn [e]
(is false (str e))
(done))))))