Skip to content

Commit

Permalink
Replace keycard flows with new interaction
Browse files Browse the repository at this point in the history
  • Loading branch information
Ferossgp committed Feb 25, 2020
1 parent 9b227b9 commit bbbafa6
Show file tree
Hide file tree
Showing 20 changed files with 390 additions and 416 deletions.
5 changes: 0 additions & 5 deletions src/status_im/hardwallet/card.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,6 @@
platform/android?)
(.addListener event-emitter "keyCardOnDisconnected" callback)))

(defn register-card-events []
(remove-event-listeners)
(on-card-connected #(re-frame/dispatch [:hardwallet.callback/on-card-connected %]))
(on-card-disconnected #(re-frame/dispatch [:hardwallet.callback/on-card-disconnected %])))

(defn get-application-info [{:keys [pairing on-success]}]
(log/debug "[keycard] get-application-info")
(.. keycard
Expand Down
47 changes: 27 additions & 20 deletions src/status_im/hardwallet/change_pin.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
(:require [status-im.i18n :as i18n]
[status-im.ui.screens.navigation :as navigation]
[status-im.hardwallet.onboarding :as onboarding]
[status-im.multiaccounts.logout.core :as multiaccounts.logout]
[status-im.utils.fx :as fx]
[taoensso.timbre :as log]
[status-im.hardwallet.common :as common]))
Expand Down Expand Up @@ -33,13 +32,23 @@
(assoc-in [:hardwallet :pin :status] nil))}
(navigation/navigate-to-cofx :enter-pin-settings nil)))

(fx/defn discard-pin-change
{:events [::on-cancel]}
[{:keys [db] :as cofx}]
(fx/merge cofx
(common/clear-pin)
(common/hide-pair-sheet)
(if (get-in db [:hardwallet :pin :puk-restore?])
(navigation/navigate-to-cofx :multiaccounts nil)
(navigation/navigate-to-cofx :keycard-settings nil))))

(fx/defn change-pin
{:events [:hardwallet/change-pin]}
[{:keys [db] :as cofx}]
(let [pairing (common/get-pairing db)
new-pin (common/vector->string (get-in db [:hardwallet :pin :original]))
current-pin (common/vector->string (get-in db [:hardwallet :pin :current]))
setup-step (get-in db [:hardwallet :setup-step])
(let [pairing (common/get-pairing db)
new-pin (common/vector->string (get-in db [:hardwallet :pin :original]))
current-pin (common/vector->string (get-in db [:hardwallet :pin :current]))
setup-step (get-in db [:hardwallet :setup-step])
card-connected? (get-in db [:hardwallet :card-connected?])]
(if (= setup-step :pin)
(onboarding/load-preparing-screen cofx)
Expand All @@ -51,40 +60,38 @@
:pairing pairing}})
(fx/merge cofx
(common/set-on-card-connected :hardwallet/change-pin)
(navigation/navigate-to-cofx :hardwallet-connect nil))))))
(common/show-pair-sheet {:on-cancel [::on-cancel]}))))))

(fx/defn on-change-pin-success
{:events [:hardwallet.callback/on-change-pin-success]}
[{:keys [db] :as cofx}]
(let [pin (get-in db [:hardwallet :pin :original])]
(let [pin (get-in db [:hardwallet :pin :original])
puk-restore? (get-in db [:hardwallet :pin :puk-restore?])]
(fx/merge cofx
{:db (assoc-in db [:hardwallet :pin] {:status nil
:login pin
:confirmation []
:error-label nil})
:utils/show-popup {:title ""
:content (i18n/label :t/pin-changed)}}
(common/clear-on-card-connected)
(when (:multiaccounts/login db)
(navigation/navigate-to-cofx :keycard-login-pin nil))
(common/hide-pair-sheet)
(if puk-restore?
(navigation/navigate-to-cofx :multiaccounts nil)
(navigation/navigate-to-cofx :keycard-settings nil))
(when (:multiaccounts/login db)
(common/get-keys-from-keycard))
(when (:multiaccount/multiaccount db)
(multiaccounts.logout/logout)))))
(common/get-keys-from-keycard)))))

