Просмотр исходного кода

enhance(sync): persist encrypted pwd in local-storage

rcmerci 3 лет назад
Родитель
Сommit
180303ce78
2 измененных файлов с 23 добавлено и 24 удалено
  1. 1 1
      src/main/frontend/components/encryption.cljs
  2. 22 23
      src/main/frontend/fs/sync.cljs

+ 1 - 1
src/main/frontend/components/encryption.cljs

@@ -113,7 +113,7 @@
 
 
                            (:create-pwd-remote :input-pwd-remote)
                            (:create-pwd-remote :input-pwd-remote)
                            (a/go
                            (a/go
-                             (let [persist-r (a/<! (sync/encrypt+persist-pwd! @password GraphUUID repo))]
+                             (let [persist-r (a/<! (sync/encrypt+persist-pwd! @password GraphUUID))]
                                (if (instance? ExceptionInfo persist-r)
                                (if (instance? ExceptionInfo persist-r)
                                  (js/console.error persist-r)
                                  (js/console.error persist-r)
                                  (notification/show! (str "Successfully set the password for graph: " GraphName) :success)))
                                  (notification/show! (str "Successfully set the password for graph: " GraphName) :success)))

+ 22 - 23
src/main/frontend/fs/sync.cljs

@@ -49,6 +49,7 @@
 ;; - local->remote-full-sync will be triggered after 20min of idle
 ;; - local->remote-full-sync will be triggered after 20min of idle
 ;; - every 20s, flush local changes, and sync to remote
 ;; - every 20s, flush local changes, and sync to remote
 
 
+;; TODO: when remote->local-full-sync, download latest journals first, then pages and so on
 ;; TODO: use access-token instead of id-token
 ;; TODO: use access-token instead of id-token
 ;; TODO: a remote delete-diff cause local related-file deleted, then trigger a `FileChangeEvent`,
 ;; TODO: a remote delete-diff cause local related-file deleted, then trigger a `FileChangeEvent`,
 ;;       and re-produce a new same-file-delete diff.
 ;;       and re-produce a new same-file-delete diff.
@@ -966,23 +967,22 @@
     (let [r (<! (p->c (encrypt/decrypt-with-passphrase key* encrypted-content)))]
     (let [r (<! (p->c (encrypt/decrypt-with-passphrase key* encrypted-content)))]
       (when-not (instance? ExceptionInfo r) r))))
       (when-not (instance? ExceptionInfo r) r))))
 
 
