krz/domain-dig
an ios app for DNS & SSL analysis
clone: git clone https://gitbay.org/krz/domain-dig.git
v4.5.0: LookupSnapshot.swift · raw
1import Foundation
2
3struct LookupSnapshot {
4 let historyEntryID: UUID?
5 let domain: String
6 let timestamp: Date
7 let trackedDomainID: UUID?
8 let note: String?
9 let appVersion: String
10 let resolverDisplayName: String
11 let resolverURLString: String
12 let dataSources: [String]
13 let provenanceBySection: [LookupSectionKind: SectionProvenance]
14 let availabilityConfidence: ConfidenceLevel?
15 let ownershipConfidence: ConfidenceLevel?
16 let subdomainConfidence: ConfidenceLevel?
17 let emailSecurityConfidence: ConfidenceLevel?
18 let geolocationConfidence: ConfidenceLevel?
19 let errorDetails: [LookupSectionKind: InspectionFailure]
20 let isPartialSnapshot: Bool
21 let validationIssues: [String]
22 let totalLookupDurationMs: Int?
23 let snapshotIndex: Int?
24 let previousSnapshotID: UUID?
25 let changeCount: Int
26 let severitySummary: ChangeSeverity?
27 let dnsSections: [DNSSection]
28 let dnsError: String?
29 let availabilityResult: DomainAvailabilityResult?
30 let suggestions: [DomainSuggestionResult]
31 let sslInfo: SSLCertificateInfo?
32 let sslError: String?
33 let hstsPreloaded: Bool?
34 let httpHeaders: [HTTPHeader]
35 let httpSecurityGrade: String?
36 let httpStatusCode: Int?
37 let httpResponseTimeMs: Int?
38 let httpProtocol: String?
39 let http3Advertised: Bool
40 let httpHeadersError: String?
41 let reachabilityResults: [PortReachability]
42 let reachabilityError: String?
43 let ipGeolocation: IPGeolocation?
44 let ipGeolocationError: String?
45 let emailSecurity: EmailSecurityResult?
46 let emailSecurityError: String?
47 let ownership: DomainOwnership?
48 let ownershipError: String?
49 let ownershipHistory: [DomainOwnershipHistoryEvent]
50 let ownershipHistoryError: String?
51 let inferredProvider: InferredProviderFingerprint?
52 let priorProviders: [String]
53 let domainClassification: DomainClassificationSummary?
54 let ownershipTransitions: [OwnershipTransitionEvent]
55 let hostingTransitions: [HostingTransitionEvent]
56 let subdomainHistory: [SubdomainHistoryEntry]
57 let riskSignals: [IntelligenceRiskSignal]
58 let intelligenceTimeline: [IntelligenceTimelineEvent]
59 let ptrRecord: String?
60 let ptrError: String?
61 let redirectChain: [RedirectHop]
62 let redirectChainError: String?
63 let subdomains: [DiscoveredSubdomain]
64 let subdomainsError: String?
65 let extendedSubdomains: [DiscoveredSubdomain]
66 let extendedSubdomainsError: String?
67 let dnsHistory: [DNSHistoryEvent]
68 let dnsHistoryError: String?
69 let domainPricing: DomainPricingInsight?
70 let domainPricingError: String?
71 let portScanResults: [PortScanResult]
72 let portScanError: String?
73 let changeSummary: DomainChangeSummary?
74 let resultSource: LookupResultSource
75 let cachedSections: [LookupSectionKind]
76 let statusMessage: String?
77
78 var isLive: Bool {
79 resultSource == .live
80 }
81}
82
83extension HistoryEntry {
84 var snapshot: LookupSnapshot {
85 LookupSnapshot(
86 historyEntryID: id,
87 domain: domain,
88 timestamp: timestamp,
89 trackedDomainID: trackedDomainID,
90 note: note,
91 appVersion: appVersion,
92 resolverDisplayName: resolverDisplayName,
93 resolverURLString: resolverURLString,
94 dataSources: dataSources,
95 provenanceBySection: provenanceBySection,
96 availabilityConfidence: availabilityConfidence,
97 ownershipConfidence: ownershipConfidence,
98 subdomainConfidence: subdomainConfidence,
99 emailSecurityConfidence: emailSecurityConfidence,
100 geolocationConfidence: geolocationConfidence,
101 errorDetails: errorDetails,
102 isPartialSnapshot: isPartialSnapshot,
103 validationIssues: validationIssues,
104 totalLookupDurationMs: totalLookupDurationMs,
105 snapshotIndex: snapshotIndex,
106 previousSnapshotID: previousSnapshotID,
107 changeCount: changeCount,
108 severitySummary: severitySummary,
109 dnsSections: dnsSections,
110 dnsError: nil,
111 availabilityResult: availabilityResult,
112 suggestions: suggestions,
113 sslInfo: sslInfo,
114 sslError: sslError,
115 hstsPreloaded: hstsPreloaded,
116 httpHeaders: httpHeaders,
117 httpSecurityGrade: HTTPSecurityGrade.grade(for: httpHeaders).rawValue,
118 httpStatusCode: nil,
119 httpResponseTimeMs: nil,
120 httpProtocol: nil,
121 http3Advertised: false,
122 httpHeadersError: httpHeadersError,
123 reachabilityResults: reachabilityResults,
124 reachabilityError: reachabilityError,
125 ipGeolocation: ipGeolocation,
126 ipGeolocationError: ipGeolocationError,
127 emailSecurity: emailSecurity,
128 emailSecurityError: emailSecurityError,
129 ownership: ownership,
130 ownershipError: ownershipError,
131 ownershipHistory: ownershipHistory,
132 ownershipHistoryError: ownershipHistoryError,
133 inferredProvider: inferredProvider,
134 priorProviders: priorProviders,
135 domainClassification: domainClassification,
136 ownershipTransitions: ownershipTransitions,
137 hostingTransitions: hostingTransitions,
138 subdomainHistory: subdomainHistory,
139 riskSignals: riskSignals,
140 intelligenceTimeline: intelligenceTimeline,
141 ptrRecord: ptrRecord,
142 ptrError: ptrError,
143 redirectChain: redirectChain,
144 redirectChainError: redirectChainError,
145 subdomains: subdomains,
146 subdomainsError: subdomainsError,
147 extendedSubdomains: extendedSubdomains,
148 extendedSubdomainsError: extendedSubdomainsError,
149 dnsHistory: dnsHistory,
150 dnsHistoryError: dnsHistoryError,
151 domainPricing: domainPricing,
152 domainPricingError: domainPricingError,
153 portScanResults: portScanResults,
154 portScanError: portScanError,
155 changeSummary: changeSummary,
156 resultSource: resultSource,
157 cachedSections: [],
158 statusMessage: nil
159 )
160 }
161}