(fx/defn on-change-pin-error
{:events [:hardwallet.callback/on-change-pin-error]}
[{:keys [db] :as cofx} error]
(log/debug "[hardwallet] change pin error" error)
(let [tag-was-lost? (= "Tag was lost." (:error error))]
(let [tag-was-lost? (= "Tag was lost." (:error error))
pairing (common/get-pairing db)]
(fx/merge cofx
(if tag-was-lost?
(fx/merge cofx
{:db (assoc-in db [:hardwallet :pin :status] nil)
:utils/show-popup {:title (i18n/label :t/error)
:content (i18n/label :t/cannot-read-card)}}
(common/set-on-card-connected :hardwallet/change-pin)
(navigation/navigate-to-cofx :hardwallet-connect nil))
{:db (assoc-in db [:hardwallet :pin :status] nil)}
(common/set-on-card-connected :hardwallet/change-pin))
(if (re-matches common/pin-mismatch-error (:error error))
(fx/merge cofx
{:db (update-in db [:hardwallet :pin] merge {:status :error
Expand All @@ -96,5 +103,5 @@
:sign []
:error-label :t/pin-mismatch})}
(navigation/navigate-to-cofx :enter-pin-settings nil)
(common/get-application-info (common/get-pairing db) nil))
(common/get-application-info pairing nil))
(common/show-wrong-keycard-alert true))))))
150 changes: 69 additions & 81 deletions src/status_im/hardwallet/common.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
(zero? free-pairing-slots))
:no-pairing-slots))

(defn- tag-lost? [error]
(defn tag-lost? [error]
(= error "Tag was lost."))

(defn find-multiaccount-by-keycard-instance-uid
Expand Down Expand Up @@ -233,7 +233,7 @@
:content (i18n/label :t/wrong-card-text)}}))

