From 56d052d160cf29d82309313eb9a829e4f6a7222a Mon Sep 17 00:00:00 2001 From: Timothy Qiu Date: Mon, 30 Oct 2017 15:03:02 +0800 Subject: [PATCH] Adds exception rules config for Global Mode --- .../Base.lproj/PreferencesWinController.xib | 161 +++++++++++------- ShadowsocksX-NG/ProxyConfHelper.m | 21 +++ ShadowsocksX-NG/proxy_conf_helper_version.h | 2 +- .../PreferencesWinController.strings | 3 + proxy_conf_helper/main.m | 15 +- 5 files changed, 135 insertions(+), 67 deletions(-) diff --git a/ShadowsocksX-NG/Base.lproj/PreferencesWinController.xib b/ShadowsocksX-NG/Base.lproj/PreferencesWinController.xib index 76f7a1b..5978286 100644 --- a/ShadowsocksX-NG/Base.lproj/PreferencesWinController.xib +++ b/ShadowsocksX-NG/Base.lproj/PreferencesWinController.xib @@ -1,8 +1,8 @@ - + - + @@ -18,43 +18,43 @@ - + - + - + - + - + - + - - + + - - + + @@ -65,7 +65,7 @@ - - + + @@ -85,8 +85,8 @@ - - + + @@ -130,27 +130,27 @@ - + - - + + - - + + - - + + @@ -164,16 +164,16 @@ - - + + - - + + @@ -189,7 +189,7 @@ - - + + @@ -217,8 +217,8 @@ - - + + @@ -229,7 +229,7 @@ - - + + - - + + @@ -300,27 +300,27 @@ - + - - + + - - + + - - + + @@ -334,8 +334,8 @@ - - + + @@ -351,7 +351,7 @@ - + - - + + - + @@ -541,26 +541,58 @@ - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + @@ -617,6 +649,7 @@ + diff --git a/ShadowsocksX-NG/ProxyConfHelper.m b/ShadowsocksX-NG/ProxyConfHelper.m index d81b947..09d4708 100644 --- a/ShadowsocksX-NG/ProxyConfHelper.m +++ b/ShadowsocksX-NG/ProxyConfHelper.m @@ -114,6 +114,24 @@ GCDWebServer *webServer =nil; } } ++ (void)addArguments4ManualSpecifyProxyExceptions:(NSMutableArray*) args { + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + + NSString* rawExceptions = [defaults stringForKey:@"ProxyExceptions"]; + if (rawExceptions) { + NSCharacterSet* seps = [NSCharacterSet characterSetWithCharactersInString:@", 、"]; + NSCharacterSet* whites = [NSCharacterSet whitespaceAndNewlineCharacterSet]; + NSArray* exceptions = [rawExceptions componentsSeparatedByCharactersInSet:seps]; + for (NSString* rawDomainOrHost in exceptions) { + NSString* domainOrHost = [rawDomainOrHost stringByTrimmingCharactersInSet:whites]; + if ([domainOrHost length] > 0) { + [args addObject:@"-x"]; + [args addObject:domainOrHost]; + } + } + } +} + + (NSString*)getPACFilePath { return [NSString stringWithFormat:@"%@/%@", NSHomeDirectory(), @".ShadowsocksX-NG/gfwlist.js"]; } @@ -129,6 +147,7 @@ GCDWebServer *webServer =nil; NSMutableArray* args = [@[@"--mode", @"auto", @"--pac-url", [url absoluteString]]mutableCopy]; [self addArguments4ManualSpecifyNetworkServices:args]; + [self addArguments4ManualSpecifyProxyExceptions:args]; [self callHelper:args]; } @@ -148,6 +167,7 @@ GCDWebServer *webServer =nil; // } [self addArguments4ManualSpecifyNetworkServices:args]; + [self addArguments4ManualSpecifyProxyExceptions:args]; [self callHelper:args]; [self stopPACServer]; } @@ -162,6 +182,7 @@ GCDWebServer *webServer =nil; , @"--pac-url", [url absoluteString] ]mutableCopy]; [self addArguments4ManualSpecifyNetworkServices:args]; + [self addArguments4ManualSpecifyProxyExceptions:args]; [self callHelper:args]; [self stopPACServer]; } diff --git a/ShadowsocksX-NG/proxy_conf_helper_version.h b/ShadowsocksX-NG/proxy_conf_helper_version.h index 9a39b4b..6e87ff4 100644 --- a/ShadowsocksX-NG/proxy_conf_helper_version.h +++ b/ShadowsocksX-NG/proxy_conf_helper_version.h @@ -9,6 +9,6 @@ #ifndef proxy_conf_helper_version_h #define proxy_conf_helper_version_h -#define kProxyConfHelperVersion @"1.6.0" +#define kProxyConfHelperVersion @"1.7.0" #endif /* proxy_conf_helper_version_h */ diff --git a/ShadowsocksX-NG/zh-Hans.lproj/PreferencesWinController.strings b/ShadowsocksX-NG/zh-Hans.lproj/PreferencesWinController.strings index af7725d..47c4777 100644 --- a/ShadowsocksX-NG/zh-Hans.lproj/PreferencesWinController.strings +++ b/ShadowsocksX-NG/zh-Hans.lproj/PreferencesWinController.strings @@ -74,6 +74,9 @@ /* Class = "NSButtonCell"; title = "Auto Configure"; ObjectID = "bu3-s5-bYM"; */ "bu3-s5-bYM.title" = "自动配置"; +/* Class = "NSTextFieldCell"; title = "Bypass proxy settings for these Hosts & Domains:"; ObjectID = "v4F-L4-s8U"; */ +"v4F-L4-s8U.title" = "忽略这些主机与域的代理设置:"; + /* Class = "NSButtonCell"; title = "Enable Verbose Mode"; ObjectID = "cIS-Wb-Rzg"; */ "cIS-Wb-Rzg.title" = "Enable Verbose Mode"; diff --git a/proxy_conf_helper/main.m b/proxy_conf_helper/main.m index f45a6c5..9b5421b 100644 --- a/proxy_conf_helper/main.m +++ b/proxy_conf_helper/main.m @@ -25,7 +25,7 @@ int main(int argc, const char * argv[]) NSString* privoxyPortString; BRLOptionParser *options = [BRLOptionParser new]; - [options setBanner:@"Usage: %s [-v] [-m auto|global|off] [-u ] [-p ] [-r ]", argv[0]]; + [options setBanner:@"Usage: %s [-v] [-m auto|global|off] [-u ] [-p ] [-r ] [-x ]", argv[0]]; // Version [options addOption:"version" flag:'v' description:@"Print the version number." block:^{ @@ -52,6 +52,11 @@ int main(int argc, const char * argv[]) [options addOption:"network-service" flag:'n' description:@"Manual specify the network profile need to set proxy." blockWithArgument:^(NSString* value){ [networkServiceKeys addObject:value]; }]; + + NSMutableSet* proxyExceptions = [NSMutableSet set]; + [options addOption:"proxy-exception" flag:'x' description:@"Bypass proxy settings for this Host / Domain" blockWithArgument:^(NSString *value) { + [proxyExceptions addObject:value]; + }]; NSError *error = nil; if (![options parseArgc:argc argv:argv error:&error]) { @@ -92,6 +97,12 @@ int main(int argc, const char * argv[]) return 1; } } + + // Bypass these Hosts & Domains if not specified + if ([proxyExceptions count] == 0) { + NSArray* bypass = @[@"127.0.0.1", @"localhost", @"192.168.0.0/16", @"10.0.0.0/8"]; + [proxyExceptions addObjectsFromArray:bypass]; + } static AuthorizationRef authRef; static AuthorizationFlags authFlags; @@ -158,7 +169,7 @@ int main(int argc, const char * argv[]) kCFNetworkProxiesSOCKSPort]; [proxies setObject:[NSNumber numberWithInt:1] forKey:(NSString*) kCFNetworkProxiesSOCKSEnable]; - [proxies setObject:@[@"127.0.0.1", @"localhost", @"192.168.0.0/16", @"10.0.0.0/8"] forKey:(NSString *)kCFNetworkProxiesExceptionsList]; + [proxies setObject:[proxyExceptions allObjects] forKey:(NSString *)kCFNetworkProxiesExceptionsList]; if (privoxyPort != 0) { [proxies setObject:@"127.0.0.1" forKey:(NSString *)