enhance(electron): add custom https proxy options for settings (#4373)

* enhance(electron): add custom https proxy options for settings
pull/4423/head
Charlie 2022-03-01 17:07:13 +08:00 committed by GitHub
parent 03d8c8a8d2
commit 779cacf715
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 123 additions and 26 deletions

View File

@ -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",

View File

@ -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!)

View File

@ -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)))

View File

@ -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]

View File

@ -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?

View File

@ -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

View File

@ -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 */

View File

@ -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 登录"

View File

@ -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==