mirror of
https://github.com/status-im/status-react.git
synced 2025-01-28 03:36:23 +00:00
- fix contact code validation for universal links - go to profile when following universal link pointing to user own contact code - fix contact code validation for add contact field spec for validating public-key has been changed to a regexp that only accept valid normalized public-key Signed-off-by: Eric Dvorsak <eric@dvorsak.fr>
This commit is contained in:
parent
11199c13ee
commit
67a86f57e9
@ -4,13 +4,14 @@
|
|||||||
[cljs.spec.alpha :as spec]
|
[cljs.spec.alpha :as spec]
|
||||||
[clojure.string :as string]))
|
[clojure.string :as string]))
|
||||||
|
|
||||||
(defn validate-pub-key [whisper-identity {:keys [address public-key]}]
|
(defn own-whisper-identity?
|
||||||
(cond
|
[{{:keys [public-key]} :account/account} whisper-identity]
|
||||||
(string/blank? whisper-identity)
|
(= whisper-identity public-key))
|
||||||
(i18n/label :t/use-valid-contact-code)
|
|
||||||
(#{(hex/normalize-hex address) (hex/normalize-hex public-key)}
|
|
||||||
(hex/normalize-hex whisper-identity))
|
|
||||||
(i18n/label :t/can-not-add-yourself)
|
|
||||||
|
|
||||||
|
(defn validate-pub-key [db whisper-identity]
|
||||||
|
(cond
|
||||||
(not (spec/valid? :global/public-key whisper-identity))
|
(not (spec/valid? :global/public-key whisper-identity))
|
||||||
(i18n/label :t/use-valid-contact-code)))
|
(i18n/label :t/use-valid-contact-code)
|
||||||
|
|
||||||
|
(own-whisper-identity? db whisper-identity)
|
||||||
|
(i18n/label :t/can-not-add-yourself)))
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
(handlers/register-handler-fx
|
(handlers/register-handler-fx
|
||||||
:new-chat/set-new-identity
|
:new-chat/set-new-identity
|
||||||
(fn [{{:keys [web3 network network-status] :as db} :db} [_ new-identity]]
|
(fn [{{:keys [web3 network network-status] :as db} :db} [_ new-identity]]
|
||||||
(let [new-identity-error (db/validate-pub-key new-identity (:account/account db))]
|
(let [new-identity-error (db/validate-pub-key db new-identity)]
|
||||||
(if (stateofus/is-valid-name? new-identity)
|
(if (stateofus/is-valid-name? new-identity)
|
||||||
(let [network (get-in db [:account/account :networks network])
|
(let [network (get-in db [:account/account :networks network])
|
||||||
chain (ethereum/network->chain-keyword network)]
|
chain (ethereum/network->chain-keyword network)]
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
(fn [{:keys [db] :as cofx} [_ _ contact-identity]]
|
(fn [{:keys [db] :as cofx} [_ _ contact-identity]]
|
||||||
(let [current-account (:account/account db)
|
(let [current-account (:account/account db)
|
||||||
fx {:db (assoc db :contacts/new-identity contact-identity)}
|
fx {:db (assoc db :contacts/new-identity contact-identity)}
|
||||||
validation-result (new-chat.db/validate-pub-key contact-identity current-account)]
|
validation-result (new-chat.db/validate-pub-key db contact-identity)]
|
||||||
(if (some? validation-result)
|
(if (some? validation-result)
|
||||||
(utils/show-popup (i18n/label :t/unable-to-read-this-code) validation-result #(re-frame/dispatch [:navigate-to-clean :home]))
|
(utils/show-popup (i18n/label :t/unable-to-read-this-code) validation-result #(re-frame/dispatch [:navigate-to-clean :home]))
|
||||||
(handlers-macro/merge-fx cofx
|
(handlers-macro/merge-fx cofx
|
||||||
|
@ -4,22 +4,9 @@
|
|||||||
[status-im.js-dependencies :as dependencies]
|
[status-im.js-dependencies :as dependencies]
|
||||||
[status-im.utils.ethereum.core :as ethereum]))
|
[status-im.utils.ethereum.core :as ethereum]))
|
||||||
|
|
||||||
(defn hex-string? [s]
|
(defn valid-public-key? [s]
|
||||||
(let [s' (if (string/starts-with? s "0x")
|
(boolean (re-matches #"0x04[0-9a-f]{128}" s)))
|
||||||
(subs s 2)
|
|
||||||
s)]
|
|
||||||
(boolean (re-matches #"(?i)[0-9a-f]+" s'))))
|
|
||||||
|
|
||||||
(defn valid-length? [identity]
|
|
||||||
(let [length (count identity)]
|
|
||||||
(and
|
|
||||||
(hex-string? identity)
|
|
||||||
(or
|
|
||||||
(and (= 128 length) (not (string/includes? identity "0x")))
|
|
||||||
(and (= 130 length) (string/starts-with? identity "0x"))
|
|
||||||
(and (= 132 length) (string/starts-with? identity "0x04"))
|
|
||||||
(ethereum/address? identity)))))
|
|
||||||
|
|
||||||
(spec/def :global/not-empty-string (spec/and string? not-empty))
|
(spec/def :global/not-empty-string (spec/and string? not-empty))
|
||||||
(spec/def :global/public-key (spec/and :global/not-empty-string valid-length?))
|
(spec/def :global/public-key (spec/and :global/not-empty-string valid-public-key?))
|
||||||
(spec/def :global/address ethereum/address?)
|
(spec/def :global/address ethereum/address?)
|
||||||
|
@ -6,7 +6,10 @@
|
|||||||
[status-im.chat.events :as chat.events]
|
[status-im.chat.events :as chat.events]
|
||||||
[status-im.models.account :as models.account]
|
[status-im.models.account :as models.account]
|
||||||
[status-im.ui.components.list-selection :as list-selection]
|
[status-im.ui.components.list-selection :as list-selection]
|
||||||
[status-im.ui.components.react :as react]))
|
[status-im.ui.components.react :as react]
|
||||||
|
[cljs.spec.alpha :as spec]
|
||||||
|
[status-im.ui.screens.navigation :as navigation]
|
||||||
|
[status-im.ui.screens.add-new.new-chat.db :as new-chat.db]))
|
||||||
|
|
||||||
(def public-chat-regex #".*/chat/public/(.*)$")
|
(def public-chat-regex #".*/chat/public/(.*)$")
|
||||||
(def profile-regex #".*/user/(.*)$")
|
(def profile-regex #".*/user/(.*)$")
|
||||||
@ -37,9 +40,11 @@
|
|||||||
(log/info "universal-links: handling public chat " public-chat)
|
(log/info "universal-links: handling public chat " public-chat)
|
||||||
(chat.events/create-new-public-chat public-chat cofx))
|
(chat.events/create-new-public-chat public-chat cofx))
|
||||||
|
|
||||||
(defn handle-view-profile [profile-id cofx]
|
(defn handle-view-profile [profile-id {:keys [db] :as cofx}]
|
||||||
(log/info "universal-links: handling view profile" profile-id)
|
(log/info "universal-links: handling view profile" profile-id)
|
||||||
(chat.events/show-profile profile-id true cofx))
|
(if (new-chat.db/own-whisper-identity? db profile-id)
|
||||||
|
(navigation/navigate-to-cofx :my-profile nil cofx)
|
||||||
|
(chat.events/show-profile profile-id true cofx)))
|
||||||
|
|
||||||
(defn handle-not-found [full-url]
|
(defn handle-not-found [full-url]
|
||||||
(log/info "universal-links: no handler for " full-url))
|
(log/info "universal-links: no handler for " full-url))
|
||||||
@ -74,7 +79,7 @@
|
|||||||
(match-url url public-chat-regex)
|
(match-url url public-chat-regex)
|
||||||
(handle-public-chat (match-url url public-chat-regex) cofx)
|
(handle-public-chat (match-url url public-chat-regex) cofx)
|
||||||
|
|
||||||
(match-url url profile-regex)
|
(spec/valid? :global/public-key (match-url url profile-regex))
|
||||||
(handle-view-profile (match-url url profile-regex) cofx)
|
(handle-view-profile (match-url url profile-regex) cofx)
|
||||||
|
|
||||||
(match-url url browse-regex)
|
(match-url url browse-regex)
|
||||||
|
@ -29,10 +29,14 @@
|
|||||||
{:db db}))))))
|
{:db db}))))))
|
||||||
(testing "a user profile link"
|
(testing "a user profile link"
|
||||||
(testing "it loads the profile"
|
(testing "it loads the profile"
|
||||||
(let [actual (links/handle-url "status-im://user/profile-id"
|
(let [actual (links/handle-url "status-im://user/0x04fbce10971e1cd7253b98c7b7e54de3729ca57ce41a2bfb0d1c4e0a26f72c4b6913c3487fa1b4bb86125770f1743fb4459da05c1cbe31d938814cfaf36e252073"
|
||||||
{:db db})]
|
{:db db})]
|
||||||
(is (= "profile-id" (get-in actual [:db :contacts/identity])))
|
(is (= "0x04fbce10971e1cd7253b98c7b7e54de3729ca57ce41a2bfb0d1c4e0a26f72c4b6913c3487fa1b4bb86125770f1743fb4459da05c1cbe31d938814cfaf36e252073" (get-in actual [:db :contacts/identity])))
|
||||||
(is (= :profile (get-in actual [:db :view-id]))))))
|
(is (= :profile (get-in actual [:db :view-id]))))))
|
||||||
|
(testing "if does nothing because the link is invalid"
|
||||||
|
(is (= (links/handle-url "status-im://user/CONTACTCODE"
|
||||||
|
{:db db})
|
||||||
|
nil)))
|
||||||
(testing "a not found url"
|
(testing "a not found url"
|
||||||
(testing "it does nothing"
|
(testing "it does nothing"
|
||||||
(is (nil? (links/handle-url "status-im://not-existing"
|
(is (nil? (links/handle-url "status-im://not-existing"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user