Skip to content

Commit

Permalink
add sorter
Browse files Browse the repository at this point in the history
  • Loading branch information
longbai committed Aug 1, 2015
1 parent fbaaef5 commit 4b5d5f5
Show file tree
Hide file tree
Showing 13 changed files with 312 additions and 276 deletions.
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
#Changelog

## 0.2.0 (2015-08-01)

### 增加
* Dnspod 企业版支持
* 外部排序接口

## 0.1.1 (2015-07-16)

### 增加
* localdns 劫持检测


## 0.1.0 (2015-07-15)

### 增加
Expand Down
6 changes: 6 additions & 0 deletions HappyDNS/Common/QNDnsManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,17 @@

@class QNNetworkInfo;
@class QNDomain;

@protocol QNIpSorter <NSObject>
- (NSArray *)sort:(NSArray*)ips;
@end

@interface QNDnsManager : NSObject
- (NSArray *)query:(NSString *)domain;
- (NSArray *)queryWithDomain:(QNDomain *)domain;
- (void)onNetworkChange:(QNNetworkInfo *)netInfo;
- (instancetype)init:(NSArray *)resolvers networkInfo:(QNNetworkInfo *)netInfo;
- (instancetype)init:(NSArray *)resolvers networkInfo:(QNNetworkInfo *)netInfo sorter:(id<QNIpSorter>)sorter;
- (instancetype)putHosts:(NSString *)domain ip:(NSString *)ip;
- (instancetype)putHosts:(NSString *)domain ip:(NSString *)ip provider:(int)provider;
@end
46 changes: 45 additions & 1 deletion HappyDNS/Common/QNDnsManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@

@interface QNDnsManager ()

@property (nonatomic) NSCache *cache;
@property (nonatomic,strong) NSCache *cache;
@property (atomic) QNNetworkInfo *curNetwork;
@property (nonatomic) NSArray *resolvers;
@property (atomic) UInt32 resolverStatus;
@property (nonatomic) QNHosts *hosts;
@property (nonatomic, strong) id<QNIpSorter>sorter;
@end

//static inline BOOL bits_isSet(UInt32 v, int index) {
Expand Down Expand Up @@ -78,12 +79,39 @@ static inline UInt32 bits_leadingZeros(UInt32 x) {
return array;
}

@interface Shuffle : NSObject <QNIpSorter>

@end

@implementation Shuffle

- (NSArray *)sort:(NSArray*)ips {
if (ips == nil || ips.count <= 1) {
return ips;
}
int skip = arc4random() % ips.count;
NSMutableArray *ret = [[NSMutableArray alloc] initWithCapacity:ips.count];
for (int i = 0; i < ips.count; i++) {
NSString *ip = [ips objectAtIndex:((i + skip) % ips.count)];
[ret addObject:ip];
}
return ret;
}

@end

@implementation QNDnsManager
- (NSArray *)query:(NSString *)domain {
return [self queryWithDomain:[[QNDomain alloc] init:domain]];
}

- (NSArray *)queryWithDomain:(QNDomain *)domain {
NSArray* ips = [self queryInternalWithDomain:domain];
return [_sorter sort:ips];
}


