mirror of
https://github.com/zhigang1992/shadowsocks-iOS.git
synced 2026-01-12 22:52:17 +08:00
125 lines
4.9 KiB
Objective-C
125 lines
4.9 KiB
Objective-C
//
|
|
// Created by clowwindy on 14-2-27.
|
|
// Copyright (c) 2014 clowwindy. All rights reserved.
|
|
//
|
|
|
|
#import "ShadowsocksRunner.h"
|
|
#import "local.h"
|
|
|
|
|
|
@implementation ShadowsocksRunner {
|
|
|
|
}
|
|
|
|
+ (BOOL)settingsAreNotComplete {
|
|
if ((![ShadowsocksRunner isUsingPublicServer]) && ([[NSUserDefaults standardUserDefaults] stringForKey:kShadowsocksIPKey] == nil ||
|
|
[[NSUserDefaults standardUserDefaults] stringForKey:kShadowsocksPortKey] == nil ||
|
|
[[NSUserDefaults standardUserDefaults] stringForKey:kShadowsocksPasswordKey] == nil)) {
|
|
return YES;
|
|
} else {
|
|
return NO;
|
|
}
|
|
}
|
|
|
|
+ (BOOL)runProxy {
|
|
if (![ShadowsocksRunner settingsAreNotComplete]) {
|
|
local_main();
|
|
return YES;
|
|
} else {
|
|
#ifdef DEBUG
|
|
NSLog(@"warning: settings are not complete");
|
|
#endif
|
|
return NO;
|
|
}
|
|
}
|
|
|
|
+ (void)reloadConfig {
|
|
if (![ShadowsocksRunner settingsAreNotComplete]) {
|
|
if ([ShadowsocksRunner isUsingPublicServer]) {
|
|
set_config("106.186.124.182", "8911", "Shadowsocks", "aes-128-cfb");
|
|
memcpy(shadowsocks_key, "\x45\xd1\xd9\x9e\xbd\xf5\x8c\x85\x34\x55\xdd\x65\x46\xcd\x06\xd3", 16);
|
|
} else {
|
|
NSString *v = [[NSUserDefaults standardUserDefaults] objectForKey:kShadowsocksEncryptionKey];
|
|
if (!v) {
|
|
v = @"aes-256-cfb";
|
|
}
|
|
set_config([[[NSUserDefaults standardUserDefaults] stringForKey:kShadowsocksIPKey] cStringUsingEncoding:NSUTF8StringEncoding], [[[NSUserDefaults standardUserDefaults] stringForKey:kShadowsocksPortKey] cStringUsingEncoding:NSUTF8StringEncoding], [[[NSUserDefaults standardUserDefaults] stringForKey:kShadowsocksPasswordKey] cStringUsingEncoding:NSUTF8StringEncoding], [v cStringUsingEncoding:NSUTF8StringEncoding]);
|
|
}
|
|
}
|
|
}
|
|
|
|
+ (BOOL)openSSURL:(NSURL *)url {
|
|
if (!url.host) {
|
|
return NO;
|
|
}
|
|
NSString *urlString = [url absoluteString];
|
|
int i = 0;
|
|
NSString *errorReason = nil;
|
|
while(i < 2) {
|
|
if (i == 1) {
|
|
NSData *data = [[NSData alloc] initWithBase64Encoding:url.host];
|
|
NSString *decodedString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
|
urlString = decodedString;
|
|
}
|
|
i++;
|
|
urlString = [urlString stringByReplacingOccurrencesOfString:@"ss://" withString:@"" options:NSAnchoredSearch range:NSMakeRange(0, urlString.length)];
|
|
NSRange firstColonRange = [urlString rangeOfString:@":"];
|
|
NSRange lastColonRange = [urlString rangeOfString:@":" options:NSBackwardsSearch];
|
|
NSRange lastAtRange = [urlString rangeOfString:@"@" options:NSBackwardsSearch];
|
|
if (firstColonRange.length == 0) {
|
|
errorReason = @"colon not found";
|
|
continue;
|
|
}
|
|
if (firstColonRange.location == lastColonRange.location) {
|
|
errorReason = @"only one colon";
|
|
continue;
|
|
}
|
|
if (lastAtRange.length == 0) {
|
|
errorReason = @"at not found";
|
|
continue;
|
|
}
|
|
if (!((firstColonRange.location < lastAtRange.location) && (lastAtRange.location < lastColonRange.location))) {
|
|
errorReason = @"wrong position";
|
|
continue;
|
|
}
|
|
NSString *method = [urlString substringWithRange:NSMakeRange(0, firstColonRange.location)];
|
|
NSString *password = [urlString substringWithRange:NSMakeRange(firstColonRange.location + 1, lastAtRange.location - firstColonRange.location - 1)];
|
|
NSString *IP = [urlString substringWithRange:NSMakeRange(lastAtRange.location + 1, lastColonRange.location - lastAtRange.location - 1)];
|
|
NSString *port = [urlString substringWithRange:NSMakeRange(lastColonRange.location + 1, urlString.length - lastColonRange.location - 1)];
|
|
[ShadowsocksRunner saveConfigForKey:kShadowsocksIPKey value:IP];
|
|
[ShadowsocksRunner saveConfigForKey:kShadowsocksPortKey value:port];
|
|
[ShadowsocksRunner saveConfigForKey:kShadowsocksPasswordKey value:password];
|
|
[ShadowsocksRunner saveConfigForKey:kShadowsocksEncryptionKey value:method];
|
|
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:kShadowsocksUsePublicServer];
|
|
[ShadowsocksRunner reloadConfig];
|
|
return YES;
|
|
}
|
|
|
|
NSLog(@"%@", errorReason);
|
|
return NO;
|
|
}
|
|
|
|
+ (void)saveConfigForKey:(NSString *)key value:(NSString *)value {
|
|
[[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
|
|
}
|
|
|
|
+ (NSString *)configForKey:(NSString *)key {
|
|
return [[NSUserDefaults standardUserDefaults] objectForKey:key];
|
|
}
|
|
|
|
+ (void)setUsingPublicServer:(BOOL)use {
|
|
[[NSUserDefaults standardUserDefaults] setBool:use forKey:kShadowsocksUsePublicServer];
|
|
|
|
}
|
|
|
|
+ (BOOL)isUsingPublicServer {
|
|
NSNumber *usePublicServer = [[NSUserDefaults standardUserDefaults] objectForKey:kShadowsocksUsePublicServer];
|
|
if (usePublicServer != nil) {
|
|
return [usePublicServer boolValue];
|
|
} else {
|
|
return YES;
|
|
}
|
|
}
|
|
|
|
@end
|