From e3b93829403d3f254b2a91f537a48550f7d1d56a Mon Sep 17 00:00:00 2001 From: Howard Griffith Date: Wed, 25 Feb 2026 09:27:50 -0600 Subject: [PATCH 1/7] Update DefaultPreferencesNudge.swift Commit code changes for Actively Exploited CVEs label customization --- Nudge/Preferences/DefaultPreferencesNudge.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index ad785943..dd16e867 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -445,6 +445,18 @@ struct UserInterfaceVariables { userInterfaceUpdateElementsJSON?.actionButtonTextUnsupported ?? "Replace Your Device" } + + static var activelyExploitedOutput: String { + userInterfaceUpdateElementsProfile?["activelyExploitedOutput"] as? String ?? + userInterfaceUpdateElementsJSON?.activelyExploitedOutput ?? + "TorF" + } + + static var activelyExploitedText: String { + userInterfaceUpdateElementsProfile?["activelyExploitedText"] as? String ?? + userInterfaceUpdateElementsJSON?.activelyExploitedText ?? + "Actively Exploited CVEs:" + } static var applicationTerminatedNotificationImagePath: String { userInterfaceProfile?["applicationTerminatedNotificationImagePath"] as? String ?? From 1a18f59ed83fc23f92c026a5113ff2cc4923d810 Mon Sep 17 00:00:00 2001 From: Howard Griffith Date: Wed, 25 Feb 2026 09:28:44 -0600 Subject: [PATCH 2/7] Update PreferencesStructure.swift Commit code changes for Actively Exploited CVEs label customization --- Nudge/Preferences/PreferencesStructure.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 65572c35..325111c3 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -523,14 +523,14 @@ extension UserInterface { // MARK: - UpdateElement struct UpdateElement: Codable { - var language, actionButtonText, actionButtonTextUnsupported, applicationTerminatedTitleText, applicationTerminatedBodyText, customDeferralButtonText, customDeferralDropdownText: String? + var language, actionButtonText, actionButtonTextUnsupported, activelyExploitedOutput, activelyExploitedText, applicationTerminatedTitleText, applicationTerminatedBodyText, customDeferralButtonText, customDeferralDropdownText: String? var informationButtonText, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported: String? var mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported: String? var oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, screenShotAltText, secondaryQuitButtonText, subHeader, subHeaderUnsupported: String? enum CodingKeys: String, CodingKey { case language = "_language" - case actionButtonText, actionButtonTextUnsupported, applicationTerminatedTitleText, applicationTerminatedBodyText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, screenShotAltText, secondaryQuitButtonText, subHeader, subHeaderUnsupported + case actionButtonText, actionButtonTextUnsupported, activelyExploitedText, applicationTerminatedTitleText, applicationTerminatedBodyText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, screenShotAltText, secondaryQuitButtonText, subHeader, subHeaderUnsupported } } @@ -556,6 +556,8 @@ extension UpdateElement { language: String? = nil, actionButtonText: String? = nil, actionButtonTextUnsupported: String? = nil, + activelyExploitedOutput: String? = nil, + activelyExploitedText: String? = nil, applicationTerminatedTitleText: String? = nil, applicationTerminatedBodyText: String? = nil, customDeferralButtonText: String? = nil, @@ -583,6 +585,8 @@ extension UpdateElement { language: language ?? self.language, actionButtonText: actionButtonText ?? self.actionButtonText, actionButtonTextUnsupported: actionButtonTextUnsupported ?? self.actionButtonTextUnsupported, + activelyExploitedOutput: activelyExploitedOutput ?? self.activelyExploitedOutput, + activelyExploitedText: activelyExploitedText ?? self.activelyExploitedText, applicationTerminatedTitleText: applicationTerminatedTitleText ?? self.applicationTerminatedTitleText, applicationTerminatedBodyText: applicationTerminatedBodyText ?? self.applicationTerminatedBodyText, customDeferralButtonText: customDeferralButtonText ?? self.customDeferralButtonText, From ecc9945fce02b3d14b6d5b2950c463cc55566dbd Mon Sep 17 00:00:00 2001 From: Howard Griffith Date: Wed, 25 Feb 2026 09:30:05 -0600 Subject: [PATCH 3/7] Update LeftSide.swift Commit code changes for Actively Exploited CVEs label customization --- Nudge/UI/StandardMode/LeftSide.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Nudge/UI/StandardMode/LeftSide.swift b/Nudge/UI/StandardMode/LeftSide.swift index 2f04e59f..33e599ef 100644 --- a/Nudge/UI/StandardMode/LeftSide.swift +++ b/Nudge/UI/StandardMode/LeftSide.swift @@ -41,7 +41,15 @@ struct StandardModeLeftSide: View { InfoRow(label: "Required Date:", value: DateManager().coerceDateToString(date: requiredInstallationDate, formatterString: UserInterfaceVariables.requiredInstallationDisplayFormat)) } if OptionalFeatureVariables.utilizeSOFAFeed && UserInterfaceVariables.showActivelyExploitedCVEs { - InfoRow(label: "Actively Exploited CVEs:", value: String(appState.activelyExploitedCVEs).capitalized, isHighlighted: appState.activelyExploitedCVEs ? true : false, boldText: appState.activelyExploitedCVEs) + switch UserInterfaceVariables.activelyExploitedOutput { + case "YorN", "yorn": + let resultTempText = String(appState.activelyExploitedCVEs ? "Yes" : "No").localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) + InfoRow(label: UserInterfaceVariables.activelyExploitedText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)), value: resultTempText.capitalized, isHighlighted: appState.activelyExploitedCVEs ? true : false, boldText: appState.activelyExploitedCVEs) + case "Count", "count": + InfoRow(label: UserInterfaceVariables.activelyExploitedText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)), value: String(appState.activelyExploitedCVEsCount), isHighlighted: appState.activelyExploitedCVEs ? true : false, boldText: appState.activelyExploitedCVEs) + default: + InfoRow(label: UserInterfaceVariables.activelyExploitedText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)), value: String(appState.activelyExploitedCVEs).capitalized, isHighlighted: appState.activelyExploitedCVEs ? true : false, boldText: appState.activelyExploitedCVEs) + } } InfoRow(label: "Current OS Version:", value: GlobalVariables.currentOSVersion) if UserInterfaceVariables.showDaysRemainingToUpdate { From 7570e1e47817906191c9634fc6e67600db093207 Mon Sep 17 00:00:00 2001 From: Howard Griffith Date: Wed, 25 Feb 2026 09:31:50 -0600 Subject: [PATCH 4/7] Update Defaults.swift Commit code changes for Actively Exploited CVEs label customization --- Nudge/UI/Defaults.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Nudge/UI/Defaults.swift b/Nudge/UI/Defaults.swift index 42d912c2..6a792e6f 100644 --- a/Nudge/UI/Defaults.swift +++ b/Nudge/UI/Defaults.swift @@ -66,6 +66,7 @@ struct UIConstants { class AppState: ObservableObject { @Published var activelyExploitedCVEs = false + @Published var activelyExploitedCVEsCount = 0 @Published var afterFirstStateChange = false @Published var allowButtons = true @Published var daysRemaining = DateManager().getNumberOfDaysBetween() From 1f2e3ce095e14f5d8d948aead21ebe1b666deac2 Mon Sep 17 00:00:00 2001 From: Howard Griffith Date: Wed, 25 Feb 2026 09:45:59 -0600 Subject: [PATCH 5/7] Update Main.swift Commit code changes for Actively Exploited CVEs label customization --- Nudge/UI/Main.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 0ba5a4bd..4b8c52b9 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -261,6 +261,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { nudgePrimaryState.requiredMinimumOSVersion = selectedOS!.productVersion nudgePrimaryState.sofaAboutUpdateURL = selectedOS!.securityInfo nudgePrimaryState.activelyExploitedCVEs = activelyExploitedCVEs + nudgePrimaryState.activelyExploitedCVEsCount = selectedOS!.activelyExploitedCVEs.count switch (activelyExploitedCVEs, presentCVEs, AppStateManager().requireMajorUpgrade()) { case (false, true, true): LogManager.notice("Non Actively Exploited Major Upgrade detected. Using nonActivelyExploitedCVEsMajorUpgradeSLA value: \(OSVersionRequirementVariables.nonActivelyExploitedCVEsMajorUpgradeSLA)", logger: sofaLog) From 3700b10a2447aed94b8ed40d9e423e8830959800 Mon Sep 17 00:00:00 2001 From: Howard Griffith Date: Thu, 26 Feb 2026 09:52:11 -0600 Subject: [PATCH 6/7] Update com.github.macadmins.Nudge.json Added "ActivelyExploitedOutput" and "ActivelyExploitedText" fields to UpdateElements section of profile. --- Schema/jamf/com.github.macadmins.Nudge.json | 37 +++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index 5847b295..2f9e22c0 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -1534,6 +1534,43 @@ } ] }, + "activelyExploitedOutput": { + "description": "Modifies the output format of the Actively Exploited CVEs field. Use TorF for True/False, YorN for Yes/No, use Count for actual count of CVEs. Lowercase is accepted, any other values will result in default of True/False (Note: This key is only used with Nudge v2.2 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "enum": [ + "TorF", + "YorN", + "Count" + ], + "default": "TorF" + } + ] + }, + "ActivelyExploitedText": { + "description": "Modifies the label for Actively Exploited CVEs (if enabled). Length of text may cause label to span more than one line. (Note: This key is only used with Nudge v2.2 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "Actively Exploited CVEs:" + } + } + } + ] + }, "applicationTerminatedTitleText": { "description": "Modifies the terminated application notification title. (Note: This key is only used with Nudge v2.0 and higher)", "anyOf": [ From 28524bb507f66b0bc0d2e20e732f56bb5fba6ce9 Mon Sep 17 00:00:00 2001 From: Howard Griffith Date: Thu, 26 Feb 2026 10:01:16 -0600 Subject: [PATCH 7/7] Update com.github.macadmins.Nudge.json Small typo in activelyExploitedText label --- Schema/jamf/com.github.macadmins.Nudge.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index 2f9e22c0..37d3c4f3 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -1553,7 +1553,7 @@ } ] }, - "ActivelyExploitedText": { + "activelyExploitedText": { "description": "Modifies the label for Actively Exploited CVEs (if enabled). Length of text may cause label to span more than one line. (Note: This key is only used with Nudge v2.2 and higher)", "anyOf": [ {