From 3e6c937008dbf593d3912d638febac4c4393e710 Mon Sep 17 00:00:00 2001 From: yicheng <11733500+yichengchen@users.noreply.github.com> Date: Tue, 28 Apr 2020 12:09:09 +0800 Subject: [PATCH] fix port check alert # Conflicts: # ClashX/goClash/main.go --- ClashX.xcodeproj/project.pbxproj | 4 ++ ClashX/AppDelegate.swift | 25 +++-------- ClashX/General/Utils/ClashStatusTool.swift | 28 ++++++++++++ ClashX/goClash/main.go | 51 +++++----------------- 4 files changed, 50 insertions(+), 58 deletions(-) create mode 100644 ClashX/General/Utils/ClashStatusTool.swift diff --git a/ClashX.xcodeproj/project.pbxproj b/ClashX.xcodeproj/project.pbxproj index 9a333b2..6ff3008 100644 --- a/ClashX.xcodeproj/project.pbxproj +++ b/ClashX.xcodeproj/project.pbxproj @@ -44,6 +44,7 @@ 499A486522EEA3FD00F6C675 /* Array+Safe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 499A486422EEA3FC00F6C675 /* Array+Safe.swift */; }; 49ABB749236B0F9E00535CD7 /* UnsafePointer+bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49ABB748236B0F9E00535CD7 /* UnsafePointer+bridge.swift */; }; 49B1086A216A356D0064FFCE /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49B10869216A356D0064FFCE /* String+Extension.swift */; }; + 49B445162457CDF000B27E3E /* ClashStatusTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49B445152457CDF000B27E3E /* ClashStatusTool.swift */; }; 49B4575D244F4A2A00463C39 /* PrivilegedHelperManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49B4575C244F4A2A00463C39 /* PrivilegedHelperManager.swift */; }; 49B4575F244FD4D100463C39 /* PrivilegedHelperManager+Legacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49B4575E244FD4D100463C39 /* PrivilegedHelperManager+Legacy.swift */; }; 49BC061C212931F4005A0FE7 /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BC061B212931F4005A0FE7 /* AboutViewController.swift */; }; @@ -155,6 +156,7 @@ 499A486422EEA3FC00F6C675 /* Array+Safe.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Array+Safe.swift"; sourceTree = ""; }; 49ABB748236B0F9E00535CD7 /* UnsafePointer+bridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UnsafePointer+bridge.swift"; sourceTree = ""; }; 49B10869216A356D0064FFCE /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; + 49B445152457CDF000B27E3E /* ClashStatusTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClashStatusTool.swift; sourceTree = ""; }; 49B4575C244F4A2A00463C39 /* PrivilegedHelperManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivilegedHelperManager.swift; sourceTree = ""; }; 49B4575E244FD4D100463C39 /* PrivilegedHelperManager+Legacy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PrivilegedHelperManager+Legacy.swift"; sourceTree = ""; }; 49BC061B212931F4005A0FE7 /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = ""; }; @@ -254,6 +256,7 @@ 4960A6DA2136529200B940C9 /* JSBridgeHandler.swift */, 493AEAE2221AE3420016FE98 /* AppVersionUtil.swift */, 49D176A62355FE680093DD7B /* NetworkChangeNotifier.swift */, + 49B445152457CDF000B27E3E /* ClashStatusTool.swift */, ); path = Utils; sourceTree = ""; @@ -704,6 +707,7 @@ 49862FA0218418C600A1D5EC /* ClashRule.swift in Sources */, 49C9EF64223E78F5005D8B6A /* ClashProxy.swift in Sources */, F9E8F34623A12B89002DE5E8 /* String+Encode.swift in Sources */, + 49B445162457CDF000B27E3E /* ClashStatusTool.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ClashX/AppDelegate.swift b/ClashX/AppDelegate.swift index 7d5a8e2..6cdfe80 100644 --- a/ClashX/AppDelegate.swift +++ b/ClashX/AppDelegate.swift @@ -115,7 +115,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply { let group = DispatchGroup() var shouldWait = false - + if ConfigManager.shared.proxyPortAutoSet && !ConfigManager.shared.isProxySetByOtherVariable.value { Logger.log("ClashX quit need clean proxy setting") shouldWait = true @@ -132,7 +132,10 @@ class AppDelegate: NSObject, NSApplicationDelegate { return .terminateNow } - statusItem.menu = nil + if statusItem != nil, statusItem.menu != nil { + statusItem.menu = nil + } + disposeBag = DisposeBag() DispatchQueue.global(qos: .default).async { let res = group.wait(timeout: .now() + 5) @@ -142,9 +145,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { case .timedOut: Logger.log("ClashX quit after clean up timeout") } - DispatchQueue.main.async { - NSApp.reply(toApplicationShouldTerminate: true) - } + NSApp.reply(toApplicationShouldTerminate: true) } Logger.log("ClashX quit wait for clean up") @@ -232,9 +233,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { self.apiPortMenuItem.title = "Api Port: \(ConfigManager.shared.apiPort)" self.ipMenuItem.title = "IP: \(NetworkChangeNotifier.getPrimaryIPAddress() ?? "")" - if config.port == 0 || config.socketPort == 0 { - self.showClashPortErrorAlert() - } + ClashStatusTool.checkPortConfig(cfg: config) }.disposed(by: disposeBag) } @@ -811,13 +810,3 @@ extension AppDelegate { } } } - -// MARK: - Alerts - -extension AppDelegate { - func showClashPortErrorAlert() { - let alert = NSAlert() - alert.messageText = NSLocalizedString("ClashX Start Error!", comment: "") - alert.informativeText = NSLocalizedString("Ports Open Fail, Please try to restart ClashX", comment: "") - } -} diff --git a/ClashX/General/Utils/ClashStatusTool.swift b/ClashX/General/Utils/ClashStatusTool.swift new file mode 100644 index 0000000..fb73a96 --- /dev/null +++ b/ClashX/General/Utils/ClashStatusTool.swift @@ -0,0 +1,28 @@ +// +// ClashStatusTool.swift +// ClashX Pro +// +// Created by yicheng on 2020/4/28. +// Copyright © 2020 west2online. All rights reserved. +// + +import Cocoa + +class ClashStatusTool { + static func checkPortConfig(cfg: ClashConfig?) { + guard let cfg = cfg else { return } + Logger.log("checkPortConfig: \(cfg.port) \(cfg.socketPort)", level: .debug) + if cfg.port == 0 || cfg.socketPort == 0 { + let alert = NSAlert() + alert.messageText = NSLocalizedString("ClashX Start Error!", comment: "") + alert.informativeText = NSLocalizedString("Ports Open Fail, Please try to restart ClashX", comment: "") + alert.addButton(withTitle: NSLocalizedString("Quit", comment: "")) + alert.addButton(withTitle: "Edit Config") + let ret = alert.runModal() + if ret == .alertSecondButtonReturn { + NSWorkspace.shared.openFile(Paths.configPath(for: "config")) + } + NSApp.terminate(nil) + } + } +} diff --git a/ClashX/goClash/main.go b/ClashX/goClash/main.go index bc55231..5ae221d 100644 --- a/ClashX/goClash/main.go +++ b/ClashX/goClash/main.go @@ -1,7 +1,13 @@ package main + import ( "C" "encoding/json" + "net" + "path/filepath" + "strconv" + "strings" + "github.com/Dreamacro/clash/config" "github.com/Dreamacro/clash/constant" "github.com/Dreamacro/clash/hub/executor" @@ -9,10 +15,6 @@ import ( "github.com/Dreamacro/clash/log" "github.com/oschwald/geoip2-golang" "github.com/phayes/freeport" - "net" - "path/filepath" - "strconv" - "strings" ) func isAddrValid(addr string) bool { @@ -20,7 +22,7 @@ func isAddrValid(addr string) bool { comps := strings.Split(addr, ":") v := comps[len(comps)-1] if port, err := strconv.Atoi(v); err == nil { - if port > 0 && port < 65535 && checkPortAvailable(port, false) { + if port > 0 && port < 65535 { return true } } @@ -28,24 +30,6 @@ func isAddrValid(addr string) bool { return false } -func checkPortAvailable(port int, lan bool) bool { - var addr string - if port < 1 || port > 65534 { - return false - } - if lan { - addr = ":" - } else { - addr = "127.0.0.1:" - } - l, err := net.Listen("tcp", addr+strconv.Itoa(port)) - if err != nil { - return false - } - _ = l.Close() - return true -} - //export initClashCore func initClashCore() { configFile := filepath.Join(constant.Path.HomeDir(), constant.Path.Config()) @@ -66,19 +50,6 @@ func parseConfig(checkPort bool) (*config.Config, error) { cfg.General.ExternalController = "127.0.0.1:" + strconv.Itoa(port) cfg.General.Secret = "" } - lan := cfg.General.AllowLan - - if !checkPortAvailable(cfg.General.Port, lan) { - if port, err := freeport.GetFreePort(); err == nil { - cfg.General.Port = port - } - } - - if !checkPortAvailable(cfg.General.SocksPort, lan) { - if port, err := freeport.GetFreePort(); err == nil { - cfg.General.SocksPort = port - } - } } go route.Start(cfg.General.ExternalController, cfg.General.Secret) @@ -151,13 +122,13 @@ func clashGetConfigs() *C.char { func verifyGEOIPDataBase() bool { mmdb, err := geoip2.Open(constant.Path.MMDB()) if err != nil { - log.Warnln("mmdb fail:%s",err.Error()) + log.Warnln("mmdb fail:%s", err.Error()) return false } - _,err = mmdb.Country(net.ParseIP("114.114.114.114")) - if err!=nil { - log.Warnln("mmdb lookup fail:%s",err.Error()) + _, err = mmdb.Country(net.ParseIP("114.114.114.114")) + if err != nil { + log.Warnln("mmdb lookup fail:%s", err.Error()) return false } return true