From 4f6f392b242e55cce4df219deb8bd7d4230f8283 Mon Sep 17 00:00:00 2001 From: qinyuhang Date: Fri, 12 Aug 2016 10:26:37 +0800 Subject: [PATCH] fix add server from QR code fix add server from QR code --- ShadowsocksX-NG.xcodeproj/project.pbxproj | 2 + ShadowsocksX-NG/Info.plist | 14 +++- ShadowsocksX-NG/Notifications.swift | 3 +- ShadowsocksX-NG/ServerProfile.swift | 16 ++-- ShadowsocksX-NG/Utils.m | 93 +++++++++++++++++++++-- 5 files changed, 110 insertions(+), 18 deletions(-) diff --git a/ShadowsocksX-NG.xcodeproj/project.pbxproj b/ShadowsocksX-NG.xcodeproj/project.pbxproj index d160b0b..6723139 100644 --- a/ShadowsocksX-NG.xcodeproj/project.pbxproj +++ b/ShadowsocksX-NG.xcodeproj/project.pbxproj @@ -825,6 +825,7 @@ "$(inherited)", "$(SDKROOT)/usr/lib/system", "$(PROJECT_DIR)/ShadowsocksX-NG", + "$(PROJECT_DIR)", ); MACOSX_DEPLOYMENT_TARGET = 10.10; PRODUCT_BUNDLE_IDENTIFIER = "com.qiuyuzhou.ShadowsocksX-NG"; @@ -851,6 +852,7 @@ "$(inherited)", "$(SDKROOT)/usr/lib/system", "$(PROJECT_DIR)/ShadowsocksX-NG", + "$(PROJECT_DIR)", ); MACOSX_DEPLOYMENT_TARGET = 10.10; PRODUCT_BUNDLE_IDENTIFIER = "com.qiuyuzhou.ShadowsocksX-NG"; diff --git a/ShadowsocksX-NG/Info.plist b/ShadowsocksX-NG/Info.plist index f350173..5124f8a 100644 --- a/ShadowsocksX-NG/Info.plist +++ b/ShadowsocksX-NG/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2 + 1.2.R CFBundleSignature ???? CFBundleURLTypes @@ -34,6 +34,18 @@ ss + + CFBundleTypeRole + Viewer + CFBundleURLIconFile + menu_icon@2x + CFBundleURLName + shadowsocks + CFBundleURLSchemes + + ssr + + CFBundleVersion 1 diff --git a/ShadowsocksX-NG/Notifications.swift b/ShadowsocksX-NG/Notifications.swift index 69b798f..e511516 100644 --- a/ShadowsocksX-NG/Notifications.swift +++ b/ShadowsocksX-NG/Notifications.swift @@ -10,4 +10,5 @@ import Foundation let NOTIFY_SERVER_PROFILES_CHANGED = "NOTIFY_SERVER_PROFILES_CHANGED" let NOTIFY_ADV_PROXY_CONF_CHANGED = "NOTIFY_ADV_PROXY_CONF_CHANGED" -let NOTIFY_ADV_CONF_CHANGED = "NOTIFY_ADV_CONF_CHANGED" \ No newline at end of file +let NOTIFY_ADV_CONF_CHANGED = "NOTIFY_ADV_CONF_CHANGED" +let NOTIFY_INVALIDE_QR = "NOTIFY_INVALIDE_QR" \ No newline at end of file diff --git a/ShadowsocksX-NG/ServerProfile.swift b/ShadowsocksX-NG/ServerProfile.swift index 2042835..1c149ab 100644 --- a/ShadowsocksX-NG/ServerProfile.swift +++ b/ShadowsocksX-NG/ServerProfile.swift @@ -39,24 +39,20 @@ class ServerProfile: NSObject { profile.serverPort = (data["ServerPort"] as! NSNumber).unsignedShortValue profile.method = data["Method"] as! String profile.password = data["Password"] as! String + profile.ssrObfs = data["ssrObfs"] as! String + profile.ssrObfsParam = data["ssrObfsParam"] as! String + profile.ssrProtocol = data["ssrProtocol"] as! String + profile.ssrProtocolParam = data["ssrProtocolParam"] as! String + if let remark = data["Remark"] { profile.remark = remark as! String } if let ota = data["OTA"] { profile.ota = ota as! Bool } - if let ssrProtocol = data["ssrProtocol"]{ - profile.ssrProtocol = ssrProtocol as! String - } if let ssrProtocolParam = data["ssrProtocolParam"]{ profile.ssrProtocolParam = ssrProtocolParam as! String } - if let ssrObfs = data["ssrObfs"]{ - profile.ssrObfs = ssrObfs as! String - } - if let ssrObfsParam = data["ssrObfsParam"]{ - profile.ssrObfsParam = ssrObfsParam as! String - } } if let id = data["Id"] as? String { @@ -151,7 +147,7 @@ class ServerProfile: NSObject { } func URL() -> NSURL? { - if(ssrObfs==""){ + if(ssrObfs=="plain"){ let parts = "\(method):\(password)@\(serverHost):\(serverPort)" let base64String = parts.dataUsingEncoding(NSUTF8StringEncoding)? .base64EncodedStringWithOptions(NSDataBase64EncodingOptions()) diff --git a/ShadowsocksX-NG/Utils.m b/ShadowsocksX-NG/Utils.m index d463664..468344b 100644 --- a/ShadowsocksX-NG/Utils.m +++ b/ShadowsocksX-NG/Utils.m @@ -53,7 +53,7 @@ void ScanQRCodeOnScreen() { CGImageRef image = CGDisplayCreateImage(displays[displaysIndex]); NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:image]]; for (CIQRCodeFeature *feature in features) { - NSLog(@"%@", feature.messageString); +// NSLog(@"%@", feature.messageString); if ( [feature.messageString hasPrefix:@"ss://"] ) { [foundSSUrls addObject:[NSURL URLWithString:feature.messageString]]; @@ -77,7 +77,6 @@ void ScanQRCodeOnScreen() { // 解析SS URL,如果成功则返回一个与ServerProfile类兼容的dict // 或SSR URL,ServerProfile类已经默认添加SSR参数,默认放空,如果URL为SSR://则改变解析方法 // ss:// + base64(method:password@domain:port) -// ssr:// + base64(abc.xyz:12345:auth_sha1_v2:rc4-md5:tls1.2_ticket_auth:{base64(password)}/?obfsparam={base64(混淆参数(网址))}&remarks={base64(节点名称)}) NSDictionary* ParseSSURL(NSURL* url) { if (!url.host) { return nil; @@ -86,7 +85,7 @@ NSDictionary* ParseSSURL(NSURL* url) { NSString *urlString = [url absoluteString]; int i = 0; NSString *errorReason = nil; - if([[NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:NULL ] hasPrefix:@"ss://"]){ + if([urlString hasPrefix:@"ss://"]){ while(i < 2) { if (i == 1) { NSString* host = url.host; @@ -136,8 +135,90 @@ NSDictionary* ParseSSURL(NSURL* url) { }; } - }else if ([[NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:NULL ] hasPrefix:@"ssr://"]){ - NSLog(@"Have One ssr QR coming"); + }else if ([urlString hasPrefix:@"ssr://"]){ + // ssr:// + base64(abc.xyz:12345:auth_sha1_v2:rc4-md5:tls1.2_ticket_auth:{base64(password)}/?obfsparam={base64(混淆参数(网址))}&remarks={base64(节点名称)}) + urlString = [urlString stringByReplacingOccurrencesOfString:@"ssr://" withString:@"" options:NSAnchoredSearch range:NSMakeRange(0, urlString.length)]; + NSData *data = [[NSData alloc] initWithBase64EncodedString:urlString options:0]; + NSString *decodedString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + urlString = decodedString; + + if (data == NULL) { + [[NSNotificationCenter defaultCenter] + postNotificationName:@"NOTIFY_INVALIDE_QR" + object:nil + userInfo: @{ @"urls": @"配置二维码无效!", + @"source": @"qrcode" + } + ]; + }else{ + NSRange paramSplit = [decodedString rangeOfString:@"?"]; + NSString *firstParam = [decodedString substringToIndex:paramSplit.location-1]; + NSString *lastParam = [decodedString substringFromIndex:paramSplit.location]; + lastParam = [lastParam substringFromIndex:1]; + + NSArray *lastParamArray = [lastParam componentsSeparatedByString:@"&"]; + NSMutableDictionary *parserLastParamDict = [[NSMutableDictionary alloc]init]; + for (int i=0; i