diff --git a/src/status_im/data_store/pending_messages.cljs b/src/status_im/data_store/pending_messages.cljs index 1344d322ca..8f7dcf24c4 100644 --- a/src/status_im/data_store/pending_messages.cljs +++ b/src/status_im/data_store/pending_messages.cljs @@ -25,13 +25,13 @@ (defn save [{:keys [id to group-id message] :as pending-message}] - (let [{:keys [sig symKeyID pubKey topic payload]} message + (let [{:keys [sig sym-key-password pubKey topic payload]} message id' (get-id id to) chat-id (or group-id to) message' (-> pending-message (assoc :id id' :sig sig - :sym-key-id symKeyID + :sym-key-password sym-key-password :pub-key pubKey :message-id id :chat-id chat-id diff --git a/src/status_im/data_store/realm/schemas/account/core.cljs b/src/status_im/data_store/realm/schemas/account/core.cljs index a96faa1505..1d29ffb829 100644 --- a/src/status_im/data_store/realm/schemas/account/core.cljs +++ b/src/status_im/data_store/realm/schemas/account/core.cljs @@ -14,7 +14,8 @@ [status-im.data-store.realm.schemas.account.v13.core :as v13] [status-im.data-store.realm.schemas.account.v14.core :as v14] [status-im.data-store.realm.schemas.account.v15.core :as v15] - [status-im.data-store.realm.schemas.account.v16.core :as v16])) + [status-im.data-store.realm.schemas.account.v16.core :as v16] + [status-im.data-store.realm.schemas.account.v17.core :as v17])) ;; TODO(oskarth): Add failing test if directory vXX exists but isn't in schemas. @@ -67,4 +68,6 @@ {:schema v16/schema :schemaVersion 16 :migration v16/migration} - ]) + {:schema v17/schema + :schemaVersion 17 + :migration v17/migration}]) diff --git a/src/status_im/data_store/realm/schemas/account/v17/core.cljs b/src/status_im/data_store/realm/schemas/account/v17/core.cljs new file mode 100644 index 0000000000..0da96be8d0 --- /dev/null +++ b/src/status_im/data_store/realm/schemas/account/v17/core.cljs @@ -0,0 +1,41 @@ +(ns status-im.data-store.realm.schemas.account.v17.core + (:require [status-im.data-store.realm.schemas.account.v11.chat :as chat] + [status-im.data-store.realm.schemas.account.v1.chat-contact :as chat-contact] + [status-im.data-store.realm.schemas.account.v6.command :as command] + [status-im.data-store.realm.schemas.account.v9.command-parameter :as command-parameter] + [status-im.data-store.realm.schemas.account.v16.contact :as contact] + [status-im.data-store.realm.schemas.account.v1.discover :as discover] + [status-im.data-store.realm.schemas.account.v1.kv-store :as kv-store] + [status-im.data-store.realm.schemas.account.v10.message :as message] + [status-im.data-store.realm.schemas.account.v17.pending-message :as pending-message] + [status-im.data-store.realm.schemas.account.v1.processed-message :as processed-message] + [status-im.data-store.realm.schemas.account.v15.request :as request] + [status-im.data-store.realm.schemas.account.v1.tag :as tag] + [status-im.data-store.realm.schemas.account.v1.user-status :as user-status] + [status-im.data-store.realm.schemas.account.v5.contact-group :as contact-group] + [status-im.data-store.realm.schemas.account.v5.group-contact :as group-contact] + [status-im.data-store.realm.schemas.account.v8.local-storage :as local-storage] + [status-im.data-store.realm.schemas.account.v13.handler-data :as handler-data] + [taoensso.timbre :as log] + [cljs.reader :as reader])) + +(def schema [chat/schema + chat-contact/schema + command/schema + command-parameter/schema + contact/schema + discover/schema + kv-store/schema + message/schema + pending-message/schema + processed-message/schema + request/schema + tag/schema + user-status/schema + contact-group/schema + group-contact/schema + local-storage/schema + handler-data/schema]) + +(defn migration [old-realm new-realm] + (log/debug "migrating v17 account database: " old-realm new-realm)) diff --git a/src/status_im/data_store/realm/schemas/account/v17/pending_message.cljs b/src/status_im/data_store/realm/schemas/account/v17/pending_message.cljs new file mode 100644 index 0000000000..9ff04d6520 --- /dev/null +++ b/src/status_im/data_store/realm/schemas/account/v17/pending_message.cljs @@ -0,0 +1,26 @@ +(ns status-im.data-store.realm.schemas.account.v17.pending-message + (:require [taoensso.timbre :as log])) + +(def schema {:name :pending-message + :primaryKey :id + :properties {:id :string + :message-id :string + :chat-id {:type :string + :optional true} + :ack? :bool + :requires-ack? :bool + :sig :string + :pub-key {:type :string + :optional true} + :sym-key-password {:type :string + :optional true} + :to {:type :string + :optional true} + :payload :string + :type :string + :topic :string + :attempts :int + :was-sent? :bool}}) + +(defn migration [old-realm new-realm] + (log/debug "migrating pending-message schema v12")) diff --git a/src/status_im/protocol/message.cljs b/src/status_im/protocol/message.cljs index 27641fbdb5..9104d3cf0a 100644 --- a/src/status_im/protocol/message.cljs +++ b/src/status_im/protocol/message.cljs @@ -6,7 +6,7 @@ (s/def :message/sig :message/from) (s/def :message/privateKeyID (s/nilable string?)) (s/def :message/pub-key (s/nilable string?)) -(s/def :message/sym-key-id (s/nilable string?)) +(s/def :message/sym-key-password (s/nilable string?)) (s/def :message/topic string?) (s/def :message/to (s/nilable string?)) (s/def :message/message-id string?) diff --git a/src/status_im/protocol/web3/delivery.cljs b/src/status_im/protocol/web3/delivery.cljs index 68ba787d2a..cb5228ced7 100644 --- a/src/status_im/protocol/web3/delivery.cljs +++ b/src/status_im/protocol/web3/delivery.cljs @@ -19,30 +19,32 @@ callback] (let [{:keys [public]} keypair - content (:content payload) - content' (if (and (not to) public content) - (e/encrypt public (prn-str content)) - content) + content (:content payload) + content' (if (and (not to) public content) + (e/encrypt public (prn-str content)) + content) - payload' (-> message - (select-keys [:message-id :requires-ack? :type :clock-value]) - (merge payload) - (assoc :content content') - prn-str - u/from-utf8)] + payload' (-> message + (select-keys [:message-id :requires-ack? :type :clock-value]) + (merge payload) + (assoc :content content') + prn-str + u/from-utf8) + sym-key-password (or key-password shh-keys/status-key-password)] (shh-keys/get-sym-key - web3 - (or key-password shh-keys/status-key-password) - (fn [status-key-id] - (callback - (merge - (select-keys message [:ttl]) - (let [type (if to :asym :sym)] - (cond-> {:sig from - :topic (first topics) - :payload payload'} - to (assoc :pubKey to) - (not to) (assoc :symKeyID status-key-id))))))))) + web3 + sym-key-password + (fn [status-key-id] + (callback + (merge + (select-keys message [:ttl]) + (let [type (if to :asym :sym)] + (cond-> {:sig from + :topic (first topics) + :payload payload'} + to (assoc :pubKey to) + (not to) (assoc :symKeyID status-key-id + :sym-key-password sym-key-password))))))))) (s/def :shh/pending-message (s/keys :req-un [:message/sig :shh/payload :message/topic] @@ -85,23 +87,33 @@ (s/def :delivery/pending-message (s/keys :req-un [:message/sig :message/to :shh/payload :payload/ack? ::id :message/requires-ack? :message/topic ::attempts ::was-sent?] - :opt-un [:message/pubKey :message/symKeyID])) + :opt-un [:message/pub-key :message/sym-key-password])) -(defn add-prepared-pending-message! - [web3 {:keys [message-id to sym-key-id pub-key] :as pending-message}] - {:pre [(valid? :delivery/pending-message pending-message)]} - (debug :add-prepared-pending-message!) - (let [message (assoc - (select-keys pending-message [:sig :topic :payload]) - :symKeyID sym-key-id - :pubKey pub-key) - pending-message' (assoc pending-message :message message +(defn- do-add-pending-message! + [web3 {:keys [message-id to pub-key sym-key-id] :as pending-message}] + (let [message (select-keys pending-message [:sig :topic :payload]) + message' (if sym-key-id + (assoc message :symKeyId sym-key-id) + (assoc message :pubKey pub-key)) + pending-message' (assoc pending-message :message message' :id message-id)] (swap! messages assoc-in [web3 message-id to] pending-message') (when to (swap! recipient->pending-message update to set/union #{[web3 message-id to]})))) +(defn add-prepared-pending-message! + [web3 {:keys [sym-key-password] :as pending-message}] + {:pre [(valid? :delivery/pending-message pending-message)]} + (debug :add-prepared-pending-message!) + (if sym-key-password + (shh-keys/get-sym-key + web3 + sym-key-password + (fn [sym-key-id] + (do-add-pending-message! web3 (assoc pending-message :sym-key-id sym-key-id)))) + (do-add-pending-message! web3 pending-message))) + (defn remove-pending-message! [web3 id to] (swap! messages update web3 (fn [messages]