Fixed encrypted object key

pull/645/head
Tienson Qin 2020-05-29 10:11:24 +08:00
parent 093439d69e
commit 6141d66182
2 changed files with 42 additions and 36 deletions

View File

@ -47,28 +47,32 @@
key)]
(gobj/get key "k")))
(defn get-key-from-object-key
[object-key]
(js/window.crypto.subtle.importKey
"jwk"
(bean/->js
{:k object-key
:alg "A128GCM"
:ext true
:key_ops ["encrypt" "decrypt"]
:kty "oct"})
(bean/->js {:name "AES-GCM"
:length 128})
false
(bean/->js ["encrypt" "decrypt"])))
(defn decrypt
[object-key encrypted]
;; Build the key using object-key and decrypt the content
(let [encrypted (str->array-buffer encrypted)]
(p/let [key (js/window.crypto.subtle.importKey
"jwk"
(bean/->js
{:k object-key
:alg "A128GCM"
:ext true
:key_ops ["encrypt" "decrypt"]
:kty "oct"})
(bean/->js {:name "AES-GCM"
:length 128})
false
(bean/->js ["decrypt"]))
decrypted (js/window.crypto.subtle.decrypt
(bean/->js
{:name "AES-GCM"
:iv (js/Uint8Array. 12)})
key
encrypted)
decoded (.decode (js/window.TextDecoder.)
(js/Uint8Array. decrypted))]
(js/JSON.parse decoded))))
(p/let [key (get-key-from-object-key object-key)
decrypted (js/window.crypto.subtle.decrypt
(bean/->js
{:name "AES-GCM"
:iv (js/Uint8Array. 12)})
key
encrypted)
decoded (.decode (js/window.TextDecoder.)
(js/Uint8Array. decrypted))]
(js/JSON.parse decoded))))

View File

@ -1105,19 +1105,21 @@
(defn set-github-token!
[token]
(state/set-github-token! token)
(p/let [key (encrypt/generate-key)
encrypted (encrypt/encrypt key token)
base64-key (encrypt/base64-key key)]
(state/set-encrypt-token! encrypted)
(util/post (str config/api "encrypt_object_key")
{:object-key base64-key}
(fn []
;; refresh the browser
;; (set! (.-href js/window.location) "/")
(let [me (:me @state/state)]
(when (:repos me)
(clone-and-pull-repos me))))
(fn [_e]))))
(let [object-key (get-in @state/state [:me :encrypt_object_key])]
(p/let [key (if object-key
(encrypt/get-key-from-object-key object-key)
(encrypt/generate-key))
encrypted (encrypt/encrypt key token)
object-key (or object-key
(encrypt/base64-key key))]
(state/set-encrypt-token! encrypted)
(util/post (str config/api "encrypt_object_key")
{:object-key object-key}
(fn []
(let [me (:me @state/state)]
(when (:repos me)
(clone-and-pull-repos me))))
(fn [_e])))))
(defn start!
[render]
@ -1129,10 +1131,10 @@
(when me (set-state-kv! :me me))
(render)
(when me
(when-let [base64-key (:encrypt_object_key me)]
(when-let [object-key (:encrypt_object_key me)]
(when-let [encrypted-token (state/get-encrypted-token)]
(->
(p/let [token (encrypt/decrypt base64-key encrypted-token)]
(p/let [token (encrypt/decrypt object-key encrypted-token)]
;; FIXME: Sometimes it has spaces in the front
(let [token (string/trim token)]
(state/set-github-token! token)