QNHijackingDetectWrapper.m 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. //
  2. // QNHijackingDetectWrapper.m
  3. // HappyDNS
  4. //
  5. // Created by bailong on 15/7/16.
  6. // Copyright (c) 2015年 Qiniu Cloud Storage. All rights reserved.
  7. //
  8. #import "QNHijackingDetectWrapper.h"
  9. #import "QNDomain.h"
  10. #import "QNRecord.h"
  11. #import "QNResolver.h"
  12. @interface QNHijackingDetectWrapper ()
  13. @property (nonatomic, readonly) QNResolver *resolver;
  14. @end
  15. @implementation QNHijackingDetectWrapper
  16. - (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error {
  17. NSArray *result = [_resolver query:domain networkInfo:netInfo error:error];
  18. if (((!domain.hasCname) && domain.maxTtl == 0) || result == nil || result.count == 0) {
  19. return result;
  20. }
  21. BOOL hasCname = NO;
  22. BOOL outOfTtl = NO;
  23. for (int i = 0; i < result.count; i++) {
  24. QNRecord *record = [result objectAtIndex:i];
  25. if (record.type == kQNTypeCname) {
  26. hasCname = YES;
  27. }
  28. if (domain.maxTtl > 0 && record.type == kQNTypeA && record.ttl > domain.maxTtl) {
  29. outOfTtl = YES;
  30. }
  31. }
  32. if ((domain.hasCname && !hasCname) || outOfTtl) {
  33. if (error != nil) {
  34. *error = [[NSError alloc] initWithDomain:domain.domain code:kQNDomainHijackingCode userInfo:nil];
  35. }
  36. return nil;
  37. }
  38. return result;
  39. }
  40. - (instancetype)initWithResolver:(QNResolver *)resolver {
  41. if (self = [super init]) {
  42. _resolver = resolver;
  43. }
  44. return self;
  45. }
  46. @end