refactor(encryption): use shadow.loader which works well with promises and does not need to resolve ns at compile time

Shadow.lazy does not work well with tests right now because the compiler can't find those modules
pull/1073/head
Kan-Ru Chen 2021-02-10 19:03:37 +09:00
parent 52d14546bd
commit 510d9cb3c5
1 changed files with 24 additions and 34 deletions

View File

@ -6,15 +6,9 @@
[frontend.state :as state] [frontend.state :as state]
[clojure.string :as str] [clojure.string :as str]
[cljs.reader :as reader] [cljs.reader :as reader]
[shadow.lazy :as lazy] [shadow.loader :as loader]
[lambdaisland.glogi :as log])) [lambdaisland.glogi :as log]))
(def lazy-keygen (lazy/loadable frontend.extensions.age-encryption/keygen))
(def lazy-encrypt-with-x25519 (lazy/loadable frontend.extensions.age-encryption/encrypt-with-x25519))
(def lazy-decrypt-with-x25519 (lazy/loadable frontend.extensions.age-encryption/decrypt-with-x25519))
(def lazy-encrypt-with-user-passphrase (lazy/loadable frontend.extensions.age-encryption/encrypt-with-user-passphrase))
(def lazy-decrypt-with-user-passphrase (lazy/loadable frontend.extensions.age-encryption/decrypt-with-user-passphrase))
(defonce age-pem-header-line "-----BEGIN AGE ENCRYPTED FILE-----") (defonce age-pem-header-line "-----BEGIN AGE ENCRYPTED FILE-----")
(defonce age-version-line "age-encryption.org/v1") (defonce age-version-line "age-encryption.org/v1")
@ -39,9 +33,9 @@
(defn generate-key-pair (defn generate-key-pair
[] []
(let [await (p/deferred)] (p/let [_ (loader/load :age-encryption)
(lazy/load lazy-keygen #(p/resolve! await)) lazy-keygen (resolve 'frontend.extensions.age-encryption/keygen)]
(p/then await #(@lazy-keygen)))) (lazy-keygen)))
(defn generate-key-pair-and-save! (defn generate-key-pair-and-save!
[repo-url] [repo-url]
@ -64,13 +58,12 @@
([repo-url content] ([repo-url content]
(cond (cond
(encrypted-db? repo-url) (encrypted-db? repo-url)
(let [await (p/deferred)] (p/let [_ (loader/load :age-encryption)
(lazy/load lazy-encrypt-with-x25519 #(p/resolve! await)) lazy-encrypt-with-x25519 (resolve 'frontend.extensions.age-encryption/encrypt-with-x25519)
(p/let [_ await content (utf8/encode content)
content (utf8/encode content) public-key (get-public-key repo-url)
public-key (get-public-key repo-url) encrypted (lazy-encrypt-with-x25519 public-key content true)]
encrypted (@lazy-encrypt-with-x25519 public-key content true)] (utf8/decode encrypted))
(utf8/decode encrypted)))
:else :else
(p/resolved content)))) (p/resolved content))))
@ -81,12 +74,11 @@
(cond (cond
(and (encrypted-db? repo-url) (and (encrypted-db? repo-url)
(content-encrypted? content)) (content-encrypted? content))
(let [content (utf8/encode content) (let [content (utf8/encode content)]
await (p/deferred)]
(lazy/load lazy-decrypt-with-x25519 #(p/resolve! await))
(if-let [secret-key (get-secret-key repo-url)] (if-let [secret-key (get-secret-key repo-url)]
(p/let [_ await (p/let [_ (loader/load :age-encryption)
decrypted (@lazy-decrypt-with-x25519 secret-key content)] lazy-decrypt-with-x25519 (resolve 'frontend.extensions.age-encryption/decrypt-with-x25519)
decrypted (lazy-decrypt-with-x25519 secret-key content)]
(utf8/decode decrypted)) (utf8/decode decrypted))
(log/error :encrypt/empty-secret-key (str "Can't find the secret key for repo: " repo-url)))) (log/error :encrypt/empty-secret-key (str "Can't find the secret key for repo: " repo-url))))
:else :else
@ -94,19 +86,17 @@
(defn encrypt-with-passphrase (defn encrypt-with-passphrase
[passphrase content] [passphrase content]
(let [await (p/deferred)] (p/let [_ (loader/load :age-encryption)
(lazy/load lazy-encrypt-with-user-passphrase #(p/resolve! await)) lazy-encrypt-with-user-passphrase (resolve 'frontend.extensions.age-encryption/encrypt-with-user-passphrase)
(p/let [_ await content (utf8/encode content)
content (utf8/encode content) encrypted (@lazy-encrypt-with-user-passphrase passphrase content true)]
encrypted (@lazy-encrypt-with-user-passphrase passphrase content true)] (utf8/decode encrypted)))
(utf8/decode encrypted))))
;; ;; TODO: What if decryption failed ;; ;; TODO: What if decryption failed
(defn decrypt-with-passphrase (defn decrypt-with-passphrase
[passphrase content] [passphrase content]
(let [await (p/deferred)] (p/let [_ (loader/load :age-encryption)
(lazy/load lazy-decrypt-with-user-passphrase #(p/resolve! await)) lazy-decrypt-with-user-passphrase (resolve 'frontend.extensions.age-encryption/decrypt-with-user-passphrase)
(p/let [_ await content (utf8/encode content)
content (utf8/encode content) decrypted (lazy-decrypt-with-user-passphrase passphrase content)]
decrypted (@lazy-decrypt-with-user-passphrase passphrase content)] (utf8/decode decrypted)))
(utf8/decode decrypted))))