feat: add pac and filterInterface interface in proxyConfigHelper

This commit is contained in:
yicheng 2020-12-19 19:15:19 +08:00
parent 9364197586
commit 106e2cd5b2
No known key found for this signature in database
GPG Key ID: 7CF411A6623B1C0A
7 changed files with 70 additions and 29 deletions

View File

@ -9,4 +9,10 @@
enum Settings { enum Settings {
@UserDefault("mmdbDownloadUrl", defaultValue: "") @UserDefault("mmdbDownloadUrl", defaultValue: "")
static var mmdbDownloadUrl:String static var mmdbDownloadUrl:String
@UserDefault("filterInterface", defaultValue: true)
static var filterInterface:Bool
@UserDefault("usePacMode", defaultValue: false)
static var usePacMode:Bool
} }

View File

@ -48,7 +48,7 @@ class SystemProxyManager: NSObject {
func enableProxy() { func enableProxy() {
let port = ConfigManager.shared.currentConfig?.usedHttpPort ?? 0 let port = ConfigManager.shared.currentConfig?.usedHttpPort ?? 0
let socketPort = ConfigManager.shared.currentConfig?.usedSocksPort ?? 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) { func enableProxy(port: Int, socksPort: Int) {
@ -57,7 +57,11 @@ class SystemProxyManager: NSObject {
return return
} }
Logger.log("enableProxy", level: .debug) 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 { if let error = error {
Logger.log("enableProxy \(error)", level: .error) Logger.log("enableProxy \(error)", level: .error)
} }
@ -74,7 +78,7 @@ class SystemProxyManager: NSObject {
Logger.log("disableProxy", level: .debug) Logger.log("disableProxy", level: .debug)
if disableRestoreProxy || forceDisable { if disableRestoreProxy || forceDisable {
helper?.disableProxy { error in helper?.disableProxy(withFilterInterface: Settings.filterInterface) { error in
if let error = error { if let error = error {
Logger.log("disableProxy \(error)", level: .error) Logger.log("disableProxy \(error)", level: .error)
} }
@ -83,7 +87,7 @@ class SystemProxyManager: NSObject {
return 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 { if let error = error {
Logger.log("restoreProxy \(error)", level: .error) Logger.log("restoreProxy \(error)", level: .error)
} }

View File

@ -9,7 +9,7 @@
<key>CFBundleName</key> <key>CFBundleName</key>
<string>com.west2online.ClashX.ProxyConfigHelper</string> <string>com.west2online.ClashX.ProxyConfigHelper</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.6</string> <string>1.7</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>2</string> <string>2</string>
<key>SMAuthorizedClients</key> <key>SMAuthorizedClients</key>

View File

@ -90,18 +90,20 @@ ProxyConfigRemoteProcessProtocol
- (void)enableProxyWithPort:(int)port - (void)enableProxyWithPort:(int)port
socksPort:(int)socksPort socksPort:(int)socksPort
pac:(NSString *)pac
filterInterface:(BOOL)filterInterface
error:(stringReplyBlock)reply { error:(stringReplyBlock)reply {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
ProxySettingTool *tool = [ProxySettingTool new]; ProxySettingTool *tool = [ProxySettingTool new];
[tool enableProxyWithport:port socksPort:socksPort]; [tool enableProxyWithport:port socksPort:socksPort pacUrl:pac filterInterface:filterInterface];
reply(nil); reply(nil);
}); });
} }
- (void)disableProxy:(stringReplyBlock)reply { - (void)disableProxyWithFilterInterface:(BOOL)filterInterface reply:(stringReplyBlock)reply {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
ProxySettingTool *tool = [ProxySettingTool new]; ProxySettingTool *tool = [ProxySettingTool new];
[tool disableProxy]; [tool disableProxyWithfilterInterface:filterInterface];
reply(nil); reply(nil);
}); });
} }
@ -110,10 +112,11 @@ ProxyConfigRemoteProcessProtocol
- (void)restoreProxyWithCurrentPort:(int)port - (void)restoreProxyWithCurrentPort:(int)port
socksPort:(int)socksPort socksPort:(int)socksPort
info:(NSDictionary *)dict info:(NSDictionary *)dict
filterInterface:(BOOL)filterInterface
error:(stringReplyBlock)reply { error:(stringReplyBlock)reply {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
ProxySettingTool *tool = [ProxySettingTool new]; ProxySettingTool *tool = [ProxySettingTool new];
[tool restoreProxySettint:dict currentPort:port currentSocksPort:socksPort]; [tool restoreProxySettint:dict currentPort:port currentSocksPort:socksPort filterInterface:filterInterface];
reply(nil); reply(nil);
}); });
} }

View File

@ -19,13 +19,17 @@ typedef void(^dictReplyBlock)(NSDictionary *);
- (void)enableProxyWithPort:(int)port - (void)enableProxyWithPort:(int)port
socksPort:(int)socksPort socksPort:(int)socksPort
pac:(NSString *)pac
filterInterface:(BOOL)filterInterface
error:(stringReplyBlock)reply; error:(stringReplyBlock)reply;
- (void)disableProxy:(stringReplyBlock)reply; - (void)disableProxyWithFilterInterface:(BOOL)filterInterface
reply:(stringReplyBlock)reply;
- (void)restoreProxyWithCurrentPort:(int)port - (void)restoreProxyWithCurrentPort:(int)port
socksPort:(int)socksPort socksPort:(int)socksPort
info:(NSDictionary *)dict info:(NSDictionary *)dict
filterInterface:(BOOL)filterInterface
error:(stringReplyBlock)reply; error:(stringReplyBlock)reply;
- (void)getCurrentProxySetting:(dictReplyBlock)reply; - (void)getCurrentProxySetting:(dictReplyBlock)reply;

