From be7d45317c3895faca1633f3cf14b612aebbfd27 Mon Sep 17 00:00:00 2001 From: qinyuhang Date: Fri, 13 Jan 2017 00:22:16 +0800 Subject: [PATCH] fix QR code bug --- ShadowsocksX-NG/Utils.m | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/ShadowsocksX-NG/Utils.m b/ShadowsocksX-NG/Utils.m index e1220db..62d668f 100644 --- a/ShadowsocksX-NG/Utils.m +++ b/ShadowsocksX-NG/Utils.m @@ -74,6 +74,19 @@ void ScanQRCodeOnScreen() { ]; } +NSString* decode64(NSString* str){ + + str = [str stringByReplacingOccurrencesOfString:@"-" withString:@"+"]; + str = [str stringByReplacingOccurrencesOfString:@"_" withString:@"/"]; + if(str.length%4){ + NSInteger length = (4-str.length%4) + str.length; + str = [str stringByPaddingToLength: length withString:@"=" startingAtIndex:0]; + } + NSData* decodeData = [[NSData alloc] initWithBase64EncodedString:str options:0]; + NSString* decodeStr = [[NSString alloc] initWithData:decodeData encoding:NSUTF8StringEncoding]; + return decodeStr; +} + // 解析SS URL,如果成功则返回一个与ServerProfile类兼容的dict // 或SSR URL,ServerProfile类已经默认添加SSR参数,默认放空,如果URL为SSR://则改变解析方法 // ss:// + base64(method:password@domain:port) @@ -140,21 +153,10 @@ NSDictionary* ParseSSURL(NSURL* url) { urlString = [urlString stringByReplacingOccurrencesOfString:@"ssr://" withString:@"" options:NSAnchoredSearch range:NSMakeRange(0, urlString.length)]; - urlString = [urlString stringByReplacingOccurrencesOfString:@"-" withString:@"+"]; - urlString = [urlString stringByReplacingOccurrencesOfString:@"_" withString:@"/"]; - if ([urlString length]%4!=0) { - int n = 4 - [urlString length]%4; - if (1==n) { - urlString = [urlString stringByAppendingString:@"="]; - } else if (2==n) { - urlString = [urlString stringByAppendingString:@"=="]; - } - } - NSData *data = [[NSData alloc] initWithBase64EncodedString:urlString options:0]; - NSString *decodedString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; +// NSData *data = [[NSData alloc] initWithBase64EncodedString:urlString options:0]; + NSString *decodedString = decode64(urlString);//[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; urlString = decodedString; - - if (data == NULL) { + if ([decodedString isEqual: @""]) { [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFY_INVALIDE_QR" object:nil @@ -175,7 +177,8 @@ NSDictionary* ParseSSURL(NSURL* url) { NSRange lastParamSplit = [toSplitString rangeOfString:@"="]; if (lastParamSplit.location != NSNotFound) { NSString *key = [toSplitString substringToIndex:lastParamSplit.location]; - NSString *value = [[NSString alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:[[[toSplitString stringByReplacingOccurrencesOfString:@"-" withString:@"+"] stringByReplacingOccurrencesOfString:@"_" withString:@"/"]substringFromIndex:lastParamSplit.location+1] options:0]encoding:NSUTF8StringEncoding]; + NSString *value = decode64([toSplitString substringFromIndex:lastParamSplit.location+1]); + // [[NSString alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:[[[toSplitString stringByReplacingOccurrencesOfString:@"-" withString:@"+"] stringByReplacingOccurrencesOfString:@"_" withString:@"/"]substringFromIndex:lastParamSplit.location+1] options:0]encoding:NSUTF8StringEncoding]; // NSString *value = [toSplitString substringFromIndex:lastParamSplit.location+1]; [parserLastParamDict setValue: value forKey: key]; } @@ -205,14 +208,14 @@ NSDictionary* ParseSSURL(NSURL* url) { firstParam = [firstParam substringFromIndex:range.location + range.length]; // range = [firstParam rangeOfString:@":"]; - NSString *password = [[NSString alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:firstParam options:0]encoding:NSUTF8StringEncoding];//第五个参数是base64密码 + NSString *password = decode64(firstParam);// [[NSString alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:firstParam options:0]encoding:NSUTF8StringEncoding];//第五个参数是base64密码 NSString *ssrObfsParam = @""; NSString *remarks = @""; NSString *ssrProtocolParam = @""; NSString *ssrGroup = @""; for (NSString *key in parserLastParamDict) { - NSLog(@"key: %@ value: %@", key, parserLastParamDict[key]); +// NSLog(@"key: %@ value: %@", key, parserLastParamDict[key]); if ([key isEqual: @"obfsparam"]) { ssrObfsParam = parserLastParamDict[key]; } else if ([key isEqual: @"remarks"]) { @@ -233,7 +236,7 @@ NSDictionary* ParseSSURL(NSURL* url) { @"ssrProtocol":ssrProtocol, @"ssrProtocolParam":ssrProtocolParam, @"Remark":remarks, - @"Group":ssrGroup, + @"ssrGroup":ssrGroup, }; } }