[#10243] Handle wrong pin on keycard account creation
This commit is contained in:
parent
f1e83158d9
commit
45b296a2c5
|
@ -464,3 +464,23 @@
|
|||
|
||||
(defn keycard-multiaccount? [db]
|
||||
(boolean (get-in db [:multiaccount :keycard-pairing])))
|
||||
|
||||
(fx/defn verify-pin
|
||||
{:events [:hardwallet/verify-pin]}
|
||||
[{:keys [db] :as cofx} {:keys [pin-step on-card-connected on-failure on-success]}]
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (update-in db [:hardwallet :pin] assoc
|
||||
:on-verified on-success
|
||||
:on-verified-failure on-failure)}
|
||||
(show-connection-sheet
|
||||
{:on-card-connected (or on-card-connected :hardwallet/verify-pin)
|
||||
:handler
|
||||
(fn [{:keys [db] :as cofx}]
|
||||
(let [pin (vector->string (get-in db [:hardwallet :pin pin-step]))
|
||||
pairing (get-pairing db)]
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (assoc-in db [:hardwallet :pin :status] :verifying)
|
||||
:hardwallet/verify-pin {:pin pin
|
||||
:pairing pairing}})))})))
|
||||
|
|
|
@ -156,10 +156,10 @@
|
|||
:puk []})}
|
||||
(common/hide-connection-sheet)))))
|
||||
|
||||
(fx/defn dispatch-on-verified-event
|
||||
[{:keys [db]} event]
|
||||
{:dispatch [event]
|
||||
:db (assoc-in db [:hardwallet :pin :on-verified] nil)})
|
||||
(fx/defn clear-on-verify-handlers
|
||||
[{:keys [db]}]
|
||||
{:db (update-in db [:hardwallet :pin]
|
||||
dissoc :on-verified-failure :on-verified)})
|
||||
|
||||
(fx/defn on-verify-pin-success
|
||||
{:events [:hardwallet.callback/on-verify-pin-success]}
|
||||
|
@ -181,55 +181,51 @@
|
|||
:hardwallet/generate-and-load-key
|
||||
:hardwallet/remove-key-with-unpair
|
||||
:hardwallet/unpair-and-delete
|
||||
:hardwallet/generate-mnemonic} on-verified)
|
||||
:hardwallet/generate-mnemonic
|
||||
:wallet.accounts/generate-new-keycard-account} on-verified)
|
||||
(common/get-application-info pairing nil))
|
||||
(when on-verified
|
||||
(dispatch-on-verified-event on-verified)))))
|
||||
(common/dispatch-event on-verified))
|
||||
(clear-on-verify-handlers))))
|
||||
|
||||
(fx/defn on-verify-pin-error
|
||||
{:events [:hardwallet.callback/on-verify-pin-error]}
|
||||
[{:keys [db] :as cofx} error]
|
||||
(let [tag-was-lost? (common/tag-lost? (:error error))
|
||||
setup? (boolean (get-in db [:hardwallet :setup-step]))
|
||||
exporting? (get-in db [:hardwallet :on-export-success])]
|
||||
(let [tag-was-lost? (common/tag-lost? (:error error))
|
||||
setup? (boolean (get-in db [:hardwallet :setup-step]))
|
||||
on-verified-failure (get-in db [:hardwallet :pin :on-verified-failure])
|
||||
exporting? (get-in db [:hardwallet :on-export-success])]
|
||||
(log/debug "[hardwallet] verify pin error" error)
|
||||
(when-not tag-was-lost?
|
||||
(if (re-matches common/pin-mismatch-error (:error error))
|
||||
(fx/merge cofx
|
||||
{:db (update-in db [:hardwallet :pin] merge {:status :error
|
||||
:enter-step :current
|
||||
:puk []
|
||||
:current []
|
||||
:original []
|
||||
:confirmation []
|
||||
:sign []
|
||||
:error-label :t/pin-mismatch})}
|
||||
{:db (update-in db [:hardwallet :pin]
|
||||
merge
|
||||
{:status :error
|
||||
:enter-step :current
|
||||
:puk []
|
||||
:current []
|
||||
:original []
|
||||
:confirmation []
|
||||
:sign []
|
||||
:error-label :t/pin-mismatch})}
|
||||
(common/hide-connection-sheet)
|
||||
(when-not setup?
|
||||
(when (and (not setup?)
|
||||
(not on-verified-failure))
|
||||
(if exporting?
|
||||
(navigation/navigate-back)
|
||||
(navigation/navigate-to-cofx :enter-pin-settings nil)))
|
||||
(common/get-application-info (common/get-pairing db) nil))
|
||||
(common/get-application-info (common/get-pairing db) nil)
|
||||
(when on-verified-failure
|
||||
(fn [_] {:utils/dispatch-later
|
||||
[{:dispatch [on-verified-failure]
|
||||
:ms 200}]}))
|
||||
(clear-on-verify-handlers))
|
||||
|
||||
(fx/merge cofx
|
||||
(common/hide-connection-sheet)
|
||||
(common/show-wrong-keycard-alert true))))))
|
||||
|
||||
(fx/defn verify-pin
|
||||
{:events [:hardwallet/verify-pin]}
|
||||
[cofx]
|
||||
(common/show-connection-sheet
|
||||
cofx
|
||||
{:on-card-connected :hardwallet/verify-pin
|
||||
:handler
|
||||
(fn [{:keys [db] :as cofx}]
|
||||
(let [pin (common/vector->string (get-in db [:hardwallet :pin :current]))
|
||||
pairing (common/get-pairing db)]
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (assoc-in db [:hardwallet :pin :status] :verifying)
|
||||
:hardwallet/verify-pin {:pin pin
|
||||
:pairing pairing}})))}))
|
||||
(common/show-wrong-keycard-alert true)
|
||||
(clear-on-verify-handlers))))))
|
||||
|
||||
(fx/defn unblock-pin
|
||||
{:events [:hardwallet/unblock-pin]}
|
||||
|
@ -313,7 +309,7 @@
|
|||
|
||||
(and (= enter-step :current)
|
||||
(= pin-code-length numbers-entered))
|
||||
(verify-pin)
|
||||
(common/verify-pin :current)
|
||||
|
||||
(and (= enter-step :export-key)
|
||||
(= pin-code-length numbers-entered))
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
(ns status-im.hardwallet.wallet
|
||||
(:require [status-im.ethereum.core :as ethereum]
|
||||
[status-im.utils.fx :as fx]
|
||||
[status-im.ui.screens.wallet.add-new.views :as add-new.views]
|
||||
[status-im.hardwallet.common :as common]
|
||||
[status-im.constants :as constants]
|
||||
[status-im.ethereum.eip55 :as eip55]
|
||||
|
@ -8,42 +9,51 @@
|
|||
|
||||
(fx/defn show-pin-sheet
|
||||
{:events [:hardwallet/new-account-pin-sheet]}
|
||||
[{:keys [db] :as cofx} sheet-options]
|
||||
[{:keys [db] :as cofx}]
|
||||
(fx/merge
|
||||
cofx
|
||||
{:db (assoc-in db [:hardwallet :pin :enter-step] :export-key)}
|
||||
(bottom-sheet/show-bottom-sheet sheet-options)))
|
||||
{:db (-> db
|
||||
(assoc-in [:hardwallet :pin :enter-step] :export-key)
|
||||
(update-in [:hardwallet :pin] dissoc :export-key))}
|
||||
(bottom-sheet/show-bottom-sheet
|
||||
{:view {:content add-new.views/pin
|
||||
:height 256}})))
|
||||
|
||||
(fx/defn hide-pin-sheet
|
||||
{:events [:hardwallet/hide-new-account-pin-sheet]}
|
||||
[{:keys [db] :as cofx}]
|
||||
[cofx]
|
||||
(fx/merge
|
||||
cofx
|
||||
{:utils/dispatch-later
|
||||
;; We need to give previous sheet some time to be fully hidden
|
||||
[{:ms 200
|
||||
:dispatch [:wallet.accounts/generate-new-keycard-account]}]}
|
||||
:dispatch [:wallet.accounts/verify-pin]}]}
|
||||
(bottom-sheet/hide-bottom-sheet)))
|
||||
|
||||
(fx/defn generate-new-keycard-account
|
||||
{:events [:wallet.accounts/generate-new-keycard-account]}
|
||||
[cofx]
|
||||
(common/show-connection-sheet
|
||||
cofx
|
||||
{:on-card-connected :wallet.accounts/generate-new-keycard-account
|
||||
:handler
|
||||
(fn [{:keys [db]}]
|
||||
(let [path-num (inc (get-in db [:multiaccount :latest-derived-path]))
|
||||
path (str constants/path-wallet-root "/" path-num)
|
||||
pin (common/vector->string (get-in db [:hardwallet :pin :export-key]))
|
||||
pairing (common/get-pairing db)]
|
||||
{:db
|
||||
(assoc-in
|
||||
db [:hardwallet :on-export-success]
|
||||
#(vector :wallet.accounts/account-stored
|
||||
{;; Strip leading 04 prefix denoting uncompressed key format
|
||||
:address (eip55/address->checksum (str "0x" (ethereum/public-key->address (subs % 2))))
|
||||
:public-key (str "0x" %)
|
||||
:path path}))
|
||||
[{:keys [db]}]
|
||||
(let [path-num (inc (get-in db [:multiaccount :latest-derived-path]))
|
||||
path (str constants/path-wallet-root "/" path-num)
|
||||
pin (common/vector->string (get-in db [:hardwallet :pin :export-key]))
|
||||
pairing (common/get-pairing db)]
|
||||
{:db
|
||||
(assoc-in
|
||||
db [:hardwallet :on-export-success]
|
||||
#(vector :wallet.accounts/account-stored
|
||||
{;; Strip leading 04 prefix denoting uncompressed key format
|
||||
:address (eip55/address->checksum (str "0x" (ethereum/public-key->address (subs % 2))))
|
||||
:public-key (str "0x" %)
|
||||
:path path}))
|
||||
|
||||
:hardwallet/export-key {:pin pin :pairing pairing :path path}}))}))
|
||||
:hardwallet/export-key {:pin pin :pairing pairing :path path}}))
|
||||
|
||||
(fx/defn verify-pin
|
||||
{:events [:wallet.accounts/verify-pin]}
|
||||
[cofx]
|
||||
(common/verify-pin
|
||||
cofx
|
||||
{:pin-step :export-key
|
||||
:on-card-connected :wallet.accounts/generate-new-keycard-account
|
||||
:on-success :wallet.accounts/generate-new-keycard-account
|
||||
:on-failure :hardwallet/new-account-pin-sheet}))
|
||||
|
|
|
@ -17,8 +17,7 @@
|
|||
[status-im.ethereum.core :as ethereum]
|
||||
[status-im.utils.security :as security]
|
||||
[clojure.string :as string]
|
||||
[status-im.utils.platform :as platform]
|
||||
[taoensso.timbre :as log]))
|
||||
[status-im.utils.platform :as platform]))
|
||||
|
||||
(defn- request-camera-permissions []
|
||||
(let [options {:handler :wallet.add-new/qr-scanner-result}]
|
||||
|
|
Loading…
Reference in New Issue