From 0ae089685851a50efb55ce075a33c74305b55067 Mon Sep 17 00:00:00 2001 From: andrey Date: Tue, 1 Sep 2020 14:24:20 +0200 Subject: [PATCH] [#10974] ENS resolving for IPNS names. --- src/status_im/browser/core.cljs | 30 +++++------ src/status_im/browser/core_test.cljs | 12 ++--- src/status_im/ipfs/core.cljs | 22 -------- src/status_im/ui/screens/browser/views.cljs | 2 +- src/status_im/utils/contenthash.cljs | 58 ++++++--------------- src/status_im/utils/contenthash_test.cljs | 28 +++------- src/status_im/utils/http.cljs | 2 +- 7 files changed, 46 insertions(+), 108 deletions(-) delete mode 100644 src/status_im/ipfs/core.cljs diff --git a/src/status_im/browser/core.cljs b/src/status_im/browser/core.cljs index 4177a4d52dc..cbf91cea7f9 100644 --- a/src/status_im/browser/core.cljs +++ b/src/status_im/browser/core.cljs @@ -24,9 +24,7 @@ [status-im.multiaccounts.update.core :as multiaccounts.update] [status-im.ui.components.bottom-sheet.core :as bottom-sheet] [status-im.browser.webview-ref :as webview-ref] - [alphabase.base58 :as alphabase.base58] - ["eth-phishing-detect" :as eth-phishing-detect] - ["hi-base32" :as hi-base32])) + ["eth-phishing-detect" :as eth-phishing-detect])) (fx/defn update-browser-option [{:keys [db]} option-key option-value] @@ -170,16 +168,17 @@ (defmulti storage-gateway :namespace) +(defmethod storage-gateway :ipns + [{:keys [hash]}] + (str "https://" hash)) + (defmethod storage-gateway :ipfs [{:keys [hash]}] - (let [base32hash (-> (.encode ^js hi-base32 (alphabase.base58/decode hash)) - (string/replace #"=" "") - (string/lower-case))] - (str base32hash ".infura.status.im"))) + (contenthash/ipfs-url hash)) (defmethod storage-gateway :swarm [{:keys [hash]}] - (str "swarm-gateways.net/bzz:/" hash)) + (str "https://swarm-gateways.net/bzz:/" hash)) (fx/defn resolve-ens-multihash-success [{:keys [db] :as cofx} m] @@ -190,7 +189,7 @@ (fx/merge cofx {:db (-> (update db :browser/options assoc - :url (str "https://" gateway path) + :url (str gateway path) :resolving? false) (assoc-in [:browser/options :resolved-ens host] gateway))}))) @@ -223,9 +222,12 @@ options (get-in cofx [:db :browser/options]) current-url (:url options)] (when (and (not= "about:blank" url) (not= current-url url) (not= (str current-url "/") url)) - - (let [resolved-ens (first (filter #(not= (.indexOf ^js url (second %)) -1) (:resolved-ens options))) - resolved-url (if resolved-ens (string/replace url (second resolved-ens) (first resolved-ens)) url)] + (let [resolved-ens (first (filter (fn [v] + (not= (.indexOf ^js url (second v)) -1)) + (:resolved-ens options))) + resolved-url (if resolved-ens + (http/normalize-url (string/replace url (second resolved-ens) (first resolved-ens))) + url)] (fx/merge cofx (update-browser-history browser resolved-url) (handle-pdf url) @@ -399,9 +401,7 @@ (cond (and (= type constants/history-state-changed) (not= "about:blank" url)) - (fx/merge cofx - (update-browser-history browser url) - (resolve-url nil)) + (update-browser-on-nav-change cofx url nil) (= type constants/web3-send-async-read-only) (web3-send-async-read-only cofx dapp-name payload messageId) diff --git a/src/status_im/browser/core_test.cljs b/src/status_im/browser/core_test.cljs index c37e691c126..2b0adedfc54 100644 --- a/src/status_im/browser/core_test.cljs +++ b/src/status_im/browser/core_test.cljs @@ -31,7 +31,7 @@ dapp1-id {:browser-id dapp1-id :history-index 0 - :history ["http://cryptokitties.co"] + :history ["https://cryptokitties.co"] :dapp? false :name "Browser" :timestamp 1})) @@ -63,12 +63,12 @@ (let [result-open-existing (browser/open-existing-browser {:db (:db result-open) :now 2} dapp1-id) - dapp1-url2 (str "http://" dapp1-url "/nav2")] + dapp1-url2 (str "https://" dapp1-url "/nav2")] (is (not (has-wrong-properties? result-open-existing dapp1-id {:browser-id dapp1-id :history-index 0 - :history ["http://cryptokitties.co"] + :history ["https://cryptokitties.co"] :dapp? false :name "Browser" :timestamp 2})) @@ -89,7 +89,7 @@ dapp1-id {:browser-id dapp1-id :history-index 1 - :history ["http://cryptokitties.co" dapp1-url2] + :history ["https://cryptokitties.co" dapp1-url2] :dapp? false :name "Browser" :timestamp 4})) @@ -102,7 +102,7 @@ dapp1-id {:browser-id dapp1-id :history-index 0 - :history ["http://cryptokitties.co" dapp1-url2] + :history ["https://cryptokitties.co" dapp1-url2] :dapp? false :name "Browser" :timestamp 5})) @@ -115,7 +115,7 @@ dapp1-id {:browser-id dapp1-id :history-index 1 - :history ["http://cryptokitties.co" dapp1-url2] + :history ["https://cryptokitties.co" dapp1-url2] :dapp? false :name "Browser" :timestamp 6})) diff --git a/src/status_im/ipfs/core.cljs b/src/status_im/ipfs/core.cljs deleted file mode 100644 index 42987a0b4bf..00000000000 --- a/src/status_im/ipfs/core.cljs +++ /dev/null @@ -1,22 +0,0 @@ -(ns status-im.ipfs.core - (:refer-clojure :exclude [cat]) - (:require [re-frame.core :as re-frame] - [status-im.utils.fx :as fx])) - -;; we currently use an ipfs gateway but this detail is not relevant -;; outside of this namespace -(def ipfs-add-url "https://ipfs.infura.io:5001/api/v0/add?cid-version=1") -(def ipfs-cat-url "https://ipfs.infura.io/ipfs/") - -(fx/defn cat - [cofx {:keys [hash on-success on-failure]}] - {:http-get (cond-> {:url (str ipfs-cat-url hash) - :timeout-ms 5000 - :on-success (fn [{:keys [status body]}] - (if (= 200 status) - (re-frame/dispatch (on-success body)) - (when on-failure - (re-frame/dispatch (on-failure status)))))} - on-failure - (assoc :on-error - #(re-frame/dispatch (on-failure %))))}) diff --git a/src/status_im/ui/screens/browser/views.cljs b/src/status_im/ui/screens/browser/views.cljs index 78b54a5c582..450985ae357 100644 --- a/src/status_im/ui/screens/browser/views.cljs +++ b/src/status_im/ui/screens/browser/views.cljs @@ -43,7 +43,7 @@ :style styles/url-input}] [react/touchable-highlight {:style styles/url-text-container :on-press #(re-frame/dispatch [:browser.ui/url-input-pressed])} - [react/text (http/url-host url-original)]]) + [react/text {:number-of-lines 1} (http/url-host url-original)]]) (when-not unsafe? [react/touchable-highlight {:on-press #(.reload ^js @webview-ref/webview-ref) :accessibility-label :refresh-page-button} diff --git a/src/status_im/utils/contenthash.cljs b/src/status_im/utils/contenthash.cljs index df19be36a35..c6eca048be0 100644 --- a/src/status_im/utils/contenthash.cljs +++ b/src/status_im/utils/contenthash.cljs @@ -2,27 +2,10 @@ "TODO: currently we only support encoding/decoding ipfs contenthash implementing swarm and other protocols will come later" (:refer-clojure :exclude [cat]) - (:require [alphabase.base58 :as b58] + (:require ["hi-base32" :as hi-base32] [alphabase.hex :as hex] [clojure.string :as string] - [status-im.ethereum.core :as ethereum] - [status-im.ipfs.core :as ipfs] - [status-im.utils.fx :as fx])) - -(defn encode [{:keys [hash namespace ipld]}] - (when (and hash - (= namespace :ipfs) - (nil? ipld)) - (when-let [b58-hash (if (string/starts-with? hash "z") - (when (= (count hash) 49) - ;; this is a CID multihash - ;; the z is removed, it indicates that the - ;; CID is b58 encoded - (subs hash 1)) - (when (= (count hash) 46) - ;; this is a deprecated simple ipfs hash - hash))] - (str "0xe301" (hex/encode (b58/decode b58-hash)))))) + [status-im.ethereum.core :as ethereum])) (defn decode "TODO properly decode the CID @@ -39,34 +22,27 @@ :hash hash}) (and (= 78 (count hex)) (string/starts-with? hex "0xe3010170")) - ;; for retrocompatibility with old CIDv0 {:namespace :ipfs + :hash (str "b" (-> hex + (subs 6) + hex/decode + ((fn [v] (.encode ^js hi-base32 v))) + (string/replace #"=" "") + string/lower-case))} + (and (string/starts-with? hex "0xe50101700")) + {:namespace :ipns :hash (-> hex - (subs 10) - hex/decode - b58/encode)} - (and (= 78 (count hex)) - (string/starts-with? hex "0xe30101")) - ;; new CIDv1 - {:namespace :ipfs - :hash (str "z" (-> hex - (subs 6) - hex/decode - b58/encode))}))) + (subs 14) + ((fn [v] (str "0x" v))) + (ethereum/hex-to-utf8))}))) + +(defn ipfs-url [hash] + (str "https://" hash ".ipfs.cf-ipfs.com")) (defn url-fn [hex] (let [{:keys [namespace hash]} (decode (ethereum/normalized-hex hex))] (case namespace - :ipfs (str "https://ipfs.infura.io/ipfs/" hash) + :ipfs (ipfs-url hash) ""))) (def url (memoize url-fn)) - -(fx/defn cat - [cofx {:keys [contenthash on-success on-failure]}] - (let [{:keys [namespace hash]} (decode contenthash)] - (when (= namespace :ipfs) - (ipfs/cat cofx - {:hash hash - :on-success on-success - :on-failure on-failure})))) diff --git a/src/status_im/utils/contenthash_test.cljs b/src/status_im/utils/contenthash_test.cljs index 2bed72e786d..3bf8dcdc66b 100644 --- a/src/status_im/utils/contenthash_test.cljs +++ b/src/status_im/utils/contenthash_test.cljs @@ -9,7 +9,11 @@ (testing "decoding a valid ipfs hash" (is (= (contenthash/decode "0xe3010170122029f2d17be6139079dc48696d1f582a8530eb9805b561eda517e22a892c7e3f1f") {:namespace :ipfs - :hash "QmRAQB6YaCyidP37UdDnjFY5vQuiBrcqdyoW1CuDgwxkD4"}))) + :hash "bafybeibj6lixxzqtsb45ysdjnupvqkufgdvzqbnvmhw2kf7cfkesy7r7d4"}))) + (testing "decoding a valid ipns hash" + (is (= (contenthash/decode "0xe5010170000f6170702e756e69737761702e6f7267") + {:namespace :ipns + :hash "app.uniswap.org"}))) (testing "decoding a valid swarm hash" (is (= (contenthash/decode "0xe40101fa011b20d1de9994b4d039f6548d191eb26786769f580809256b4685ef316805265ea162") {:namespace :swarm @@ -19,24 +23,4 @@ (testing "decoding random garbage" (is (nil? (contenthash/decode "0xabcdef1234567890")))) (testing "decoding nil" - (is (nil? (contenthash/decode nil))))) - -(deftest contenthash-encode - (testing "encoding a valid ipfs hash" - (is (= (contenthash/encode - {:namespace :ipfs - :hash "QmRAQB6YaCyidP37UdDnjFY5vQuiBrcqdyoW1CuDgwxkD4"}) - "0xe301122029f2d17be6139079dc48696d1f582a8530eb9805b561eda517e22a892c7e3f1f"))) - (testing "encoding a valid ipfs cid" - (is (= (contenthash/encode - {:namespace :ipfs - :hash "zb2rhZfjRh2FHHB2RkHVEvL2vJnCTcu7kwRqgVsf9gpkLgteo"}) - "0xe301015512202cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"))) - (testing "encoding an invalid ipfs hash" - (is (nil? (contenthash/encode {:namespace :ipfs - :hash "0xe301122029f2d17be6139079dc48696d1f582a8530eb9805b561eda517e2"})))) - (testing "encoding random garbage" - (is (nil? (contenthash/encode {:namespace :ipfs - :hash "0xabcdef1234567890"})))) - (testing "encoding random garbage" - (is (nil? (contenthash/encode nil))))) + (is (nil? (contenthash/decode nil))))) \ No newline at end of file diff --git a/src/status_im/utils/http.cljs b/src/status_im/utils/http.cljs index ce564fa7631..6d7ec6966cb 100644 --- a/src/status_im/utils/http.cljs +++ b/src/status_im/utils/http.cljs @@ -112,7 +112,7 @@ (.catch (or on-error #()))))) (defn normalize-url [url] - (str (when (and (string? url) (not (re-find #"^[a-zA-Z-_]+:/" url))) "http://") url)) + (str (when (and (string? url) (not (re-find #"^[a-zA-Z-_]+:/" url))) "https://") url)) (def normalize-and-decode-url (comp js/decodeURI normalize-url))