summaryrefslogtreecommitdiff
path: root/DomainDig/ReverseDNSService.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-20 15:28:12 -0500
committerChristian Cleberg <[email protected]>2026-04-20 15:28:12 -0500
commitee2520f2c0c2d806fd284c3d6b8a81a3822f5270 (patch)
tree0680550a1071e01546ba074c2f20b1bf5a452238 /DomainDig/ReverseDNSService.swift
parent4e94ee723cd19c964b1cf37792931e0c7c4614f4 (diff)
downloaddomain-dig-ee2520f2c0c2d806fd284c3d6b8a81a3822f5270.tar.gz
domain-dig-ee2520f2c0c2d806fd284c3d6b8a81a3822f5270.tar.bz2
domain-dig-ee2520f2c0c2d806fd284c3d6b8a81a3822f5270.zip
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
Diffstat (limited to 'DomainDig/ReverseDNSService.swift')
-rw-r--r--DomainDig/ReverseDNSService.swift49
1 files changed, 14 insertions, 35 deletions
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<String> {
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: "\"")) }
- }
}