Browse Source

feat(encryption): update to rage-wasm 0.2.0 and make encryption methods async

The size of rage-wasm 0.2.0 is significantly smaller and skill compatible with shadow-cljs
Kan-Ru Chen 4 years ago
parent
commit
217060d589

+ 1 - 1
package.json

@@ -56,7 +56,7 @@
         "cljs:build-electron": "clojure -A:cljs compile app electron"
     },
     "dependencies": {
-        "@kanru/rage-wasm": "^0.1.4",
+        "@kanru/rage-wasm": "^0.2.0",
         "chokidar": "^3.5.1",
         "codemirror": "^5.58.1",
         "diff": "5.0.0",

+ 8 - 6
src/main/frontend/components/encryption.cljs

@@ -1,5 +1,6 @@
 (ns frontend.components.encryption
   (:require [rum.core :as rum]
+            [promesa.core :as p]
             [frontend.encrypt :as e]
             [frontend.util :as util :refer-macros [profile]]
             [frontend.context.i18n :as i18n]
@@ -72,10 +73,10 @@
            :on-click (fn []
                        (let [value @password]
                          (when-not (string/blank? value)
-                           (when-let [keys (e/generate-key-pair-and-save! repo-url)]
-                             (let [db-encrypted-secret (e/encrypt-with-passphrase value keys)]
-                               (metadata-handler/set-db-encrypted-secret! db-encrypted-secret)))
-                           (close-fn true))))}
+                           (p/let [keys (e/generate-key-pair-and-save! repo-url)
+                                   db-encrypted-secret (e/encrypt-with-passphrase value keys)]
+                             (metadata-handler/set-db-encrypted-secret! db-encrypted-secret)
+                             (close-fn true)))))}
           "Submit"]]]])))
 
 (defn input-password
@@ -137,8 +138,9 @@
            :on-click (fn []
                        (let [value @secret]
                          (when-not (string/blank? value) ; TODO: length or other checks
-                           (let [repo (state/get-current-repo)]
-                             (e/save-key-pair! repo (e/decrypt-with-passphrase value db-encrypted-secret))
+                           (p/let [repo (state/get-current-repo)
+                                   keys (e/decrypt-with-passphrase value db-encrypted-secret)]
+                             (e/save-key-pair! repo keys)
                              (close-fn true)))))}
           "Submit"]]]])))
 

+ 14 - 11
src/main/frontend/encrypt.cljs

@@ -2,9 +2,12 @@
   (:require [frontend.utf8 :as utf8]
             [frontend.db.utils :as db-utils]
             [frontend.db :as db]
+            [promesa.core :as p]
             [frontend.state :as state]
             [clojure.string :as str]
             [cljs.reader :as reader]
+            ;; required for async npm module
+            ["regenerator-runtime/runtime"]
             ["@kanru/rage-wasm" :as rage]
             [lambdaisland.glogi :as log]))
 