+(defn- local-storage-pwd-path
+  [graph-uuid]
+  (str "encrypted-pwd/" graph-uuid))
+
 (defn- persist-pwd!
 (defn- persist-pwd!
-  [pwd repo]
-  (go
-    (let [path (config/get-file-path repo (str config/app-name "/encrypted-password.txt"))
-          repo-dir (config/get-repo-dir repo)]
-      (<! (p->c (fs/mkdir-if-not-exists (str repo-dir "/" config/app-name))))
-      (<! (p->c (fs/write-file! repo repo-dir path pwd {:skip-compare? true}))))))
+  [pwd graph-uuid]
+  (js/localStorage.setItem (local-storage-pwd-path graph-uuid) pwd))
 
 
-(defn- remove-pwd-txt!
-  [repo]
-  (let [path (config/get-file-path repo (str config/app-name "/encrypted-password.txt"))]
-    (p->c (fs/unlink! repo path nil))))
+(defn- remove-pwd!
+  [graph-uuid]
+  (js/localStorage.removeItem (local-storage-pwd-path graph-uuid)))
 
 
 (defn encrypt+persist-pwd!
 (defn encrypt+persist-pwd!
   "- store pwd in `pwd-map`
   "- store pwd in `pwd-map`
-  - persist encrypted pwd at 'logseq/encrypted-password.txt'"
-  [pwd graph-uuid repo]
+  - persist encrypted pwd at local-storage"
+  [pwd graph-uuid]
   (go
   (go
     (let [[value expired-at gone?]
     (let [[value expired-at gone?]
           ((juxt :value :expired-at #(-> % ex-data :err :status (= 410)))
           ((juxt :value :expired-at #(-> % ex-data :err :status (= 410)))
@@ -992,14 +992,14 @@
             ((juxt :value :expired-at) (<! (create-graph-salt remoteapi graph-uuid)))
             ((juxt :value :expired-at) (<! (create-graph-salt remoteapi graph-uuid)))
             [value expired-at])
             [value expired-at])
           encrypted-pwd (<! (encrypt-content pwd salt-value))]
           encrypted-pwd (<! (encrypt-content pwd salt-value))]
-      (<! (persist-pwd! encrypted-pwd repo)))))
+      (persist-pwd! encrypted-pwd graph-uuid))))
 
 
 (defn restore-pwd!
 (defn restore-pwd!
   "restore pwd from persisted encrypted-pwd, update `pwd-map`"
   "restore pwd from persisted encrypted-pwd, update `pwd-map`"
-  [repo graph-uuid]
+  [graph-uuid]
   (go
   (go
-    (let [encrypted-pwd (<! (p->c (fs/read-file "" (config/get-file-path repo "logseq/encrypted-password.txt"))))]
-      (if (or (nil? encrypted-pwd) (instance? ExceptionInfo encrypted-pwd))
+    (let [encrypted-pwd (js/localStorage.getItem (local-storage-pwd-path graph-uuid))]
+      (if (nil? encrypted-pwd)
         {:restore-pwd-failed true}
         {:restore-pwd-failed true}
         (let [[salt-value _expired-at gone?]
         (let [[salt-value _expired-at gone?]
               ((juxt :value :expired-at #(-> % ex-data :err :status (= 410)))
               ((juxt :value :expired-at #(-> % ex-data :err :status (= 410)))
@@ -1017,10 +1017,10 @@
     (let [pwd (get-in @pwd-map [graph-uuid :pwd])]
     (let [pwd (get-in @pwd-map [graph-uuid :pwd])]
       (when (nil? pwd)
       (when (nil? pwd)
         (let [{restore-pwd-failed :restore-pwd-failed}
         (let [{restore-pwd-failed :restore-pwd-failed}
-              (<! (restore-pwd! repo graph-uuid))]
+              (<! (restore-pwd! graph-uuid))]
           (when restore-pwd-failed
           (when restore-pwd-failed
             (state/pub-event! [:modal/remote-encryption-input-pw-dialog repo {:GraphUUID graph-uuid} :input-pwd-remote
             (state/pub-event! [:modal/remote-encryption-input-pw-dialog repo {:GraphUUID graph-uuid} :input-pwd-remote
-                               #(restore-pwd! repo graph-uuid)])))
+                               #(restore-pwd! graph-uuid)])))
         (loop []
         (loop []
           (<! pwd-map-changed-chan)
           (<! pwd-map-changed-chan)
           (let [pwd (get-in @pwd-map [graph-uuid :pwd])]
           (let [pwd (get-in @pwd-map [graph-uuid :pwd])]
@@ -1029,10 +1029,10 @@
 
 
 (defn clear-pwd!
 (defn clear-pwd!
   "- clear pwd in `pwd-map`
   "- clear pwd in `pwd-map`
-  - remove logseq/encrypted-password.txt"
-  [repo graph-uuid]
+  - remove encrypted-pwd in local-storage"
+  [graph-uuid]
   (swap! pwd-map dissoc graph-uuid)
   (swap! pwd-map dissoc graph-uuid)
-  (remove-pwd-txt! repo))
+  (remove-pwd! graph-uuid))
 
 
 (defn ensure-pwd+keys-exists!
 (defn ensure-pwd+keys-exists!
   "ensure password persisted,
   "ensure password persisted,
@@ -1071,7 +1071,7 @@
 
 
             ;; bad pwd
             ;; bad pwd
             (do (notification/show! "wrong password" :error false)
             (do (notification/show! "wrong password" :error false)
-                (<! (clear-pwd! repo graph-uuid))
+                (clear-pwd! graph-uuid)
                 ::need-password)))))))
                 ::need-password)))))))
 
 
 ;;; ### sync state
 ;;; ### sync state
@@ -1314,7 +1314,6 @@
     (get-ignore-files [_] #{#"logseq/graphs-txid.edn$"
     (get-ignore-files [_] #{#"logseq/graphs-txid.edn$"
                             #"logseq/bak/.*"
                             #"logseq/bak/.*"
                             #"logseq/version-files/.*"
                             #"logseq/version-files/.*"
-                            #"logseq/encrypted-password.txt$"
                             #"logseq/\.recycle/.*"
                             #"logseq/\.recycle/.*"
                             #"\.DS_Store$"})
                             #"\.DS_Store$"})
     (get-monitored-dirs [_] #{#"^assets/" #"^journals/" #"^logseq/" #"^pages/"})
     (get-monitored-dirs [_] #{#"^assets/" #"^journals/" #"^logseq/" #"^pages/"})