From 106e2cd5b2d2ffe624810a5419ed61e3467d2e30 Mon Sep 17 00:00:00 2001 From: yicheng <11733500+yichengchen@users.noreply.github.com> Date: Sat, 19 Dec 2020 19:15:19 +0800 Subject: [PATCH] feat: add pac and filterInterface interface in proxyConfigHelper --- ClashX/General/Managers/Settings.swift | 6 +++ .../General/Managers/SystemProxyManager.swift | 12 +++-- ProxyConfigHelper/Helper-Info.plist | 2 +- ProxyConfigHelper/ProxyConfigHelper.m | 15 +++--- .../ProxyConfigRemoteProcessProtocol.h | 6 ++- ProxyConfigHelper/ProxySettingTool.h | 11 +++-- ProxyConfigHelper/ProxySettingTool.m | 47 +++++++++++++------ 7 files changed, 70 insertions(+), 29 deletions(-) diff --git a/ClashX/General/Managers/Settings.swift b/ClashX/General/Managers/Settings.swift index 73dad5f..a120f3c 100644 --- a/ClashX/General/Managers/Settings.swift +++ b/ClashX/General/Managers/Settings.swift @@ -9,4 +9,10 @@ enum Settings { @UserDefault("mmdbDownloadUrl", defaultValue: "") static var mmdbDownloadUrl:String + + @UserDefault("filterInterface", defaultValue: true) + static var filterInterface:Bool + + @UserDefault("usePacMode", defaultValue: false) + static var usePacMode:Bool } diff --git a/ClashX/General/Managers/SystemProxyManager.swift b/ClashX/General/Managers/SystemProxyManager.swift index 00371a9..7288c59 100644 --- a/ClashX/General/Managers/SystemProxyManager.swift +++ b/ClashX/General/Managers/SystemProxyManager.swift @@ -48,7 +48,7 @@ class SystemProxyManager: NSObject { func enableProxy() { let port = ConfigManager.shared.currentConfig?.usedHttpPort ?? 0 let socketPort = ConfigManager.shared.currentConfig?.usedSocksPort ?? 0 - SystemProxyManager.shared.enableProxy(port: port, socksPort: socketPort) + enableProxy(port: port, socksPort: socketPort) } func enableProxy(port: Int, socksPort: Int) { @@ -57,7 +57,11 @@ class SystemProxyManager: NSObject { return } Logger.log("enableProxy", level: .debug) - helper?.enableProxy(withPort: Int32(port), socksPort: Int32(socksPort), error: { error in + helper?.enableProxy(withPort: Int32(port), + socksPort: Int32(socksPort), + pac:nil, + filterInterface: Settings.filterInterface, + error: { error in if let error = error { Logger.log("enableProxy \(error)", level: .error) } @@ -74,7 +78,7 @@ class SystemProxyManager: NSObject { Logger.log("disableProxy", level: .debug) if disableRestoreProxy || forceDisable { - helper?.disableProxy { error in + helper?.disableProxy(withFilterInterface: Settings.filterInterface) { error in if let error = error { Logger.log("disableProxy \(error)", level: .error) } @@ -83,7 +87,7 @@ class SystemProxyManager: NSObject { return } - helper?.restoreProxy(withCurrentPort: Int32(port), socksPort: Int32(socksPort), info: savedProxyInfo, error: { error in + helper?.restoreProxy(withCurrentPort: Int32(port), socksPort: Int32(socksPort), info: savedProxyInfo, filterInterface: Settings.filterInterface, error: { error in if let error = error { Logger.log("restoreProxy \(error)", level: .error) } diff --git a/ProxyConfigHelper/Helper-Info.plist b/ProxyConfigHelper/Helper-Info.plist index 6c30d91..9246e29 100755 --- a/ProxyConfigHelper/Helper-Info.plist +++ b/ProxyConfigHelper/Helper-Info.plist @@ -9,7 +9,7 @@ CFBundleName com.west2online.ClashX.ProxyConfigHelper CFBundleShortVersionString - 1.6 + 1.7 CFBundleVersion 2 SMAuthorizedClients diff --git a/ProxyConfigHelper/ProxyConfigHelper.m b/ProxyConfigHelper/ProxyConfigHelper.m index a3f49ad..3ad0e25 100644 --- a/ProxyConfigHelper/ProxyConfigHelper.m +++ b/ProxyConfigHelper/ProxyConfigHelper.m @@ -89,19 +89,21 @@ ProxyConfigRemoteProcessProtocol } - (void)enableProxyWithPort:(int)port - socksPort:(int)socksPort - error:(stringReplyBlock)reply { + socksPort:(int)socksPort + pac:(NSString *)pac + filterInterface:(BOOL)filterInterface + error:(stringReplyBlock)reply { dispatch_async(dispatch_get_main_queue(), ^{ ProxySettingTool *tool = [ProxySettingTool new]; - [tool enableProxyWithport:port socksPort:socksPort]; + [tool enableProxyWithport:port socksPort:socksPort pacUrl:pac filterInterface:filterInterface]; reply(nil); }); } -- (void)disableProxy:(stringReplyBlock)reply { +- (void)disableProxyWithFilterInterface:(BOOL)filterInterface reply:(stringReplyBlock)reply { dispatch_async(dispatch_get_main_queue(), ^{ ProxySettingTool *tool = [ProxySettingTool new]; - [tool disableProxy]; + [tool disableProxyWithfilterInterface:filterInterface]; reply(nil); }); } @@ -110,10 +112,11 @@ ProxyConfigRemoteProcessProtocol - (void)restoreProxyWithCurrentPort:(int)port socksPort:(int)socksPort info:(NSDictionary *)dict + filterInterface:(BOOL)filterInterface error:(stringReplyBlock)reply { dispatch_async(dispatch_get_main_queue(), ^{ ProxySettingTool *tool = [ProxySettingTool new]; - [tool restoreProxySettint:dict currentPort:port currentSocksPort:socksPort]; + [tool restoreProxySettint:dict currentPort:port currentSocksPort:socksPort filterInterface:filterInterface]; reply(nil); }); } diff --git a/ProxyConfigHelper/ProxyConfigRemoteProcessProtocol.h b/ProxyConfigHelper/ProxyConfigRemoteProcessProtocol.h index 1c35dce..0f16a0b 100644 --- a/ProxyConfigHelper/ProxyConfigRemoteProcessProtocol.h +++ b/ProxyConfigHelper/ProxyConfigRemoteProcessProtocol.h @@ -19,13 +19,17 @@ typedef void(^dictReplyBlock)(NSDictionary *); - (void)enableProxyWithPort:(int)port socksPort:(int)socksPort + pac:(NSString *)pac + filterInterface:(BOOL)filterInterface error:(stringReplyBlock)reply; -- (void)disableProxy:(stringReplyBlock)reply; +- (void)disableProxyWithFilterInterface:(BOOL)filterInterface + reply:(stringReplyBlock)reply; - (void)restoreProxyWithCurrentPort:(int)port socksPort:(int)socksPort info:(NSDictionary *)dict + filterInterface:(BOOL)filterInterface error:(stringReplyBlock)reply; - (void)getCurrentProxySetting:(dictReplyBlock)reply; diff --git a/ProxyConfigHelper/ProxySettingTool.h b/ProxyConfigHelper/ProxySettingTool.h index 54615bf..a11bb04 100644 --- a/ProxyConfigHelper/ProxySettingTool.h +++ b/ProxyConfigHelper/ProxySettingTool.h @@ -12,10 +12,15 @@ NS_ASSUME_NONNULL_BEGIN @interface ProxySettingTool : NSObject -- (void)enableProxyWithport:(int)port socksPort:(int)socksPort; -- (void)disableProxy; +- (void)enableProxyWithport:(int)port socksPort:(int)socksPort + pacUrl:(NSString *)pacUrl + filterInterface:(BOOL)filterInterFace; +- (void)disableProxyWithfilterInterface:(BOOL)filterInterFace; -- (void)restoreProxySettint:(NSDictionary *)savedInfo currentPort:(int)port currentSocksPort:(int)socksPort; +- (void)restoreProxySettint:(NSDictionary *)savedInfo + currentPort:(int)port + currentSocksPort:(int)socksPort + filterInterface:(BOOL)filterInterface; + (NSMutableDictionary *)currentProxySettings; @end diff --git a/ProxyConfigHelper/ProxySettingTool.m b/ProxyConfigHelper/ProxySettingTool.m index ff65922..c794159 100644 --- a/ProxyConfigHelper/ProxySettingTool.m +++ b/ProxyConfigHelper/ProxySettingTool.m @@ -27,25 +27,31 @@ // MARK: - Public -- (void)enableProxyWithport:(int)port socksPort:(int)socksPort { +- (void)enableProxyWithport:(int)port socksPort:(int)socksPort + pacUrl:(NSString *)pacUrl + filterInterface:(BOOL)filterInterface { + [self applySCNetworkSettingWithRef:^(SCPreferencesRef ref) { - [ProxySettingTool getDiviceListWithPrefRef:ref devices:^(NSString *key, NSDictionary *dict) { - [self enableProxySettings:ref interface:key port:port socksPort:socksPort]; + [ProxySettingTool getDiviceListWithPrefRef:ref filterInterface:filterInterface devices:^(NSString *key, NSDictionary *dict) { + [self enableProxySettings:ref interface:key port:port socksPort:socksPort pac:pacUrl]; }]; }]; } -- (void)disableProxy { +- (void)disableProxyWithfilterInterface:(BOOL)filterInterface { [self applySCNetworkSettingWithRef:^(SCPreferencesRef ref) { - [ProxySettingTool getDiviceListWithPrefRef:ref devices:^(NSString *key, NSDictionary *dict) { + [ProxySettingTool getDiviceListWithPrefRef:ref filterInterface:filterInterface devices:^(NSString *key, NSDictionary *dict) { [self disableProxySetting:ref interface:key]; }]; }]; } -- (void)restoreProxySettint:(NSDictionary *)savedInfo currentPort:(int)port currentSocksPort:(int)socksPort { +- (void)restoreProxySettint:(NSDictionary *)savedInfo + currentPort:(int)port + currentSocksPort:(int)socksPort + filterInterface:(BOOL)filterInterface{ [self applySCNetworkSettingWithRef:^(SCPreferencesRef ref) { - [ProxySettingTool getDiviceListWithPrefRef:ref devices:^(NSString *key, NSDictionary *dict) { + [ProxySettingTool getDiviceListWithPrefRef:ref filterInterface:filterInterface devices:^(NSString *key, NSDictionary *dict) { NSDictionary *proxySetting = savedInfo[key]; if (![proxySetting isKindOfClass:[NSDictionary class]]) { proxySetting = nil; @@ -88,7 +94,7 @@ + (NSMutableDictionary *)currentProxySettings { __block NSMutableDictionary *info = [NSMutableDictionary dictionary]; SCPreferencesRef ref = SCPreferencesCreate(nil, CFSTR("ClashX"), nil); - [ProxySettingTool getDiviceListWithPrefRef:ref devices:^(NSString *key, NSDictionary *dev) { + [ProxySettingTool getDiviceListWithPrefRef:ref filterInterface:YES devices:^(NSString *key, NSDictionary *dev) { NSDictionary *proxySettings = dev[(__bridge NSString *)kSCEntNetProxies]; info[key] = [proxySettings copy]; }]; @@ -141,11 +147,14 @@ return ignoreList; } -- (NSDictionary *)getProxySetting:(BOOL)enable port:(int) port socksPort: (int)socksPort { +- (NSDictionary *)getProxySetting:(BOOL)enable port:(int) port + socksPort: (int)socksPort pac:(NSString *)pac { + NSMutableDictionary *proxySettings = [NSMutableDictionary dictionary]; NSString *ip = enable ? @"127.0.0.1" : @""; NSInteger enableInt = enable ? 1 : 0; + NSInteger enablePac = [pac length] > 0; proxySettings[(__bridge NSString *)kCFNetworkProxiesHTTPProxy] = ip; proxySettings[(__bridge NSString *)kCFNetworkProxiesHTTPEnable] = @(enableInt); @@ -165,6 +174,13 @@ proxySettings[(__bridge NSString *)kCFNetworkProxiesSOCKSPort] = nil; } + proxySettings[(__bridge NSString *)kCFNetworkProxiesProxyAutoConfigEnable] = @(enablePac); + if (enablePac) { + proxySettings[(__bridge NSString *)kCFNetworkProxiesProxyAutoConfigURLString] = pac; + } else { + proxySettings[(__bridge NSString *)kCFNetworkProxiesProxyAutoConfigURLString] = nil; + } + if (enable) { proxySettings[(__bridge NSString *)kCFNetworkProxiesExceptionsList] = [self getIgnoreList]; } else { @@ -184,16 +200,17 @@ - (void)enableProxySettings:(SCPreferencesRef)prefs interface:(NSString *)interfaceKey port:(int) port - socksPort:(int) socksPort { + socksPort:(int) socksPort + pac:(NSString *)pac { - NSDictionary *proxySettings = [self getProxySetting:YES port:port socksPort:socksPort]; + NSDictionary *proxySettings = [self getProxySetting:YES port:port socksPort:socksPort pac:pac]; [self setProxyConfig:prefs interface:interfaceKey proxySetting:proxySettings]; } - (void)disableProxySetting:(SCPreferencesRef)prefs interface:(NSString *)interfaceKey { - NSDictionary *proxySettings = [self getProxySetting:NO port:0 socksPort:0]; + NSDictionary *proxySettings = [self getProxySetting:NO port:0 socksPort:0 pac:nil]; [self setProxyConfig:prefs interface:interfaceKey proxySetting:proxySettings]; } @@ -206,12 +223,14 @@ (__bridge CFDictionaryRef)proxySettings); } -+ (void)getDiviceListWithPrefRef:(SCPreferencesRef)ref devices:(void(^)(NSString *, NSDictionary *))callback { ++ (void)getDiviceListWithPrefRef:(SCPreferencesRef)ref + filterInterface:(BOOL)filterInterface + devices:(void(^)(NSString *, NSDictionary *))callback { NSDictionary *sets = (__bridge NSDictionary *)SCPreferencesGetValue(ref, kSCPrefNetworkServices); for (NSString *key in [sets allKeys]) { NSMutableDictionary *dict = [sets objectForKey:key]; NSString *hardware = [dict valueForKeyPath:@"Interface.Hardware"]; - if ([hardware isEqualToString:@"AirPort"] + if (!filterInterface || [hardware isEqualToString:@"AirPort"] || [hardware isEqualToString:@"Wi-Fi"] || [hardware isEqualToString:@"Ethernet"] ) {