krz/domain-dig
an ios app for DNS & SSL analysis
clone: git clone https://gitbay.org/krz/domain-dig.git
v5.0.2: 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 reputation: DomainReputationResult?
72 let reputationError: String?
73 let portScanResults: [PortScanResult]
74 let portScanError: String?
75 let changeSummary: DomainChangeSummary?
76 let resultSource: LookupResultSource
77 let cachedSections: [LookupSectionKind]
78 let statusMessage: String?
79
80 var isLive: Bool {
81 resultSource == .live
82 }
83}
84
85extension HistoryEntry {
86 var snapshot: LookupSnapshot {
87 LookupSnapshot(
88 historyEntryID: id,
89 domain: domain,
90 timestamp: timestamp,
91 trackedDomainID: trackedDomainID,
92 note: note,
93 appVersion: appVersion,
94 resolverDisplayName: resolverDisplayName,
95 resolverURLString: resolverURLString,
96 dataSources: dataSources,
97 provenanceBySection: provenanceBySection,
98 availabilityConfidence: availabilityConfidence,
99 ownershipConfidence: ownershipConfidence,
100 subdomainConfidence: subdomainConfidence,
101 emailSecurityConfidence: emailSecurityConfidence,
102 geolocationConfidence: geolocationConfidence,
103 errorDetails: errorDetails,
104 isPartialSnapshot: isPartialSnapshot,
105 validationIssues: validationIssues,
106 totalLookupDurationMs: totalLookupDurationMs,
107 snapshotIndex: snapshotIndex,
108 previousSnapshotID: previousSnapshotID,
109 changeCount: changeCount,
110 severitySummary: severitySummary,
111 dnsSections: dnsSections,
112 dnsError: nil,
113 availabilityResult: availabilityResult,
114 suggestions: suggestions,
115 sslInfo: sslInfo,
116 sslError: sslError,
117 hstsPreloaded: hstsPreloaded,
118 httpHeaders: httpHeaders,
119 httpSecurityGrade: HTTPSecurityGrade.grade(for: httpHeaders).rawValue,
120 httpStatusCode: nil,
121 httpResponseTimeMs: nil,
122 httpProtocol: nil,
123 http3Advertised: false,
124 httpHeadersError: httpHeadersError,
125 reachabilityResults: reachabilityResults,
126 reachabilityError: reachabilityError,
127 ipGeolocation: ipGeolocation,
128 ipGeolocationError: ipGeolocationError,
129 emailSecurity: emailSecurity,
130 emailSecurityError: emailSecurityError,
131 ownership: ownership,
132 ownershipError: ownershipError,
133 ownershipHistory: ownershipHistory,
134 ownershipHistoryError: ownershipHistoryError,
135 inferredProvider: inferredProvider,
136 priorProviders: priorProviders,
137 domainClassification: domainClassification,
138 ownershipTransitions: ownershipTransitions,
139 hostingTransitions: hostingTransitions,
140 subdomainHistory: subdomainHistory,
141 riskSignals: riskSignals,
142 intelligenceTimeline: intelligenceTimeline,
143 ptrRecord: ptrRecord,
144 ptrError: ptrError,
145 redirectChain: redirectChain,
146 redirectChainError: redirectChainError,
147 subdomains: subdomains,
148 subdomainsError: subdomainsError,
149 extendedSubdomains: extendedSubdomains,
150 extendedSubdomainsError: extendedSubdomainsError,
151 dnsHistory: dnsHistory,
152 dnsHistoryError: dnsHistoryError,
153 domainPricing: domainPricing,
154 domainPricingError: domainPricingError,
155 reputation: reputation,
156 reputationError: reputationError,
157 portScanResults: portScanResults,
158 portScanError: portScanError,
159 changeSummary: changeSummary,
160 resultSource: resultSource,
161 cachedSections: [],
162 statusMessage: nil
163 )
164 }
165}