- (NSArray *)queryInternalWithDomain:(QNDomain *)domain {
if (domain.hostsFirst) {
NSArray *ret = [_hosts query:domain networkInfo:_curNetwork];
if (ret != nil && ret.count != 0) {
Expand Down Expand Up @@ -158,6 +186,22 @@ - (instancetype)init:(NSArray *)resolvers networkInfo:(QNNetworkInfo *)netInfo {
return self;
}

- (instancetype)init:(NSArray *)resolvers networkInfo:(QNNetworkInfo *)netInfo sorter:(id<QNIpSorter>)sorter {
if (self = [super init]) {
_cache = [[NSCache alloc] init];
_cache.countLimit = 1024;
_curNetwork = netInfo;
_resolvers = [[NSArray alloc] initWithArray:resolvers];
_hosts = [[QNHosts alloc] init];
if (sorter == nil) {
_sorter = [[Shuffle alloc]init];
}else{
_sorter = sorter;
}
}
return self;
}

- (void)onNetworkChange:(QNNetworkInfo *)netInfo {
@synchronized(_cache)
{
Expand Down
6 changes: 3 additions & 3 deletions HappyDNS/Http/QNDnspodEnterprise.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ extern const int kQN_DECRYPT_FAILED;
@property (readonly, strong) NSString *server;

- (instancetype)initWithId:(NSString*)userId
key:(NSString*)key;
key:(NSString*)key;

- (instancetype)initWithId:(NSString*)userId
key:(NSString*)key
server:(NSString*)server;
key:(NSString*)key
server:(NSString*)server;


- (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error;
Expand Down
154 changes: 77 additions & 77 deletions HappyDNS/Http/QNDnspodEnterprise.m
Original file line number Diff line number Diff line change
Expand Up @@ -27,93 +27,93 @@ @interface QNDnspodEnterprise ()
@implementation QNDnspodEnterprise

- (instancetype)initWithId:(NSString*)userId
key:(NSString*)key {
return [self initWithId:userId key:key server:@"119.29.29.29"];
key:(NSString*)key {
return [self initWithId:userId key:key server:@"119.29.29.29"];
}

- (instancetype)initWithId:(NSString*)userId
key:(NSString*)key
server:(NSString*)server{
if (self = [super init]) {
_server = server;
_userId = userId;
_des = [[QNDes alloc] init:[key dataUsingEncoding:NSUTF8StringEncoding]];
}
return self;
key:(NSString*)key
server:(NSString*)server {
if (self = [super init]) {
_server = server;
_userId = userId;
_des = [[QNDes alloc] init:[key dataUsingEncoding:NSUTF8StringEncoding]];
}
return self;
}

- (NSString *)encrypt:(NSString*)domain{
NSData *data = [_des encrypt:[domain dataUsingEncoding:NSUTF8StringEncoding]];
if (data == nil) {
return nil;
}
NSString * str = [QNHex encodeHexData:data];
return str;
- (NSString *)encrypt:(NSString*)domain {
NSData *data = [_des encrypt:[domain dataUsingEncoding:NSUTF8StringEncoding]];
if (data == nil) {
return nil;
}
NSString * str = [QNHex encodeHexData:data];
return str;
}

- (NSString *)decrypt:(NSData*)raw{
NSData *enc = [QNHex decodeHexString:[[NSString alloc]initWithData:raw
encoding:NSUTF8StringEncoding]];
if (enc == nil) {
return nil;
}
NSData *data = [_des decrpyt:enc];
if (data == nil) {
return nil;
}
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
- (NSString *)decrypt:(NSData*)raw {
NSData *enc = [QNHex decodeHexString:[[NSString alloc]initWithData:raw
encoding:NSUTF8StringEncoding]];
if (enc == nil) {
return nil;
}
NSData *data = [_des decrpyt:enc];
if (data == nil) {
return nil;
}
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}

- (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error {
NSString *encrypt = [self encrypt:domain.domain];
if (encrypt == nil) {
if (error != nil) {
*error = [[NSError alloc] initWithDomain:domain.domain code: kQN_ENCRYPT_FAILED userInfo:nil];
}
return nil;
}
NSString *url = [NSString stringWithFormat:@"http://%@/d?ttl=1&dn=%@&id=%@", _server, encrypt, _userId];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse *response = nil;
NSError *httpError = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&response
error:&httpError];
if (httpError != nil) {
if (error != nil) {
*error = httpError;
}
return nil;
}
if (response.statusCode != 200) {
return nil;
}
NSString *raw = [self decrypt:data];
if (raw == nil) {
if (error != nil) {
*error = [[NSError alloc] initWithDomain:domain.domain code: kQN_DECRYPT_FAILED userInfo:nil];
}
return nil;
}
NSArray *ip1 = [raw componentsSeparatedByString:@","];
if (ip1.count != 2) {
return nil;
}
NSString *ttlStr = [ip1 objectAtIndex:1];
int ttl = [ttlStr intValue];
if (ttl <= 0) {
return nil;
}
NSString *ips = [ip1 objectAtIndex:0];
NSArray *ipArray = [ips componentsSeparatedByString:@";"];
NSMutableArray *ret = [[NSMutableArray alloc] initWithCapacity:ipArray.count];
for (int i = 0; i < ipArray.count; i++) {
QNRecord *record = [[QNRecord alloc]init:[ipArray objectAtIndex:i] ttl:ttl type:0];
[ret addObject:record];
}
return ret;
NSString *encrypt = [self encrypt:domain.domain];
if (encrypt == nil) {
if (error != nil) {
*error = [[NSError alloc] initWithDomain:domain.domain code: kQN_ENCRYPT_FAILED userInfo:nil];
}
return nil;
}
NSString *url = [NSString stringWithFormat:@"http://%@/d?ttl=1&dn=%@&id=%@", _server, encrypt, _userId];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse *response = nil;
NSError *httpError = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&response
error:&httpError];

if (httpError != nil) {
if (error != nil) {
*error = httpError;
}
return nil;
}
if (response.statusCode != 200) {
return nil;
}

NSString *raw = [self decrypt:data];
if (raw == nil) {
if (error != nil) {
*error = [[NSError alloc] initWithDomain:domain.domain code: kQN_DECRYPT_FAILED userInfo:nil];
}
return nil;
}
NSArray *ip1 = [raw componentsSeparatedByString:@","];
if (ip1.count != 2) {
return nil;
}
NSString *ttlStr = [ip1 objectAtIndex:1];
int ttl = [ttlStr intValue];
if (ttl <= 0) {
return nil;
}
NSString *ips = [ip1 objectAtIndex:0];
NSArray *ipArray = [ips componentsSeparatedByString:@";"];
NSMutableArray *ret = [[NSMutableArray alloc] initWithCapacity:ipArray.count];
for (int i = 0; i < ipArray.count; i++) {
QNRecord *record = [[QNRecord alloc]init:[ipArray objectAtIndex:i] ttl:ttl type:0];
[ret addObject:record];
}
return ret;
}

@end
12 changes: 6 additions & 6 deletions HappyDNS/Http/QNDnspodFree.m
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,17 @@
@implementation QNDnspodFree

- (instancetype)init {
return [self initWithServer:@"119.29.29.29"];
return [self initWithServer:@"119.29.29.29"];
}
- (instancetype)initWithServer:(NSString*)server {
if (self = [super init]) {
_server = server;
}
return self;
if (self = [super init]) {
_server = server;
}
return self;
}

- (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error {
NSString *url = [NSString stringWithFormat:@"http://%@/d?ttl=1&dn=%@", _server, domain.domain];
NSString *url = [NSString stringWithFormat:@"http://%@/d?ttl=1&dn=%@", _server, domain.domain];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse *response = nil;
NSError *httpError = nil;
Expand Down
15 changes: 1 addition & 14 deletions HappyDNS/Local/QNHosts.m
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,6 @@ - (instancetype)init:(NSString *)ip provider:(int)provider {
return normal;
}

static NSArray *shuffle(NSArray *input) {
if (input == nil || input.count <= 1) {
return input;
}
int skip = arc4random() % input.count;
NSMutableArray *ret = [[NSMutableArray alloc] initWithCapacity:input.count];
for (int i = 0; i < input.count; i++) {
NSString *ip = [input objectAtIndex:((i + skip) % input.count)];
[ret addObject:ip];
}
return ret;
}

@implementation QNHosts
- (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo {
NSMutableArray *x;
Expand All @@ -72,7 +59,7 @@ - (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo {
if (x == nil || x.count == 0) {
return nil;
}
return shuffle(filte(x, netInfo.provider));
return filte(x, netInfo.provider);
}

- (void)put:(NSString *)domain ip:(NSString *)ip {
Expand Down
Loading

0 comments on commit 4b5d5f5

Please sign in to comment.