diff --git a/.env b/.env index 2b9812ffbb..8a6d5477b5 100644 --- a/.env +++ b/.env @@ -28,4 +28,5 @@ MAX_IMAGES_BATCH=5 APN_TOPIC=im.status.ethereum.pr COMMUNITIES_ENABLED=1 DATABASE_MANAGEMENT_ENABLED=1 -METRICS_ENABLED=0 \ No newline at end of file +METRICS_ENABLED=0 +RESET_PASSWORD_ENABLED=1 \ No newline at end of file diff --git a/.env.nightly b/.env.nightly index 3d1d3ced0c..87c17f3a6b 100644 --- a/.env.nightly +++ b/.env.nightly @@ -22,4 +22,4 @@ MAX_IMAGES_BATCH=5 BLANK_PREVIEW=0 COMMUNITIES_ENABLED=1 DATABASE_MANAGEMENT_ENABLED=1 -METRICS_ENABLED=0 \ No newline at end of file +METRICS_ENABLED=0 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 99196b1622..f9e6be59bc 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -596,7 +596,7 @@ SPEC CHECKSUMS: FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e Folly: b73c3869541e86821df3c387eb0af5f65addfab4 - glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 + glog: 060ff9f5bfc2e5fc0ef1a3961cdf58307ce2086d Keycard: dd96182888da0aacf4de821b641103143bbb26cc Permission-Camera: afad27bf90337684d4a86f3825112d648c8c4d3b Permission-Microphone: 0ffabc3fe1c75cfb260525ee3f529383c9f4368c @@ -660,4 +660,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 27b3929c4d7f0b5afd76276d0bd4ae289ec11f18 -COCOAPODS: 1.10.0 +COCOAPODS: 1.10.1 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 282f8781d3..882479893c 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 @@ -1481,5 +1481,23 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL } }); } + + @ReactMethod + public void reEncryptDbAndKeyStore(final String keyUID, final String password, final String newPassword, final Callback callback) { + Log.d(TAG, "reEncryptDbAndKeyStore"); + + Runnable r = new Runnable() { + @Override + public void run() { + // changes db password and re-encrypts keystore + String result = Statusgo.changeDatabasePassword(keyUID, password, newPassword); + callback.invoke(result); + } + }; + + StatusThreadPoolExecutor.getInstance().execute(r); + } + + } diff --git a/modules/react-native-status/ios/RCTStatus/RCTStatus.m b/modules/react-native-status/ios/RCTStatus/RCTStatus.m index 8311c7d2cc..990f2bc525 100644 --- a/modules/react-native-status/ios/RCTStatus/RCTStatus.m +++ b/modules/react-native-status/ios/RCTStatus/RCTStatus.m @@ -583,14 +583,27 @@ RCT_EXPORT_METHOD(verify:(NSString *)address #endif NSFileManager *fileManager = [NSFileManager defaultManager]; NSURL *rootUrl =[[fileManager - URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask] - lastObject]; + URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask] + lastObject]; NSURL *absKeystoreUrl = [rootUrl URLByAppendingPathComponent:@"keystore"]; NSString *result = StatusgoVerifyAccountPassword(absKeystoreUrl.path, address, password); callback(@[result]); } +//////////////////////////////////////////////////////////////////// changeDatabasePassword +RCT_EXPORT_METHOD(reEncryptDbAndKeystore:(NSString *)keyUID + currentPassword:(NSString *)currentPassword + newPassword:(NSString *)newPassword + callback:(RCTResponseSenderBlock)callback) { +#if DEBUG + NSLog(@"reEncryptDbAndKeystore() method called"); +#endif + // changes password and re-encrypts keystore + NSString *result = StatusgoChangeDatabasePassword(keyUID, currentPassword, newPassword); + callback(@[result]); +} + //////////////////////////////////////////////////////////////////// #pragma mark - SendTransaction //////////////////////////////////////////////////////////////////// sendTransaction diff --git a/src/status_im/multiaccounts/reset_password/core.cljs b/src/status_im/multiaccounts/reset_password/core.cljs new file mode 100644 index 0000000000..f8c5cfebad --- /dev/null +++ b/src/status_im/multiaccounts/reset_password/core.cljs @@ -0,0 +1,85 @@ +(ns status-im.multiaccounts.reset-password.core + (:require [re-frame.core :as re-frame] + [status-im.utils.fx :as fx] + [status-im.utils.types :as types] + [clojure.string :as string] + [status-im.utils.security :as security] + [status-im.popover.core :as popover] + [status-im.native-module.core :as status] + [status-im.ethereum.core :as ethereum])) + +(fx/defn on-input-change + {:events [::handle-input-change]} + [{:keys [db]} input-id value] + (let [new-password (get-in db [:multiaccount/reset-password-form-vals :new-password]) + error (when (and (= input-id :confirm-new-password) + (pos? (count new-password)) + (pos? (count value)) + (not= value new-password)) + :t/password-mismatch)] + {:db (-> db + (assoc-in [:multiaccount/reset-password-form-vals input-id] value) + (assoc-in [:multiaccount/reset-password-errors input-id] error))})) + +(fx/defn clear-form-vals + {:events [::clear-form-vals]} + [{:keys [db]}] + {:db (dissoc db :multiaccount/reset-password-form-vals :multiaccount/reset-password-errors)}) + +(fx/defn set-current-password-error + {:events [::handle-verification-error ::password-reset-error]} + [{:keys [db]} error] + {:db (assoc-in db [:multiaccount/reset-password-errors :current-password] error)}) + +(fx/defn password-reset-success + {:events [::password-reset-success]} + [{:keys [db] :as cofx}] + (fx/merge cofx + {:db (dissoc + db + :multiaccount/reset-password-form-vals + :multiaccount/reset-password-errors + :multiaccount/reset-password-next-enabled?)} + (popover/show-popover {:view :password-reset-success}))) + +(defn change-db-password-cb [res] + (let [{:keys [error]} (types/json->clj res)] + (if (not (string/blank? error)) + (re-frame/dispatch [::password-reset-error error]) + (re-frame/dispatch [::password-reset-success])))) + +(re-frame/reg-fx + ::change-db-password + (fn [[key-uid {:keys [current-password new-password]}]] + (status/reset-password + key-uid + (ethereum/sha3 (security/safe-unmask-data current-password)) + (ethereum/sha3 (security/safe-unmask-data new-password)) + change-db-password-cb))) + +(fx/defn handle-verification-success + {:events [::handle-verification-success]} + [{:keys [db]} form-vals] + (let [{:keys [key-uid name]} (:multiaccount db)] + {::change-db-password [key-uid form-vals]})) + +(defn handle-verification [form-vals result] + (let [{:keys [error]} (types/json->clj result)] + (if (not (string/blank? error)) + (re-frame/dispatch [::handle-verification-error :t/wrong-password]) + (re-frame/dispatch [::handle-verification-success form-vals])))) + +(re-frame/reg-fx + ::validate-current-password-and-reset + (fn [{:keys [address current-password] :as form-vals}] + (let [hashed-pass (ethereum/sha3 (security/safe-unmask-data current-password))] + (status/verify address hashed-pass + (partial handle-verification form-vals))))) + +(fx/defn reset + {:events [::reset]} + [{:keys [db]} form-vals] + {::validate-current-password-and-reset + (assoc form-vals + :address + (get-in db [:multiaccount :wallet-root-address]))}) diff --git a/src/status_im/native_module/core.cljs b/src/status_im/native_module/core.cljs index 1cf657b752..377032a130 100644 --- a/src/status_im/native_module/core.cljs +++ b/src/status_im/native_module/core.cljs @@ -407,3 +407,11 @@ (log/debug "[native-module] resetKeyboardInput") (when platform/android? (.resetKeyboardInputCursor ^js (status) input selection))) + +;; passwords are hashed +(defn reset-password + [key-uid current-password# new-password# callback] + (log/debug "[native-module] change-database-password") + (init-keystore + key-uid + #(.reEncryptDbAndKeystore ^js (status) key-uid current-password# new-password# callback))) diff --git a/src/status_im/subs.cljs b/src/status_im/subs.cljs index 9b52c32198..888ab69ae9 100644 --- a/src/status_im/subs.cljs +++ b/src/status_im/subs.cljs @@ -98,6 +98,8 @@ (reg-root-key-sub :multiaccount/accounts :multiaccount/accounts) (reg-root-key-sub :get-recover-multiaccount :multiaccounts/recover) (reg-root-key-sub :multiaccounts/key-storage :multiaccounts/key-storage) +(reg-root-key-sub :multiaccount/reset-password-form-vals :multiaccount/reset-password-form-vals) +(reg-root-key-sub :multiaccount/reset-password-errors :multiaccount/reset-password-errors) ;;chat (reg-root-key-sub ::cooldown-enabled? :chat/cooldown-enabled?) @@ -2614,3 +2616,20 @@ (and (= network-type "cellular") syncing-on-mobile-network?)))) + +;; RESET PASSWORD +(re-frame/reg-sub + :multiaccount/reset-password-form-vals-and-errors + :<- [:multiaccount/reset-password-form-vals] + :<- [:multiaccount/reset-password-errors] + (fn [[form-vals errors]] + (let [{:keys [current-password new-password confirm-new-password]} form-vals] + {:form-vals form-vals + :errors errors + :next-enabled? + (and (pos? (count current-password)) + (pos? (count new-password)) + (pos? (count confirm-new-password)) + (>= (count new-password) 6) + (>= (count current-password) 6) + (= new-password confirm-new-password))}))) diff --git a/src/status_im/ui/screens/popover/views.cljs b/src/status_im/ui/screens/popover/views.cljs index e76e0a74fa..5d158f38cc 100644 --- a/src/status_im/ui/screens/popover/views.cljs +++ b/src/status_im/ui/screens/popover/views.cljs @@ -11,6 +11,7 @@ [status-im.ui.screens.profile.user.views :as profile.user] ["react-native" :refer (BackHandler)] [status-im.ui.components.invite.advertiser :as advertiser.invite] + [status-im.ui.screens.reset-password.views :as reset-password.views] [status-im.ui.components.invite.dapp :as dapp.invite] [status-im.ui.screens.multiaccounts.recover.views :as multiaccounts.recover] [status-im.ui.screens.multiaccounts.key-storage.views :as multiaccounts.key-storage] @@ -169,6 +170,9 @@ (= :transfer-multiaccount-unknown-error view) [multiaccounts.key-storage/unknown-error-popover] + (= :password-reset-success view) + [reset-password.views/reset-success-popover] + :else [view])]]]]])))}))) diff --git a/src/status_im/ui/screens/privacy_and_security_settings/events.cljs b/src/status_im/ui/screens/privacy_and_security_settings/events.cljs index 0284c27e4b..6a66c75350 100644 --- a/src/status_im/ui/screens/privacy_and_security_settings/events.cljs +++ b/src/status_im/ui/screens/privacy_and_security_settings/events.cljs @@ -69,4 +69,4 @@ (fx/defn keep-keys-on-keycard {:events [::keep-keys-on-keycard]} [{:keys [db] :as cofx} checked?] - {:db (assoc-in db [:delete-profile/keep-keys-on-keycard?] checked?)}) \ No newline at end of file + {:db (assoc-in db [:delete-profile/keep-keys-on-keycard?] checked?)}) diff --git a/src/status_im/ui/screens/privacy_and_security_settings/views.cljs b/src/status_im/ui/screens/privacy_and_security_settings/views.cljs index c3a2e4e8a0..e1f31244c0 100644 --- a/src/status_im/ui/screens/privacy_and_security_settings/views.cljs +++ b/src/status_im/ui/screens/privacy_and_security_settings/views.cljs @@ -2,6 +2,7 @@ (:require [re-frame.core :as re-frame] [status-im.i18n.i18n :as i18n] [quo.core :as quo] + [status-im.multiaccounts.reset-password.core :as reset-password] [status-im.ui.components.common.common :as components.common] [status-im.ui.components.react :as react] [status-im.utils.config :as config] @@ -38,14 +39,6 @@ :on-press #(re-frame/dispatch [:multiaccounts.ui/biometric-auth-switched ((complement boolean) (= auth-method "biometric"))])}]) [separator] - ;; TODO - uncomment when implemented - ;; {:size :small - ;; :title (i18n/label :t/change-password) - ;; :chevron true} - ;; {:size :small - ;; :title (i18n/label :t/change-passcode) - ;; :chevron true} - [quo/list-header (i18n/label :t/privacy)] [quo/list-item {:size :small :title (i18n/label :t/set-dapp-access-permissions) @@ -76,6 +69,15 @@ :t/anyone)) :on-press #(re-frame/dispatch [:navigate-to :messages-from-contacts-only]) :accessibility-label :accept-new-chats-from}] + (when config/reset-password-enabled? + [quo/list-item {:size :small + :title (i18n/label :t/reset-password) + :chevron true + :accessory :text + :on-press #(do + (re-frame/dispatch [::reset-password/clear-form-vals]) + (re-frame/dispatch [:navigate-to :reset-password])) + :accessibility-label :reset-password}]) (when config/metrics-enabled? [quo/list-item {:size :small :title (i18n/label :t/anonymous-usage-data) diff --git a/src/status_im/ui/screens/reset_password/views.cljs b/src/status_im/ui/screens/reset_password/views.cljs new file mode 100644 index 0000000000..fcfe4bbe2d --- /dev/null +++ b/src/status_im/ui/screens/reset_password/views.cljs @@ -0,0 +1,78 @@ +(ns status-im.ui.screens.reset-password.views + (:require [re-frame.core :as re-frame] + [status-im.i18n.i18n :as i18n] + [quo.core :as quo] + [status-im.ui.components.react :as react] + [status-im.ui.components.colors :as colors] + [status-im.ui.components.icons.icons :as icons] + [status-im.multiaccounts.reset-password.core :as reset-password] + [status-im.utils.security :as security] + [status-im.ui.components.toolbar :as toolbar]) + (:require-macros [status-im.utils.views :refer [defview letsubs]])) + +(defn input-field + ([id errors on-submit] (input-field id errors on-submit false)) + ([id errors on-submit focus?] + [quo/text-input + {:placeholder (i18n/label id) + :default-value "" + :auto-focus focus? + :accessibility-label id + :show-cancel false + :style {:margin-bottom 32} + :on-submit-editing on-submit + :on-change-text #(re-frame/dispatch [::reset-password/handle-input-change + id + (security/mask-data %)]) + :secure-text-entry true + :error (when-let [error (get errors id)] + (if (keyword? error) + (i18n/label error) + error))}])) + +(defview reset-password [] + (letsubs [{:keys [form-vals errors next-enabled?]} + [:multiaccount/reset-password-form-vals-and-errors]] + (let [on-submit #(re-frame/dispatch [::reset-password/reset form-vals])] + [react/keyboard-avoiding-view {:flex 1} + [react/view {:style {:flex 1 + :justify-content :space-between}} + [react/view {:style {:padding-horizontal 16 + :padding-vertical 16}} + [input-field :current-password errors on-submit true] + [input-field :new-password errors on-submit] + [input-field :confirm-new-password errors on-submit]] + [quo/text {:color :secondary :align :center :size :small + :style {:padding-horizontal 16}} + (i18n/label :t/password-description)] + [toolbar/toolbar + {:show-border? true + :right + [quo/button + {:on-press on-submit + :accessibility-label :next-button + :disabled (not next-enabled?) + :type :secondary + :after :main-icons/next} + (i18n/label :t/next)]}]]]))) + +(defview reset-success-popover [] + [react/view {:padding-vertical 24 + :padding-horizontal 48 + :align-items :center} + [react/view {:width 32 + :height 32 + :background-color colors/green-transparent-10 + :border-radius 32 + :align-items :center + :justify-content :center} + [icons/icon :main-icons/check {:color colors/green}]] + [quo/text {:size :x-large + :weight :bold + :style {:typography :title-bold + :margin-top 16 + :margin-bottom 24}} + (i18n/label :t/password-reset-success)] + [react/view {:align-items :center} + [quo/button {:on-press #(re-frame/dispatch [:hide-popover])} + (i18n/label :t/ok-got-it)]]]) diff --git a/src/status_im/ui/screens/screens.cljs b/src/status_im/ui/screens/screens.cljs index 4389900110..b4ee394ce1 100644 --- a/src/status_im/ui/screens/screens.cljs +++ b/src/status_im/ui/screens/screens.cljs @@ -85,6 +85,7 @@ [status-im.ui.screens.mobile-network-settings.view :as mobile-network-settings] + [status-im.ui.screens.reset-password.views :as reset-password] [status-im.ui.screens.network.edit-network.views :as edit-network] [status-im.ui.screens.network.views :as network] [status-im.ui.screens.network.network-details.views :as network-details] @@ -221,7 +222,7 @@ :component profile.group-chat/group-chat-invite} {:name :stickers - :options {:topBar {:title {:text (i18n/label :t/sticker-market)}}} + :options {:topBar {:title {:text (i18n/label :t/sticker-market)}}} :component stickers/packs} {:name :stickers-pack @@ -233,40 +234,40 @@ :component notifications-center/center} ;; Community {:name :community - ;TODO custom + ;;TODO custom :options {:topBar {:visible false}} :component community/community} {:name :community-management :insets {:top false} - ;TODO animated-header + ;;TODO animated-header :options {:topBar {:visible false}} :component community.profile/management-container} {:name :community-members - ;TODO custom subtitle + ;;TODO custom subtitle :options {:topBar {:visible false}} :component members/members-container} {:name :community-requests-to-join - ;TODO custom subtitle + ;;TODO custom subtitle :options {:topBar {:visible false}} :component requests-to-join/requests-to-join-container} {:name :create-community-channel - ;TODO custom + ;;TODO custom :options {:topBar {:visible false}} :component create-channel/view} - {:name :community-channel-details - ;TODO custom + {:name :community-channel-details + ;;TODO custom :options {:topBar {:visible false}} :component communities.channel-details/view} {:name :edit-community-channel :insets {:bottom true} :component edit-channel/view} {:name :contact-toggle-list - ;TODO custom subtitle + ;;TODO custom subtitle :options {:topBar {:visible false}} :component group-chat/contact-toggle-list} {:name :new-group :options {:topBar {:visible false}} - ;TODO custom subtitle + ;;TODO custom subtitle :component group-chat/new-group} {:name :referral-enclav ;;TODO custom content @@ -277,16 +278,16 @@ :options {:topBar {:visible false}} :component communities/communities} {:name :community-import - :options {:topBar {:title {:text (i18n/label :t/import-community-title)}}} + :options {:topBar {:title {:text (i18n/label :t/import-community-title)}}} :component communities.import/view} {:name :community-edit - :options {:topBar {:title {:text (i18n/label :t/community-edit-title)}}} + :options {:topBar {:title {:text (i18n/label :t/community-edit-title)}}} :component community.edit/edit} {:name :community-create - :options {:topBar {:title {:text (i18n/label :t/new-community-title)}}} + :options {:topBar {:title {:text (i18n/label :t/new-community-title)}}} :component communities.create/view} {:name :community-membership - :options {:topBar {:title {:text (i18n/label :t/membership-title)}}} + :options {:topBar {:title {:text (i18n/label :t/membership-title)}}} :component membership/membership} ;;BROWSER @@ -340,14 +341,14 @@ :component wallet-settings/manage-assets} {:name :wallet-add-custom-token :on-focus [:wallet/wallet-add-custom-token] - :options {:topBar {:title {:text (i18n/label :t/add-custom-token)}}} + :options {:topBar {:title {:text (i18n/label :t/add-custom-token)}}} :component custom-tokens/add-custom-token} {:name :wallet-custom-token-details ;;TODO dynamic title :options {:topBar {:visible false}} :component custom-tokens/custom-token-details} {:name :currency-settings - :options {:topBar {:title {:text (i18n/label :t/main-currency)}}} + :options {:topBar {:title {:text (i18n/label :t/main-currency)}}} :component currency-settings/currency-settings} ;;MY STATUS @@ -363,36 +364,36 @@ :insets {:top false} :component profile.user/my-profile} {:name :contacts-list - :options {:topBar {:title {:text (i18n/label :t/contacts)}}} + :options {:topBar {:title {:text (i18n/label :t/contacts)}}} :component contacts-list/contacts-list} {:name :ens-main - :options {:topBar {:title {:text (i18n/label :t/ens-usernames)}}} + :options {:topBar {:title {:text (i18n/label :t/ens-usernames)}}} :component ens/main} {:name :ens-search - :options {:topBar {:title {:text (i18n/label :t/ens-your-username)}}} + :options {:topBar {:title {:text (i18n/label :t/ens-your-username)}}} :component ens/search} {:name :ens-checkout - :options {:topBar {:title {:text (i18n/label :t/ens-your-username)}}} + :options {:topBar {:title {:text (i18n/label :t/ens-your-username)}}} :component ens/checkout} {:name :ens-confirmation - :options {:topBar {:title {:text (i18n/label :t/ens-your-username)}}} + :options {:topBar {:title {:text (i18n/label :t/ens-your-username)}}} :component ens/confirmation} {:name :ens-terms - :options {:topBar {:title {:text (i18n/label :t/ens-terms-registration)}}} + :options {:topBar {:title {:text (i18n/label :t/ens-terms-registration)}}} :component ens/terms} {:name :ens-name-details ;;TODO dynamic title :options {:topBar {:visible false}} :component ens/name-details} {:name :blocked-users-list - :options {:topBar {:title {:text (i18n/label :t/blocked-users)}}} + :options {:topBar {:title {:text (i18n/label :t/blocked-users)}}} :component contacts-list/blocked-users-list} {:name :bootnodes-settings ;;TODO dynamic title :options {:topBar {:visible false}} :component bootnodes-settings/bootnodes-settings} {:name :installations - :options {:topBar {:title {:text (i18n/label :t/devices)}}} + :options {:topBar {:title {:text (i18n/label :t/devices)}}} :component pairing/installations} {:name :edit-bootnode ;;TODO dynamic title @@ -407,43 +408,43 @@ :options {:topBar {:visible false}} :component edit-mailserver/edit-mailserver} {:name :dapps-permissions - :options {:topBar {:title {:text (i18n/label :t/dapps-permissions)}}} + :options {:topBar {:title {:text (i18n/label :t/dapps-permissions)}}} :component dapps-permissions/dapps-permissions} {:name :link-previews-settings - :options {:topBar {:title {:text (i18n/label :t/chat-link-previews)}}} + :options {:topBar {:title {:text (i18n/label :t/chat-link-previews)}}} :component link-previews-settings/link-previews-settings} {:name :privacy-and-security - :options {:topBar {:title {:text (i18n/label :t/privacy-and-security)}}} + :options {:topBar {:title {:text (i18n/label :t/privacy-and-security)}}} :component privacy-and-security/privacy-and-security} {:name :messages-from-contacts-only - :options {:topBar {:title {:text (i18n/label :t/accept-new-chats-from)}}} + :options {:topBar {:title {:text (i18n/label :t/accept-new-chats-from)}}} :component messages-from-contacts-only/messages-from-contacts-only} {:name :appearance - :options {:topBar {:title {:text (i18n/label :t/appearance)}}} + :options {:topBar {:title {:text (i18n/label :t/appearance)}}} :component appearance/appearance} {:name :appearance-profile-pic - :options {:topBar {:title {:text (i18n/label :t/show-profile-pictures)}}} + :options {:topBar {:title {:text (i18n/label :t/show-profile-pictures)}}} :component appearance/profile-pic} {:name :notifications - :options {:topBar {:title {:text (i18n/label :t/notification-settings)}}} + :options {:topBar {:title {:text (i18n/label :t/notification-settings)}}} :component notifications-settings/notifications-settings} {:name :notifications-servers - :options {:topBar {:title {:text (i18n/label :t/notification-servers)}}} + :options {:topBar {:title {:text (i18n/label :t/notification-servers)}}} :component notifications-settings/notifications-servers} {:name :sync-settings - :options {:topBar {:title {:text (i18n/label :t/sync-settings)}}} + :options {:topBar {:title {:text (i18n/label :t/sync-settings)}}} :component sync-settings/sync-settings} {:name :advanced-settings - :options {:topBar {:title {:text (i18n/label :t/advanced)}}} + :options {:topBar {:title {:text (i18n/label :t/advanced)}}} :component advanced-settings/advanced-settings} {:name :help-center - :options {:topBar {:title {:text (i18n/label :t/need-help)}}} + :options {:topBar {:title {:text (i18n/label :t/need-help)}}} :component help-center/help-center} {:name :glossary - :options {:topBar {:title {:text (i18n/label :t/glossary)}}} + :options {:topBar {:title {:text (i18n/label :t/glossary)}}} :component glossary/glossary} {:name :about-app - :options {:topBar {:title {:text (i18n/label :t/about-app)}}} + :options {:topBar {:title {:text (i18n/label :t/about-app)}}} :component about-app/about-app} {:name :manage-dapps-permissions ;;TODO dynamic title @@ -454,41 +455,44 @@ :options {:topBar {:visible false}} :component network/network-settings} {:name :network-details - :options {:topBar {:title {:text (i18n/label :t/network-details)}}} + :options {:topBar {:title {:text (i18n/label :t/network-details)}}} :component network-details/network-details} {:name :network-info - :options {:topBar {:title {:text (i18n/label :t/network-info)}}} + :options {:topBar {:title {:text (i18n/label :t/network-info)}}} :component network-info/network-info} {:name :rpc-usage-info - :options {:topBar {:title {:text (i18n/label :t/rpc-usage-info)}}} + :options {:topBar {:title {:text (i18n/label :t/rpc-usage-info)}}} :component rpc-usage-info/usage-info} {:name :edit-network - :options {:topBar {:title {:text (i18n/label :t/add-network)}}} + :options {:topBar {:title {:text (i18n/label :t/add-network)}}} :component edit-network/edit-network} {:name :log-level-settings - :options {:topBar {:title {:text (i18n/label :t/log-level-settings)}}} + :options {:topBar {:title {:text (i18n/label :t/log-level-settings)}}} :component log-level-settings/log-level-settings} {:name :fleet-settings - :options {:topBar {:title {:text (i18n/label :t/fleet-settings)}}} + :options {:topBar {:title {:text (i18n/label :t/fleet-settings)}}} :component fleet-settings/fleet-settings} {:name :mobile-network-settings - :options {:topBar {:title {:text (i18n/label :t/mobile-network-settings)}}} + :options {:topBar {:title {:text (i18n/label :t/mobile-network-settings)}}} :component mobile-network-settings/mobile-network-settings} {:name :backup-seed ;;TODO dynamic navigation :options {:topBar {:visible false}} :component profile.seed/backup-seed} - {:name :delete-profile - :insets {:bottom true} - :component delete-profile/delete-profile} + {:name :reset-password + :options {:topBar {:title {:text (i18n/label :t/reset-password)}}} + :component reset-password/reset-password} + {:name :delete-profile + :insets {:bottom true} + :component delete-profile/delete-profile} {:name :default-sync-period-settings - :options {:topBar {:title {:text (i18n/label :t/default-sync-period)}}} + :options {:topBar {:title {:text (i18n/label :t/default-sync-period)}}} :component default-sync-period-settings/default-sync-period-settings} {:name :anonymous-metrics-settings :component anonymous-metrics-settings/settings} - {:name :anon-metrics-learn-more + {:name :anon-metrics-learn-more :component anonymous-metrics-settings/learn-more} - {:name :anon-metrics-view-data + {:name :anon-metrics-view-data :component anonymous-metrics-settings/view-data} {:name :anon-metrics-opt-in :back-handler :noop @@ -506,12 +510,12 @@ ;[Chat] New Public chat {:name :new-public-chat :insets {:bottom true} - :options {:topBar {:title {:text (i18n/label :t/new-public-group-chat)}}} + :options {:topBar {:title {:text (i18n/label :t/new-public-group-chat)}}} :component new-public-chat/new-public-chat} ;[Chat] Link preview settings {:name :link-preview-settings - :options {:topBar {:title {:text (i18n/label :t/chat-link-previews)}}} + :options {:topBar {:title {:text (i18n/label :t/chat-link-previews)}}} :component link-previews-settings/link-previews-settings} ;[Chat] Edit nickname @@ -524,7 +528,7 @@ ;[Group chat] Edit group chat name {:name :edit-group-chat-name :insets {:bottom true} - :options {:topBar {:title {:text (i18n/label :t/edit-group)}}} + :options {:topBar {:title {:text (i18n/label :t/edit-group)}}} :component group-chat/edit-group-chat-name} ;[Group chat] Add participants @@ -552,7 +556,7 @@ ;Refferal invite {:name :referral-invite :insets {:bottom true} - :options {:topBar {:title {:text (i18n/label :t/invite-friends)}}} + :options {:topBar {:title {:text (i18n/label :t/invite-friends)}}} :component invite/referral-invite} ;[Wallet] Recipient @@ -565,7 +569,7 @@ ;[Wallet] New favourite {:name :new-favourite :insets {:bottom true} - :options {:topBar {:title {:text (i18n/label :t/new-favourite)}}} + :options {:topBar {:title {:text (i18n/label :t/new-favourite)}}} :component recipient/new-favourite} ;QR Scanner @@ -581,7 +585,7 @@ ;;TODO WHY MODAL? ;[Profile] Notifications settings {:name :notifications-settings - :options {:topBar {:title {:text (i18n/label :t/notification-settings)}} + :options {:topBar {:title {:text (i18n/label :t/notification-settings)}} :popGesture false :hardwareBackButton {:dismissModalOnPress false :popStackOnPress false}} @@ -591,7 +595,7 @@ ;;TODO WHY MODAL? ;[Profile] Notifications Advanced settings {:name :notifications-advanced-settings - :options {:topBar {:title {:text (i18n/label :t/notification-settings)}} + :options {:topBar {:title {:text (i18n/label :t/notification-settings)}} :popGesture false :hardwareBackButton {:dismissModalOnPress false :popStackOnPress false}} @@ -602,19 +606,19 @@ {:name :prepare-send-transaction :insets {:bottom true} :on-dissmiss [:wallet/cancel-transaction-command] - :options {:topBar {:title {:text (i18n/label :t/send-transaction)}} - :swipeToDismiss false + :options {:topBar {:title {:text (i18n/label :t/send-transaction)}} + :swipeToDismiss false :hardwareBackButton {:dismissModalOnPress false}} :component wallet/prepare-send-transaction} ;[Wallet] Request Transaction - {:name :request-transaction - :insets {:bottom true} + {:name :request-transaction + :insets {:bottom true} :on-dissmiss [:wallet/cancel-transaction-command] - :options {:topBar {:title {:text (i18n/label :t/request-transaction)}} - :swipeToDismiss false + :options {:topBar {:title {:text (i18n/label :t/request-transaction)}} + :swipeToDismiss false :hardwareBackButton {:dismissModalOnPress false}} - :component wallet/request-transaction} + :component wallet/request-transaction} ;[Wallet] Buy crypto {:name :buy-crypto @@ -631,7 +635,7 @@ ;My Status {:name :my-status :insets {:bottom true} - :options {:topBar {:title {:text (i18n/label :t/my-status)}}} + :options {:topBar {:title {:text (i18n/label :t/my-status)}}} :component status.new/my-status} ;[Browser] New bookmark @@ -650,12 +654,12 @@ ;KEYCARD {:name :keycard-onboarding-intro - :insets {:bottom true} + :insets {:bottom true} :back-handler keycard.core/onboarding-intro-back-handler :component keycard.onboarding/intro} {:name :keycard-onboarding-puk-code :insets {:bottom true} - :options {:topBar {:visible false} + :options {:topBar {:visible false} :popGesture false :hardwareBackButton {:dismissModalOnPress false :popStackOnPress false}} @@ -663,7 +667,7 @@ :component keycard.onboarding/puk-code} {:name :keycard-onboarding-pin :insets {:bottom true} - :options {:topBar {:visible false} + :options {:topBar {:visible false} :popGesture false :hardwareBackButton {:dismissModalOnPress false :popStackOnPress false}} @@ -671,7 +675,7 @@ :component keycard.onboarding/pin} {:name :keycard-recovery-pair :insets {:bottom true} - :options {:topBar {:title {:text (i18n/label :t/step-i-of-n {:number 2 :step 1})}} + :options {:topBar {:title {:text (i18n/label :t/step-i-of-n {:number 2 :step 1})}} :popGesture false :hardwareBackButton {:dismissModalOnPress false :popStackOnPress false}} @@ -698,21 +702,21 @@ :component keycard/not-keycard} {:name :keycard-onboarding-recovery-phrase :insets {:bottom true} - :options {:topBar {:visible false} + :options {:topBar {:visible false} :popGesture false :hardwareBackButton {:dismissModalOnPress false :popStackOnPress false}} :component keycard.onboarding/recovery-phrase} {:name :keycard-onboarding-recovery-phrase-confirm-word1 :insets {:bottom true} - :options {:topBar {:visible false} + :options {:topBar {:visible false} :popGesture false :hardwareBackButton {:dismissModalOnPress false :popStackOnPress false}} :component keycard.onboarding/recovery-phrase-confirm-word} {:name :keycard-onboarding-recovery-phrase-confirm-word2 :insets {:bottom true} - :options {:topBar {:visible false} + :options {:topBar {:visible false} :popGesture false :hardwareBackButton {:dismissModalOnPress false :popStackOnPress false}} @@ -722,14 +726,14 @@ :component keycard.recovery/intro} {:name :keycard-recovery-success :insets {:bottom true} - :options {:topBar {:visible false} + :options {:topBar {:visible false} :popGesture false :hardwareBackButton {:dismissModalOnPress false :popStackOnPress false}} :component keycard.recovery/success} {:name :keycard-recovery-no-key :insets {:bottom true} - :options {:topBar {:visible false} + :options {:topBar {:visible false} :popGesture false :hardwareBackButton {:dismissModalOnPress false :popStackOnPress false}} @@ -752,11 +756,11 @@ :component keycard/unpaired} {:name :keycard-settings :insets {:bottom true} - :options {:topBar {:title {:text (i18n/label :t/status-keycard)}}} + :options {:topBar {:title {:text (i18n/label :t/status-keycard)}}} :component keycard.settings/keycard-settings} {:name :reset-card :insets {:bottom true} - :options {:topBar {:title {:text (i18n/label :t/reset-card)}}} + :options {:topBar {:title {:text (i18n/label :t/reset-card)}}} :component keycard.settings/reset-card} {:name :keycard-pin :insets {:bottom true} @@ -797,4 +801,4 @@ (when js/goog.DEBUG quo.preview/screens) (when js/goog.DEBUG - quo.preview/main-screens))) \ No newline at end of file + quo.preview/main-screens))) diff --git a/src/status_im/utils/config.cljs b/src/status_im/utils/config.cljs index ee9a22f0d2..fd2a055107 100644 --- a/src/status_im/utils/config.cljs +++ b/src/status_im/utils/config.cljs @@ -49,6 +49,7 @@ (def database-management-enabled? (enabled? (get-config :DATABASE_MANAGEMENT_ENABLED "0"))) (def debug-webview? (enabled? (get-config :DEBUG_WEBVIEW "0"))) (def metrics-enabled? (enabled? (get-config :METRICS_ENABLED "0"))) +(def reset-password-enabled? (enabled? (get-config :RESET_PASSWORD_ENABLED "0"))) ;; CONFIG VALUES (def log-level diff --git a/status-go-version.json b/status-go-version.json index b057d445d3..fccb8602e4 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": "v0.79.11", - "commit-sha1": "b395144704f29c9e1f4fd11714d1031a10160ad1", - "src-sha256": "13yzac5n7w7hzispphm6g5xhw6r62qxg2hvzcrcl9jpwy0frvzi2" + "version": "v0.80.00", + "commit-sha1": "659ca28974d9fca08091c20c1aa4cac34e5e5f81", + "src-sha256": "10xjfzdyayq8iw99wpr488r1l6la4zxdnmljv6pkrkkyghhf6wba" } diff --git a/translations/en.json b/translations/en.json index f6f1b57052..ca74cce140 100644 --- a/translations/en.json +++ b/translations/en.json @@ -1570,5 +1570,12 @@ "no-thanks": "No thanks", "help-improve-status": "Help improve Status", "thank-you": "Thank you", - "count-metrics-collected": "{{count}} metrics collected" + "count-metrics-collected": "{{count}} metrics collected", + "bip39-password-placeholder": "BIP39 password", + "current-password": "Current password", + "reset-password": "Reset password", + "password-reset-success": "Password reset", + "new-password": "New password", + "confirm-new-password": "Confirm new password", + "password-mismatch": "New password and confirmation does not match" }