From 0b8509949a8727b5962a27a569c384c40db97a67 Mon Sep 17 00:00:00 2001 From: Michele Balistreri Date: Wed, 28 Apr 2021 14:45:29 +0300 Subject: [PATCH] add factory reset option on new Keycard account Signed-off-by: Michele Balistreri --- ios/Podfile.lock | 2 +- ios/StatusIm/Info.plist | 1 + ios/StatusImPR/Info.plist | 1 + ios/StatusImTests/Info.plist | 1 + package.json | 2 +- src/status_im/keycard/card.cljs | 19 ++++++++++ src/status_im/keycard/common.cljs | 7 ++++ src/status_im/keycard/fx.cljs | 4 ++ src/status_im/keycard/ios_keycard.cljs | 34 ----------------- src/status_im/keycard/keycard.cljs | 1 + src/status_im/keycard/onboarding.cljs | 38 ++++++++++++++++--- src/status_im/keycard/real_keycard.cljs | 13 +++++++ src/status_im/keycard/simulated_keycard.cljs | 4 ++ .../ui/screens/keycard/onboarding/views.cljs | 8 +++- translations/en.json | 3 ++ yarn.lock | 6 +-- 16 files changed, 98 insertions(+), 46 deletions(-) delete mode 100644 src/status_im/keycard/ios_keycard.cljs diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 7568fe3fb1..574e48397b 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -628,7 +628,7 @@ EXTERNAL SOURCES: CHECKOUT OPTIONS: Keycard: - :commit: 75c956d64a7d9fdf63e1aac9c2f36237e792c3eb + :commit: abf2be41c70846ab6f11c8bd445faf81b0befc1f :git: https://github.com/status-im/Keycard.swift.git secp256k1: :commit: 46a1fa30d9b8babeae85ff519050f42394ab5fcc diff --git a/ios/StatusIm/Info.plist b/ios/StatusIm/Info.plist index bc9264967d..d5fff3fa83 100644 --- a/ios/StatusIm/Info.plist +++ b/ios/StatusIm/Info.plist @@ -131,6 +131,7 @@ A00000080400010101 A00000080400010301 + A000000151000000 NFCReaderUsageDescription Enable Keycard diff --git a/ios/StatusImPR/Info.plist b/ios/StatusImPR/Info.plist index b93d2c175c..5066250e5f 100644 --- a/ios/StatusImPR/Info.plist +++ b/ios/StatusImPR/Info.plist @@ -137,6 +137,7 @@ A00000080400010101 A00000080400010301 + A000000151000000 NFCReaderUsageDescription Enable Keycard diff --git a/ios/StatusImTests/Info.plist b/ios/StatusImTests/Info.plist index 51031e10b1..db4d420079 100644 --- a/ios/StatusImTests/Info.plist +++ b/ios/StatusImTests/Info.plist @@ -24,6 +24,7 @@ A00000080400010101 A00000080400010301 + A000000151000000 NFCReaderUsageDescription Enable Keycard diff --git a/package.json b/package.json index 62a34d0d37..7f246a88e6 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "react-native-screens": "^2.10.1", "react-native-shake": "^3.3.1", "react-native-splash-screen": "^3.2.0", - "react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#v2.5.34", + "react-native-status-keycard": "git+https://github.com/status-im/react-native-status-keycard.git#v2.5.35", "react-native-svg": "^9.8.4", "react-native-touch-id": "^4.4.1", "react-native-webview": "git+https://github.com/status-im/react-native-webview.git#v10.9.2", diff --git a/src/status_im/keycard/card.cljs b/src/status_im/keycard/card.cljs index 7174adfd99..819d1d6bcc 100644 --- a/src/status_im/keycard/card.cljs +++ b/src/status_im/keycard/card.cljs @@ -99,6 +99,25 @@ [:keycard.callback/on-get-application-info-error (error-object->map response)]))}))) +(defn factory-reset [{:keys [on-success] :as args}] + (log/debug "[keycard] factory-reset") + (keycard/factory-reset + card + (merge + args + {:on-success + (fn [response] + (log/debug "[keycard response succ] get-application-info") + (re-frame/dispatch + [:keycard.callback/on-get-application-info-success + response on-success])) + :on-failure + (fn [response] + (log/debug "[keycard response fail] get-application-info") + (re-frame/dispatch + [:keycard.callback/on-get-application-info-error + (error-object->map response)]))}))) + (defn install-applet [] (log/debug "[keycard] install-applet") (keycard/install-applet diff --git a/src/status_im/keycard/common.cljs b/src/status_im/keycard/common.cljs index 162301e52a..8282a1563b 100644 --- a/src/status_im/keycard/common.cljs +++ b/src/status_im/keycard/common.cljs @@ -409,6 +409,13 @@ (navigation/navigate-to-cofx :keycard-recovery-pin nil))) (show-wrong-keycard-alert true))))) +(fx/defn factory-reset + {:events [:keycard/factory-reset]} + [{:keys [db]} on-card-read] + (log/debug "[keycard] factory-reset") + {:db (update db :keycard dissoc :factory-reset-card?) + :keycard/factory-reset {:on-success on-card-read}}) + ;; Get application info (fx/defn get-application-info diff --git a/src/status_im/keycard/fx.cljs b/src/status_im/keycard/fx.cljs index 14b72051ed..ad932520fd 100644 --- a/src/status_im/keycard/fx.cljs +++ b/src/status_im/keycard/fx.cljs @@ -59,6 +59,10 @@ :keycard/get-application-info card/get-application-info) +(re-frame/reg-fx + :keycard/factory-reset + card/factory-reset) + (re-frame/reg-fx :keycard/check-nfc-support card/check-nfc-support) diff --git a/src/status_im/keycard/ios_keycard.cljs b/src/status_im/keycard/ios_keycard.cljs deleted file mode 100644 index f5c738924c..0000000000 --- a/src/status_im/keycard/ios_keycard.cljs +++ /dev/null @@ -1,34 +0,0 @@ -(ns status-im.keycard.ios-keycard - (:require [status-im.keycard.keycard :as keycard])) - -(defrecord IOSKeycard [] - keycard/Keycard - (check-nfc-support [this args]) - (check-nfc-enabled [this args]) - (open-nfc-settings [this]) - (register-card-events [this args]) - (on-card-disconnected [this callback]) - (on-card-connected [this callback]) - (remove-event-listener [this event]) - (remove-event-listeners [this]) - (get-application-info [this args]) - (install-applet [this args]) - (init-card [this args]) - (install-applet-and-init-card [this args]) - (pair [this args]) - (generate-and-load-key [this args]) - (unblock-pin [this args]) - (verify-pin [this args]) - (change-pin [this args]) - (unpair [this args]) - (delete [this args]) - (remove-key [this args]) - (remove-key-with-unpair [this args]) - (export-key [this args]) - (unpair-and-delete [this args]) - (import-keys [this args]) - (get-keys [this args]) - (sign [this args]) - (save-multiaccount-and-login [this args]) - (login [this args]) - (send-transaction-with-signature [this args])) diff --git a/src/status_im/keycard/keycard.cljs b/src/status_im/keycard/keycard.cljs index 39a49879bf..795b6da340 100644 --- a/src/status_im/keycard/keycard.cljs +++ b/src/status_im/keycard/keycard.cljs @@ -14,6 +14,7 @@ (remove-event-listener [this event]) (remove-event-listeners [this]) (get-application-info [this args]) + (factory-reset [this args]) (install-applet [this args]) (install-cash-applet [this args]) (init-card [this args]) diff --git a/src/status_im/keycard/onboarding.cljs b/src/status_im/keycard/onboarding.cljs index e6fd2f0645..a8c69ca4d3 100644 --- a/src/status_im/keycard/onboarding.cljs +++ b/src/status_im/keycard/onboarding.cljs @@ -4,6 +4,7 @@ [status-im.i18n.i18n :as i18n] [status-im.navigation :as navigation] [status-im.utils.fx :as fx] + [status-im.utils.utils :as utils] [status-im.keycard.common :as common] [status-im.keycard.mnemonic :as mnemonic] [taoensso.timbre :as log] @@ -274,6 +275,11 @@ {:mnemonic mnemonic :pin pin'}}))) +(fx/defn factory-reset-card-toggle + {:events [:keycard.onboarding.intro.ui/factory-reset-card-toggle]} + [{:keys [db] :as cofx} checked?] + {:db (assoc-in db [:keycard :factory-reset-card?] checked?)}) + (fx/defn begin-setup-pressed {:events [:keycard.onboarding.intro.ui/begin-setup-pressed]} [{:keys [db] :as cofx}] @@ -282,14 +288,34 @@ {:db (-> db (update :keycard dissoc :secrets :card-state :multiaccount-wallet-address - :multiaccount-whisper-public-key - :application-info) + :multiaccount-whisper-public-key :application-info) (assoc-in [:keycard :setup-step] :begin) (assoc-in [:keycard :pin :on-verified] nil))} - (common/show-connection-sheet - {:on-card-connected :keycard/get-application-info - :on-card-read :keycard/check-card-state - :handler (common/get-application-info :keycard/check-card-state)}))) + (if (get-in db [:keycard :factory-reset-card?]) + (utils/show-confirmation {:title (i18n/label :t/keycard-factory-reset-title) + :content (i18n/label :t/keycard-factory-reset-text) + :confirm-button-text (i18n/label :t/yes) + :cancel-button-text (i18n/label :t/no) + :on-accept #(re-frame/dispatch [::factory-reset]) + :on-cancel #(re-frame/dispatch [::factory-reset-cancel])}) + (common/show-connection-sheet + {:on-card-connected :keycard/get-application-info + :on-card-read :keycard/check-card-state + :handler (common/get-application-info :keycard/check-card-state)})))) + +(fx/defn factory-reset + {:events [::factory-reset]} + [cofx] + (common/show-connection-sheet + cofx + {:on-card-connected :keycard/factory-reset + :on-card-read :keycard/check-card-state + :handler (common/factory-reset :keycard/check-card-state)})) + +(fx/defn factory-reset-cancel + {:events [::factory-reset-cancel]} + [{:keys [db] :as cofx}] + {:db (update db :keycard dissoc :factory-reset-card?)}) (fx/defn cancel-confirm {:events [::cancel-confirm]} diff --git a/src/status_im/keycard/real_keycard.cljs b/src/status_im/keycard/real_keycard.cljs index 51566eb5ce..2fc7821dcf 100644 --- a/src/status_im/keycard/real_keycard.cljs +++ b/src/status_im/keycard/real_keycard.cljs @@ -107,6 +107,17 @@ (on-success info)))) (catch on-failure))) +(defn factory-reset + [{:keys [on-success on-failure]}] + (.. status-keycard + (factoryReset) + (then (fn [response] + (let [info (-> response + (js->clj :keywordize-keys true) + (update :key-uid ethereum/normalized-hex))] + (on-success info)))) + (catch on-failure))) + (defn install-applet [{:keys [on-success on-failure]}] (.. status-keycard installApplet @@ -313,6 +324,8 @@ (set-pairings args)) (keycard/get-application-info [this args] (get-application-info args)) + (keycard/factory-reset [this args] + (factory-reset args)) (keycard/install-applet [this args] (install-applet args)) (keycard/install-cash-applet [this args] diff --git a/src/status_im/keycard/simulated_keycard.cljs b/src/status_im/keycard/simulated_keycard.cljs index 6c9e389c41..a8d0175730 100644 --- a/src/status_im/keycard/simulated_keycard.cljs +++ b/src/status_im/keycard/simulated_keycard.cljs @@ -119,6 +119,7 @@ (log/debug "get-application-info") (later #(on-success (get @state :application-info)))) +(defn factory-reset [_]) (defn install-applet [_]) (defn install-cash-applet [_]) @@ -459,6 +460,9 @@ (keycard/get-application-info [this args] (log/debug "simulated card get-application-info") (get-application-info args)) + (keycard/factory-reset [this args] + (log/debug "simulated card factory-reset") + (get-application-info args)) (keycard/install-applet [this args] (log/debug "simulated card install-applet") (install-applet args)) diff --git a/src/status_im/ui/screens/keycard/onboarding/views.cljs b/src/status_im/ui/screens/keycard/onboarding/views.cljs index 78a19c1e46..7aa3456fe4 100644 --- a/src/status_im/ui/screens/keycard/onboarding/views.cljs +++ b/src/status_im/ui/screens/keycard/onboarding/views.cljs @@ -11,13 +11,14 @@ [status-im.ui.components.topbar :as topbar] [status-im.ui.screens.keycard.pin.views :as pin.views] [status-im.ui.screens.keycard.styles :as styles] + [status-im.ui.components.checkbox.view :as checkbox] [quo.core :as quo] [status-im.constants :as constants]) (:require-macros [status-im.utils.views :refer [defview letsubs]])) (defview intro [] (letsubs [flow [:keycard-flow] - {:keys [from-key-storage-and-migration?]} [:keycard]] + {:keys [from-key-storage-and-migration? factory-reset-card?]} [:keycard]] [react/view styles/container (when-not from-key-storage-and-migration? [topbar/topbar]) @@ -86,6 +87,11 @@ [react/text {:style {:color colors/gray :padding-right 35}} text]]]]))] + [react/view {:style {:flex-direction :row}} + [checkbox/checkbox {:checked? factory-reset-card? + :style {:margin-right 10} + :on-value-change #(re-frame/dispatch [:keycard.onboarding.intro.ui/factory-reset-card-toggle %])}] + [react/text (i18n/label :t/keycard-factory-reset)]] [react/view {:margin-bottom 40} [quo/button {:on-press #(re-frame/dispatch [:keycard.onboarding.intro.ui/begin-setup-pressed])} (i18n/label :t/begin-set-up)]]]])) diff --git a/translations/en.json b/translations/en.json index b68c4a3124..07b30e2993 100644 --- a/translations/en.json +++ b/translations/en.json @@ -714,6 +714,9 @@ "keycard-desc": "Own a Keycard? Store your keys on it; you’ll need it for transactions", "keycard-dont-ask-card": "Don't ask for card to sign in", "keycard-reset-passcode": "Reset passcode", + "keycard-factory-reset": "Return card to factory settings", + "keycard-factory-reset-title": "Are you sure you want to perform a factory reset?", + "keycard-factory-reset-text": "Performing this will delete any mnemonic phrase stored on the card. Make sure you have a backup of the mnemonic phrase you've been using with this Keycard.", "keycard-enter-new-passcode": "Enter new passcode {{step}}/2", "keycard-has-multiaccount-on-it": "This card is full. Each card can hold one main keypair", "keycard-onboarding-finishing-header": "Finishing up", diff --git a/yarn.lock b/yarn.lock index 6ee88b180d..ca6a92d9d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6751,9 +6751,9 @@ react-native-splash-screen@^3.2.0: resolved "https://registry.yarnpkg.com/react-native-splash-screen/-/react-native-splash-screen-3.2.0.tgz#d47ec8557b1ba988ee3ea98d01463081b60fff45" integrity sha512-Ls9qiNZzW/OLFoI25wfjjAcrf2DZ975hn2vr6U9gyuxi2nooVbzQeFoQS5vQcbCt9QX5NY8ASEEAtlLdIa6KVg== -"react-native-status-keycard@git+https://github.com/status-im/react-native-status-keycard.git#v2.5.34": - version "2.5.34" - resolved "git+https://github.com/status-im/react-native-status-keycard.git#b9f242aa11afbb6a79c269459c48e32a6091176c" +"react-native-status-keycard@git+https://github.com/status-im/react-native-status-keycard.git#v2.5.35": + version "2.5.35" + resolved "git+https://github.com/status-im/react-native-status-keycard.git#8cf7cbff803b080b2069202ea6179703b8c69d2e" react-native-svg@^9.8.4: version "9.13.6"