(fx/defn unauthorized-operation
[{:keys [db] :as cofx}]
[cofx]
(fx/merge cofx
{:utils/show-popup {:title ""
:content (i18n/label :t/keycard-unauthorized-operation)}}
Expand All @@ -243,9 +243,11 @@
(fx/defn navigate-to-enter-pin-screen
{:events [:hardwallet/navigate-to-enter-pin-screen]}
[{:keys [db] :as cofx}]
(let [key-uid (get-in db [:hardwallet :application-info :key-uid])
multiaccount-key-uid (get-in db [:multiaccount :key-uid])
(let [key-uid (get-in db [:hardwallet :application-info :key-uid])
multiaccount-key-uid (get-in db [:multiaccount :key-uid])
keycard-multiaccount? (boolean (get-in db [:multiaccount :keycard-pairing]))]
;; TODO: WHY we check key-uid? If last oepration was with wrong card
;; it does not mean that now we do not want to do it with the right one
(if (or (nil? keycard-multiaccount?)
(and key-uid
(= key-uid multiaccount-key-uid)))
Expand All @@ -267,7 +269,7 @@
[{:keys [db]}]
(let [key-uid (get-in db [:multiaccounts/login :key-uid])
pairing (get-in db [:multiaccounts/multiaccounts key-uid :keycard-pairing])
pin (string/join (get-in db [:hardwallet :pin :login]))]
pin (string/join (get-in db [:hardwallet :pin :login]))]
(when (and pairing
(seq pin))
{:db (assoc-in db [:hardwallet :pin :status] :verifying)
Expand All @@ -277,69 +279,66 @@
(fx/defn on-get-keys-success
{:events [:hardwallet.callback/on-get-keys-success]}
[{:keys [db] :as cofx} data]
(let [{:keys [key-uid encryption-public-key whisper-private-key] :as account-data} (js->clj data :keywordize-keys true)
(let [{:keys [key-uid encryption-public-key whisper-private-key]
:as account-data} (js->clj data :keywordize-keys true)
{:keys [photo-path name]} (get-in db [:multiaccounts/multiaccounts key-uid])
key-uid (get-in db [:hardwallet :application-info :key-uid])
multiaccount-data (types/clj->json {:name name
:key-uid key-uid
:photo-path photo-path})
save-keys? (get-in db [:multiaccounts/login :save-password?])]
(fx/merge
cofx
{:db
(-> db
(assoc-in [:hardwallet :pin :status] nil)
(assoc-in [:hardwallet :pin :login] [])
(assoc-in [:hardwallet :multiaccount]
(update account-data :whisper-public-key ethereum/normalized-hex))
(assoc-in [:hardwallet :flow] nil)
(update :multiaccounts/login assoc
:password encryption-public-key
:key-uid key-uid
:photo-path photo-path
:name name))

:hardwallet/get-application-info {:pairing (get-pairing db key-uid)}
:hardwallet/login-with-keycard {:multiaccount-data multiaccount-data
:password encryption-public-key
:chat-key whisper-private-key}}
(when save-keys?
(keychain/save-hardwallet-keys key-uid encryption-public-key whisper-private-key))
(clear-on-card-connected)
(clear-on-card-read))))
key-uid (get-in db [:hardwallet :application-info :key-uid])
multiaccount-data (types/clj->json {:name name
:key-uid key-uid
:photo-path photo-path})
save-keys? (get-in db [:multiaccounts/login :save-password?])]
(fx/merge cofx
{:db
(-> db
(assoc-in [:hardwallet :pin :status] nil)
(assoc-in [:hardwallet :pin :login] [])
(assoc-in [:hardwallet :multiaccount]
(update account-data :whisper-public-key ethereum/normalized-hex))
(assoc-in [:hardwallet :flow] nil)
(update :multiaccounts/login assoc
:password encryption-public-key
:key-uid key-uid
:photo-path photo-path
:name name))

:hardwallet/get-application-info {:pairing (get-pairing db key-uid)}
:hardwallet/login-with-keycard {:multiaccount-data multiaccount-data
:password encryption-public-key
:chat-key whisper-private-key}}
(when save-keys?
(keychain/save-hardwallet-keys key-uid encryption-public-key whisper-private-key))
(clear-on-card-connected)
(clear-on-card-read)
(hide-pair-sheet))))

(fx/defn on-get-keys-error
{:events [:hardwallet.callback/on-get-keys-error]}
[{:keys [db] :as cofx} error]
(log/debug "[hardwallet] get keys error: " error)
(let [tag-was-lost? (= "Tag was lost." (:error error))
key-uid (get-in db [:hardwallet :application-info :key-uid])
flow (get-in db [:hardwallet :flow])]
(let [tag-was-lost? (tag-lost? (:error error))
key-uid (get-in db [:hardwallet :application-info :key-uid])
flow (get-in db [:hardwallet :flow])]
(if tag-was-lost?
(fx/merge cofx
{:db (assoc-in db [:hardwallet :pin :status] nil)}
(navigation/navigate-to-cofx :keycard-connection-lost nil))
{:db (assoc-in db [:hardwallet :pin :status] nil)}
(if (re-matches pin-mismatch-error (:error error))
(fx/merge cofx
{:hardwallet/get-application-info {:pairing (get-pairing db key-uid)}
:db (update-in db [:hardwallet :pin] merge {:status :error
:login []
:import-multiaccount []
:error-label :t/pin-mismatch})}
(if (= flow :import)
(navigation/navigate-to-cofx :keycard-recovery-pin nil)
(navigation/navigate-to-cofx :keycard-login-pin nil)))
(hide-pair-sheet)
(when (= flow :import)
(navigation/navigate-to-cofx :keycard-recovery-pin nil)))
(show-wrong-keycard-alert true)))))

;; Get application info

(fx/defn get-application-info
{:events [:hardwallet/get-application-info]}
[{:keys [db]} pairing on-card-read]
(let [key-uid (get-in db [:hardwallet :application-info :key-uid])
pairing' (or pairing
(when key-uid
(get-pairing db key-uid)))]
(let [key-uid (get-in db [:hardwallet :application-info :key-uid])
pairing' (or pairing (some->> key-uid (get-pairing db)))]
{:hardwallet/get-application-info {:pairing pairing'
:on-success on-card-read}}))

Expand All @@ -351,16 +350,13 @@
(update :key-uid ethereum/normalized-hex))
{:keys [pin-retry-counter puk-retry-counter]} info'
view-id (:view-id db)
connect-screen? (contains? #{:hardwallet-connect
:hardwallet-connect-sign
:hardwallet-connect-settings} view-id)

{:keys [on-card-read]} (:hardwallet db)
on-success' (or on-success on-card-read)
enter-step (if (zero? pin-retry-counter)
:puk
(get-in db [:hardwallet :pin :enter-step]))]
(log/debug "[hardwallet] on-get-application-info-success"
"connect-screen?" connect-screen?
"on-success" on-success')
(fx/merge cofx
{:db (-> db
Expand All @@ -382,39 +378,36 @@
{:events [:hardwallet.callback/on-get-application-info-error]}
[{:keys [db] :as cofx} error]
(log/debug "[hardwallet] application info error " error)
(let [on-card-read (get-in db [:hardwallet :on-card-read])
on-card-connected (get-in db [:hardwallet :on-card-connected])
connect-screen? (= (:view-id db) :hardwallet-connect)
login? (= on-card-read :hardwallet/login-with-keycard)
tag-was-lost? (= "Tag was lost." (:error error))]
(if tag-was-lost?
(navigation/navigate-to-cofx cofx :keycard-connection-lost nil)
(let [on-card-read (get-in db [:hardwallet :on-card-read])
on-card-connected (get-in db [:hardwallet :on-card-conncted])
login? (= on-card-read :hardwallet/login-with-keycard)
tag-was-lost? (tag-lost? (:error error))]
(when-not tag-was-lost?
(if login?
(fx/merge cofx
(clear-on-card-read)
(navigation/navigate-to-cofx :not-keycard nil))
(fx/merge cofx
{:db (assoc-in db [:hardwallet :application-info-error] error)}

(when (= on-card-connected :hardwallet/prepare-to-sign)
(show-wrong-keycard-alert true))
(when-not connect-screen?
(clear-on-card-read))

(when on-card-read
(dispatch-event on-card-read)))))))

(fx/defn on-card-connected
{:events [:hardwallet.callback/on-card-connected]}
{:events [::on-card-connected]}
[{:keys [db] :as cofx} _]
(log/debug "[hardwallet] card connected")
(let [instance-uid (get-in db [:hardwallet :application-info :instance-uid])
key-uid (get-in db [:hardwallet :application-info :key-uid])
accounts-screen? (= :multiaccounts (:view-id db))
(let [instance-uid (get-in db [:hardwallet :application-info :instance-uid])
key-uid (get-in db [:hardwallet :application-info :key-uid])
should-read-instance-uid? (nil? instance-uid)
on-card-connected (get-in db [:hardwallet :on-card-connected])
on-card-read (cond
should-read-instance-uid? :hardwallet/get-application-info
:else (get-in db [:hardwallet :on-card-read]))
pairing (get-pairing db key-uid)]
on-card-connected (get-in db [:hardwallet :on-card-connected])
on-card-read (cond
should-read-instance-uid? :hardwallet/get-application-info
:else (get-in db [:hardwallet :on-card-read]))
pairing (get-pairing db key-uid)]
(log/debug "[hardwallet] on-card-connected"
"on-card-connected" on-card-connected
"on-card-read" on-card-read)
Expand All @@ -430,17 +423,12 @@
(get-application-info pairing on-card-read)))))

(fx/defn on-card-disconnected
{:events [:hardwallet.callback/on-card-disconnected]}
{:events [::on-card-disconnected]}
[{:keys [db] :as cofx} _]
(log/debug "[hardwallet] card disconnected ")
(let [setup-running? (get-in db [:hardwallet :setup-step])
on-card-connected (get-in db [:hardwallet :on-card-connected])]
(fx/merge cofx
{:db (-> db
(assoc-in [:hardwallet :card-connected?] false)
(assoc-in [:hardwallet :card-read-in-progress?] false))}
(restore-on-card-connected)
(restore-on-card-read)
(when (and setup-running?
on-card-connected)
(navigation/navigate-to-cofx :keycard-connection-lost-setup nil)))))
(fx/merge cofx
{:db (-> db
(assoc-in [:hardwallet :card-connected?] false)
(assoc-in [:hardwallet :card-read-in-progress?] false))}
(restore-on-card-connected)
(restore-on-card-read)))
Loading

0 comments on commit bbbafa6

Please sign in to comment.