Skip to content

Commit

Permalink
add dns hajacking test
Browse files Browse the repository at this point in the history
  • Loading branch information
longbai committed Jul 16, 2015
1 parent ab3387c commit 00ad369
Show file tree
Hide file tree
Showing 10 changed files with 148 additions and 9 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
#Changelog

## 0.1.1 (2015-07-16)

### 增加
* localdns 劫持检测


## 0.1.0 (2015-07-15)

### 增加
Expand Down
2 changes: 1 addition & 1 deletion HappyDNS.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'HappyDNS'
s.version = '0.1.0'
s.version = '0.1.1'
s.summary = 'DNS library for iOS and Mac'
s.homepage = 'https://github.com/qiniu/happy-dns-objc'
s.social_media_url = 'http://weibo.com/qiniutek'
Expand Down
22 changes: 16 additions & 6 deletions HappyDNS.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,11 @@
DF1A94E31B429996006517C0 /* DnsTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DF1A94E11B429996006517C0 /* DnsTest.m */; };
DF1DA8941B3BDF1800A88CB6 /* HappyDNS.h in Headers */ = {isa = PBXBuildFile; fileRef = DF1DA8931B3BDF1800A88CB6 /* HappyDNS.h */; };
DF22C0CB1B37B9B90010FEBF /* libHappyDNS.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DF22C0BF1B37B9B90010FEBF /* libHappyDNS.dylib */; };
DF44A1021B563CFB00A0EEB9 /* QNNetworkTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DF44A1011B563CFB00A0EEB9 /* QNNetworkTest.m */; };
DF44A1031B563CFB00A0EEB9 /* QNNetworkTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DF44A1011B563CFB00A0EEB9 /* QNNetworkTest.m */; };
DF44A1021B563CFB00A0EEB9 /* NetworkTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DF44A1011B563CFB00A0EEB9 /* NetworkTest.m */; };
DF44A1031B563CFB00A0EEB9 /* NetworkTest.m in Sources */ = {isa = PBXBuildFile; fileRef = DF44A1011B563CFB00A0EEB9 /* NetworkTest.m */; };
DF5AC8E11B575E2800728D30 /* QNHijackingDetectWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = DF5AC8DF1B575E2800728D30 /* QNHijackingDetectWrapper.h */; };
DF5AC8E21B575E2800728D30 /* QNHijackingDetectWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = DF5AC8E01B575E2800728D30 /* QNHijackingDetectWrapper.m */; };
DF5AC8E31B575E2800728D30 /* QNHijackingDetectWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = DF5AC8E01B575E2800728D30 /* QNHijackingDetectWrapper.m */; };
DF801F641B396D5100866FDE /* QNRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = DF801F621B396D5100866FDE /* QNRecord.h */; };
DF801F651B396D5100866FDE /* QNRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = DF801F631B396D5100866FDE /* QNRecord.m */; };
DF801F691B396DA000866FDE /* QNDnsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = DF801F671B396DA000866FDE /* QNDnsManager.h */; };
Expand Down Expand Up @@ -100,7 +103,9 @@
DF22C0BF1B37B9B90010FEBF /* libHappyDNS.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libHappyDNS.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
DF22C0CA1B37B9B90010FEBF /* HappyDNS_MacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HappyDNS_MacTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
DF22C0D01B37B9B90010FEBF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
DF44A1011B563CFB00A0EEB9 /* QNNetworkTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QNNetworkTest.m; sourceTree = "<group>"; };
DF44A1011B563CFB00A0EEB9 /* NetworkTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NetworkTest.m; sourceTree = "<group>"; };
DF5AC8DF1B575E2800728D30 /* QNHijackingDetectWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QNHijackingDetectWrapper.h; path = Local/QNHijackingDetectWrapper.h; sourceTree = "<group>"; };
DF5AC8E01B575E2800728D30 /* QNHijackingDetectWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = QNHijackingDetectWrapper.m; path = Local/QNHijackingDetectWrapper.m; sourceTree = "<group>"; };
DF801F621B396D5100866FDE /* QNRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QNRecord.h; path = Common/QNRecord.h; sourceTree = "<group>"; };
DF801F631B396D5100866FDE /* QNRecord.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = QNRecord.m; path = Common/QNRecord.m; sourceTree = "<group>"; };
DF801F671B396DA000866FDE /* QNDnsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QNDnsManager.h; path = Common/QNDnsManager.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -224,7 +229,7 @@
DF1552501B3B915D008D3E7C /* DnspodFreeTest.m */,
DF1A94DE1B429983006517C0 /* HostsTest.m */,
DF1A94E11B429996006517C0 /* DnsTest.m */,
DF44A1011B563CFB00A0EEB9 /* QNNetworkTest.m */,
DF44A1011B563CFB00A0EEB9 /* NetworkTest.m */,
);
path = HappyDNSTests;
sourceTree = "<group>";
Expand Down Expand Up @@ -253,6 +258,8 @@
DF801F721B396E3C00866FDE /* QNResolver.m */,
DF801F801B396E9A00866FDE /* QNHosts.h */,
DF801F811B396E9A00866FDE /* QNHosts.m */,
DF5AC8DF1B575E2800728D30 /* QNHijackingDetectWrapper.h */,
DF5AC8E01B575E2800728D30 /* QNHijackingDetectWrapper.m */,
);
name = Local;
sourceTree = "<group>";
Expand Down Expand Up @@ -290,6 +297,7 @@
DF0A03201B3BABBD00E3778C /* QNNetworkInfo.h in Headers */,
DF801F691B396DA000866FDE /* QNDnsManager.h in Headers */,
DF801F641B396D5100866FDE /* QNRecord.h in Headers */,
DF5AC8E11B575E2800728D30 /* QNHijackingDetectWrapper.h in Headers */,
DF801F731B396E3C00866FDE /* QNResolver.h in Headers */,
DF801F871B396F5500866FDE /* QNResolverDelegate.h in Headers */,
DF801F7D1B396E7600866FDE /* QNDnspodFree.h in Headers */,
Expand Down Expand Up @@ -510,6 +518,7 @@
DF801F651B396D5100866FDE /* QNRecord.m in Sources */,
DF801F8D1B39743200866FDE /* QNDomain.m in Sources */,
DF801F831B396E9A00866FDE /* QNHosts.m in Sources */,
DF5AC8E21B575E2800728D30 /* QNHijackingDetectWrapper.m in Sources */,
DF0A03211B3BABBD00E3778C /* QNNetworkInfo.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -521,7 +530,7 @@
DF1A94DF1B429983006517C0 /* HostsTest.m in Sources */,
DF1A94E21B429996006517C0 /* DnsTest.m in Sources */,
DF1552441B3A9536008D3E7C /* ResolverTest.m in Sources */,
DF44A1021B563CFB00A0EEB9 /* QNNetworkTest.m in Sources */,
DF44A1021B563CFB00A0EEB9 /* NetworkTest.m in Sources */,
DF1552511B3B915D008D3E7C /* DnspodFreeTest.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -536,6 +545,7 @@
DF15525B1B3B9316008D3E7C /* QNResolver.m in Sources */,
DF15525D1B3B9316008D3E7C /* QNHosts.m in Sources */,
DF15525F1B3B9316008D3E7C /* QNDnspodFree.m in Sources */,
DF5AC8E31B575E2800728D30 /* QNHijackingDetectWrapper.m in Sources */,
DF0A03221B3BABBD00E3778C /* QNNetworkInfo.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -547,7 +557,7 @@
DF1A94E01B429983006517C0 /* HostsTest.m in Sources */,
DF1A94E31B429996006517C0 /* DnsTest.m in Sources */,
DF1552451B3A9536008D3E7C /* ResolverTest.m in Sources */,
DF44A1031B563CFB00A0EEB9 /* QNNetworkTest.m in Sources */,
DF44A1031B563CFB00A0EEB9 /* NetworkTest.m in Sources */,
DF1552521B3B915D008D3E7C /* DnspodFreeTest.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down
8 changes: 8 additions & 0 deletions HappyDNS/Common/QNDnsManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,14 @@ - (NSArray *)queryWithDomain:(QNDomain *)domain {
QNNetworkInfo *previousNetwork = _curNetwork;
NSString *previousIp = [QNNetworkInfo getIp];
records = [resolver query:domain networkInfo:previousNetwork error:&error];
if (error != nil) {
NSError *tmp = error;
error = nil;
if (tmp.code == kQNDomainNotOwnCode) {
continue;
}
}

if (records == nil || records.count == 0) {
if (_curNetwork == previousNetwork && [previousIp isEqualToString:[QNNetworkInfo getIp]]) {
_resolverStatus = bits_set(_resolverStatus, pos);
Expand Down
4 changes: 2 additions & 2 deletions HappyDNS/Common/QNDomain.m
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ - (instancetype)init:(NSString *)domain hostsFirst:(BOOL)hostsFirst hasCname:(BO
- (instancetype)init:(NSString *)domain hostsFirst:(BOOL)hostsFirst hasCname:(BOOL)hasCname maxTtl:(int)maxTtl {
if (self = [super init]) {
_domain = domain;
_hasCname = NO;
_maxTtl = 0;
_hasCname = hasCname;
_maxTtl = maxTtl;
_hostsFirst = hostsFirst;
}
return self;
Expand Down
2 changes: 2 additions & 0 deletions HappyDNS/HappyDNS.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@
#import "QNDomain.h"
#import "QNDnsManager.h"
#import "QNRecord.h"
#import "QNNetworkInfo.h"
#import "QNHijackingDetectWrapper.h"
17 changes: 17 additions & 0 deletions HappyDNS/Local/QNHijackingDetectWrapper.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// QNHijackingDetectWrapper.h
// HappyDNS
//
// Created by bailong on 15/7/16.
// Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "QNResolverDelegate.h"

@class QNResolver;
@interface QNHijackingDetectWrapper : NSObject <QNResolverDelegate>
- (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error;
- (instancetype)initWithResolver:(QNResolver *)resolver;
@end
51 changes: 51 additions & 0 deletions HappyDNS/Local/QNHijackingDetectWrapper.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
//
// QNHijackingDetectWrapper.m
// HappyDNS
//
// Created by bailong on 15/7/16.
// Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved.
//

#import "QNHijackingDetectWrapper.h"
#import "QNResolver.h"
#import "QNDomain.h"
#import "QNRecord.h"

@interface QNHijackingDetectWrapper ()
@property (nonatomic, readonly) QNResolver* resolver;
@end

@implementation QNHijackingDetectWrapper

- (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error {
NSArray *result = [_resolver query:domain networkInfo:netInfo error:error];
if (((!domain.hasCname) && domain.maxTtl == 0) || result == nil || result.count == 0) {
return result;
}
BOOL hasCname = NO;
BOOL outOfTtl = NO;
for (int i = 0; i<result.count; i++) {
QNRecord* record = [result objectAtIndex:i];
if (record.type == kQNTypeCname) {
hasCname = YES;
}
if (domain.maxTtl > 0 && record.type ==kQNTypeA && record.ttl>domain.maxTtl) {
outOfTtl = YES;
}
}
if ((domain.hasCname && !hasCname) || outOfTtl) {
if (error != nil) {
*error = [[NSError alloc] initWithDomain:domain.domain code:kQNDomainHijackingCode userInfo:nil];
}
return nil;
}
return result;
}
- (instancetype)initWithResolver:(QNResolver *)resolver {
if (self = [super init]) {
_resolver = resolver;
}
return self;
}

@end
45 changes: 45 additions & 0 deletions HappyDNSTests/DnsTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#import "QNDnsManager.h"
#import "QNNetworkInfo.h"
#import "QNDomain.h"
#import "QNHijackingDetectWrapper.h"

@interface DnsTest : XCTestCase

Expand Down Expand Up @@ -54,4 +55,48 @@ - (void)testCnc {
XCTAssertEqualObjects(@"4.4.4.4", r[0], @"PASS");
}

- (void) testTtl {
NSMutableArray *array = [[NSMutableArray alloc]init];
[array addObject:[[QNHijackingDetectWrapper alloc] initWithResolver:[QNResolver systemResolver]]];
[array addObject:[[QNHijackingDetectWrapper alloc]initWithResolver:[[QNResolver alloc] initWithAddres:@"114.114.115.115"]]];
QNNetworkInfo *info = [[QNNetworkInfo alloc] init:kQNMOBILE provider:kQNISP_CNC];
QNDnsManager *dns = [[QNDnsManager alloc] init:array networkInfo:info];
[dns putHosts:@"hello.qiniu.com" ip:@"1.1.1.1"];
[dns putHosts:@"hello.qiniu.com" ip:@"2.2.2.2"];
[dns putHosts:@"qiniu.com" ip:@"3.3.3.3"];
[dns putHosts:@"qiniu.com" ip:@"4.4.4.4" provider:kQNISP_CNC];

QNDomain *domain = [[QNDomain alloc]init:@"qiniu.com" hostsFirst:NO hasCname:NO maxTtl:10];
NSArray *r = [dns queryWithDomain:domain];
XCTAssertEqual(r.count, 1, @"PASS");
XCTAssertEqualObjects(@"4.4.4.4", r[0], @"PASS");

domain = [[QNDomain alloc]init:@"qiniu.com" hostsFirst:NO hasCname:NO maxTtl:1000];
r = [dns queryWithDomain:domain];
XCTAssertEqual(r.count, 1, @"PASS");
XCTAssertFalse([@"4.4.4.4" isEqualToString:r[0]], @"PASS");
}

- (void) testCname {
NSMutableArray *array = [[NSMutableArray alloc]init];
[array addObject:[[QNHijackingDetectWrapper alloc] initWithResolver:[QNResolver systemResolver]]];
[array addObject:[[QNHijackingDetectWrapper alloc]initWithResolver:[[QNResolver alloc] initWithAddres:@"114.114.115.115"]]];
QNNetworkInfo *info = [QNNetworkInfo normal];
QNDnsManager *dns = [[QNDnsManager alloc] init:array networkInfo:info];
[dns putHosts:@"hello.qiniu.com" ip:@"1.1.1.1"];
[dns putHosts:@"hello.qiniu.com" ip:@"2.2.2.2"];
[dns putHosts:@"qiniu.com" ip:@"3.3.3.3"];
[dns putHosts:@"qiniu.com" ip:@"4.4.4.4" provider:kQNISP_CNC];

QNDomain *domain = [[QNDomain alloc]init:@"qiniu.com" hostsFirst:NO hasCname:YES maxTtl:0];
NSArray *r = [dns queryWithDomain:domain];
XCTAssertEqual(r.count, 1, @"PASS");
XCTAssertEqualObjects(@"3.3.3.3", r[0], @"PASS");

domain = [[QNDomain alloc]init:@"qiniu.com" hostsFirst:NO hasCname:NO maxTtl:0];
r = [dns queryWithDomain:domain];
XCTAssertEqual(r.count, 1, @"PASS");
XCTAssertFalse([@"3.3.3.3" isEqualToString:r[0]], @"PASS");
}

@end
File renamed without changes.

0 comments on commit 00ad369

Please sign in to comment.