View File

@ -12,10 +12,15 @@ NS_ASSUME_NONNULL_BEGIN
@interface ProxySettingTool : NSObject @interface ProxySettingTool : NSObject
- (void)enableProxyWithport:(int)port socksPort:(int)socksPort; - (void)enableProxyWithport:(int)port socksPort:(int)socksPort
- (void)disableProxy; 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<NSString *,NSDictionary *> *)currentProxySettings; + (NSMutableDictionary<NSString *,NSDictionary *> *)currentProxySettings;
@end @end

View File

@ -27,25 +27,31 @@
// MARK: - Public // 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) { [self applySCNetworkSettingWithRef:^(SCPreferencesRef ref) {
[ProxySettingTool getDiviceListWithPrefRef:ref devices:^(NSString *key, NSDictionary *dict) { [ProxySettingTool getDiviceListWithPrefRef:ref filterInterface:filterInterface devices:^(NSString *key, NSDictionary *dict) {
[self enableProxySettings:ref interface:key port:port socksPort:socksPort]; [self enableProxySettings:ref interface:key port:port socksPort:socksPort pac:pacUrl];
}]; }];
}]; }];
} }
- (void)disableProxy { - (void)disableProxyWithfilterInterface:(BOOL)filterInterface {
[self applySCNetworkSettingWithRef:^(SCPreferencesRef ref) { [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]; [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) { [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]; NSDictionary *proxySetting = savedInfo[key];
if (![proxySetting isKindOfClass:[NSDictionary class]]) { if (![proxySetting isKindOfClass:[NSDictionary class]]) {
proxySetting = nil; proxySetting = nil;
@ -88,7 +94,7 @@
+ (NSMutableDictionary<NSString *,NSDictionary *> *)currentProxySettings { + (NSMutableDictionary<NSString *,NSDictionary *> *)currentProxySettings {
__block NSMutableDictionary<NSString *,NSDictionary *> *info = [NSMutableDictionary dictionary]; __block NSMutableDictionary<NSString *,NSDictionary *> *info = [NSMutableDictionary dictionary];
SCPreferencesRef ref = SCPreferencesCreate(nil, CFSTR("ClashX"), nil); 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]; NSDictionary *proxySettings = dev[(__bridge NSString *)kSCEntNetProxies];
info[key] = [proxySettings copy]; info[key] = [proxySettings copy];
}]; }];
@ -141,11 +147,14 @@
return ignoreList; 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]; NSMutableDictionary *proxySettings = [NSMutableDictionary dictionary];
NSString *ip = enable ? @"127.0.0.1" : @""; NSString *ip = enable ? @"127.0.0.1" : @"";
NSInteger enableInt = enable ? 1 : 0; NSInteger enableInt = enable ? 1 : 0;
NSInteger enablePac = [pac length] > 0;
proxySettings[(__bridge NSString *)kCFNetworkProxiesHTTPProxy] = ip; proxySettings[(__bridge NSString *)kCFNetworkProxiesHTTPProxy] = ip;
proxySettings[(__bridge NSString *)kCFNetworkProxiesHTTPEnable] = @(enableInt); proxySettings[(__bridge NSString *)kCFNetworkProxiesHTTPEnable] = @(enableInt);
@ -165,6 +174,13 @@
proxySettings[(__bridge NSString *)kCFNetworkProxiesSOCKSPort] = nil; 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) { if (enable) {
proxySettings[(__bridge NSString *)kCFNetworkProxiesExceptionsList] = [self getIgnoreList]; proxySettings[(__bridge NSString *)kCFNetworkProxiesExceptionsList] = [self getIgnoreList];
} else { } else {
@ -184,16 +200,17 @@
- (void)enableProxySettings:(SCPreferencesRef)prefs - (void)enableProxySettings:(SCPreferencesRef)prefs
interface:(NSString *)interfaceKey interface:(NSString *)interfaceKey
port:(int) port 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]; [self setProxyConfig:prefs interface:interfaceKey proxySetting:proxySettings];
} }
- (void)disableProxySetting:(SCPreferencesRef)prefs - (void)disableProxySetting:(SCPreferencesRef)prefs
interface:(NSString *)interfaceKey { 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]; [self setProxyConfig:prefs interface:interfaceKey proxySetting:proxySettings];
} }
@ -206,12 +223,14 @@
(__bridge CFDictionaryRef)proxySettings); (__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); NSDictionary *sets = (__bridge NSDictionary *)SCPreferencesGetValue(ref, kSCPrefNetworkServices);
for (NSString *key in [sets allKeys]) { for (NSString *key in [sets allKeys]) {
NSMutableDictionary *dict = [sets objectForKey:key]; NSMutableDictionary *dict = [sets objectForKey:key];
NSString *hardware = [dict valueForKeyPath:@"Interface.Hardware"]; NSString *hardware = [dict valueForKeyPath:@"Interface.Hardware"];
if ([hardware isEqualToString:@"AirPort"] if (!filterInterface || [hardware isEqualToString:@"AirPort"]
|| [hardware isEqualToString:@"Wi-Fi"] || [hardware isEqualToString:@"Wi-Fi"]
|| [hardware isEqualToString:@"Ethernet"] || [hardware isEqualToString:@"Ethernet"]
) { ) {