From d2f1bbeb164d2e6642bebbc11823b070eefadccb Mon Sep 17 00:00:00 2001 From: yenda Date: Wed, 31 Jul 2019 18:10:38 +0200 Subject: [PATCH] integrate status-go initKeystore native call - avoids having to start a node before login --- externs.js | 1 + .../status/ethereum/module/StatusModule.java | 22 +++++++++++++++ .../react-native-status/desktop/rctstatus.cpp | 6 +++++ .../react-native-status/desktop/rctstatus.h | 1 + .../ios/RCTStatus/RCTStatus.m | 22 +++++++++++++++ src/status_im/init/core.cljs | 6 +++++ src/status_im/multiaccounts/create/core.cljs | 13 +++------ src/status_im/native_module/core.cljs | 3 +++ src/status_im/native_module/impl/module.cljs | 27 ++++++++++--------- src/status_im/signals/core.cljs | 5 +--- status-go-version.json | 6 ++--- 11 files changed, 83 insertions(+), 29 deletions(-) diff --git a/externs.js b/externs.js index 2be39fa276..b2789b96de 100644 --- a/externs.js +++ b/externs.js @@ -191,6 +191,7 @@ var TopLevel = { "index" : function () {}, "indexOf" : function () {}, "init" : function () {}, + "initKeystore" : function () {}, "injectJavaScript" : function () {}, "installApplet" : function () {}, "installAppletAndInitCard" : function () {}, diff --git a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java index 734fab11c8..2608eea9df 100644 --- a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java +++ b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java @@ -352,6 +352,28 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL callback.invoke(); } + @ReactMethod + private void initKeystore() { + Activity currentActivity = getCurrentActivity(); + + final String keydir = currentActivity.getApplicationInfo().dataDir; + Log.d(TAG, "initKeystore"); + if (!checkAvailability()) { + Log.e(TAG, "[initKeystore] Activity doesn't exist, cannot init keystore"); + System.exit(0); + return; + } + + Runnable r = new Runnable() { + @Override + public void run() { + Statusgo.initKeystore(keydir); + } + }; + + StatusThreadPoolExecutor.getInstance().execute(r); + } + @ReactMethod public void startNode(final String config) { Log.d(TAG, "startNode"); diff --git a/modules/react-native-status/desktop/rctstatus.cpp b/modules/react-native-status/desktop/rctstatus.cpp index b00a78300e..6d710ef9ab 100644 --- a/modules/react-native-status/desktop/rctstatus.cpp +++ b/modules/react-native-status/desktop/rctstatus.cpp @@ -128,6 +128,12 @@ void RCTStatus::stopNode() { logStatusGoResult("::stopNode StopNode", result); } +void RCTStatus::initKeystore() { + aCInfo(RCTSTATUS) << "::initKeystore call"; + QString rootDirPath = getDataStoragePath(); + const char* result = initKeystore(rootDirPath); + logStatusGoResult("::initKeystore InitKeystore", result); +} void RCTStatus::createAccount(QString password, double callbackId) { Q_D(RCTStatus); diff --git a/modules/react-native-status/desktop/rctstatus.h b/modules/react-native-status/desktop/rctstatus.h index 876d6d425c..afce58e48d 100644 --- a/modules/react-native-status/desktop/rctstatus.h +++ b/modules/react-native-status/desktop/rctstatus.h @@ -35,6 +35,7 @@ public: QList methodsToExport() override; QVariantMap constantsToExport() override; + Q_INVOKABLE void initKeystore(); Q_INVOKABLE void startNode(QString configString); Q_INVOKABLE void stopNode(); Q_INVOKABLE void createAccount(QString password, double callbackId); diff --git a/modules/react-native-status/ios/RCTStatus/RCTStatus.m b/modules/react-native-status/ios/RCTStatus/RCTStatus.m index 7d21278420..c68a259187 100644 --- a/modules/react-native-status/ios/RCTStatus/RCTStatus.m +++ b/modules/react-native-status/ios/RCTStatus/RCTStatus.m @@ -200,6 +200,28 @@ RCT_EXPORT_METHOD(stopNode) { }); } +//////////////////////////////////////////////////////////////////// +#pragma mark - InitKeystore method +//////////////////////////////////////////////////////////////////// StopNode +RCT_EXPORT_METHOD(initKeystore) { +#if DEBUG + NSLog(@"initKeystore() method called"); +#endif + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSError *error = nil; + NSURL *rootUrl =[[fileManager + URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] + lastObject]; + + NSURL *keystoreDir = [rootUrl URLByAppendingPathComponent:@"keystore"]; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), + ^(void) + { + NSString *res = StatusgoInitKeystore(keystoreDir.path); + NSLog(@"StopNode result %@", res); + }); +} + //////////////////////////////////////////////////////////////////// #pragma mark - Accounts method //////////////////////////////////////////////////////////////////// createAccount diff --git a/src/status_im/init/core.cljs b/src/status_im/init/core.cljs index 14400e3c6f..0a51dc16e8 100644 --- a/src/status_im/init/core.cljs +++ b/src/status_im/init/core.cljs @@ -67,6 +67,7 @@ (fx/merge cofx {:init/get-device-UUID nil :init/get-supported-biometric-auth nil + :init/init-keystore nil :init/restore-native-settings nil :ui/listen-to-window-dimensions-change nil :notifications/init nil @@ -257,6 +258,11 @@ :init/restore-native-settings restore-native-settings!) +(re-frame/reg-fx + :init/init-keystore + (fn [] + (status/init-keystore))) + (re-frame/reg-fx :init/get-device-UUID (fn [] diff --git a/src/status_im/multiaccounts/create/core.cljs b/src/status_im/multiaccounts/create/core.cljs index f8007da99a..52dce0af9c 100644 --- a/src/status_im/multiaccounts/create/core.cljs +++ b/src/status_im/multiaccounts/create/core.cljs @@ -166,15 +166,10 @@ (fx/merge {:db (dissoc db :intro-wizard)} (navigation/navigate-to-cofx :home nil))) -(fx/defn init-key-generation [{:keys [db] :as cofx}] - (let [node-started? (= :started (:node/status db))] - (fx/merge - {:db (-> db - (assoc-in [:intro-wizard :generating-keys?] true) - (assoc :node/on-ready :start-onboarding))} - (if node-started? - {:intro-wizard/start-onboarding nil} - (node/initialize nil))))) +(fx/defn init-key-generation + [{:keys [db] :as cofx}] + {:db (assoc-in db [:intro-wizard :generating-keys?] true) + :intro-wizard/start-onboarding nil}) (fx/defn on-confirm-failure [{:keys [db] :as cofx}] (do diff --git a/src/status_im/native_module/core.cljs b/src/status_im/native_module/core.cljs index feb42fb9ec..1c79943a4f 100644 --- a/src/status_im/native_module/core.cljs +++ b/src/status_im/native_module/core.cljs @@ -3,6 +3,9 @@ (def adjust-resize 16) +(defn init-keystore [] + (native-module/init-keystore)) + (defn start-node [config] (native-module/start-node config)) diff --git a/src/status_im/native_module/impl/module.cljs b/src/status_im/native_module/impl/module.cljs index 617771e305..a804c08648 100644 --- a/src/status_im/native_module/impl/module.cljs +++ b/src/status_im/native_module/impl/module.cljs @@ -10,6 +10,9 @@ (when (exists? (.-NativeModules rn-dependencies/react-native)) (.-Status (.-NativeModules rn-dependencies/react-native)))) +(defn init-keystore [] + (.initKeystore (status))) + (defonce listener-initialized (atom false)) (when-not @listener-initialized @@ -63,13 +66,12 @@ (.recoverAccount (status) passphrase password on-result))) (defn multiaccount-generate-and-derive-addresses [n mnemonic-length paths on-result] - (when (and @node-started (status)) - (.multiAccountGenerateAndDeriveAddresses (status) - (types/clj->json {:n n - :mnemonicPhraseLength mnemonic-length - :bip39Passphrase "" - :paths paths}) - on-result))) + (.multiAccountGenerateAndDeriveAddresses (status) + (types/clj->json {:n n + :mnemonicPhraseLength mnemonic-length + :bip39Passphrase "" + :paths paths}) + on-result)) (defn multiaccount-derive-addresses [account-id paths on-result] (when (and @node-started (status)) @@ -98,13 +100,12 @@ on-result))) (defn multiaccount-store-derived [account-id paths password on-result] - (when (and @node-started (status)) - (.multiAccountStoreDerived (status) - (types/clj->json {:accountID account-id - :paths paths - :password password}) + (.multiAccountStoreDerived (status) + (types/clj->json {:accountID account-id + :paths paths + :password password}) - on-result))) + on-result)) (defn multiaccount-import-mnemonic [mnemonic password on-result] (when (and @node-started (status)) diff --git a/src/status_im/signals/core.cljs b/src/status_im/signals/core.cljs index 7253157fe1..ad38778aa8 100644 --- a/src/status_im/signals/core.cljs +++ b/src/status_im/signals/core.cljs @@ -42,10 +42,7 @@ :import-mnemonic (multiaccounts.recover/import-mnemonic) :create-keycard-multiaccount - (hardwallet/create-keycard-multiaccount) - :start-onboarding - (fn [] - {:intro-wizard/start-onboarding nil}))))) + (hardwallet/create-keycard-multiaccount))))) (fx/defn status-node-stopped [{db :db}] diff --git a/status-go-version.json b/status-go-version.json index b912e54d0a..b194143391 100644 --- a/status-go-version.json +++ b/status-go-version.json @@ -2,7 +2,7 @@ "_comment": "DO NOT EDIT THIS FILE BY HAND. USE 'scripts/update-status-go.sh ' instead", "owner": "status-im", "repo": "status-go", - "version": "06dc227071708d10988203de8b3787362d5f40d1", - "commit-sha1": "06dc227071708d10988203de8b3787362d5f40d1", - "src-sha256": "1imf5rb35938vwmi96yas9lykcrd2r487kv0di6dj4cz590vx8ws" + "version": "develop", + "commit-sha1": "be9c55bc16ca035ca9bfc0586b6c9298a91bdcd4", + "src-sha256": "1a499mi1xg1ryl8bjg0kiww6s1vdykhrl11sk0h649ajfcaak1jb" }