From 779cacf715d400827cf02c418d16b9993e60559f Mon Sep 17 00:00:00 2001 From: Charlie Date: Tue, 1 Mar 2022 17:07:13 +0800 Subject: [PATCH] enhance(electron): add custom https proxy options for settings (#4373) * enhance(electron): add custom https proxy options for settings --- resources/package.json | 3 +- src/electron/electron/core.cljs | 4 +- src/electron/electron/handler.cljs | 3 ++ src/electron/electron/plugin.cljs | 2 +- src/electron/electron/utils.cljs | 22 +++++++- src/main/frontend/components/settings.cljs | 61 +++++++++++++++++++--- src/main/frontend/components/settings.css | 24 +++++++++ src/main/frontend/dicts.cljs | 12 +++++ static/yarn.lock | 18 +------ 9 files changed, 123 insertions(+), 26 deletions(-) diff --git a/resources/package.json b/resources/package.json index c937b6a35..9abfcfcb5 100644 --- a/resources/package.json +++ b/resources/package.json @@ -31,7 +31,8 @@ "open": "7.3.1", "semver": "7.3.5", "update-electron-app": "2.0.1", - "extract-zip": "2.0.1" + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0" }, "devDependencies": { "@electron-forge/cli": "^6.0.0-beta.57", diff --git a/src/electron/electron/core.cljs b/src/electron/electron/core.cljs index 25b42491c..bd3e5d34e 100644 --- a/src/electron/electron/core.cljs +++ b/src/electron/electron/core.cljs @@ -2,7 +2,7 @@ (:require [electron.handler :as handler] [electron.search :as search] [electron.updater :refer [init-updater]] - [electron.utils :refer [*win mac? linux? logger get-win-from-sender]] + [electron.utils :refer [*win mac? linux? logger get-win-from-sender restore-user-fetch-agent]] [clojure.string :as string] [promesa.core :as p] [cljs-bean.core :as bean] @@ -199,6 +199,8 @@ _ (reset! *win win)] (.. logger (info (str "Logseq App(" (.getVersion app) ") Starting... "))) + (restore-user-fetch-agent) + (utils/disableXFrameOptions win) (search/ensure-search-dir!) diff --git a/src/electron/electron/handler.cljs b/src/electron/electron/handler.cljs index 399c7ef03..5f4e051d3 100644 --- a/src/electron/electron/handler.cljs +++ b/src/electron/electron/handler.cljs @@ -361,6 +361,9 @@ (when-let [web-content (.-webContents win)] (.reload web-content))) +(defmethod handle :setHttpsAgent [^js _win [_ opts]] + (utils/set-fetch-agent opts)) + (defmethod handle :default [args] (println "Error: no ipc handler for: " (bean/->js args))) diff --git a/src/electron/electron/plugin.cljs b/src/electron/electron/plugin.cljs index 9dda4be5a..c57278cac 100644 --- a/src/electron/electron/plugin.cljs +++ b/src/electron/electron/plugin.cljs @@ -53,7 +53,7 @@ (defn download-asset-zip [{:keys [id repo title author description effect sponsors]} dl-url dl-version dot-extract-to] (p/catch - (p/let [^js res (fetch dl-url #js {:timeout 30000}) + (p/let [^js res (fetch dl-url {:timeout 30000}) _ (when-not (.-ok res) (throw (js/Error. :download-network-issue))) frm-zip (p/create (fn [resolve1 reject1] diff --git a/src/electron/electron/utils.cljs b/src/electron/electron/utils.cljs index 1c28b3121..304661197 100644 --- a/src/electron/electron/utils.cljs +++ b/src/electron/electron/utils.cljs @@ -2,6 +2,7 @@ (:require [clojure.string :as string] ["fs-extra" :as fs] ["path" :as path] + [electron.configs :as cfgs] [cljs-bean.core :as bean] ["electron" :refer [app BrowserWindow]])) @@ -18,11 +19,18 @@ (defonce dev? (not prod?)) (defonce logger (js/require "electron-log")) +(defonce *fetchAgent (atom nil)) (defonce open (js/require "open")) -(defonce fetch (js/require "node-fetch")) +(defonce HttpsProxyAgent (js/require "https-proxy-agent")) +(defonce _fetch (js/require "node-fetch")) (defonce extract-zip (js/require "extract-zip")) +(defn fetch + ([url] (fetch url nil)) + ([url options] + (_fetch url (bean/->js (merge options {:agent @*fetchAgent}))))) + (defn get-ls-dotdir-root [] (let [lg-dir (str (.getPath app "home") "/.logseq")] @@ -42,6 +50,18 @@ (map #(path/join plugins-root (.-name %))))] dirs)) +(defn set-fetch-agent + [{:keys [protocol host port] :as opts}] + (reset! *fetchAgent + (when (and protocol host port) + (new HttpsProxyAgent (str protocol "://" host ":" port)))) + (cfgs/set-item! :settings/agent opts)) + +(defn restore-user-fetch-agent + [] + (when-let [agent (cfgs/get-item :settings/agent)] + (set-fetch-agent agent))) + ;; keep same as ignored-path? in src/main/frontend/util/fs.cljs ;; TODO: merge them (defn ignored-path? diff --git a/src/main/frontend/components/settings.cljs b/src/main/frontend/components/settings.cljs index fd64f9a0d..d30511d4b 100644 --- a/src/main/frontend/components/settings.cljs +++ b/src/main/frontend/components/settings.cljs @@ -62,8 +62,6 @@ (ui/toggle state on-toggle true) detail-text]]]) - - (rum/defcs app-updater < rum/reactive [state version] (let [update-pending? (state/sub :electron/updater-pending?) @@ -510,10 +508,59 @@ :on-click #(js/logseq.api.relaunch) :small? true :intent "logseq")]])])) -(defn plugin-system-switcher-row [t] +(rum/defc user-proxy-settings-panel + [{:keys [protocol] :as agent-opts}] + (let [[opts set-opts!] (rum/use-state agent-opts) + disabled? (string/blank? (:protocol opts))] + [:div.cp__settings-network-proxy-panel + [:h1.mb-2.text-2xl.font-bold (t :settings-page/network-proxy)] + [:div.p-2 + [:p [:label [:strong (t :type)] + (ui/select [{:label "Disabled" :value "" :selected disabled?} + {:label "http" :value "http" :selected (= protocol "http")} + {:label "https" :value "https" :selected (= protocol "https")} + {:label "socks5" :value "socks5" :selected (= protocol "socks5")}] + #(set-opts! + (assoc opts :protocol (if (= "disabled" (util/safe-lower-case %)) nil %))) nil)]] + [:p.flex + [:label.pr-4 [:strong (t :host)] + [:input.form-input.is-small + {:value (:host opts) :disabled disabled? + :on-change #(set-opts! + (assoc opts :host (util/trim-safe (util/evalue %))))}]] + + [:label [:strong (t :port)] + [:input.form-input.is-small + {:value (:port opts) :type "number" :disabled disabled? + :on-change #(set-opts! + (assoc opts :port (util/trim-safe (util/evalue %))))}]]] + + [:p.pt-2 + (ui/button (t :save) + :on-click (fn [] + (p/let [_ (ipc/ipc :setHttpsAgent opts)] + (state/set-state! [:electron/user-cfgs :settings/agent] opts) + (state/close-sub-modal! :https-proxy-panel))))]]])) + +(rum/defc user-proxy-settings + [{:keys [protocol host port] :as agent-opts}] + (ui/button [:span + (when-let [e (and protocol host port (str protocol "://" host ":" port))] + [:strong.pr-1 e]) + (ui/icon "edit")] + :on-click #(state/set-sub-modal! + (fn [_] (user-proxy-settings-panel agent-opts)) + {:id :https-proxy-panel :center? true}))) + +(defn plugin-system-switcher-row [] (row-with-button-action - {:left-label "Plug-in system" - :action (plugin-enabled-switcher t)})) + {:left-label (t :settings-page/plugin-system) + :action (plugin-enabled-switcher t)})) + +(defn https-user-agent-row [agent-opts] + (row-with-button-action + {:left-label (t :settings-page/network-proxy) + :action (user-proxy-settings agent-opts)})) (rum/defcs settings-general < rum/reactive [_state current-repo] @@ -589,12 +636,14 @@ (let [instrument-disabled? (state/sub :instrument/disabled?) developer-mode? (state/sub [:ui/developer-mode?]) cors-proxy (state/sub [:me :cors_proxy]) + https-agent-opts (state/sub [:electron/user-cfgs :settings/agent]) logged? (state/logged?)] [:div.panel-wrap.is-advanced (when (and util/mac? (util/electron?)) (app-auto-update-row t)) (usage-diagnostics-row t instrument-disabled?) (when-not (mobile-util/is-native-platform?) (developer-mode-row t developer-mode?)) - (when (util/electron?) (plugin-system-switcher-row t)) + (when (util/electron?) (plugin-system-switcher-row)) + (when (util/electron?) (https-user-agent-row https-agent-opts)) (clear-cache-row t) (ui/admonition diff --git a/src/main/frontend/components/settings.css b/src/main/frontend/components/settings.css index 51afcb5c7..00f42230f 100644 --- a/src/main/frontend/components/settings.css +++ b/src/main/frontend/components/settings.css @@ -256,6 +256,30 @@ } } } + + &-network-proxy-panel { + margin: -15px; + + label { + display: flex; + align-items: center; + + > select { + min-width: 100px; + margin-left: -14px !important; + padding: 4px 10px !important; + } + + > input[disabled] { + opacity: .5; + } + + > strong { + font-weight: 500; + width: 60px; + } + } + } } /* Styles for the category icon on the left of settings-modal */ diff --git a/src/main/frontend/dicts.cljs b/src/main/frontend/dicts.cljs index 9c9a62e38..d3a9d85fe 100644 --- a/src/main/frontend/dicts.cljs +++ b/src/main/frontend/dicts.cljs @@ -268,6 +268,8 @@ :settings-page/tab-shortcuts "Shortcuts" :settings-page/tab-version-control "Version control" :settings-page/tab-advanced "Advanced" + :settings-page/plugin-system "Plug-in system" + :settings-page/network-proxy "Network proxy" :logseq "Logseq" :on "ON" :more-options "More options" @@ -278,6 +280,10 @@ :cancel "Cancel" :close "Close" :delete "Delete" + :save "Save" + :type "Type" + :host "Host" + :port "Port" :re-index "Re-index" :re-index-detail "Rebuild the graph" :open-new-window "New window" @@ -1152,6 +1158,8 @@ :settings-page/tab-shortcuts "快捷键" :settings-page/tab-advanced "高级设置" :settings-page/tab-version-control "多版本控制" + :settings-page/plugin-system "插件系统" + :settings-page/network-proxy "网络代理" :logseq "Logseq" :on "已打开" :more-options "更多选项" @@ -1206,6 +1214,10 @@ :cloning "Clone 中" :close "关闭" :delete "删除" + :save "保存" + :type "类型" + :host "主机" + :port "端口" :parsing-files "正在解析文件" :loading-files "正在加载文件" :login-github "用 GitHub 登录" diff --git a/static/yarn.lock b/static/yarn.lock index 658b41f7c..bd5d78ecc 100644 --- a/static/yarn.lock +++ b/static/yarn.lock @@ -1653,16 +1653,7 @@ electron-builder@^22.11.7: update-notifier "^5.1.0" yargs "^17.0.1" -electron-context-menu@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/electron-context-menu/-/electron-context-menu-3.1.1.tgz#109884e79df293f7e85effcbdbbe45d362987d94" - integrity sha512-LJhwaKf6XHwk2LQ5SdwoGNODoA8lRwks9bbEeAqqMf4e3hsrT7pZtX6MaHKYNFZKxF14JjI/VR+VRjGvxmaQoA== - dependencies: - cli-truncate "^2.1.0" - electron-dl "^3.2.1" - electron-is-dev "^2.0.0" - -electron-dl@^3.2.1: +electron-dl@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/electron-dl/-/electron-dl-3.3.0.tgz#4e422e276c627373ba61fcf3f92ffa088988db1a" integrity sha512-Zwaz/OMGPIfBLV2SQH4sTsdDOs/U4y5AOHfremMBXEpjIxX+SiTx845DZAvJJwgb5hfowyWOBLiJhd/emBNLLQ== @@ -1739,11 +1730,6 @@ electron-is-dev@^0.3.0: resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-0.3.0.tgz#14e6fda5c68e9e4ecbeff9ccf037cbd7c05c5afe" integrity sha1-FOb9pcaOnk7L7/nM8DfL18BcWv4= -electron-is-dev@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-2.0.0.tgz#833487a069b8dad21425c67a19847d9064ab19bd" - integrity sha512-3X99K852Yoqu9AcW50qz3ibYBWY79/pBhlMCab8ToEWS48R0T9tyxRiQhwylE7zQdXrMnx2JKqUJyMPmt5FBqA== - electron-log@4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-4.3.1.tgz#1405fef9d4e6964a5fdb8790a69163aa237ffe91" @@ -2605,7 +2591,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@^5.0.0: +https-proxy-agent@5.0.0, https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==