From 3612fd8c47fb4adb866bb906ad0ea43e8d24d7c2 Mon Sep 17 00:00:00 2001 From: Eric Dvorsak Date: Thu, 12 Apr 2018 20:04:00 +0200 Subject: [PATCH] [fix 3806] Provide separate MailServers for each network Signed-off-by: Andrey Shovkoplyas --- src/status_im/constants.cljs | 24 ++++++++--------- .../realm/schemas/base/v1/account.cljs | 1 - src/status_im/transport/inbox.cljs | 21 ++++++++------- src/status_im/ui/screens/accounts/events.cljs | 12 ++++----- .../ui/screens/accounts/login/events.cljs | 5 ---- src/status_im/ui/screens/db.cljs | 4 --- src/status_im/ui/screens/events.cljs | 11 +++----- .../offline_messaging_settings/db.cljs | 4 +-- .../offline_messaging_settings/events.cljs | 26 +++++++++++-------- .../offline_messaging_settings/subs.cljs | 17 ++++++++++++ .../offline_messaging_settings/views.cljs | 4 +-- src/status_im/ui/screens/subs.cljs | 1 + .../ui/screens/wallet/settings/events.cljs | 9 +++---- 13 files changed, 72 insertions(+), 67 deletions(-) create mode 100644 src/status_im/ui/screens/offline_messaging_settings/subs.cljs diff --git a/src/status_im/constants.cljs b/src/status_im/constants.cljs index 8d315d3f0e..c8339576f1 100644 --- a/src/status_im/constants.cljs +++ b/src/status_im/constants.cljs @@ -38,7 +38,9 @@ (def default-account-settings {:wallet {:visible-tokens {:testnet #{:STT} - :mainnet #{:SNT}}}}) + :mainnet #{:SNT}}} + :wnode {:testnet "main" + :mainnet "main"}}) (defn- transform-config [networks] (->> networks @@ -87,19 +89,17 @@ (merge testnet-networks (when config/mainnet-networks-enabled? mainnet-networks)))) -;; adamb's status-cluster enode -(def default-wnode "main") - (def default-wnodes - {"main" {:id "main" - :name "Status mailserver A" - :address "enode://fa63a6cc730468c5456eab365b2a7a68a166845423c8c9acc363e5f8c4699ff6d954e7ec58f13ae49568600cff9899561b54f6fc2b9923136cd7104911f31cce@163.172.168.202:30303"} - "backup" {:id "backup" - :name "Status mailserver B" - :address "enode://90cbf961c87eb837adc1300a0a6722a57134d843f0028a976d35dff387f101a2754842b6b694e50a01093808f304440d4d968bcbc599259e895ff26e5a1a17cf@51.15.194.39:30303"}}) + {:testnet {"main" {:id "main" + :name "Status testnet mailserver A" + :address "enode://fa63a6cc730468c5456eab365b2a7a68a166845423c8c9acc363e5f8c4699ff6d954e7ec58f13ae49568600cff9899561b54f6fc2b9923136cd7104911f31cce@163.172.168.202:30303"} + "backup" {:id "backup" + :name "Status testnet mailserver B" + :address "enode://90cbf961c87eb837adc1300a0a6722a57134d843f0028a976d35dff387f101a2754842b6b694e50a01093808f304440d4d968bcbc599259e895ff26e5a1a17cf@51.15.194.39:30303"}} + :mainnet {"main" {:id "main" + :name "Status mainnet mailserver" + :address "enode://b963569aac14785f756ecf97e7549a513dea993a1bc744c4f8efe2b4e9479500dd3f5d18f3da19f6550b8bd0d8770350950c9a7da8168b44865402dcc9a51657@51.15.35.110:30403"}}}) -;; TODO(oskarth): Determine if this is the correct topic or not -(def inbox-topic "0xaabb11ee") (def inbox-password "status-offline-inbox") ;; Used to generate topic for contact discoveries diff --git a/src/status_im/data_store/realm/schemas/base/v1/account.cljs b/src/status_im/data_store/realm/schemas/base/v1/account.cljs index ccc3f2cf03..4782c6e3c0 100644 --- a/src/status_im/data_store/realm/schemas/base/v1/account.cljs +++ b/src/status_im/data_store/realm/schemas/base/v1/account.cljs @@ -18,7 +18,6 @@ :network :string :networks {:type :list :objectType :network} - :wnode :string :settings {:type :string} :sharing-usage-data? {:type :bool :default false} :dev-mode? {:type :bool :default false} diff --git a/src/status_im/transport/inbox.cljs b/src/status_im/transport/inbox.cljs index 063c238bf9..2a02ac98e5 100644 --- a/src/status_im/transport/inbox.cljs +++ b/src/status_im/transport/inbox.cljs @@ -5,7 +5,8 @@ [status-im.utils.handlers :as handlers] [status-im.transport.utils :as web3.utils] [status-im.utils.config :as config] - [taoensso.timbre :as log])) + [taoensso.timbre :as log] + [status-im.utils.ethereum.core :as ethereum])) (defn- parse-json ;; NOTE(dmitryn) Expects JSON response like: @@ -35,14 +36,18 @@ (error-fn error) (success-fn result))))) +(defn get-current-wnode-address [{:accounts/keys [current-account-id accounts] :as db}] + (let [network (ethereum/network->chain-keyword (get db :network)) + wnode-id (get-in accounts [current-account-id :settings :wnode network])] + (get-in db [:inbox/wnodes network wnode-id :address]))) + (defn initialize-offline-inbox "Initialises offline inbox by producing `::add-peer` effect if inboxing enabled in config, then the event chan is: add-peer -> fetch-peers -> check-peer-added -> mark-trusted-peer -> get-sym-key -> request-messages" [{:keys [db]}] (when config/offline-inbox-enabled? - (let [wnode-id (get db :inbox/wnode) - wnode (get-in db [:inbox/wnodes wnode-id :address])] + (let [wnode (get-current-wnode-address db)] (log/info "offline inbox: initialize") {::add-peer {:wnode wnode}}))) @@ -91,10 +96,6 @@ (success-fn resp) (error-fn err topic)))))))) -(defn get-wnode [db] - (let [wnode-id (get db :inbox/wnode)] - (get-in db [:inbox/wnodes wnode-id :address]))) - (re-frame/reg-fx ::add-peer (fn [{:keys [wnode]}] @@ -144,7 +145,7 @@ ;; if not we dispatch a new fetch-peer event for later (fn [{:keys [db]} [_ peers retries]] (let [web3 (:web3 db) - wnode (get-wnode db)] + wnode (get-current-wnode-address db)] (log/info "offline inbox: fetch-peers response" peers) (if (registered-peer? peers wnode) {::mark-trusted-peer {:web3 web3 @@ -163,7 +164,7 @@ ;; with add-peer (fn [{:keys [db]} [_ response]] (let [web3 (:web3 db) - wnode (get-wnode db) + wnode (get-current-wnode-address db) password (:inbox/password db)] (log/info "offline inbox: mark-trusted-peer response" wnode response) {:shh/generate-sym-key-from-password {:password password @@ -179,7 +180,7 @@ (fn [{:keys [db]} [_ sym-key-id]] (log/info "offline inbox: get-sym-key response") sym-key-id (let [web3 (:web3 db) - wnode (get-wnode db) + wnode (get-current-wnode-address db) topics (map #(:topic %) (vals (:transport/chats db))) to nil from nil] diff --git a/src/status_im/ui/screens/accounts/events.cljs b/src/status_im/ui/screens/accounts/events.cljs index 6ac913a5fc..adc9caa680 100644 --- a/src/status_im/ui/screens/accounts/events.cljs +++ b/src/status_im/ui/screens/accounts/events.cljs @@ -49,11 +49,10 @@ (defn add-account "Takes db and new account, creates map of effects describing adding account to database and realm" - [{:keys [network inbox/wnode] :networks/keys [networks] :as db} {:keys [address] :as account}] + [{:keys [network] :networks/keys [networks] :as db} {:keys [address] :as account}] (let [enriched-account (assoc account :network network :networks networks - :wnode wnode :address address)] {:db (assoc-in db [:accounts/accounts address] enriched-account) :data-store/save-account enriched-account})) @@ -106,10 +105,11 @@ {:db (assoc-in db [:accounts/accounts id] new-account) :data-store/save-account new-account}))) -(defn update-wallet-settings [{:accounts/keys [current-account-id accounts] :as db} settings] - (let [new-account (-> (get accounts current-account-id) - (assoc :settings settings))] - {:db (assoc-in db [:accounts/accounts current-account-id] new-account) +(defn update-settings [settings {:keys [db] :as cofx}] + (let [{:accounts/keys [current-account-id accounts]} db + new-account (-> (get accounts current-account-id) + (assoc :settings settings))] + {:db (assoc-in db [:accounts/accounts current-account-id] new-account) :data-store/save-account new-account})) (defn account-update diff --git a/src/status_im/ui/screens/accounts/login/events.cljs b/src/status_im/ui/screens/accounts/login/events.cljs index 395a71b084..6532aae307 100644 --- a/src/status_im/ui/screens/accounts/login/events.cljs +++ b/src/status_im/ui/screens/accounts/login/events.cljs @@ -67,9 +67,6 @@ {:network network :config config})) -(defn get-wnode-by-address [db address] - (get-in db [:accounts/accounts address :wnode] constants/default-wnode)) - (defn wrap-with-initialize-geth-fx [db address password] (let [{:keys [network config]} (get-network-by-address db address)] {:initialize-geth-fx config @@ -91,9 +88,7 @@ :login-account (fn [{{:keys [network status-node-started?] :as db} :db} [_ address password]] (let [{account-network :network} (get-network-by-address db address) - wnode (get-wnode-by-address db address) db' (-> db - (assoc :inbox/wnode wnode) (assoc-in [:accounts/login :processing] true)) wrap-fn (cond (not status-node-started?) wrap-with-initialize-geth-fx diff --git a/src/status_im/ui/screens/db.cljs b/src/status_im/ui/screens/db.cljs index 3120948c98..a61f35bce6 100644 --- a/src/status_im/ui/screens/db.cljs +++ b/src/status_im/ui/screens/db.cljs @@ -41,9 +41,7 @@ :notifications {} :network constants/default-network :networks/networks constants/default-networks - :inbox/wnode constants/default-wnode :inbox/wnodes constants/default-wnodes - :inbox/topic constants/inbox-topic :inbox/password constants/inbox-password :my-profile/editing? false :transport/chats {} @@ -162,9 +160,7 @@ :networks/networks :node/after-start :node/after-stop - :inbox/wnode :inbox/wnodes - :inbox/topic :inbox/password :browser/browsers :browser/options diff --git a/src/status_im/ui/screens/events.cljs b/src/status_im/ui/screens/events.cljs index 4c3ded7bfe..359c38ee2f 100644 --- a/src/status_im/ui/screens/events.cljs +++ b/src/status_im/ui/screens/events.cljs @@ -244,10 +244,8 @@ (fn [{:keys [accounts/accounts accounts/create contacts/contacts networks/networks network network-status view-id navigation-stack access-scope->commands-responses - status-module-initialized? status-node-started? - inbox/wnode] - :or [network (get app-db :network) - wnode (get app-db :inbox/wnode)]} [_ address]] + status-module-initialized? status-node-started?] + :or [network (get app-db :network)]} [_ address]] (let [console-contact (get contacts constants/console-chat-id)] (cond-> (assoc app-db :access-scope->commands-responses access-scope->commands-responses @@ -264,8 +262,7 @@ :accounts/create create :networks/networks networks :network-status network-status - :network network - :inbox/wnode wnode) + :network network) console-contact (assoc :contacts/contacts {constants/console-chat-id console-contact}))))) @@ -278,7 +275,7 @@ [:load-contacts] [:load-contact-groups] [:initialize-chats] - [:initialize-browsers] + [:initialize-browsers] [:initialize-debugging {:address address}] [:send-account-update-if-needed] [:update-wallet] diff --git a/src/status_im/ui/screens/offline_messaging_settings/db.cljs b/src/status_im/ui/screens/offline_messaging_settings/db.cljs index 5c4418465c..15a82674bc 100644 --- a/src/status_im/ui/screens/offline_messaging_settings/db.cljs +++ b/src/status_im/ui/screens/offline_messaging_settings/db.cljs @@ -11,7 +11,5 @@ (spec/def :wnode/id ::not-blank-string) (spec/def :wnode/wnode (allowed-keys :req-un [:wnode/address :wnode/name :wnode/id])) -(spec/def :inbox/topic ::not-blank-string) (spec/def :inbox/password ::not-blank-string) -(spec/def :inbox/wnode ::not-blank-string) -(spec/def :inbox/wnodes (spec/nilable (spec/map-of :wnode/id :wnode/wnode))) +(spec/def :inbox/wnodes (spec/nilable (spec/map-of keyword? (spec/map-of :wnode/id :wnode/wnode)))) diff --git a/src/status_im/ui/screens/offline_messaging_settings/events.cljs b/src/status_im/ui/screens/offline_messaging_settings/events.cljs index 84c34e122a..8941f156fc 100644 --- a/src/status_im/ui/screens/offline_messaging_settings/events.cljs +++ b/src/status_im/ui/screens/offline_messaging_settings/events.cljs @@ -3,22 +3,26 @@ [status-im.utils.handlers :as handlers] [status-im.ui.screens.accounts.events :as accounts-events] [status-im.i18n :as i18n] - [status-im.transport.core :as transport])) + [status-im.transport.core :as transport] + [status-im.utils.ethereum.core :as ethereum])) (handlers/register-handler-fx ::save-wnode (fn [{:keys [db now] :as cofx} [_ wnode]] - (handlers/merge-fx cofx - {:dispatch [:navigate-to-clean :accounts]} - (accounts-events/account-update {:wnode wnode :last-updated now}) - (transport/stop-whisper)))) + (let [{:accounts/keys [current-account-id accounts]} db + network (ethereum/network->chain-keyword (:network db)) + settings (get-in accounts [current-account-id :settings])] + (handlers/merge-fx cofx + {:dispatch [:logout]} + (accounts-events/update-settings (assoc-in settings [:wnode network] wnode)))))) (handlers/register-handler-fx :connect-wnode (fn [{:keys [db]} [_ wnode]] - {:show-confirmation {:title (i18n/label :t/close-app-title) - :content (i18n/label :t/connect-wnode-content - {:name (get-in db [:inbox/wnodes wnode :name])}) - :confirm-button-text (i18n/label :t/close-app-button) - :on-accept #(dispatch [::save-wnode wnode]) - :on-cancel nil}})) + (let [network (ethereum/network->chain-keyword (:network db))] + {:show-confirmation {:title (i18n/label :t/close-app-title) + :content (i18n/label :t/connect-wnode-content + {:name (get-in db [:inbox/wnodes network wnode :name])}) + :confirm-button-text (i18n/label :t/close-app-button) + :on-accept #(dispatch [::save-wnode wnode]) + :on-cancel nil}}))) diff --git a/src/status_im/ui/screens/offline_messaging_settings/subs.cljs b/src/status_im/ui/screens/offline_messaging_settings/subs.cljs new file mode 100644 index 0000000000..c11d22547e --- /dev/null +++ b/src/status_im/ui/screens/offline_messaging_settings/subs.cljs @@ -0,0 +1,17 @@ +(ns status-im.ui.screens.offline-messaging-settings.subs + (:require [re-frame.core :as re-frame] + [status-im.utils.ethereum.core :as ethereum])) + +(re-frame/reg-sub :settings/current-wnode + :<- [:network] + :<- [:get-current-account] + (fn [[network current-account]] + (let [chain (ethereum/network->chain-keyword network)] + (get-in current-account [:settings :wnode chain])))) + +(re-frame/reg-sub :settings/network-wnodes + :<- [:network] + :<- [:get :inbox/wnodes] + (fn [[network wnodes]] + (let [chain (ethereum/network->chain-keyword network)] + (chain wnodes)))) diff --git a/src/status_im/ui/screens/offline_messaging_settings/views.cljs b/src/status_im/ui/screens/offline_messaging_settings/views.cljs index 0b967b99b7..dddd82010f 100644 --- a/src/status_im/ui/screens/offline_messaging_settings/views.cljs +++ b/src/status_im/ui/screens/offline_messaging_settings/views.cljs @@ -26,8 +26,8 @@ name]]]]))) (views/defview offline-messaging-settings [] - (views/letsubs [current-wnode [:get :inbox/wnode] - wnodes [:get :inbox/wnodes]] + (views/letsubs [current-wnode [:settings/current-wnode] + wnodes [:settings/network-wnodes]] [react/view {:flex 1} [status-bar/status-bar] [toolbar/simple-toolbar (i18n/label :t/offline-messaging-settings)] diff --git a/src/status_im/ui/screens/subs.cljs b/src/status_im/ui/screens/subs.cljs index 33ebff3c98..60f4c1c1ea 100644 --- a/src/status_im/ui/screens/subs.cljs +++ b/src/status_im/ui/screens/subs.cljs @@ -13,6 +13,7 @@ status-im.ui.screens.wallet.settings.subs status-im.ui.screens.wallet.transactions.subs status-im.ui.screens.network-settings.subs + status-im.ui.screens.offline-messaging-settings.subs status-im.ui.screens.browser.subs status-im.bots.subs status-im.ui.screens.add-new.new-chat.subs diff --git a/src/status_im/ui/screens/wallet/settings/events.cljs b/src/status_im/ui/screens/wallet/settings/events.cljs index f56c5dff6d..8e21e0bad7 100644 --- a/src/status_im/ui/screens/wallet/settings/events.cljs +++ b/src/status_im/ui/screens/wallet/settings/events.cljs @@ -10,11 +10,8 @@ (handlers/register-handler-fx :wallet.settings/toggle-visible-token - (fn [{{:keys [network] :accounts/keys [current-account-id] :as db} :db} [_ symbol checked?]] + (fn [{{:keys [network] :accounts/keys [current-account-id] :as db} :db :as cofx} [_ symbol checked?]] (let [chain (ethereum/network->chain-keyword network) - path [:accounts/accounts current-account-id :settings] - settings (get-in db path) + settings (get-in db [:accounts/accounts current-account-id :settings]) new-settings (update-in settings [:wallet :visible-tokens chain] #(toggle-checked % symbol checked?))] - (-> db - (assoc-in path new-settings) - (accounts/update-wallet-settings new-settings))))) \ No newline at end of file + (accounts/update-settings new-settings cofx))))