diff options
| author | Christian Cleberg <[email protected]> | 2026-07-17 16:06:47 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-07-17 16:06:47 -0500 |
| commit | d8862a9b78b0d6cf4e11cf537be7678794e08811 (patch) | |
| tree | 4af615370bb122e6706bbefc6deaa044e02b477b /octosentry/SeverityMapping.swift | |
| download | octosentry-d8862a9b78b0d6cf4e11cf537be7678794e08811.tar.gz octosentry-d8862a9b78b0d6cf4e11cf537be7678794e08811.tar.bz2 octosentry-d8862a9b78b0d6cf4e11cf537be7678794e08811.zip | |
Scaffold octosentry MVP: unified GitHub security alert feed0.1.0
MenuBarExtra popover aggregating Dependabot, code scanning, and secret
scanning alerts for a single repo into one severity-ranked stream. Swift 6
strict concurrency, zero third-party dependencies, PAT-via-env-var auth as
a dev-only shortcut ahead of the device authorization flow.
Diffstat (limited to 'octosentry/SeverityMapping.swift')
| -rw-r--r-- | octosentry/SeverityMapping.swift | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/octosentry/SeverityMapping.swift b/octosentry/SeverityMapping.swift new file mode 100644 index 0000000..5befb46 --- /dev/null +++ b/octosentry/SeverityMapping.swift @@ -0,0 +1,52 @@ +// +// SeverityMapping.swift +// octosentry +// +// Normalizes each GitHub alert source's native severity vocabulary into +// the shared SecurityEventSeverity scale. Kept as a single auditable +// source file per the spec (ยง4) rather than scattered across the client. +// + +import Foundation + +nonisolated enum SeverityMapping { + /// Dependabot alerts report CVSS-derived severity on the vulnerability object. + static func dependabot(_ nativeSeverity: String) -> SecurityEventSeverity { + switch nativeSeverity.lowercased() { + case "critical": .critical + case "high": .high + case "moderate", "medium": .medium + case "low": .low + default: .medium + } + } + + /// Code scanning alerts expose `rule.security_severity_level` (CVSS-derived) when + /// present, falling back to `rule.severity` (note/warning/error) otherwise. + static func codeScanning(securitySeverityLevel: String?, ruleSeverity: String?) -> SecurityEventSeverity { + if let securitySeverityLevel { + switch securitySeverityLevel.lowercased() { + case "critical": return .critical + case "high": return .high + case "medium": return .medium + case "low": return .low + default: break + } + } + switch ruleSeverity?.lowercased() { + case "error": return .high + case "warning": return .medium + case "note": return .low + default: return .medium + } + } + + /// Secret scanning has no native severity field. Per spec: validated/active + /// secrets are treated as critical, unvalidated ones as high. + static func secretScanning(validity: String?) -> SecurityEventSeverity { + switch validity?.lowercased() { + case "active": .critical + default: .high + } + } +} |
