From ee2520f2c0c2d806fd284c3d6b8a81a3822f5270 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Mon, 20 Apr 2026 15:28:12 -0500 Subject: feat(v1.8): improve result structure, history, and consistency - normalize sections and add summary card - fix resolver usage in reverse DNS - include custom port scans in history/export - standardize error handling - decompose ContentView into smaller views --- DomainDig/ReverseDNSService.swift | 49 +++++++++++---------------------------- 1 file changed, 14 insertions(+), 35 deletions(-) (limited to 'DomainDig/ReverseDNSService.swift') diff --git a/DomainDig/ReverseDNSService.swift b/DomainDig/ReverseDNSService.swift index caab0f7..3b212a8 100644 --- a/DomainDig/ReverseDNSService.swift +++ b/DomainDig/ReverseDNSService.swift @@ -1,48 +1,27 @@ import Foundation struct ReverseDNSService { - /// Look up the PTR record for an IPv4 address via Cloudflare DoH. - static func lookup(ip: String) async -> String? { + static func lookup(ip: String, resolverURLString: String) async -> ServiceResult { let octets = ip.split(separator: ".") - guard octets.count == 4 else { return nil } + guard octets.count == 4 else { + return .error("Invalid IPv4 address") + } let reversed = octets.reversed().joined(separator: ".") let ptrDomain = "\(reversed).in-addr.arpa" - // PTR record type = 12 do { - let records = try await lookupPTR(domain: ptrDomain) - return records.first + let records = try await DNSLookupService.lookup( + domain: ptrDomain, + recordType: .PTR, + resolverURLString: resolverURLString + ) + if let record = records.first?.value { + return .success(record) + } + return .empty("No PTR record found") } catch { - return nil + return .error(error.localizedDescription) } } - - private static func lookupPTR(domain: String) async throws -> [String] { - var components = URLComponents(string: "https://cloudflare-dns.com/dns-query")! - components.queryItems = [ - URLQueryItem(name: "name", value: domain), - URLQueryItem(name: "type", value: "12") // PTR - ] - - var request = URLRequest(url: components.url!) - request.setValue("application/dns-json", forHTTPHeaderField: "Accept") - - let (data, response) = try await URLSession.shared.data(for: request) - - guard let httpResponse = response as? HTTPURLResponse, - httpResponse.statusCode == 200 else { - throw URLError(.badServerResponse) - } - - let dnsResponse = try JSONDecoder().decode(CloudflareDNSResponse.self, from: data) - - guard let answers = dnsResponse.Answer else { - return [] - } - - return answers - .filter { $0.type == 12 } - .map { $0.data.trimmingCharacters(in: CharacterSet(charactersIn: "\"")) } - } } -- cgit v1.2.3