Selaa lähdekoodia

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

* enhance(electron): add custom https proxy options for settings
Charlie 3 vuotta sitten
vanhempi
sitoutus
779cacf715

+ 2 - 1
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",

+ 3 - 1
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!)

+ 3 - 0
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)))
 

+ 1 - 1
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]

+ 21 - 1
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?

+ 55 - 6
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 (t :settings-page/plugin-system)
+    :action (plugin-enabled-switcher t)}))
+
+(defn https-user-agent-row [agent-opts]
   (row-with-button-action
-    {:left-label "Plug-in system"
-     :action (plugin-enabled-switcher t)}))
+   {: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

+ 24 - 0
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 */

+ 12 - 0
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 登录"

+ 2 - 16
static/yarn.lock

@@ -1653,16 +1653,7 @@ electron-builder@^22.11.7:
     update-notifier "^5.1.0"
     yargs "^17.0.1"
 
[email protected]:
-  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:
[email protected]:
   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==
-
 [email protected]:
   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:
+[email protected], 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==