From 6e273c2676ce29cef057d117e4427e031886e743 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Fri, 17 Jul 2026 10:39:17 -0500 Subject: v4.7.0: Add domain reputation/blocklist data source - New DomainReputationResult model (status: clean/listed/unknown, listed sources, checked-at) and a `reputation(domain:)` method on ExternalDataService, mirroring the existing pluggable-URL enrichment pattern (ownership history, DNS history, extended subdomains, pricing). With no endpoint configured (the default; DomainDig ships no bundled third-party reputation dependency) it resolves to unavailable rather than "clean". - New .reputation FeatureCapability/DataCapability, gated Pro+ like domainPricing. - Threaded reputation/reputationError through LookupSnapshot and HistoryEntry (backward-compatible decode) so results persist with history entries. - Auto-fetched in performLookup alongside pricing; surfaced as a "Reputation" info row, folded into DomainInsightEngine's risk score/factors and top-level insights (a listed domain raises risk score and adds a factor/insight), and exported in text, CSV, and JSON report output. - Reputation-driven risk changes ride the existing change-severity pipeline, so a listed status flip is visible to monitoring the same way any other risk delta is, without bespoke monitoring wiring. --- DomainDig/FeatureAccessService.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'DomainDig/FeatureAccessService.swift') diff --git a/DomainDig/FeatureAccessService.swift b/DomainDig/FeatureAccessService.swift index a601b33..1598354 100644 --- a/DomainDig/FeatureAccessService.swift +++ b/DomainDig/FeatureAccessService.swift @@ -32,6 +32,7 @@ enum FeatureCapability: String, CaseIterable, Identifiable { case dnsHistory case extendedSubdomains case domainPricing + case reputation var id: String { rawValue } @@ -61,6 +62,8 @@ enum FeatureCapability: String, CaseIterable, Identifiable { return "Extended subdomains" case .domainPricing: return "Domain pricing" + case .reputation: + return "Domain reputation" } } } @@ -157,7 +160,7 @@ enum FeatureAccessService { switch capability { case .workflows, .batchOperations, .automatedMonitoring, .localAlerts, .advancedExports: return "Available in Pro" - case .ownershipHistory, .dnsHistory, .extendedSubdomains, .domainPricing: + case .ownershipHistory, .dnsHistory, .extendedSubdomains, .domainPricing, .reputation: return "Available in Pro+" case .limitedTracking: return "Tracking is limited on Free" @@ -219,7 +222,7 @@ enum FeatureAccessService { static func upgradePrompt(for capability: FeatureCapability) -> UpgradePromptContext { let title: String switch capability { - case .ownershipHistory, .dnsHistory, .extendedSubdomains, .domainPricing: + case .ownershipHistory, .dnsHistory, .extendedSubdomains, .domainPricing, .reputation: title = "Available in Pro+" default: title = "Available in Pro" -- cgit v1.2.3