@@ -37,7 +40,7 @@
 (defn generate-key-pair-and-save!
   [repo-url]
   (when-not (get-key-pair repo-url)
-    (let [keys (generate-key-pair)]
+    (p/let [keys (generate-key-pair)]
       (save-key-pair! repo-url keys)
       (pr-str keys))))
 
@@ -55,12 +58,12 @@
   ([repo-url content]
    (cond
      (encrypted-db? repo-url)
-     (let [content (utf8/encode content)
-           public-key (get-public-key repo-url)
-           encrypted (rage/encrypt_with_x25519 public-key content true)]
+     (p/let [content (utf8/encode content)
+             public-key (get-public-key repo-url)
+             encrypted (rage/encrypt_with_x25519 public-key content true)]
        (utf8/decode encrypted))
      :else
-     content)))
+     (p/resolved content))))
 
 (defn decrypt
   ([content]
@@ -71,21 +74,21 @@
           (content-encrypted? content))
      (let [content (utf8/encode content)]
        (if-let [secret-key (get-secret-key repo-url)]
-         (let [decrypted (rage/decrypt_with_x25519 secret-key content)]
+         (p/let [decrypted (rage/decrypt_with_x25519 secret-key content)]
            (utf8/decode decrypted))
          (log/error :encrypt/empty-secret-key (str "Can't find the secret key for repo: " repo-url))))
      :else
-     content)))
+     (p/resolved content))))
 
 (defn encrypt-with-passphrase
   [passphrase content]
-  (let [content (utf8/encode content)
-        encrypted (rage/encrypt_with_user_passphrase passphrase content true)]
+  (p/let [content (utf8/encode content)
+          encrypted (rage/encrypt_with_user_passphrase passphrase content true)]
     (utf8/decode encrypted)))
 
 ;; TODO: What if decryption failed
 (defn decrypt-with-passphrase
   [passphrase content]
-  (let [content (utf8/encode content)
-        decrypted (rage/decrypt_with_user_passphrase passphrase content)]
+  (p/let [content (utf8/encode content)
+          decrypted (rage/decrypt_with_user_passphrase passphrase content)]
     (utf8/decode decrypted)))

+ 3 - 3
src/main/frontend/fs.cljs

@@ -65,9 +65,9 @@
 (defn write-file!
   [repo dir path content opts]
   (when content
-    (let [metadata-or-css? (or (string/ends-with? path config/metadata-file)
-                               (string/ends-with? path config/custom-css-file))
-          content (if metadata-or-css? content (encrypt/encrypt content))]
+    (p/let [metadata-or-css? (or (string/ends-with? path config/metadata-file)
+                                 (string/ends-with? path config/custom-css-file))
+            content (if metadata-or-css? content (encrypt/encrypt content))]
       (->
        (do
          (protocol/write-file! (get-fs dir) repo dir path content opts)

+ 28 - 26
src/main/frontend/handler/repo.cljs

@@ -185,32 +185,34 @@
 
 (defn- parse-files-and-create-default-files!
   [repo-url files delete-files delete-blocks file-paths first-clone? db-encrypted? re-render? re-render-opts encrypted?]
-  (let [files (if encrypted? (map (fn [file]
-                                    (update file :file/content encrypt/decrypt))
-                                  files) files)
-        parsed-files (filter
-                      (fn [file]
-                        (let [format (format/get-format (:file/path file))]
-                          (contains? config/mldoc-support-formats format)))
-                      files)
-        blocks-pages (if (seq parsed-files)
-                       (extract-handler/extract-all-blocks-pages repo-url parsed-files)
-                       [])]
-    (reset-contents-and-blocks! repo-url files blocks-pages delete-files delete-blocks))
-  (let [config-file (config/get-config-path)]
-    (if (contains? (set file-paths) config-file)
-      (when-let [content (some #(when (= (:file/path %) config-file)
-                                  (:file/content %)) files)]
-        (file-handler/restore-config! repo-url content true))))
-  (if (and first-clone? (not db-encrypted?))
-    (state/set-modal!
-     (encryption/encryption-setup-dialog
-      repo-url
-      #(create-default-files! repo-url %)))
-    (create-default-files! repo-url db-encrypted?))
-  (when re-render?
-    (ui-handler/re-render-root! re-render-opts))
-  (state/set-importing-to-db! false))
+  (p/do!
+   (p/let [files (p/all (if encrypted? (map (fn [file]
+                                              (p/let [content (encrypt/decrypt (:file/content file))]
+                                                (assoc file :file/content content)))
+                                            files) files))
+           parsed-files (filter
+                         (fn [file]
+                           (let [format (format/get-format (:file/path file))]
+                             (contains? config/mldoc-support-formats format)))
+                         files)
+           blocks-pages (if (seq parsed-files)
+                          (extract-handler/extract-all-blocks-pages repo-url parsed-files)
+                          [])]
+     (reset-contents-and-blocks! repo-url files blocks-pages delete-files delete-blocks))
+   (let [config-file (config/get-config-path)]
+     (if (contains? (set file-paths) config-file)
+       (when-let [content (some #(when (= (:file/path %) config-file)
+                                   (:file/content %)) files)]
+         (file-handler/restore-config! repo-url content true))))
+   (if (and first-clone? (not db-encrypted?))
+     (state/set-modal!
+      (encryption/encryption-setup-dialog
+       repo-url
+       #(create-default-files! repo-url %)))
+     (create-default-files! repo-url db-encrypted?))
+   (when re-render?
+     (ui-handler/re-render-root! re-render-opts))
+   (state/set-importing-to-db! false)))
 
 (defn parse-files-and-load-to-db!
   [repo-url files {:keys [first-clone? delete-files delete-blocks re-render? re-render-opts] :as opts

+ 6 - 4
src/main/frontend/handler/web/nfs.cljs

@@ -145,8 +145,9 @@
        (-> (p/all (map (fn [file]
                          (p/let [content (if nfs?
                                            (.text (:file/file file))
-                                           (:file/content file))]
-                           (assoc file :file/content (encrypt/decrypt content)))) markup-files))
+                                           (:file/content file))
+                                 content (encrypt/decrypt content)]
+                           (assoc file :file/content content))) markup-files))
            (p/then (fn [result]
                      (let [files (map #(dissoc % :file/file) result)]
                        (repo-handler/start-repo-db-if-not-exists! repo {:db-type :local-native-fs})
@@ -240,8 +241,9 @@
                       (when-let [file (get-file-f path new-files)]
                         (p/let [content (if nfs?
                                           (.text (:file/file file))
-                                          (:file/content file))]
-                          (assoc file :file/content (encrypt/decrypt content))))) added-or-modified))
+                                          (:file/content file))
+                                content (encrypt/decrypt content)]
+                          (assoc file :file/content content)))) added-or-modified))
         (p/then (fn [result]
                   (let [files (map #(dissoc % :file/file :file/handle) result)
                         non-modified? (fn [file]

+ 4 - 4
yarn.lock

@@ -206,10 +206,10 @@
   dependencies:
     purgecss "^3.1.3"
 
-"@kanru/rage-wasm@^0.1.4":
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/@kanru/rage-wasm/-/rage-wasm-0.1.4.tgz#76bc29b319a60acd4600ee9d4f4e340aa152fc3c"
-  integrity sha512-jl3V0Mrb8/Yzk+O4rjIbHz3mWQFWA4MO79OxkqWxHls/qW+wJMIbfb08ci1BkiDKu91rxKUF9XIjyl9UQ4ArrA==
+"@kanru/rage-wasm@^0.2.0":
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/@kanru/rage-wasm/-/rage-wasm-0.2.0.tgz#34f776ca1e24302b954e0c151472e117005b2a9f"
+  integrity sha512-wRTM5TJJ02AqAbiHbjMLXo/aV0q+vu91miJHSd2+piq6uWyt02Epg3CafsQNP6mLSArZL6zl1xBYsreaU+Sr0g==
 
 "@nodelib/[email protected]":
   version "2.1.4"