From f3232cacfb464cb7a881f708e74d0a7ef879e724 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 25 Mar 2024 11:11:53 -0500 Subject: [PATCH 001/141] v.1.2.0 --- CHANGELOG.md | 11 +++++++++++ Nudge/Info.plist | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 939d5fe7..ac376504 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.2.0] - 2024-05-08 +Requires macOS x.0 and higher. + +### Changed +Upcoming + +### Fixed +Upcoming +### Added +Upcoming + ## [1.1.16] - 2024-03-13 This will be the **final Nudge release** for macOS 11 and potentially other versions of macOS. diff --git a/Nudge/Info.plist b/Nudge/Info.plist index c7214285..90c42a07 100644 --- a/Nudge/Info.plist +++ b/Nudge/Info.plist @@ -15,9 +15,9 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.1.16 + 1.2.0 CFBundleVersion - 1.1.16 + 1.2.0 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion From c4dd6b2c35643507215678bbdbc0efc53199a733 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 25 Mar 2024 11:16:20 -0500 Subject: [PATCH 002/141] bump to macos12 and fix marketing version --- Nudge.xcodeproj/project.pbxproj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Nudge.xcodeproj/project.pbxproj b/Nudge.xcodeproj/project.pbxproj index 636edf4f..b300f470 100644 --- a/Nudge.xcodeproj/project.pbxproj +++ b/Nudge.xcodeproj/project.pbxproj @@ -580,7 +580,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 11.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -640,7 +640,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 11.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; @@ -669,8 +669,8 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 11.0; - MARKETING_VERSION = 1.1.12; + MACOSX_DEPLOYMENT_TARGET = 12.0; + MARKETING_VERSION = 1.2.0; PRODUCT_BUNDLE_IDENTIFIER = com.github.macadmins.Nudge; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -700,8 +700,8 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 11.0; - MARKETING_VERSION = 1.1.12; + MACOSX_DEPLOYMENT_TARGET = 12.0; + MARKETING_VERSION = 1.2.0; PRODUCT_BUNDLE_IDENTIFIER = com.github.macadmins.Nudge; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -728,7 +728,7 @@ "@executable_path/../Frameworks", "@loader_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 11.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; MARKETING_VERSION = 0.0.2; PRODUCT_BUNDLE_IDENTIFIER = com.github.macadmins.NudgeTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -756,7 +756,7 @@ "@executable_path/../Frameworks", "@loader_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 11.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; MARKETING_VERSION = 0.0.2; PRODUCT_BUNDLE_IDENTIFIER = com.github.macadmins.NudgeTests; PRODUCT_NAME = "$(TARGET_NAME)"; From 1520f7bab0db4d719613b25decf34b3ab91355b5 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 26 Mar 2024 12:22:08 -0500 Subject: [PATCH 003/141] add remote image support to companyLogo/screenShot --- Nudge/UI/Common/CompanyLogo.swift | 23 +++++++++++++--- Nudge/UI/StandardMode/RightSide.swift | 31 ++++++++++++++++------ Nudge/UI/StandardMode/ScreenShotZoom.swift | 21 +++++++++++++-- Nudge/Utilities/Extensions.swift | 18 ++++++++++--- Nudge/Utilities/Utils.swift | 8 ++++++ 5 files changed, 84 insertions(+), 17 deletions(-) diff --git a/Nudge/UI/Common/CompanyLogo.swift b/Nudge/UI/Common/CompanyLogo.swift index 2c7c1699..751744d2 100644 --- a/Nudge/UI/Common/CompanyLogo.swift +++ b/Nudge/UI/Common/CompanyLogo.swift @@ -28,8 +28,25 @@ struct CompanyLogo: View { } private var companyImage: some View { - Image(nsImage: ImageManager().getCorrectImage(path: companyLogoPath, type: "CompanyLogo")) - .customResizable(width: uiConstants.logoWidth, height: uiConstants.logoHeight) + AsyncImage(url: UIUtilities().createCorrectURLType(from: companyLogoPath)) { phase in + switch phase { + case .empty: + Image(systemName: "square.dashed") + .customResizable(width: uiConstants.logoWidth, height: uiConstants.logoHeight) + .customFontWeight(fontWeight: .ultraLight) + .opacity(0.05) + case .failure: + Image(systemName: "questionmark.square.dashed") + .customResizable(width: uiConstants.logoWidth, height: uiConstants.logoHeight) + .customFontWeight(fontWeight: .ultraLight) + .opacity(0.05) + case .success(let image): + image + .customResizable(width: uiConstants.logoWidth, height: uiConstants.logoHeight) + @unknown default: + EmptyView() + } + } } private var defaultImage: some View { @@ -53,7 +70,7 @@ struct CompanyLogo: View { } private func shouldShowCompanyLogo() -> Bool { - companyLogoPath.starts(with: "data:") || FileManager.default.fileExists(atPath: companyLogoPath) + ["data:", "https://", "http://", "file://"].contains(where: companyLogoPath.starts(with:)) || FileManager.default.fileExists(atPath: companyLogoPath) } } diff --git a/Nudge/UI/StandardMode/RightSide.swift b/Nudge/UI/StandardMode/RightSide.swift index 60d71f5b..0541b1fa 100644 --- a/Nudge/UI/StandardMode/RightSide.swift +++ b/Nudge/UI/StandardMode/RightSide.swift @@ -112,7 +112,7 @@ struct StandardModeRightSide: View { private var screenshotDisplay: some View { Group { - if shouldShowScreenshot { + if shouldShowScreenshot() { screenshotButton } else { EmptyView() @@ -122,8 +122,25 @@ struct StandardModeRightSide: View { private var screenshotButton: some View { Button(action: { appState.screenShotZoomViewIsPresented = true }) { - Image(nsImage: ImageManager().getCorrectImage(path: screenShotPath, type: "ScreenShot")) - .customResizable(maxHeight: UIConstants.screenshotMaxHeight) + AsyncImage(url: UIUtilities().createCorrectURLType(from: screenShotPath)) { phase in + switch phase { + case .empty: + Image(systemName: "square.dashed") + .customResizable(maxHeight: UIConstants.screenshotMaxHeight) + .customFontWeight(fontWeight: .ultraLight) + .opacity(0.05) + case .failure: + Image(systemName: "questionmark.square.dashed") + .customResizable(maxHeight: UIConstants.screenshotMaxHeight) + .customFontWeight(fontWeight: .ultraLight) + .opacity(0.05) + case .success(let image): + image + .customResizable(maxHeight: UIConstants.screenshotMaxHeight) + @unknown default: + EmptyView() + } + } } .buttonStyle(.plain) .help(UserInterfaceVariables.screenShotAltText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) @@ -132,11 +149,9 @@ struct StandardModeRightSide: View { } .onHoverEffect() } - - private var shouldShowScreenshot: Bool { - // Logic to determine if the screenshot should be shown - let imagePath = ImageManager().getScreenShotPath(colorScheme: colorScheme) - return FileManager.default.fileExists(atPath: imagePath) || imagePath.starts(with: "data:") || forceScreenShotIconMode() + + private func shouldShowScreenshot() -> Bool { + ["data:", "https://", "http://", "file://"].contains(where: screenShotPath.starts(with:)) || FileManager.default.fileExists(atPath: screenShotPath) || forceScreenShotIconMode() } } diff --git a/Nudge/UI/StandardMode/ScreenShotZoom.swift b/Nudge/UI/StandardMode/ScreenShotZoom.swift index fc62bbb1..60f1f12b 100644 --- a/Nudge/UI/StandardMode/ScreenShotZoom.swift +++ b/Nudge/UI/StandardMode/ScreenShotZoom.swift @@ -52,8 +52,25 @@ struct ScreenShotZoom: View { } private var screenShotImage: some View { - Image(nsImage: ImageManager().getCorrectImage(path: screenShotPath, type: "ScreenShot")) - .customResizable(maxHeight: 675) + AsyncImage(url: UIUtilities().createCorrectURLType(from: screenShotPath)) { phase in + switch phase { + case .empty: + Image(systemName: "square.dashed") + .customResizable(maxHeight: 675) + .customFontWeight(fontWeight: .ultraLight) + .opacity(0.05) + case .failure: + Image(systemName: "questionmark.square.dashed") + .customResizable(maxHeight: 675) + .customFontWeight(fontWeight: .ultraLight) + .opacity(0.05) + case .success(let image): + image + .scaledToFit() + @unknown default: + EmptyView() + } + } } } diff --git a/Nudge/Utilities/Extensions.swift b/Nudge/Utilities/Extensions.swift index 30f7e583..6b79958f 100644 --- a/Nudge/Utilities/Extensions.swift +++ b/Nudge/Utilities/Extensions.swift @@ -42,13 +42,23 @@ extension FixedWidthInteger { // Image Extension extension Image { - func customResizable(width: CGFloat? = nil, height: CGFloat? = nil, maxHeight: CGFloat? = nil) -> some View { + func customResizable(width: CGFloat? = nil, height: CGFloat? = nil, minHeight: CGFloat? = nil, minWidth: CGFloat? = nil, maxHeight: CGFloat? = nil, maxWidth: CGFloat? = nil) -> some View { self .resizable() - .aspectRatio(contentMode: .fit) .scaledToFit() - .frame(width: width, height: height) - .frame(maxHeight: maxHeight) + .frame(width: width, height: height, alignment: .center) + .frame(minWidth: minWidth, maxWidth: maxWidth, minHeight: minHeight, maxHeight: maxHeight) + } +} + +extension View { + @ViewBuilder + func customFontWeight(fontWeight: Font.Weight? = nil) -> some View { + if #available(macOS 13.0, *), let weight = fontWeight { + self.fontWeight(weight) + } else { + self + } } } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 8af2223f..068584e5 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -800,6 +800,14 @@ struct UIUtilities { NSApp.windows.first?.center() } + func createCorrectURLType(from input: String) -> URL? { + // Checks if the input contains "://", a simple heuristic to decide if it's a web URL + let isWebURL = ["data:", "https://", "http://", "file://"].contains(where: input.starts(with:)) + + // Returns a URL initialized appropriately based on the input type + return isWebURL ? URL(string: input) : URL(fileURLWithPath: input) + } + private func determineUpdateURL() -> URL? { if let actionButtonPath = FeatureVariables.actionButtonPath { if actionButtonPath.isEmpty { From f38ae97da1118c998dd1b9b5fef642b69d448193 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 26 Mar 2024 12:44:56 -0500 Subject: [PATCH 004/141] tweak screenshot zoom again --- Nudge/UI/StandardMode/ScreenShotZoom.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Nudge/UI/StandardMode/ScreenShotZoom.swift b/Nudge/UI/StandardMode/ScreenShotZoom.swift index 60f1f12b..ea60794a 100644 --- a/Nudge/UI/StandardMode/ScreenShotZoom.swift +++ b/Nudge/UI/StandardMode/ScreenShotZoom.swift @@ -24,7 +24,7 @@ struct ScreenShotZoom: View { Spacer() // Vertically align Screenshot to center } .background(Color(NSColor.windowBackgroundColor)) - .frame(maxWidth: 900) + .frame(minWidth: 850, maxWidth: 1200, minHeight: 900, maxHeight: 1200) } private var closeButton: some View { @@ -66,7 +66,7 @@ struct ScreenShotZoom: View { .opacity(0.05) case .success(let image): image - .scaledToFit() + .customResizable() @unknown default: EmptyView() } From c86a76f5e8bf780aedd6f0e538d9bb35c4ef46a0 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 26 Mar 2024 12:45:03 -0500 Subject: [PATCH 005/141] move to web assets --- Example Assets/com.github.macadmins.Nudge.tester.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 400583c4..a11315a6 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -31,11 +31,11 @@ "randomDelay": false }, "userInterface": { - "iconDarkPath": "data:image/png;base64,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", - "iconLightPath": "data:image/png;base64,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", + "iconDarkPath": "https://github.com/macadmins/nudge/blob/main/assets/NudgeIconInverted.png?raw=true", + "iconLightPath": "https://github.com/macadmins/nudge/blob/main/assets/NudgeIcon.png?raw=true", + "screenShotDarkPath": "https://github.com/macadmins/nudge/blob/main/assets/standard_mode/demo_dark_1_icon.png?raw=true", + "screenShotLightPath": "https://github.com/macadmins/nudge/blob/main/assets/standard_mode/demo_light_1_icon.png?raw=true", "simpleMode": false, - "screenShotDarkPath": "data:image/png;base64,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", - "screenShotLightPath": "data:image/png;base64,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", "updateElements": [ { "_language": "en", From 0cfd0649543a6213ed2682c7f51eae9a89558d77 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 26 Mar 2024 12:53:58 -0500 Subject: [PATCH 006/141] mark macOS 12 and higher for now --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac376504..d8781556 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [1.2.0] - 2024-05-08 -Requires macOS x.0 and higher. +Requires macOS 12.0 and higher. Further releases and feature requests may make this macOS 13 and higher depending on code complexity. ### Changed Upcoming From 62178c295f3a94d210d7012892d39e40c66756c6 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 27 Mar 2024 10:19:09 -0500 Subject: [PATCH 007/141] allow window to be movable by admin (allowMovableWindow) --- Nudge/Preferences/DefaultPreferencesNudge.swift | 8 +++++++- Nudge/Preferences/PreferencesStructure.swift | 4 +++- Nudge/UI/Main.swift | 9 ++++++++- Nudge/Utilities/Utils.swift | 5 +++++ 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 10092ca9..838135b4 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -178,13 +178,19 @@ struct UserExperienceVariables { static var allowGracePeriods: Bool { PrefsWrapper.allowGracePeriods } - + static var allowLaterDeferralButton: Bool { userExperienceProfile?["allowLaterDeferralButton"] as? Bool ?? userExperienceJSON?.allowLaterDeferralButton ?? true } + static var allowMovableWindow: Bool { + userExperienceProfile?["allowMovableWindow"] as? Bool ?? + userExperienceJSON?.allowMovableWindow ?? + false + } + static var allowUserQuitDeferrals: Bool { userExperienceProfile?["allowUserQuitDeferrals"] as? Bool ?? userExperienceJSON?.allowUserQuitDeferrals ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index d4f64507..aa47637d 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -229,7 +229,7 @@ extension AboutUpdateURL { // MARK: - UserExperience struct UserExperience: Codable { - var allowGracePeriods, allowLaterDeferralButton, allowUserQuitDeferrals: Bool? + var allowGracePeriods, allowLaterDeferralButton, allowMovableWindow, allowUserQuitDeferrals: Bool? var allowedDeferrals, allowedDeferralsUntilForcedSecondaryQuitButton, approachingRefreshCycle, approachingWindowTime: Int? var calendarDeferralUnit: String? var elapsedRefreshCycle, gracePeriodInstallDelay, gracePeriodLaunchDelay: Int? @@ -264,6 +264,7 @@ extension UserExperience { func with( allowGracePeriods: Bool? = nil, allowLaterDeferralButton: Bool? = nil, + allowMovableWindow: Bool? = nil, allowUserQuitDeferrals: Bool? = nil, allowedDeferrals: Int? = nil, allowedDeferralsUntilForcedSecondaryQuitButton: Int? = nil, @@ -287,6 +288,7 @@ extension UserExperience { return UserExperience( allowGracePeriods: allowGracePeriods ?? self.allowGracePeriods, allowLaterDeferralButton: allowLaterDeferralButton ?? self.allowLaterDeferralButton, + allowMovableWindow: allowMovableWindow ?? self.allowMovableWindow, allowUserQuitDeferrals: allowUserQuitDeferrals ?? self.allowUserQuitDeferrals, allowedDeferrals: allowedDeferrals ?? self.allowedDeferrals, allowedDeferralsUntilForcedSecondaryQuitButton: allowedDeferralsUntilForcedSecondaryQuitButton ?? self.allowedDeferralsUntilForcedSecondaryQuitButton, diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 9714903f..1eb101d7 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -85,7 +85,7 @@ struct ContentView: View { window?.standardWindowButton(.miniaturizeButton)?.isHidden = true window?.standardWindowButton(.zoomButton)?.isHidden = true window?.center() - window?.isMovable = false + window?.isMovable = UserExperienceVariables.allowMovableWindow window?.collectionBehavior = [.fullScreenAuxiliary] window?.delegate = UIConstants.windowDelegate } @@ -215,16 +215,19 @@ class AppDelegate: NSObject, NSApplicationDelegate { } @objc func screenParametersChanged(_ notification: Notification) { + if UserExperienceVariables.allowMovableWindow { return } LogManager.info("Screen parameters changed - Notification Center", logger: utilsLog) UIUtilities().centerNudge() } @objc func screenProfileChanged(_ notification: Notification) { + if UserExperienceVariables.allowMovableWindow { return } LogManager.info("Display has changed profiles - Notification Center", logger: utilsLog) UIUtilities().centerNudge() } @objc func spacesStateChanged(_ notification: Notification) { + if UserExperienceVariables.allowMovableWindow { return } UIUtilities().centerNudge() LogManager.info("Spaces state changed", logger: utilsLog) nudgePrimaryState.afterFirstStateChange = true @@ -452,6 +455,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { forName: NSWindow.didChangeScreenNotification, object: NSApplication.shared, queue: .main) { _ in + if UserExperienceVariables.allowMovableWindow { return } print("Window object frame moved - Notification Center") UIUtilities().centerNudge() } @@ -548,14 +552,17 @@ class AppDelegate: NSObject, NSApplicationDelegate { class WindowDelegate: NSObject, NSWindowDelegate { func windowDidMove(_ notification: Notification) { + if UserExperienceVariables.allowMovableWindow { return } print("Window attempted to move - Window Delegate") UIUtilities().centerNudge() } func windowDidChangeScreen(_ notification: Notification) { + if UserExperienceVariables.allowMovableWindow { return } print("Window moved screens - Window Delegate") UIUtilities().centerNudge() } func windowDidChangeScreenProfile(_ notification: Notification) { + if UserExperienceVariables.allowMovableWindow { return } print("Display has changed profiles - Window Delegate") UIUtilities().centerNudge() } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 068584e5..9e91e115 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -23,6 +23,11 @@ struct AppStateManager { LoggerUtilities().logUserQuitDeferrals() LoggerUtilities().logUserDeferrals() + // When the window is allowed to be moved, all of the other controls no longer force centering, so we need to force centering when re-activating. + if UserExperienceVariables.allowMovableWindow { + UIUtilities().centerNudge() + } + if DateManager().pastRequiredInstallationDate() && OptionalFeatureVariables.aggressiveUserFullScreenExperience { UIUtilities().centerNudge() NSApp.activate(ignoringOtherApps: true) From 9d6838c587c1fdca44e8d756571bbc296e9a8dbf Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 27 Mar 2024 17:15:38 -0500 Subject: [PATCH 008/141] first real attempt at getting gdmf data --- Nudge.xcodeproj/project.pbxproj | 16 +++ Nudge/3rd Party Assets/gdmf.swift | 222 ++++++++++++++++++++++++++++++ Nudge/UI/Defaults.swift | 1 + Nudge/UI/Main.swift | 4 + Nudge/Utilities/Utils.swift | 84 +++++++++++ 5 files changed, 327 insertions(+) create mode 100644 Nudge/3rd Party Assets/gdmf.swift diff --git a/Nudge.xcodeproj/project.pbxproj b/Nudge.xcodeproj/project.pbxproj index b300f470..d3296dad 100644 --- a/Nudge.xcodeproj/project.pbxproj +++ b/Nudge.xcodeproj/project.pbxproj @@ -19,6 +19,9 @@ 5836861C25DAD01C0004514C /* SoftwareUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5836861B25DAD01C0004514C /* SoftwareUpdate.swift */; }; 6316F0E72832CA0700E1354D /* Schema in Resources */ = {isa = PBXBuildFile; fileRef = 6316F0E62832CA0700E1354D /* Schema */; }; 6347351D2B45DC2400C3401D /* CloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6347351C2B45DC2400C3401D /* CloseButton.swift */; }; + 634CE1092BB47480002C26C4 /* gdmf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634CE1082BB47480002C26C4 /* gdmf.swift */; }; + 634CE10A2BB47480002C26C4 /* gdmf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634CE1082BB47480002C26C4 /* gdmf.swift */; }; + 634CE10B2BB47480002C26C4 /* gdmf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634CE1082BB47480002C26C4 /* gdmf.swift */; }; 636B9C0226CACCAB0007BE3B /* DeferView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636B9C0126CACCAB0007BE3B /* DeferView.swift */; }; 636C4B4A25D1BECE0004A791 /* DefaultPreferencesNudge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636C4B4925D1BECE0004A791 /* DefaultPreferencesNudge.swift */; }; 636C4B7625D4306A0004A791 /* UILogic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636C4B7525D4306A0004A791 /* UILogic.swift */; }; @@ -91,6 +94,7 @@ 5836861B25DAD01C0004514C /* SoftwareUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoftwareUpdate.swift; sourceTree = ""; }; 6316F0E62832CA0700E1354D /* Schema */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Schema; sourceTree = ""; }; 6347351C2B45DC2400C3401D /* CloseButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseButton.swift; sourceTree = ""; }; + 634CE1082BB47480002C26C4 /* gdmf.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = gdmf.swift; sourceTree = ""; }; 636B9C0126CACCAB0007BE3B /* DeferView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeferView.swift; sourceTree = ""; }; 636C4B4925D1BECE0004A791 /* DefaultPreferencesNudge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPreferencesNudge.swift; sourceTree = ""; }; 636C4B7525D4306A0004A791 /* UILogic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UILogic.swift; sourceTree = ""; }; @@ -177,6 +181,14 @@ path = Common; sourceTree = ""; }; + 634CE1032BB47433002C26C4 /* 3rd Party Assets */ = { + isa = PBXGroup; + children = ( + 634CE1082BB47480002C26C4 /* gdmf.swift */, + ); + path = "3rd Party Assets"; + sourceTree = ""; + }; 639B6B3925DF1FEB00E38EC1 /* Preferences */ = { isa = PBXGroup; children = ( @@ -257,6 +269,7 @@ 63D7D0E125C9E9A400236281 /* Nudge */ = { isa = PBXGroup; children = ( + 634CE1032BB47433002C26C4 /* 3rd Party Assets */, 73CC1D7729B81EE500FBF8E2 /* com.github.macadmins.Nudge.SMAppService.plist */, 639B6B5425DF374600E38EC1 /* UI */, 639B6B3925DF1FEB00E38EC1 /* Preferences */, @@ -467,6 +480,7 @@ 63C39C1B2A38D33C0049EF62 /* Extensions.swift in Sources */, 0B0CCEDA25CE1C7C00A93D43 /* OSVersion.swift in Sources */, 639E198A25CD9E21008F618B /* Utils.swift in Sources */, + 634CE1092BB47480002C26C4 /* gdmf.swift in Sources */, 636C4B7625D4306A0004A791 /* UILogic.swift in Sources */, 41AD2B0026DE65B1004C52B1 /* QuitButtons.swift in Sources */, 636C4B4A25D1BECE0004A791 /* DefaultPreferencesNudge.swift in Sources */, @@ -497,6 +511,7 @@ files = ( 0BC9972C25CE2DFC0019FC8F /* OSVersionTests.swift in Sources */, 63D7D0F625C9E9A500236281 /* NudgeTests.swift in Sources */, + 634CE10A2BB47480002C26C4 /* gdmf.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -505,6 +520,7 @@ buildActionMask = 2147483647; files = ( 63D7D10125C9E9A500236281 /* NudgeUITests.swift in Sources */, + 634CE10B2BB47480002C26C4 /* gdmf.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Nudge/3rd Party Assets/gdmf.swift b/Nudge/3rd Party Assets/gdmf.swift new file mode 100644 index 00000000..c548b1f8 --- /dev/null +++ b/Nudge/3rd Party Assets/gdmf.swift @@ -0,0 +1,222 @@ +// +// gdmf.swift +// Nudge +// +// Created by Erik Gomez on 3/27/24. +// + +import Foundation + +// Define the root structure +struct GDMFAssetInfo: Codable { + let publicAssetSets: AssetSets + let assetSets: AssetSets + let publicRapidSecurityResponses: AssetSets? + + enum CodingKeys: String, CodingKey { + case publicAssetSets = "PublicAssetSets" + case assetSets = "AssetSets" + case publicRapidSecurityResponses = "PublicRapidSecurityResponses" + } +} + +// Represents both PublicAssetSets and AssetSets +struct AssetSets: Codable { + let iOS: [Asset]? + let xrOS: [Asset]? + let macOS: [Asset]? + let visionOS: [Asset]? + + enum CodingKeys: String, CodingKey { + case iOS = "iOS" + case xrOS = "xrOS" + case macOS = "macOS" + case visionOS = "visionOS" + } +} + +// Represents an individual asset +struct Asset: Codable { + let productVersion: String + let build: String + let postingDate: String + let expirationDate: String + let supportedDevices: [String] + + enum CodingKeys: String, CodingKey { + case productVersion = "ProductVersion" + case build = "Build" + case postingDate = "PostingDate" + case expirationDate = "ExpirationDate" + case supportedDevices = "SupportedDevices" + } +} + +extension GDMFAssetInfo { + init(data: Data) throws { + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .iso8601 // Use ISO 8601 date format + self = try decoder.decode(GDMFAssetInfo.self, from: data) + } + + init(_ json: String, using encoding: String.Encoding = .utf8) throws { + guard let data = json.data(using: encoding) else { + throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil) + } + try self.init(data: data) + } + + init(fromURL url: URL) throws { + try self.init(data: try Data(contentsOf: url)) + } + + func with( + PublicAssetSets: AssetSets, + AssetSets: AssetSets, + PublicRapidSecurityResponses: AssetSets + ) -> GDMFAssetInfo { + return GDMFAssetInfo( + publicAssetSets: PublicAssetSets, + assetSets: AssetSets, + publicRapidSecurityResponses: PublicRapidSecurityResponses + ) + } +} + +// https://arvindcs.medium.com/ssl-pinning-in-ios-30ee13f3202d +class GDMFPinnedSSL: NSObject { + static let shared = GDMFPinnedSSL() + + // Create an array to store the public keys of the trusted certificates + // To get these certs, download them as .cer, convert to .der, then base64 encode + //// openssl x509 -in Apple\ Server\ Authentication\ CA.cer -outform der -out Apple\ Server\ Authentication\ CA.der + /// base64 -i Apple\ Server\ Authentication\ CA.der + let trustedCertificates: [SecCertificate] = [ + // Apple Root CA + SecCertificateCreateWithData(nil, Data(base64Encoded: "MIIEuzCCA6OgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMDYwNDI1MjE0MDM2WhcNMzUwMjA5MjE0MDM2WjBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkkakJH5HbHkdQ6wXtXnmELes2oldMVeyLGYne+Uts9QerIjAC6Bg++FAJ039BqJj50cpmnCRrEdCju+QbKsMflZ56DKRHi1vUFjczy8QPTc4UadHJGXL1XQ7Vf1+b8iUDulWPTV0N8WQ1IxVLFVkds5T39pyez1C6wVhQZ48ItCD3y6wsIG9wtj8BMIy3Q88PnT3zK0koGsj+zrW5DtleHNbLPbU6rfQPDgCSC7EhFi501TwN22IWq6NxkkdTVcGvL0Gz+PvjcM3mo0xFfh9Ma1CWQYnEdGILEINBhzOKgbEwWOxaBDKMaLOPHd5lc/9nXmW8Sdh2nzMUZaF3lMktAgMBAAGjggF6MIIBdjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUK9BpR5R2Cf70a40uQKb3R01/CF4wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01/CF4wggERBgNVHSAEggEIMIIBBDCCAQAGCSqGSIb3Y2QFATCB8jAqBggrBgEFBQcCARYeaHR0cHM6Ly93d3cuYXBwbGUuY29tL2FwcGxlY2EvMIHDBggrBgEFBQcCAjCBthqBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMA0GCSqGSIb3DQEBBQUAA4IBAQBcNplMLXi37Yyb3PN3m/J20ncwT8EfhYOFG5k9RzfyqZtAjizUsZAS2L70c5vu0mQPy3lPNNiiPvl4/2vIB+x9OYOLUyDTOMSxv5pPCmv/K/xZpwUJfBdAVhEedNO3iyM7R6PVbyTi69G3cN8PReEnyvFteO3ntRcXqNx+IjXKJdXZD9Zr1KIkIxH3oayPc4FgxhtbCS+SsvhESPBgOJ4V9T0mZyCKM2r3DYLP3uujL/lTaltkwGMzd/c6ByxW69oPIQ7aunMZT7XZNn/Bh1XZp5m5MkL72NVxnn6hUrcbvZNCJBIqxw8dtk2cXmPIS4AXUKqK1drk/NAJBzewdXUh")! as CFData)!, + // Apple Server Authentication CA + SecCertificateCreateWithData(nil, Data(base64Encoded: "MIID+DCCAuCgAwIBAgIII2l0BK3LgxQwDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTE0MDMwODAxNTMwNFoXDTI5MDMwODAxNTMwNFowbTEnMCUGA1UEAwweQXBwbGUgU2VydmVyIEF1dGhlbnRpY2F0aW9uIENBMSAwHgYDVQQLDBdDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5Jhawy4ercRWSjt+qPuGA11O6pGDMfIVy9zB8CU9XDUr/4V7JS1ATAmSxvTk10dcEUcEY+iL6rt+YGNa/Tk1DEPoliJ/TQIV25SKBtlRFc5qL45xIGoZ6w1Hi2pX4pH3bMN5sDsTF9WyY56b6VyAdGXN6Ds1jD7cniC7hmmiCuEBsYxYkZivnsuJUfeeIOaIbgT4C0znYl3dKMgzWCgqzBJvxcm9jqBUebDfoD9tTkNYpXLxqV5tGeAo+JOqaP6HYP/XbbqhsgrXdmTjsklaUpsVzJtGuCLLGUueOdkuJuFQPbuDZQtsqZYdGFLuWuFe7UeaEE/cNobaJrHzRIXSrAgMBAAGjgaYwgaMwHQYDVR0OBBYEFCzFbVLdMe+M7AiB7d/cykMARQHQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01/CF4wLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybC5hcHBsZS5jb20vcm9vdC5jcmwwDgYDVR0PAQH/BAQDAgEGMBAGCiqGSIb3Y2QGAgwEAgUAMA0GCSqGSIb3DQEBCwUAA4IBAQAj8QZ+UEGBol7TcKRJka/YzGeMoSV9xJqTOS/YafsbQVtE19lryzslCRry9OPHnOiwW/Df3SIlERWTuUle2gxmel7Xb/Bj1GWMxHpUfVZPZZr92sSyyLC4oct94EeoQBW4FhntW2GO36rQzdI6wH46nyJO39/0ThrNk//Q8EVVZDM+1OXaaKATinYwJ9S/+B529vnDAO+xg+pTbVw1xw0HAbr4Ybn+xZprQ2GBA+u6X3Cd6G+UJEvczpKoLqI1PONJ4BZ3otxruY0YQrk2lkMyxst2mTU22FbGmF3Db6V+lcLVegoCIGZ4kvJnpCMN6Am9zCExEKC9vrXdTN1GA5mZ")! as CFData)! + ] + + func pin(url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> Void) { + let request = URLRequest(url: url) + let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil) + let task = session.dataTask(with: request, completionHandler: completion) + task.resume() + } + +// func pin2(url: URL, completion: @escaping (Result) -> Void) { +// let request = URLRequest(url: url) +// let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil) +// let task = session.dataTask(with: request) { data, response, error in +// if let error = error { +// completion(.failure(error)) +// } else if let data = data { +// completion(.success(data)) +// } else { +// completion(.failure(URLError(.badServerResponse))) +// } +// } +// task.resume() +// } + +// func pin3(url: URL, completion: @escaping (Result) -> Void) { +// let request = URLRequest(url: url) +// let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil) +// let task = session.dataTask(with: request) { data, response, error in +// if let error = error { +// completion(.failure(error)) +// return +// } +// +// guard let data = data else { +// completion(.failure(URLError(.cannotParseResponse))) +// return +// } +// +// do { +// let assetInfo = try JSONDecoder().decode(GDMFAssetInfo.self, from: data) +// completion(.success(assetInfo)) +// } catch { +// completion(.failure(error)) +// } +// } +// task.resume() +// } + +// func fetchAssetInfoSynchronously(urlString: String, completion: @escaping (GDMFAssetInfo?, Error?) -> Void) { +// guard let url = URL(string: urlString) else { +// completion(nil, URLError(.badURL)) +// return +// } +// +// DispatchQueue.global(qos: .userInitiated).async { +// let semaphore = DispatchSemaphore(value: 0) +// var assetInfo: GDMFAssetInfo? +// var requestError: Error? +// +// let request = URLRequest(url: url) +// let task = URLSession.shared.dataTask(with: request) { data, response, error in +// defer { semaphore.signal() } +// +// if let error = error { +// requestError = error +// return +// } +// +// guard let data = data else { +// requestError = URLError(.badServerResponse) +// return +// } +// +// do { +// // print(String(data: data, encoding: .utf8)) +// assetInfo = try JSONDecoder().decode(GDMFAssetInfo.self, from: data) +// } catch { +// requestError = error +// } +// } +// +// task.resume() +// semaphore.wait() // This will block the background thread until the semaphore is signaled +// +// DispatchQueue.main.async { +// completion(assetInfo, requestError) +// } +// } +// } +} + +extension GDMFPinnedSSL: URLSessionDelegate { + func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { + // Check if the certificate is trusted + if let serverTrust = challenge.protectionSpace.serverTrust, + SecTrustGetCertificateCount(serverTrust) > 0 { + if SecTrustGetCertificateCount(serverTrust) > 1 { + // Convert certificate stores to maps so they can be compared + let trustedCertificatesData = trustedCertificates.map { SecCertificateCopyData($0) as Data } + let serverCertificatesArray = SecTrustCopyCertificateChain(serverTrust)! as! [SecCertificate] + let serverCertificatesData = serverCertificatesArray.map { SecCertificateCopyData($0) as Data } + + if !trustedCertificatesData.filter(serverCertificatesData.contains).isEmpty { + completionHandler(.useCredential, URLCredential(trust: serverTrust)) + return + } + } else { + // Single certs we just loop through the internal nudge trust and compare if any exist + let serverCertificate = SecTrustCopyCertificateChain(serverTrust)! + let serverCertificateData = SecCertificateCopyData(serverCertificate as! SecCertificate) as Data + + for trustedCertificate in trustedCertificates { + let trustedCertificateData = SecCertificateCopyData(trustedCertificate) as Data + if serverCertificateData == trustedCertificateData { + completionHandler(.useCredential, URLCredential(trust: serverTrust)) + return + } + } + } + } + // If the certificate is not trusted, cancel the request + completionHandler(.cancelAuthenticationChallenge, nil) + } +} diff --git a/Nudge/UI/Defaults.swift b/Nudge/UI/Defaults.swift index 11314570..324c4a89 100644 --- a/Nudge/UI/Defaults.swift +++ b/Nudge/UI/Defaults.swift @@ -80,6 +80,7 @@ class AppState: ObservableObject { @Published var userRequiredMinimumOSVersion = Globals.nudgeDefaults.object(forKey: "requiredMinimumOSVersion") as? String ?? "0.0" @Published var userSessionDeferrals = Globals.nudgeDefaults.object(forKey: "userSessionDeferrals") as? Int ?? 0 @Published var backgroundBlur = [BackgroundBlurWindowController]() + @Published var gdmfAssets: GDMFAssetInfo? @Published var screenCurrentlyLocked = false @Published var locale = Locale.current @Published var nudgeCustomEventDate = DateManager().getCurrentDate() diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 1eb101d7..959f3723 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -142,6 +142,9 @@ class AppDelegate: NSObject, NSApplicationDelegate { handleKeyboardEvents() handleApplicationLaunchesIfNeeded() checkFullScreenStateOnFirstLaunch() + DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { + print(nudgePrimaryState.gdmfAssets) + } } func applicationDidResignActive(_ notification: Notification) { @@ -174,6 +177,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { // Pre-Launch Logic func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") + NetworkFileManager().getGDMFAssets() handleSMAppService() checkForBadProfilePath() handleCommandLineArguments() diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 9e91e115..cabd4e57 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -704,6 +704,90 @@ struct NetworkFileManager { } } + func getGDMFAssets() { + // Define the URL you want to pin to + if let url = URL(string: "https://gdmf.apple.com/v2/pmv") { + // Call the pin method + GDMFPinnedSSL.shared.pin(url: url) { data, response, error in + if let error = error { + print("Error: \(error.localizedDescription)") + } else if let data = data { + do { + let assetInfo = try GDMFAssetInfo(data: data) + // print(assetInfo) + DispatchQueue.main.async { + nudgePrimaryState.gdmfAssets = assetInfo + } + } catch { + print("Failed to decode JSON: \(error.localizedDescription)") + } + } else { + print("Unknown error") + } + } + } else { + print("Invalid URL") + } + } + +// func getGDMFAssets2() -> GDMFAssetInfo? { +// if let url = URL(string: "https://gdmf.apple.com/v2/pmv") { +// // Call the pin method +// GDMFPinnedSSL.shared.pin1(url: url) { result in +// switch result { +// case .success(let assetInfo): +// print(assetInfo) +// case .failure(let error): +// print("Error: \(error.localizedDescription)") +// } +// } +// } +// return nil +// } +// +// func getGDMFAssetsSync() -> GDMFAssetInfo? { +// var info: GDMFAssetInfo? +// GDMFPinnedSSL.shared.fetchAssetInfoSynchronously(urlString: "https://gdmf.apple.com/v2/pmv") { assetInfo, error in +// if let error = error { +// print("Error: \(error.localizedDescription)") +// } else if let assetInfo = assetInfo { +// print("Asset Info: \(assetInfo)") +// info = assetInfo +// } else { +// print("Unknown error occurred") +// } +// } +// return info +// } +// GDMFPinnedSSL.shared.pin(url: url) { data, response, error in +// // Ensure there is no error +// guard error == nil else { +// print("Error: \(error!.localizedDescription)") +// return nil +// } +// +// // Ensure there is data returned +// guard let data = data else { +// print("No data received") +// return nil +// } +// // Process the JSON data +// do { +// // Assuming `AssetInfo` is the struct model that conforms to Decodable +// let assetInfo = try JSONDecoder().decode(GDMFAssetInfo.self, from: data) +// // Now you have your model and can use it as needed +// return assetInfo +// } catch { +// print("Failed to decode JSON: \(error.localizedDescription)") +// return nil +// } +// } +// } else { +// print("invalid URL") +// return nil +// } +// } + func getBackupMajorUpgradeAppPath() -> String { switch VersionManager.getMajorRequiredNudgeOSVersion() { case 12: From f83eab8d36b9011c8eff609e488cff2a95bd239c Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 27 Mar 2024 17:15:53 -0500 Subject: [PATCH 009/141] return board-id for gdmf comparison --- Nudge/Utilities/Utils.swift | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index cabd4e57..ae482f44 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -8,6 +8,7 @@ import AppKit import CoreMediaIO import Foundation +import IOKit #if canImport(ServiceManagement) import ServiceManagement #endif @@ -477,6 +478,49 @@ struct DateManager { } struct DeviceManager { + // print(DeviceManager().getBoardID()) + func getBoardID() -> String? { + var service: io_service_t = IOServiceGetMatchingService(kIOMainPortDefault, IOServiceMatching("IOPlatformExpertDevice")) + + defer { + IOObjectRelease(service) + } + + guard service != 0 else { + print("Failed to get IOPlatformExpertDevice service") + return nil + } + + guard let property = IORegistryEntryCreateCFProperty(service, "board-id" as CFString, kCFAllocatorDefault, 0)?.takeRetainedValue() else { + print("Failed to get board-id property") + return nil + } + +// print(CFGetTypeID(property)) +// print(CFStringGetTypeID()) +// if let propertyDescription = CFCopyTypeIDDescription(CFGetTypeID(property)) { +// print("Property type is:", propertyDescription) +// } + + // Check if the property is of type CFData + if CFGetTypeID(property) == CFDataGetTypeID(), let data = property as? Data { + // Attempt to convert the data to a string + let boardID = String(data: data, encoding: .utf8)?.trimmingCharacters(in: CharacterSet(charactersIn: "\0")) + return boardID + } else { + print("Failed to check board-id property") + return nil + } + } + + func getSysctlValue(for key: String) -> String? { + var size: size_t = 0 + sysctlbyname(key, nil, &size, nil, 0) + var value = [CChar](repeating: 0, count: size) + sysctlbyname(key, &value, &size, nil, 0) + return String(cString: value) + } + func getCPUTypeInt() -> Int { // https://stackoverflow.com/a/63539782 var cputype = cpu_type_t() @@ -485,6 +529,10 @@ struct DeviceManager { return result == -1 ? -1 : Int(cputype) } + func getHardwareModel() -> String { + getSysctlValue(for: "hw.model") ?? "" + } + func getCPUTypeString() -> String { // https://stackoverflow.com/a/63539782 let type = getCPUTypeInt() From ce83f3c5d16b282f60025e9aebd7de844b9f9958 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 27 Mar 2024 17:19:34 -0500 Subject: [PATCH 010/141] get rid of some compiler warnings --- Nudge/Utilities/Utils.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index ae482f44..317e016e 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -238,7 +238,7 @@ struct CameraManager { var address = CMIOObjectPropertyAddress( mSelector: CMIOObjectPropertySelector(kCMIOObjectPropertyName), mScope: CMIOObjectPropertyScope(kCMIOObjectPropertyScopeGlobal), - mElement: CMIOObjectPropertyElement(kCMIOObjectPropertyElementMaster)) + mElement: CMIOObjectPropertyElement(kCMIOObjectPropertyElementMain)) var nameCFString: CFString? let propsize = UInt32(MemoryLayout>.size) @@ -260,7 +260,7 @@ struct CameraUtilities { var opa = CMIOObjectPropertyAddress( mSelector: CMIOObjectPropertySelector(kCMIOHardwarePropertyDevices), mScope: CMIOObjectPropertyScope(kCMIOObjectPropertyScopeGlobal), - mElement: CMIOObjectPropertyElement(kCMIOObjectPropertyElementMaster)) + mElement: CMIOObjectPropertyElement(kCMIOObjectPropertyElementMain)) var dataSize: UInt32 = 0 var dataUsed: UInt32 = 0 @@ -480,7 +480,7 @@ struct DateManager { struct DeviceManager { // print(DeviceManager().getBoardID()) func getBoardID() -> String? { - var service: io_service_t = IOServiceGetMatchingService(kIOMainPortDefault, IOServiceMatching("IOPlatformExpertDevice")) + let service: io_service_t = IOServiceGetMatchingService(kIOMainPortDefault, IOServiceMatching("IOPlatformExpertDevice")) defer { IOObjectRelease(service) @@ -570,7 +570,7 @@ struct DeviceManager { } private func getPropertyFromPlatformExpert(key: String) -> String? { - let platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice")) + let platformExpert = IOServiceGetMatchingService(kIOMainPortDefault, IOServiceMatching("IOPlatformExpertDevice")) defer { IOObjectRelease(platformExpert) } guard platformExpert > 0, @@ -1156,7 +1156,7 @@ var cameras: [CameraManager] { var opa = CMIOObjectPropertyAddress( mSelector: CMIOObjectPropertySelector(kCMIOHardwarePropertyDevices), mScope: CMIOObjectPropertyScope(kCMIOObjectPropertyScopeGlobal), - mElement: CMIOObjectPropertyElement(kCMIOObjectPropertyElementMaster)) + mElement: CMIOObjectPropertyElement(kCMIOObjectPropertyElementMain)) var dataSize: UInt32 = 0 var dataUsed: UInt32 = 0 From 9a3e8a43c170069f433b3f2a3bbfd0e827512c5f Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 28 Mar 2024 15:04:22 -0500 Subject: [PATCH 011/141] support for apple silicon vs intel hardware for gdmf --- Nudge/UI/Defaults.swift | 2 ++ Nudge/UI/Main.swift | 21 ++++++++++++++++++++- Nudge/Utilities/Logger.swift | 1 + Nudge/Utilities/SoftwareUpdate.swift | 12 ++++++++++++ Nudge/Utilities/Utils.swift | 22 +++++++++++----------- 5 files changed, 46 insertions(+), 12 deletions(-) diff --git a/Nudge/UI/Defaults.swift b/Nudge/UI/Defaults.swift index 324c4a89..1026b157 100644 --- a/Nudge/UI/Defaults.swift +++ b/Nudge/UI/Defaults.swift @@ -26,6 +26,8 @@ struct Globals { static let configProfile = ConfigurationManager().getConfigurationAsProfile() static let nudgeDefaults = UserDefaults.standard static let nudgeJSONPreferences = NetworkFileManager().getNudgeJSONPreferences() + // Device Properties + var hardwareID: String = "" } struct Intervals { diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 959f3723..91ed77a0 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -143,7 +143,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { handleApplicationLaunchesIfNeeded() checkFullScreenStateOnFirstLaunch() DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { - print(nudgePrimaryState.gdmfAssets) + print(nudgePrimaryState.gdmfAssets as Any) } } @@ -178,6 +178,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") NetworkFileManager().getGDMFAssets() + self.getSoftwareUpdateDeviceID() handleSMAppService() checkForBadProfilePath() handleCommandLineArguments() @@ -552,6 +553,24 @@ class AppDelegate: NSObject, NSApplicationDelegate { SoftwareUpdate().download() } } + + func getSoftwareUpdateDeviceID() { + if DeviceManager().getCPUTypeString() == "Apple Silicon" { + // There is no local bridge + globals.hardwareID = DeviceManager().getIORegInfo(serviceTarget: "target-sub-type") ?? "Unknown" + } else { + // Attempt localbridge for T2, if it fails, it's likely a T1 or lower + let bridgeID = SoftwareUpdate().getSoftwareUpdateDeviceID() + let boardID = DeviceManager().getIORegInfo(serviceTarget: "board-id") + if bridgeID.isEmpty { + // Fallback to boardID for T1 + globals.hardwareID = boardID ?? "Unknown" + } else { + // T2 uses bridge ID for it's update brain via gdmf + globals.hardwareID = bridgeID + } + } + } } class WindowDelegate: NSObject, NSWindowDelegate { diff --git a/Nudge/Utilities/Logger.swift b/Nudge/Utilities/Logger.swift index 9bd156f5..5d3cd5a6 100644 --- a/Nudge/Utilities/Logger.swift +++ b/Nudge/Utilities/Logger.swift @@ -44,6 +44,7 @@ let loggingLog = LogManager.createLogger(category: "logging") let prefsProfileLog = LogManager.createLogger(category: "preferences-profile") let prefsJSONLog = LogManager.createLogger(category: "preferences-json") let uiLog = LogManager.createLogger(category: "user-interface") +let softwareupdateDeviceLog = LogManager.createLogger(category: "softwareupdate-device") let softwareupdateListLog = LogManager.createLogger(category: "softwareupdate-list") let softwareupdateDownloadLog = LogManager.createLogger(category: "softwareupdate-download") diff --git a/Nudge/Utilities/SoftwareUpdate.swift b/Nudge/Utilities/SoftwareUpdate.swift index fed909fa..7ebba8db 100644 --- a/Nudge/Utilities/SoftwareUpdate.swift +++ b/Nudge/Utilities/SoftwareUpdate.swift @@ -9,6 +9,18 @@ import Foundation import os class SoftwareUpdate { + func getSoftwareUpdateDeviceID() -> String { + let (output, error, exitCode) = runProcess(launchPath: "/usr/libexec/remotectl", arguments: ["get-property", "localbridge", "HWModel"]) + + if exitCode != 0 { + LogManager.error("Error assessing DeviceID: \(error)", logger: softwareupdateDeviceLog) + return error + } else { + LogManager.info("SoftwareUpdateDeviceID: \(output)", logger: softwareupdateDeviceLog) + return output + } + } + func list() -> String { let (output, error, exitCode) = runProcess(launchPath: "/usr/sbin/softwareupdate", arguments: ["--list", "--all"]) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 317e016e..918cf747 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -478,8 +478,7 @@ struct DateManager { } struct DeviceManager { - // print(DeviceManager().getBoardID()) - func getBoardID() -> String? { + func getIORegInfo(serviceTarget: String) -> String? { let service: io_service_t = IOServiceGetMatchingService(kIOMainPortDefault, IOServiceMatching("IOPlatformExpertDevice")) defer { @@ -487,12 +486,12 @@ struct DeviceManager { } guard service != 0 else { - print("Failed to get IOPlatformExpertDevice service") + LogManager.error("Failed to fetch IOPlatformExpertDevice service.", logger: utilsLog) return nil } - guard let property = IORegistryEntryCreateCFProperty(service, "board-id" as CFString, kCFAllocatorDefault, 0)?.takeRetainedValue() else { - print("Failed to get board-id property") + guard let property = IORegistryEntryCreateCFProperty(service, serviceTarget as CFString, kCFAllocatorDefault, 0)?.takeRetainedValue() else { + LogManager.error("Failed to fetch \(serviceTarget) property.", logger: utilsLog) return nil } @@ -505,10 +504,10 @@ struct DeviceManager { // Check if the property is of type CFData if CFGetTypeID(property) == CFDataGetTypeID(), let data = property as? Data { // Attempt to convert the data to a string - let boardID = String(data: data, encoding: .utf8)?.trimmingCharacters(in: CharacterSet(charactersIn: "\0")) - return boardID + let serviceTargetProperty = String(data: data, encoding: .utf8)?.trimmingCharacters(in: CharacterSet(charactersIn: "\0")) + return serviceTargetProperty } else { - print("Failed to check board-id property") + LogManager.error("Failed to check \(serviceTarget) property.", logger: utilsLog) return nil } } @@ -544,13 +543,13 @@ struct DeviceManager { switch cpuArch { case Int(CPU_TYPE_X86) /* Intel */: - LogManager.debug("CPU Type is Intel", logger: utilsLog) + LogManager.debug("CPU Type: Intel", logger: utilsLog) return "Intel" case Int(CPU_TYPE_ARM) /* Apple Silicon */: - LogManager.debug("CPU Type is Apple Silicon", logger: utilsLog) + LogManager.debug("CPU Type: Apple Silicon", logger: utilsLog) return "Apple Silicon" default: - LogManager.debug("Unknown CPU Type", logger: utilsLog) + LogManager.debug("CPU Type: Unknown", logger: utilsLog) return "unknown" } } @@ -765,6 +764,7 @@ struct NetworkFileManager { // print(assetInfo) DispatchQueue.main.async { nudgePrimaryState.gdmfAssets = assetInfo + // perhaps process this as a lookup for all OS versions a board ID can contain } } catch { print("Failed to decode JSON: \(error.localizedDescription)") From 16426c29e45b13a259e72d0a85c21fe122e14ab3 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 29 Mar 2024 15:38:46 -0500 Subject: [PATCH 012/141] refactor gdmf and hardmodel --- Nudge/3rd Party Assets/gdmf.swift | 116 ++++-------- Nudge/UI/Defaults.swift | 4 +- Nudge/UI/Main.swift | 23 --- Nudge/Utilities/SoftwareUpdate.swift | 44 +---- Nudge/Utilities/Utils.swift | 257 ++++++++++++++------------- 5 files changed, 175 insertions(+), 269 deletions(-) diff --git a/Nudge/3rd Party Assets/gdmf.swift b/Nudge/3rd Party Assets/gdmf.swift index c548b1f8..1baeb122 100644 --- a/Nudge/3rd Party Assets/gdmf.swift +++ b/Nudge/3rd Party Assets/gdmf.swift @@ -98,93 +98,47 @@ class GDMFPinnedSSL: NSObject { SecCertificateCreateWithData(nil, Data(base64Encoded: "MIID+DCCAuCgAwIBAgIII2l0BK3LgxQwDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTE0MDMwODAxNTMwNFoXDTI5MDMwODAxNTMwNFowbTEnMCUGA1UEAwweQXBwbGUgU2VydmVyIEF1dGhlbnRpY2F0aW9uIENBMSAwHgYDVQQLDBdDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5Jhawy4ercRWSjt+qPuGA11O6pGDMfIVy9zB8CU9XDUr/4V7JS1ATAmSxvTk10dcEUcEY+iL6rt+YGNa/Tk1DEPoliJ/TQIV25SKBtlRFc5qL45xIGoZ6w1Hi2pX4pH3bMN5sDsTF9WyY56b6VyAdGXN6Ds1jD7cniC7hmmiCuEBsYxYkZivnsuJUfeeIOaIbgT4C0znYl3dKMgzWCgqzBJvxcm9jqBUebDfoD9tTkNYpXLxqV5tGeAo+JOqaP6HYP/XbbqhsgrXdmTjsklaUpsVzJtGuCLLGUueOdkuJuFQPbuDZQtsqZYdGFLuWuFe7UeaEE/cNobaJrHzRIXSrAgMBAAGjgaYwgaMwHQYDVR0OBBYEFCzFbVLdMe+M7AiB7d/cykMARQHQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01/CF4wLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybC5hcHBsZS5jb20vcm9vdC5jcmwwDgYDVR0PAQH/BAQDAgEGMBAGCiqGSIb3Y2QGAgwEAgUAMA0GCSqGSIb3DQEBCwUAA4IBAQAj8QZ+UEGBol7TcKRJka/YzGeMoSV9xJqTOS/YafsbQVtE19lryzslCRry9OPHnOiwW/Df3SIlERWTuUle2gxmel7Xb/Bj1GWMxHpUfVZPZZr92sSyyLC4oct94EeoQBW4FhntW2GO36rQzdI6wH46nyJO39/0ThrNk//Q8EVVZDM+1OXaaKATinYwJ9S/+B529vnDAO+xg+pTbVw1xw0HAbr4Ybn+xZprQ2GBA+u6X3Cd6G+UJEvczpKoLqI1PONJ4BZ3otxruY0YQrk2lkMyxst2mTU22FbGmF3Db6V+lcLVegoCIGZ4kvJnpCMN6Am9zCExEKC9vrXdTN1GA5mZ")! as CFData)! ] - func pin(url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> Void) { + func pinAsynch(url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> Void) { let request = URLRequest(url: url) let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil) let task = session.dataTask(with: request, completionHandler: completion) task.resume() } -// func pin2(url: URL, completion: @escaping (Result) -> Void) { -// let request = URLRequest(url: url) -// let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil) -// let task = session.dataTask(with: request) { data, response, error in -// if let error = error { -// completion(.failure(error)) -// } else if let data = data { -// completion(.success(data)) -// } else { -// completion(.failure(URLError(.badServerResponse))) -// } -// } -// task.resume() -// } - -// func pin3(url: URL, completion: @escaping (Result) -> Void) { -// let request = URLRequest(url: url) -// let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil) -// let task = session.dataTask(with: request) { data, response, error in -// if let error = error { -// completion(.failure(error)) -// return -// } -// -// guard let data = data else { -// completion(.failure(URLError(.cannotParseResponse))) -// return -// } -// -// do { -// let assetInfo = try JSONDecoder().decode(GDMFAssetInfo.self, from: data) -// completion(.success(assetInfo)) -// } catch { -// completion(.failure(error)) -// } -// } -// task.resume() -// } - -// func fetchAssetInfoSynchronously(urlString: String, completion: @escaping (GDMFAssetInfo?, Error?) -> Void) { -// guard let url = URL(string: urlString) else { -// completion(nil, URLError(.badURL)) -// return -// } -// -// DispatchQueue.global(qos: .userInitiated).async { -// let semaphore = DispatchSemaphore(value: 0) -// var assetInfo: GDMFAssetInfo? -// var requestError: Error? -// -// let request = URLRequest(url: url) -// let task = URLSession.shared.dataTask(with: request) { data, response, error in -// defer { semaphore.signal() } -// -// if let error = error { -// requestError = error -// return -// } -// -// guard let data = data else { -// requestError = URLError(.badServerResponse) -// return -// } -// -// do { -// // print(String(data: data, encoding: .utf8)) -// assetInfo = try JSONDecoder().decode(GDMFAssetInfo.self, from: data) -// } catch { -// requestError = error -// } -// } -// -// task.resume() -// semaphore.wait() // This will block the background thread until the semaphore is signaled -// -// DispatchQueue.main.async { -// completion(assetInfo, requestError) -// } -// } -// } + func pinSync(url: URL, maxRetries: Int = 3) -> (data: Data?, response: URLResponse?, error: Error?) { + let semaphore = DispatchSemaphore(value: 0) + let request = URLRequest(url: url) + let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil) + var attempts = 0 + + var responseData: Data? + var response: URLResponse? + var responseError: Error? + + // Retry loop + while attempts < maxRetries { + attempts += 1 + let task = session.dataTask(with: request) { data, resp, error in + responseData = data + response = resp + responseError = error + semaphore.signal() + } + task.resume() + + semaphore.wait() + + // Break the loop if the task succeeded or return an error other than a timeout + if responseError == nil || (responseError! as NSError).code != NSURLErrorTimedOut { + break + } else if attempts < maxRetries { + // Reset the error to try again + responseError = nil + } + } + + return (responseData, response, responseError) + } } extension GDMFPinnedSSL: URLSessionDelegate { diff --git a/Nudge/UI/Defaults.swift b/Nudge/UI/Defaults.swift index 1026b157..5850cdab 100644 --- a/Nudge/UI/Defaults.swift +++ b/Nudge/UI/Defaults.swift @@ -27,7 +27,8 @@ struct Globals { static let nudgeDefaults = UserDefaults.standard static let nudgeJSONPreferences = NetworkFileManager().getNudgeJSONPreferences() // Device Properties - var hardwareID: String = "" + static let gdmfAssets = NetworkFileManager().getGDMFAssets() + static let hardwareModelID = DeviceManager().getHardwareModelID() } struct Intervals { @@ -82,7 +83,6 @@ class AppState: ObservableObject { @Published var userRequiredMinimumOSVersion = Globals.nudgeDefaults.object(forKey: "requiredMinimumOSVersion") as? String ?? "0.0" @Published var userSessionDeferrals = Globals.nudgeDefaults.object(forKey: "userSessionDeferrals") as? Int ?? 0 @Published var backgroundBlur = [BackgroundBlurWindowController]() - @Published var gdmfAssets: GDMFAssetInfo? @Published var screenCurrentlyLocked = false @Published var locale = Locale.current @Published var nudgeCustomEventDate = DateManager().getCurrentDate() diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 91ed77a0..1eb101d7 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -142,9 +142,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { handleKeyboardEvents() handleApplicationLaunchesIfNeeded() checkFullScreenStateOnFirstLaunch() - DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { - print(nudgePrimaryState.gdmfAssets as Any) - } } func applicationDidResignActive(_ notification: Notification) { @@ -177,8 +174,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { // Pre-Launch Logic func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") - NetworkFileManager().getGDMFAssets() - self.getSoftwareUpdateDeviceID() handleSMAppService() checkForBadProfilePath() handleCommandLineArguments() @@ -553,24 +548,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { SoftwareUpdate().download() } } - - func getSoftwareUpdateDeviceID() { - if DeviceManager().getCPUTypeString() == "Apple Silicon" { - // There is no local bridge - globals.hardwareID = DeviceManager().getIORegInfo(serviceTarget: "target-sub-type") ?? "Unknown" - } else { - // Attempt localbridge for T2, if it fails, it's likely a T1 or lower - let bridgeID = SoftwareUpdate().getSoftwareUpdateDeviceID() - let boardID = DeviceManager().getIORegInfo(serviceTarget: "board-id") - if bridgeID.isEmpty { - // Fallback to boardID for T1 - globals.hardwareID = boardID ?? "Unknown" - } else { - // T2 uses bridge ID for it's update brain via gdmf - globals.hardwareID = bridgeID - } - } - } } class WindowDelegate: NSObject, NSWindowDelegate { diff --git a/Nudge/Utilities/SoftwareUpdate.swift b/Nudge/Utilities/SoftwareUpdate.swift index 7ebba8db..c3c551e1 100644 --- a/Nudge/Utilities/SoftwareUpdate.swift +++ b/Nudge/Utilities/SoftwareUpdate.swift @@ -9,20 +9,8 @@ import Foundation import os class SoftwareUpdate { - func getSoftwareUpdateDeviceID() -> String { - let (output, error, exitCode) = runProcess(launchPath: "/usr/libexec/remotectl", arguments: ["get-property", "localbridge", "HWModel"]) - - if exitCode != 0 { - LogManager.error("Error assessing DeviceID: \(error)", logger: softwareupdateDeviceLog) - return error - } else { - LogManager.info("SoftwareUpdateDeviceID: \(output)", logger: softwareupdateDeviceLog) - return output - } - } - func list() -> String { - let (output, error, exitCode) = runProcess(launchPath: "/usr/sbin/softwareupdate", arguments: ["--list", "--all"]) + let (output, error, exitCode) = SubProcessUtilities().runProcess(launchPath: "/usr/sbin/softwareupdate", arguments: ["--list", "--all"]) if exitCode != 0 { LogManager.error("Error listing software updates: \(error)", logger: softwareupdateListLog) @@ -46,7 +34,7 @@ class SoftwareUpdate { if OptionalFeatureVariables.attemptToFetchMajorUpgrade, !majorUpgradeAppPathExists, !majorUpgradeBackupAppPathExists { LogManager.notice("Device requires major upgrade - attempting download", logger: softwareupdateListLog) - let (output, error, exitCode) = runProcess(launchPath: "/usr/sbin/softwareupdate", arguments: ["--fetch-full-installer", "--full-installer-version", OSVersionRequirementVariables.requiredMinimumOSVersion]) + let (output, error, exitCode) = SubProcessUtilities().runProcess(launchPath: "/usr/sbin/softwareupdate", arguments: ["--fetch-full-installer", "--full-installer-version", OSVersionRequirementVariables.requiredMinimumOSVersion]) if exitCode != 0 { LogManager.error("Error downloading software update: \(error)", logger: softwareupdateDownloadLog) @@ -72,7 +60,7 @@ class SoftwareUpdate { } LogManager.notice("Software update found \(updateLabel) available for download - attempting download", logger: softwareupdateListLog) - let (output, error, exitCode) = runProcess(launchPath: "/usr/sbin/softwareupdate", arguments: ["--download", updateLabel]) + let (output, error, exitCode) = SubProcessUtilities().runProcess(launchPath: "/usr/sbin/softwareupdate", arguments: ["--download", updateLabel]) if exitCode != 0 { LogManager.error("Error downloading software updates: \(error)", logger: softwareupdateDownloadLog) @@ -98,30 +86,4 @@ class SoftwareUpdate { return updateLabel ?? "" } - - private func runProcess(launchPath: String, arguments: [String]) -> (output: String, error: String, exitCode: Int32) { - let task = Process() - task.launchPath = launchPath - task.arguments = arguments - - let outputPipe = Pipe() - let errorPipe = Pipe() - task.standardOutput = outputPipe - task.standardError = errorPipe - - do { - try task.run() - } catch { - return ("", "Error running process", -1) - } - - task.waitUntilExit() - - let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile() - let errorData = errorPipe.fileHandleForReading.readDataToEndOfFile() - let output = String(decoding: outputData, as: UTF8.self) - let error = String(decoding: errorData, as: UTF8.self) - - return (output, error, task.terminationStatus) - } } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 918cf747..cd06a085 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -478,48 +478,6 @@ struct DateManager { } struct DeviceManager { - func getIORegInfo(serviceTarget: String) -> String? { - let service: io_service_t = IOServiceGetMatchingService(kIOMainPortDefault, IOServiceMatching("IOPlatformExpertDevice")) - - defer { - IOObjectRelease(service) - } - - guard service != 0 else { - LogManager.error("Failed to fetch IOPlatformExpertDevice service.", logger: utilsLog) - return nil - } - - guard let property = IORegistryEntryCreateCFProperty(service, serviceTarget as CFString, kCFAllocatorDefault, 0)?.takeRetainedValue() else { - LogManager.error("Failed to fetch \(serviceTarget) property.", logger: utilsLog) - return nil - } - -// print(CFGetTypeID(property)) -// print(CFStringGetTypeID()) -// if let propertyDescription = CFCopyTypeIDDescription(CFGetTypeID(property)) { -// print("Property type is:", propertyDescription) -// } - - // Check if the property is of type CFData - if CFGetTypeID(property) == CFDataGetTypeID(), let data = property as? Data { - // Attempt to convert the data to a string - let serviceTargetProperty = String(data: data, encoding: .utf8)?.trimmingCharacters(in: CharacterSet(charactersIn: "\0")) - return serviceTargetProperty - } else { - LogManager.error("Failed to check \(serviceTarget) property.", logger: utilsLog) - return nil - } - } - - func getSysctlValue(for key: String) -> String? { - var size: size_t = 0 - sysctlbyname(key, nil, &size, nil, 0) - var value = [CChar](repeating: 0, count: size) - sysctlbyname(key, &value, &size, nil, 0) - return String(cString: value) - } - func getCPUTypeInt() -> Int { // https://stackoverflow.com/a/63539782 var cputype = cpu_type_t() @@ -528,8 +486,16 @@ struct DeviceManager { return result == -1 ? -1 : Int(cputype) } - func getHardwareModel() -> String { - getSysctlValue(for: "hw.model") ?? "" + func getBridgeModelID() -> String { + let (output, error, exitCode) = SubProcessUtilities().runProcess(launchPath: "/usr/libexec/remotectl", arguments: ["get-property", "localbridge", "HWModel"]) + + if exitCode != 0 { + LogManager.error("Error assessing DeviceID: \(error)", logger: softwareupdateDeviceLog) + return "" + } else { + LogManager.info("SoftwareUpdateDeviceID: \(output)", logger: softwareupdateDeviceLog) + return output + } } func getCPUTypeString() -> String { @@ -554,6 +520,31 @@ struct DeviceManager { } } + func getHardwareModel() -> String { + getSysctlValue(for: "hw.model") ?? "" + } + + func getHardwareModelID() -> String { + var hardwareModelID = "" + if DeviceManager().getCPUTypeString() == "Apple Silicon" { + // There is no local bridge + hardwareModelID = getIORegInfo(serviceTarget: "target-sub-type") ?? "Unknown" + } else { + // Attempt localbridge for T2, if it fails, it's likely a T1 or lower + let bridgeID = getBridgeModelID() + let boardID = getIORegInfo(serviceTarget: "board-id") + if bridgeID.isEmpty { + // Fallback to boardID for T1 + hardwareModelID = boardID ?? "Unknown" + } else { + // T2 uses bridge ID for it's update brain via gdmf + hardwareModelID = bridgeID + } + } + LogManager.debug("Hardware Model ID: \(hardwareModelID)", logger: utilsLog) + return hardwareModelID + } + func getHardwareUUID() -> String { guard !CommandLineUtilities().demoModeEnabled(), !CommandLineUtilities().unitTestingEnabled() else { @@ -562,6 +553,40 @@ struct DeviceManager { return getPropertyFromPlatformExpert(key: String(kIOPlatformUUIDKey)) ?? "" } + func getIORegInfo(serviceTarget: String) -> String? { + let service: io_service_t = IOServiceGetMatchingService(kIOMainPortDefault, IOServiceMatching("IOPlatformExpertDevice")) + + defer { + IOObjectRelease(service) + } + + guard service != 0 else { + LogManager.error("Failed to fetch IOPlatformExpertDevice service.", logger: utilsLog) + return nil + } + + guard let property = IORegistryEntryCreateCFProperty(service, serviceTarget as CFString, kCFAllocatorDefault, 0)?.takeRetainedValue() else { + LogManager.error("Failed to fetch \(serviceTarget) property.", logger: utilsLog) + return nil + } + + // print(CFGetTypeID(property)) + // print(CFStringGetTypeID()) + // if let propertyDescription = CFCopyTypeIDDescription(CFGetTypeID(property)) { + // print("Property type is:", propertyDescription) + // } + + // Check if the property is of type CFData + if CFGetTypeID(property) == CFDataGetTypeID(), let data = property as? Data { + // Attempt to convert the data to a string + let serviceTargetProperty = String(data: data, encoding: .utf8)?.trimmingCharacters(in: CharacterSet(charactersIn: "\0")) + return serviceTargetProperty + } else { + LogManager.error("Failed to check \(serviceTarget) property.", logger: utilsLog) + return nil + } + } + func getPatchOSVersion() -> Int { let PatchOSVersion = ProcessInfo().operatingSystemVersion.patchVersion LogManager.info("Patch OS Version: \(PatchOSVersion)", logger: utilsLog) @@ -587,6 +612,14 @@ struct DeviceManager { return getPropertyFromPlatformExpert(key: String(kIOPlatformSerialNumberKey)) ?? "" } + func getSysctlValue(for key: String) -> String? { + var size: size_t = 0 + sysctlbyname(key, nil, &size, nil, 0) + var value = [CChar](repeating: 0, count: size) + sysctlbyname(key, &value, &size, nil, 0) + return String(cString: value) + } + func getSystemConsoleUsername() -> String { var uid: uid_t = 0 var gid: gid_t = 0 @@ -751,90 +784,42 @@ struct NetworkFileManager { } } - func getGDMFAssets() { + func getGDMFAssets() -> GDMFAssetInfo? { // Define the URL you want to pin to if let url = URL(string: "https://gdmf.apple.com/v2/pmv") { // Call the pin method - GDMFPinnedSSL.shared.pin(url: url) { data, response, error in - if let error = error { - print("Error: \(error.localizedDescription)") - } else if let data = data { - do { - let assetInfo = try GDMFAssetInfo(data: data) - // print(assetInfo) - DispatchQueue.main.async { - nudgePrimaryState.gdmfAssets = assetInfo - // perhaps process this as a lookup for all OS versions a board ID can contain - } - } catch { - print("Failed to decode JSON: \(error.localizedDescription)") - } - } else { - print("Unknown error") + // Async Method + // GDMFPinnedSSL.shared.pinAsync(url: url) { data, response, error in + // if let error = error { + // print("Error: \(error.localizedDescription)") + // } else if let data = data { + // do { + // let assetInfo = try GDMFAssetInfo(data: data) + // return assetInfo + // } catch { + // print("Failed to decode JSON: \(error.localizedDescription)") + // } + // } else { + // print("Unknown error") + // } + // } + // Sync Method + let gdmfData = GDMFPinnedSSL.shared.pinSync(url: url) + if (gdmfData.error == nil) { + do { + let assetInfo = try GDMFAssetInfo(data: gdmfData.data!) + return assetInfo + } catch { + LogManager.error("Failed to decode gdmf JSON: \(error.localizedDescription)", logger: utilsLog) } + } else { + LogManager.error("Failed to fetch gdmf JSON: \(gdmfData.error!.localizedDescription)", logger: utilsLog) } } else { - print("Invalid URL") - } - } - -// func getGDMFAssets2() -> GDMFAssetInfo? { -// if let url = URL(string: "https://gdmf.apple.com/v2/pmv") { -// // Call the pin method -// GDMFPinnedSSL.shared.pin1(url: url) { result in -// switch result { -// case .success(let assetInfo): -// print(assetInfo) -// case .failure(let error): -// print("Error: \(error.localizedDescription)") -// } -// } -// } -// return nil -// } -// -// func getGDMFAssetsSync() -> GDMFAssetInfo? { -// var info: GDMFAssetInfo? -// GDMFPinnedSSL.shared.fetchAssetInfoSynchronously(urlString: "https://gdmf.apple.com/v2/pmv") { assetInfo, error in -// if let error = error { -// print("Error: \(error.localizedDescription)") -// } else if let assetInfo = assetInfo { -// print("Asset Info: \(assetInfo)") -// info = assetInfo -// } else { -// print("Unknown error occurred") -// } -// } -// return info -// } -// GDMFPinnedSSL.shared.pin(url: url) { data, response, error in -// // Ensure there is no error -// guard error == nil else { -// print("Error: \(error!.localizedDescription)") -// return nil -// } -// -// // Ensure there is data returned -// guard let data = data else { -// print("No data received") -// return nil -// } -// // Process the JSON data -// do { -// // Assuming `AssetInfo` is the struct model that conforms to Decodable -// let assetInfo = try JSONDecoder().decode(GDMFAssetInfo.self, from: data) -// // Now you have your model and can use it as needed -// return assetInfo -// } catch { -// print("Failed to decode JSON: \(error.localizedDescription)") -// return nil -// } -// } -// } else { -// print("invalid URL") -// return nil -// } -// } + LogManager.error("Failed to decode gdmf JSON URL string", logger: utilsLog) + } + return nil + } func getBackupMajorUpgradeAppPath() -> String { switch VersionManager.getMajorRequiredNudgeOSVersion() { @@ -875,6 +860,34 @@ struct NetworkFileManager { } } +struct SubProcessUtilities { + func runProcess(launchPath: String, arguments: [String]) -> (output: String, error: String, exitCode: Int32) { + let task = Process() + task.launchPath = launchPath + task.arguments = arguments + + let outputPipe = Pipe() + let errorPipe = Pipe() + task.standardOutput = outputPipe + task.standardError = errorPipe + + do { + try task.run() + } catch { + return ("", "Error running process", -1) + } + + task.waitUntilExit() + + let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile() + let errorData = errorPipe.fileHandleForReading.readDataToEndOfFile() + let output = String(decoding: outputData, as: UTF8.self) + let error = String(decoding: errorData, as: UTF8.self) + + return (output, error, task.terminationStatus) + } +} + struct SMAppManager { private func handleLegacyLaunchAgent(passedThroughCLI: Bool, action: String) { logOrPrint("Legacy Nudge LaunchAgent currently loaded. Please disable this agent before attempting to \(action) modern agent.", passedThroughCLI: passedThroughCLI, exitCode: 1) From 632451072d6f8365558bc79b1dfbe30323620d35 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 29 Mar 2024 16:39:19 -0500 Subject: [PATCH 013/141] strip newlines in modelID --- Nudge/Utilities/Utils.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index cd06a085..2ddb0985 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -542,7 +542,7 @@ struct DeviceManager { } } LogManager.debug("Hardware Model ID: \(hardwareModelID)", logger: utilsLog) - return hardwareModelID + return hardwareModelID.trimmingCharacters(in: .whitespacesAndNewlines) } func getHardwareUUID() -> String { From 9fa46e2cf2193a49d0fbfc3b78b78d15b1c12fcb Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 29 Mar 2024 16:39:36 -0500 Subject: [PATCH 014/141] Remove optional logging in serviceTargetProperty --- Nudge/Utilities/Utils.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 2ddb0985..5133c9e9 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -579,8 +579,11 @@ struct DeviceManager { // Check if the property is of type CFData if CFGetTypeID(property) == CFDataGetTypeID(), let data = property as? Data { // Attempt to convert the data to a string - let serviceTargetProperty = String(data: data, encoding: .utf8)?.trimmingCharacters(in: CharacterSet(charactersIn: "\0")) - return serviceTargetProperty + if let serviceTargetProperty = String(data: data, encoding: .utf8)?.trimmingCharacters(in: CharacterSet(charactersIn: "\0")) { + LogManager.debug("\(serviceTarget): \(String(describing: serviceTargetProperty))", logger: utilsLog) + return serviceTargetProperty + } + return nil } else { LogManager.error("Failed to check \(serviceTarget) property.", logger: utilsLog) return nil From 05e052e0ebc9cc6c6f695b523c5477b8e8e65c58 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 29 Mar 2024 16:39:55 -0500 Subject: [PATCH 015/141] Add a temporary comparison loop of the macOS Assets from gdmf --- Nudge/UI/Main.swift | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 1eb101d7..d8098e5f 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -174,6 +174,23 @@ class AppDelegate: NSObject, NSApplicationDelegate { // Pre-Launch Logic func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") + if let macOSAssets = Globals.gdmfAssets?.publicAssetSets.macOS { + // Find the first macOS asset that matches the product version + var tempRequiredMinOSVersion = PrefsWrapper.requiredMinimumOSVersion + tempRequiredMinOSVersion = "14.4.1" // Hack so I can test this since 14.99.99 doesn't exist in GDMF + if let matchingAsset = macOSAssets.first(where: { $0.productVersion == tempRequiredMinOSVersion }) { + // Check if the specified device is in the supported devices of the matching asset + print("GDMF Matched OS Version: \(matchingAsset.productVersion)") + print("GDMF Assets: \(matchingAsset.supportedDevices)") + print("Assessed Model ID: \(Globals.hardwareModelID)") + print("DeviceGDMFSupported: \(matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }))") + } else { + // If no matching product version found or the device is not supported, return false + print("DeviceGDMFSupported: False") + } + } else { + print("No macOS assets available.") + } handleSMAppService() checkForBadProfilePath() handleCommandLineArguments() From 17853d2b051b5b5b3576a0eb518b2e1d9864fdc2 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 14 May 2024 12:53:48 -0500 Subject: [PATCH 016/141] initial query of sofa v1 api --- Nudge.xcodeproj/project.pbxproj | 4 + Nudge/3rd Party Assets/sofa.swift | 253 ++++++++++++++++++++++++++++++ Nudge/UI/Defaults.swift | 1 + Nudge/UI/Main.swift | 32 +++- Nudge/Utilities/Utils.swift | 22 ++- 5 files changed, 307 insertions(+), 5 deletions(-) create mode 100644 Nudge/3rd Party Assets/sofa.swift diff --git a/Nudge.xcodeproj/project.pbxproj b/Nudge.xcodeproj/project.pbxproj index d3296dad..9f563e03 100644 --- a/Nudge.xcodeproj/project.pbxproj +++ b/Nudge.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ 5836861425DACFE90004514C /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5836861325DACFE90004514C /* Logger.swift */; }; 5836861C25DAD01C0004514C /* SoftwareUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5836861B25DAD01C0004514C /* SoftwareUpdate.swift */; }; 6316F0E72832CA0700E1354D /* Schema in Resources */ = {isa = PBXBuildFile; fileRef = 6316F0E62832CA0700E1354D /* Schema */; }; + 631A6D762BF2654000DC1EF3 /* sofa.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631A6D752BF2654000DC1EF3 /* sofa.swift */; }; 6347351D2B45DC2400C3401D /* CloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6347351C2B45DC2400C3401D /* CloseButton.swift */; }; 634CE1092BB47480002C26C4 /* gdmf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634CE1082BB47480002C26C4 /* gdmf.swift */; }; 634CE10A2BB47480002C26C4 /* gdmf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634CE1082BB47480002C26C4 /* gdmf.swift */; }; @@ -93,6 +94,7 @@ 5836861325DACFE90004514C /* Logger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = ""; }; 5836861B25DAD01C0004514C /* SoftwareUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoftwareUpdate.swift; sourceTree = ""; }; 6316F0E62832CA0700E1354D /* Schema */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Schema; sourceTree = ""; }; + 631A6D752BF2654000DC1EF3 /* sofa.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = sofa.swift; sourceTree = ""; }; 6347351C2B45DC2400C3401D /* CloseButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseButton.swift; sourceTree = ""; }; 634CE1082BB47480002C26C4 /* gdmf.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = gdmf.swift; sourceTree = ""; }; 636B9C0126CACCAB0007BE3B /* DeferView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeferView.swift; sourceTree = ""; }; @@ -185,6 +187,7 @@ isa = PBXGroup; children = ( 634CE1082BB47480002C26C4 /* gdmf.swift */, + 631A6D752BF2654000DC1EF3 /* sofa.swift */, ); path = "3rd Party Assets"; sourceTree = ""; @@ -495,6 +498,7 @@ 639B6B6E25DF3C3F00E38EC1 /* SimpleMode.swift in Sources */, 639E198225CD885D008F618B /* PreferencesStructure.swift in Sources */, 639B6B3B25DF200C00E38EC1 /* Preferences.swift in Sources */, + 631A6D762BF2654000DC1EF3 /* sofa.swift in Sources */, 63D7D0E325C9E9A400236281 /* Main.swift in Sources */, 639B6B6025DF37F000E38EC1 /* ScreenShotZoom.swift in Sources */, 41AD2B0226DE6947004C52B1 /* AdditionalInfoButton.swift in Sources */, diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift new file mode 100644 index 00000000..58d46bc1 --- /dev/null +++ b/Nudge/3rd Party Assets/sofa.swift @@ -0,0 +1,253 @@ +// +// sofa.swift +// Nudge +// +// Created by Erik Gomez on 5/13/24. +// + +import Foundation + +struct MacOSDataFeed: Codable { + let updateHash: String + let osVersions: [SofaOSVersion] + let xProtectPayloads: XProtectPayloads + let xProtectPlistConfigData: XProtectPlistConfigData + let models: [String: ModelInfo] + let installationApps: InstallationApps + + enum CodingKeys: String, CodingKey { + case updateHash = "UpdateHash" + case osVersions = "OSVersions" + case xProtectPayloads = "XProtectPayloads" + case xProtectPlistConfigData = "XProtectPlistConfigData" + case models = "Models" + case installationApps = "InstallationApps" + } +} + +struct SofaOSVersion: Codable { + let osVersion: String + let latest: LatestOS + let securityReleases: [SecurityRelease] + let supportedModels: [SupportedModel] + + enum CodingKeys: String, CodingKey { + case osVersion = "OSVersion" + case latest = "Latest" + case securityReleases = "SecurityReleases" + case supportedModels = "SupportedModels" + } +} + +struct LatestOS: Codable { + let productVersion, build: String + let releaseDate: Date? + let expirationDate: Date + let supportedDevices: [String] + + enum CodingKeys: String, CodingKey { + case productVersion = "ProductVersion" + case build = "Build" + case releaseDate = "ReleaseDate" + case expirationDate = "ExpirationDate" + case supportedDevices = "SupportedDevices" + } +} + +struct SecurityRelease: Codable { + let updateName, productVersion: String + let releaseDate: Date + let securityInfo: String + let cves: [String: Bool] + let activelyExploitedCVEs: [String] + let uniqueCVEsCount, daysSincePreviousRelease: Int + + enum CodingKeys: String, CodingKey { + case updateName = "UpdateName" + case productVersion = "ProductVersion" + case releaseDate = "ReleaseDate" + case securityInfo = "SecurityInfo" + case cves = "CVEs" + case activelyExploitedCVEs = "ActivelyExploitedCVEs" + case uniqueCVEsCount = "UniqueCVEsCount" + case daysSincePreviousRelease = "DaysSincePreviousRelease" + } +} + +struct SupportedModel: Codable { + let model: String + let url: String + let identifiers: [String: String] + + enum CodingKeys: String, CodingKey { + case model = "Model" + case url = "URL" + case identifiers = "Identifiers" + } +} + +struct XProtectPayloads: Codable { + let xProtectFramework, pluginService: String + let releaseDate: Date + + enum CodingKeys: String, CodingKey { + case xProtectFramework = "com.apple.XProtectFramework.XProtect" + case pluginService = "com.apple.XprotectFramework.PluginService" + case releaseDate = "ReleaseDate" + } +} + +struct XProtectPlistConfigData: Codable { + let xProtect: String + let releaseDate: Date + + enum CodingKeys: String, CodingKey { + case xProtect = "com.apple.XProtect" + case releaseDate = "ReleaseDate" + } +} + +struct ModelInfo: Codable { + let marketingName: String + let supportedOS: [String] + let osVersions: [Int] + + enum CodingKeys: String, CodingKey { + case marketingName = "MarketingName" + case supportedOS = "SupportedOS" + case osVersions = "OSVersions" + } +} + +struct InstallationApps: Codable { + let latestUMA: UMA + let allPreviousUMA: [UMA] + let latestMacIPSW: MacIPSW + + enum CodingKeys: String, CodingKey { + case latestUMA = "LatestUMA" + case allPreviousUMA = "AllPreviousUMA" + case latestMacIPSW = "LatestMacIPSW" + } +} + +struct UMA: Codable { + let title, version, build, appleSlug, url: String + + enum CodingKeys: String, CodingKey { + case title, version, build + case appleSlug = "apple_slug" + case url + } +} + +struct MacIPSW: Codable { + let macosIpswURL: String + let macosIpswBuild, macosIpswVersion, macosIpswAppleSlug: String + + enum CodingKeys: String, CodingKey { + case macosIpswURL = "macos_ipsw_url" + case macosIpswBuild = "macos_ipsw_build" + case macosIpswVersion = "macos_ipsw_version" + case macosIpswAppleSlug = "macos_ipsw_apple_slug" + } +} + +extension MacOSDataFeed { + init(data: Data) throws { + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .flexibleISO8601 // Use custom ISO 8601 date format because of weird strings returning in v1 of sofa api + self = try decoder.decode(MacOSDataFeed.self, from: data) + } + + init(_ json: String, using encoding: String.Encoding = .utf8) throws { + guard let data = json.data(using: encoding) else { + throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil) + } + try self.init(data: data) + } + + init(fromURL url: URL) throws { + try self.init(data: try Data(contentsOf: url)) + } + + func with( + updateHash: String, + osVersions: [SofaOSVersion], + xProtectPayloads: XProtectPayloads, + xProtectPlistConfigData: XProtectPlistConfigData, + models: [String: ModelInfo], + installationApps: InstallationApps + ) -> MacOSDataFeed { + return MacOSDataFeed( + updateHash: updateHash, + osVersions: osVersions, + xProtectPayloads: xProtectPayloads, + xProtectPlistConfigData: xProtectPlistConfigData, + models: models, + installationApps: installationApps + ) + } +} + +extension JSONDecoder.DateDecodingStrategy { + static var flexibleISO8601: JSONDecoder.DateDecodingStrategy { + return .custom { decoder -> Date in + let container = try decoder.singleValueContainer() + let dateString = try container.decode(String.self) + + let dateFormatter = DateFormatter() + dateFormatter.locale = Locale(identifier: "en_US_POSIX") + dateFormatter.timeZone = TimeZone(secondsFromGMT: 0) + + // List of date formats to try + let dateFormats = ["yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-dd'T'HH:mm:ss.SSSZ"] + for format in dateFormats { + dateFormatter.dateFormat = format + if let date = dateFormatter.date(from: dateString) { + return date + } + } + + // Return POSIX epoch start date if no valid date is found + return Date(timeIntervalSince1970: 0) + } + } +} + +class SOFA: NSObject, URLSessionDelegate { + func URLSync(url: URL, maxRetries: Int = 3) -> (data: Data?, response: URLResponse?, error: Error?) { + let semaphore = DispatchSemaphore(value: 0) + let request = URLRequest(url: url) + let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil) + var attempts = 0 + + var responseData: Data? + var response: URLResponse? + var responseError: Error? + + // Retry loop + while attempts < maxRetries { + attempts += 1 + let task = session.dataTask(with: request) { data, resp, error in + responseData = data + response = resp + responseError = error + semaphore.signal() + } + task.resume() + + semaphore.wait() + + // Break the loop if the task succeeded or return an error other than a timeout + if responseError == nil || (responseError! as NSError).code != NSURLErrorTimedOut { + break + } else if attempts < maxRetries { + // Reset the error to try again + responseError = nil + } + } + + return (responseData, response, responseError) + } +} diff --git a/Nudge/UI/Defaults.swift b/Nudge/UI/Defaults.swift index 5850cdab..cab45a92 100644 --- a/Nudge/UI/Defaults.swift +++ b/Nudge/UI/Defaults.swift @@ -28,6 +28,7 @@ struct Globals { static let nudgeJSONPreferences = NetworkFileManager().getNudgeJSONPreferences() // Device Properties static let gdmfAssets = NetworkFileManager().getGDMFAssets() + static let sofaAssets = NetworkFileManager().getSOFAAssets() static let hardwareModelID = DeviceManager().getHardwareModelID() } diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index d8098e5f..01103db0 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -174,11 +174,11 @@ class AppDelegate: NSObject, NSApplicationDelegate { // Pre-Launch Logic func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") - if let macOSAssets = Globals.gdmfAssets?.publicAssetSets.macOS { + if let macOSGDMFAssets = Globals.gdmfAssets?.publicAssetSets.macOS { // Find the first macOS asset that matches the product version var tempRequiredMinOSVersion = PrefsWrapper.requiredMinimumOSVersion - tempRequiredMinOSVersion = "14.4.1" // Hack so I can test this since 14.99.99 doesn't exist in GDMF - if let matchingAsset = macOSAssets.first(where: { $0.productVersion == tempRequiredMinOSVersion }) { + tempRequiredMinOSVersion = "14.5" // Hack so I can test this since 14.99.99 doesn't exist in GDMF + if let matchingAsset = macOSGDMFAssets.first(where: { $0.productVersion == tempRequiredMinOSVersion }) { // Check if the specified device is in the supported devices of the matching asset print("GDMF Matched OS Version: \(matchingAsset.productVersion)") print("GDMF Assets: \(matchingAsset.supportedDevices)") @@ -189,7 +189,31 @@ class AppDelegate: NSObject, NSApplicationDelegate { print("DeviceGDMFSupported: False") } } else { - print("No macOS assets available.") + print("No macOS GDMF assets available.") + } + + if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { + // Find the first macOS asset that matches the product version + var tempRequiredMinOSVersion = PrefsWrapper.requiredMinimumOSVersion + tempRequiredMinOSVersion = "14.5" // Hack so I can test this since 14.99.99 doesn't exist in GDMF + var foundMatch = false + // osVersions.map { $0.latest.productVersion } + for osVersion in macOSSOFAAssets { + if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == tempRequiredMinOSVersion }) { + foundMatch = true + // Check if the specified device is in the supported devices of the matching asset + print("SOFA Matched OS Version: \(matchingAsset.productVersion)") + // print("SOFA Assets: \(matchingAsset.supportedDevices)") + print("Assessed Model ID: \(Globals.hardwareModelID)") + // print("DeviceSOFASupported: \(matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }))") + } + } + if !foundMatch { + // If no matching product version found or the device is not supported, return false + print("DeviceSOFASupported: False") + } + } else { + print("No macOS SOFA assets available.") } handleSMAppService() checkForBadProfilePath() diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 5133c9e9..80c9cfab 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -787,7 +787,7 @@ struct NetworkFileManager { } } - func getGDMFAssets() -> GDMFAssetInfo? { + func getGDMFAssets() -> GDMFAssetInfo? { // Define the URL you want to pin to if let url = URL(string: "https://gdmf.apple.com/v2/pmv") { // Call the pin method @@ -824,6 +824,26 @@ struct NetworkFileManager { return nil } + func getSOFAAssets() -> MacOSDataFeed? { + if let url = URL(string: "https://sofa.macadmins.io/v1/macos_data_feed.json") { + let sofaData = SOFA().URLSync(url: url) + if (sofaData.error == nil) { + do { + let assetInfo = try MacOSDataFeed(data: sofaData.data!) + return assetInfo + } catch { + LogManager.error("Failed to decode sofa JSON: \(error.localizedDescription)", logger: utilsLog) + LogManager.error("Failed to decode sofa JSON: \(error)", logger: utilsLog) + } + } else { + LogManager.error("Failed to fetch sofa JSON: \(sofaData.error!.localizedDescription)", logger: utilsLog) + } + } else { + LogManager.error("Failed to decode sofa JSON URL string", logger: utilsLog) + } + return nil + } + func getBackupMajorUpgradeAppPath() -> String { switch VersionManager.getMajorRequiredNudgeOSVersion() { case 12: From b09d4936b30ecc53f3c2e0033906ed4697d525a6 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 14 May 2024 14:52:12 -0500 Subject: [PATCH 017/141] remove need for custom decoding strategy for sofa thanks Henry for the quick fix --- Nudge/3rd Party Assets/sofa.swift | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift index 58d46bc1..105b2b02 100644 --- a/Nudge/3rd Party Assets/sofa.swift +++ b/Nudge/3rd Party Assets/sofa.swift @@ -156,7 +156,7 @@ struct MacIPSW: Codable { extension MacOSDataFeed { init(data: Data) throws { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .flexibleISO8601 // Use custom ISO 8601 date format because of weird strings returning in v1 of sofa api + decoder.dateDecodingStrategy = .iso8601 // Use ISO 8601 date format self = try decoder.decode(MacOSDataFeed.self, from: data) } @@ -190,31 +190,6 @@ extension MacOSDataFeed { } } -extension JSONDecoder.DateDecodingStrategy { - static var flexibleISO8601: JSONDecoder.DateDecodingStrategy { - return .custom { decoder -> Date in - let container = try decoder.singleValueContainer() - let dateString = try container.decode(String.self) - - let dateFormatter = DateFormatter() - dateFormatter.locale = Locale(identifier: "en_US_POSIX") - dateFormatter.timeZone = TimeZone(secondsFromGMT: 0) - - // List of date formats to try - let dateFormats = ["yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-dd'T'HH:mm:ss.SSSZ"] - for format in dateFormats { - dateFormatter.dateFormat = format - if let date = dateFormatter.date(from: dateString) { - return date - } - } - - // Return POSIX epoch start date if no valid date is found - return Date(timeIntervalSince1970: 0) - } - } -} - class SOFA: NSObject, URLSessionDelegate { func URLSync(url: URL, maxRetries: Int = 3) -> (data: Data?, response: URLResponse?, error: Error?) { let semaphore = DispatchSemaphore(value: 0) From 2deab45644f3311804f7745fbf9e87634970528a Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 15 May 2024 15:12:52 -0500 Subject: [PATCH 018/141] new version of sofa has SupportedDevices enabled --- Nudge/3rd Party Assets/sofa.swift | 2 ++ Nudge/UI/Main.swift | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift index 105b2b02..085a3b1f 100644 --- a/Nudge/3rd Party Assets/sofa.swift +++ b/Nudge/3rd Party Assets/sofa.swift @@ -58,6 +58,7 @@ struct SecurityRelease: Codable { let updateName, productVersion: String let releaseDate: Date let securityInfo: String + let supportedDevices: [String] let cves: [String: Bool] let activelyExploitedCVEs: [String] let uniqueCVEsCount, daysSincePreviousRelease: Int @@ -67,6 +68,7 @@ struct SecurityRelease: Codable { case productVersion = "ProductVersion" case releaseDate = "ReleaseDate" case securityInfo = "SecurityInfo" + case supportedDevices = "SupportedDevices" case cves = "CVEs" case activelyExploitedCVEs = "ActivelyExploitedCVEs" case uniqueCVEsCount = "UniqueCVEsCount" diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 01103db0..b1ae2558 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -203,9 +203,9 @@ class AppDelegate: NSObject, NSApplicationDelegate { foundMatch = true // Check if the specified device is in the supported devices of the matching asset print("SOFA Matched OS Version: \(matchingAsset.productVersion)") - // print("SOFA Assets: \(matchingAsset.supportedDevices)") + print("SOFA Assets: \(matchingAsset.supportedDevices)") print("Assessed Model ID: \(Globals.hardwareModelID)") - // print("DeviceSOFASupported: \(matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }))") + print("DeviceSOFASupported: \(matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }))") } } if !foundMatch { From 0f31977f22ccb852611ec8090065dfedd7d99dff Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 15 May 2024 15:31:30 -0500 Subject: [PATCH 019/141] new utilizeSOFAFeed preference - defaults to false --- Example Assets/com.github.macadmins.Nudge.tester.json | 3 ++- Nudge/Preferences/DefaultPreferencesNudge.swift | 6 ++++++ Nudge/Preferences/PreferencesStructure.swift | 8 +++++--- Nudge/Utilities/Utils.swift | 3 +++ 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index a11315a6..39a8f706 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -14,7 +14,8 @@ "com.microsoft.VSCode", "us.zoom.xos" ], - "terminateApplicationsOnLaunch": false + "terminateApplicationsOnLaunch": false, + "utilizeSOFAFeed": true }, "osVersionRequirements": [ { diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 838135b4..f5d5cde6 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -142,6 +142,12 @@ struct OptionalFeatureVariables { optionalFeaturesJSON?.terminateApplicationsOnLaunch ?? false } + + static var utilizeSOFAFeed: Bool { + optionalFeaturesProfile?["utilizeSOFAFeedh"] as? Bool ?? + optionalFeaturesJSON?.utilizeSOFAFeed ?? + false + } } // OS Version Requirements diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index aa47637d..a825ffff 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -53,7 +53,7 @@ struct OptionalFeatures: Codable { var acceptableApplicationBundleIDs, acceptableAssertionApplicationNames: [String]? var acceptableAssertionUsage, acceptableCameraUsage, acceptableScreenSharingUsage, aggressiveUserExperience, aggressiveUserFullScreenExperience, asynchronousSoftwareUpdate, attemptToBlockApplicationLaunches, attemptToFetchMajorUpgrade: Bool? var blockedApplicationBundleIDs: [String]? - var disableSoftwareUpdateWorkflow, enforceMinorUpdates, terminateApplicationsOnLaunch: Bool? + var disableSoftwareUpdateWorkflow, enforceMinorUpdates, terminateApplicationsOnLaunch, utilizeSOFAFeed: Bool? } // MARK: OptionalFeatures convenience initializers and mutators @@ -88,7 +88,8 @@ extension OptionalFeatures { blockedApplicationBundleIDs: [String]? = nil, disableSoftwareUpdateWorkflow: Bool? = nil, enforceMinorUpdates: Bool? = nil, - terminateApplicationsOnLaunch: Bool? = nil + terminateApplicationsOnLaunch: Bool? = nil, + utilizeSOFAFeed: Bool? = nil ) -> OptionalFeatures { return OptionalFeatures( acceptableApplicationBundleIDs: acceptableApplicationBundleIDs ?? self.acceptableApplicationBundleIDs, @@ -104,7 +105,8 @@ extension OptionalFeatures { blockedApplicationBundleIDs: blockedApplicationBundleIDs ?? self.blockedApplicationBundleIDs, disableSoftwareUpdateWorkflow: disableSoftwareUpdateWorkflow ?? self.disableSoftwareUpdateWorkflow, enforceMinorUpdates: enforceMinorUpdates ?? self.enforceMinorUpdates, - terminateApplicationsOnLaunch: terminateApplicationsOnLaunch ?? self.terminateApplicationsOnLaunch + terminateApplicationsOnLaunch: terminateApplicationsOnLaunch ?? self.terminateApplicationsOnLaunch, + utilizeSOFAFeed: utilizeSOFAFeed ?? self.utilizeSOFAFeed ) } } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 80c9cfab..3b6d92af 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -825,6 +825,9 @@ struct NetworkFileManager { } func getSOFAAssets() -> MacOSDataFeed? { + if !OptionalFeatureVariables.utilizeSOFAFeed { + return nil + } if let url = URL(string: "https://sofa.macadmins.io/v1/macos_data_feed.json") { let sofaData = SOFA().URLSync(url: url) if (sofaData.error == nil) { From b20dd4409a1c509be2cf95a0b5b007a53f21de11 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 15 May 2024 16:05:28 -0500 Subject: [PATCH 020/141] start implementing unsupported ui --- .../com.github.macadmins.Nudge.tester.json | 7 ++++- .../Preferences/DefaultPreferencesNudge.swift | 31 +++++++++++++++++++ Nudge/Preferences/PreferencesStructure.swift | 19 ++++++++++-- Nudge/UI/Defaults.swift | 1 + Nudge/UI/Main.swift | 31 ++++--------------- Nudge/UI/StandardMode/RightSide.swift | 5 +-- Nudge/Utilities/Preferences.swift | 10 ++++++ 7 files changed, 73 insertions(+), 31 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 39a8f706..92375ec7 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -21,7 +21,7 @@ { "aboutUpdateURL": "https://apple.com", "requiredInstallationDate": "2025-01-01T00:00:00Z", - "requiredMinimumOSVersion": "14.99.99" + "requiredMinimumOSVersion": "14.5" } ], "userExperience": { @@ -45,10 +45,15 @@ "customDeferralDropdownText": "customDeferralDropdownText", "informationButtonText": "informationButtonText", "mainContentHeader": "mainContentHeader", + "mainContentHeaderUnsupported": "mainContentHeaderUnsupported", "mainContentNote": "mainContentNote", + "mainContentNoteUnsupported": "mainContentNoteUnsupported", "mainContentSubHeader": "mainContentSubHeader", + "mainContentSubHeaderUnsupported": "mainContentSubHeaderUnsupported", "mainContentText": "mainContentText", + "mainContentTextUnsupported": "mainContentTextUnsupported", "mainHeader": "mainHeader", + "mainHeaderUnsupported": "mainHeaderUnsupported", "oneDayDeferralButtonText": "oneDayDeferralButtonText", "oneHourDeferralButtonText": "oneHourDeferralButtonText", "primaryQuitButtonText": "primaryQuitButtonText", diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index f5d5cde6..810d2b48 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -373,24 +373,48 @@ struct UserInterfaceVariables { "Your device will restart during this update" } + static var mainContentHeaderUnsupported: String { + userInterfaceUpdateElementsProfile?["mainContentHeaderUnsupported"] as? String ?? + userInterfaceUpdateElementsJSON?.mainContentHeaderUnsupported ?? + "Your device will restart during this update" + } + static var mainContentNote: String { userInterfaceUpdateElementsProfile?["mainContentNote"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentNote ?? "Important Notes" } + static var mainContentNoteUnsupported: String { + userInterfaceUpdateElementsProfile?["mainContentNoteUnsupported"] as? String ?? + userInterfaceUpdateElementsJSON?.mainContentNoteUnsupported ?? + "Important Notes" + } + static var mainContentSubHeader: String { userInterfaceUpdateElementsProfile?["mainContentSubHeader"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentSubHeader ?? "Updates can take around 30 minutes to complete" } + static var mainContentSubHeaderUnsupported: String { + userInterfaceUpdateElementsProfile?["mainContentSubHeaderUnsupported"] as? String ?? + userInterfaceUpdateElementsJSON?.mainContentSubHeaderUnsupported ?? + "Updates can take around 30 minutes to complete" + } + static var mainContentText: String { userInterfaceUpdateElementsProfile?["mainContentText"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentText ?? "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not update your device, you may lose access to some items necessary for your day-to-day tasks.\n\nTo begin the update, simply click on the Update Device button and follow the provided steps." } + static var mainContentTextUnsupported: String { + userInterfaceUpdateElementsProfile?["mainContentTextUnsupported"] as? String ?? + userInterfaceUpdateElementsJSON?.mainContentTextUnsupported ?? + "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not update your device, you may lose access to some items necessary for your day-to-day tasks.\n\nTo begin the update, simply click on the Update Device button and follow the provided steps." + } + static var primaryQuitButtonText: String { userInterfaceUpdateElementsProfile?["primaryQuitButtonText"] as? String ?? userInterfaceUpdateElementsJSON?.primaryQuitButtonText ?? @@ -421,6 +445,13 @@ struct UserInterfaceVariables { "A friendly reminder from your local IT team" } + static var subHeaderUnsupported: String { + userInterfaceUpdateElementsProfile?["subHeaderUnsupported"] as? String ?? + userInterfaceUpdateElementsJSON?.subHeaderUnsupported ?? + "A friendly reminder from your local IT team" + } + + static var customDeferralDropdownText: String { userInterfaceUpdateElementsProfile?["customDeferralDropdownText"] as? String ?? userInterfaceUpdateElementsJSON?.customDeferralDropdownText ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index a825ffff..40bce2a8 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -376,11 +376,12 @@ extension UserInterface { struct UpdateElement: Codable { var language, actionButtonText, customDeferralButtonText, customDeferralDropdownText, informationButtonText: String? var mainContentHeader, mainContentNote, mainContentSubHeader, mainContentText, mainHeader: String? - var oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, screenShotAltText: String? - + var mainContentHeaderUnsupported, mainContentNoteUnsupported, mainContentSubHeaderUnsupported, mainContentTextUnsupported, mainHeaderUnsupported: String? + var oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText: String? + enum CodingKeys: String, CodingKey { case language = "_language" - case actionButtonText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, mainContentHeader, mainContentNote, mainContentSubHeader, mainContentText, mainHeader, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, screenShotAltText + case actionButtonText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, mainContentHeader, mainContentNote, mainContentSubHeader, mainContentText, mainHeader, mainContentHeaderUnsupported, mainContentNoteUnsupported, mainContentSubHeaderUnsupported, mainContentTextUnsupported, mainHeaderUnsupported, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText } } @@ -413,11 +414,17 @@ extension UpdateElement { mainContentSubHeader: String? = nil, mainContentText: String? = nil, mainHeader: String? = nil, + mainContentHeaderUnsupported: String? = nil, + mainContentNoteUnsupported: String? = nil, + mainContentSubHeaderUnsupported: String? = nil, + mainContentTextUnsupported: String? = nil, + mainHeaderUnsupported: String? = nil, oneDayDeferralButtonText: String? = nil, oneHourDeferralButtonText: String? = nil, primaryQuitButtonText: String? = nil, secondaryQuitButtonText: String? = nil, subHeader: String? = nil, + subHeaderUnsupported: String? = nil, screenShotAltText: String? = nil ) -> UpdateElement { return UpdateElement( @@ -431,11 +438,17 @@ extension UpdateElement { mainContentSubHeader: mainContentSubHeader ?? self.mainContentSubHeader, mainContentText: mainContentText ?? self.mainContentText, mainHeader: mainHeader ?? self.mainHeader, + mainContentHeaderUnsupported: mainContentHeaderUnsupported ?? self.mainContentHeaderUnsupported, + mainContentNoteUnsupported: mainContentNoteUnsupported ?? self.mainContentNoteUnsupported, + mainContentSubHeaderUnsupported: mainContentSubHeaderUnsupported ?? self.mainContentSubHeaderUnsupported, + mainContentTextUnsupported: mainContentTextUnsupported ?? self.mainContentTextUnsupported, + mainHeaderUnsupported: mainHeaderUnsupported ?? self.mainHeaderUnsupported, oneDayDeferralButtonText: oneDayDeferralButtonText ?? self.oneDayDeferralButtonText, oneHourDeferralButtonText: oneHourDeferralButtonText ?? self.oneHourDeferralButtonText, primaryQuitButtonText: primaryQuitButtonText ?? self.primaryQuitButtonText, secondaryQuitButtonText: secondaryQuitButtonText ?? self.secondaryQuitButtonText, subHeader: subHeader ?? self.subHeader, + subHeaderUnsupported: subHeaderUnsupported ?? self.subHeaderUnsupported, screenShotAltText: screenShotAltText ?? self.screenShotAltText ) } diff --git a/Nudge/UI/Defaults.swift b/Nudge/UI/Defaults.swift index cab45a92..175f21e8 100644 --- a/Nudge/UI/Defaults.swift +++ b/Nudge/UI/Defaults.swift @@ -70,6 +70,7 @@ class AppState: ObservableObject { @Published var daysRemaining = DateManager().getNumberOfDaysBetween() @Published var deferralCountPastThreshold = false @Published var deferRunUntil = Globals.nudgeDefaults.object(forKey: "deferRunUntil") as? Date + @Published var deviceSupportedByOSVersion = true @Published var hasClickedSecondaryQuitButton = false @Published var hasLoggedDeferralCountPastThreshold = false @Published var hasLoggedDeferralCountPastThresholdDualQuitButtons = false diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index b1ae2558..237792ed 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -174,38 +174,19 @@ class AppDelegate: NSObject, NSApplicationDelegate { // Pre-Launch Logic func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") - if let macOSGDMFAssets = Globals.gdmfAssets?.publicAssetSets.macOS { - // Find the first macOS asset that matches the product version - var tempRequiredMinOSVersion = PrefsWrapper.requiredMinimumOSVersion - tempRequiredMinOSVersion = "14.5" // Hack so I can test this since 14.99.99 doesn't exist in GDMF - if let matchingAsset = macOSGDMFAssets.first(where: { $0.productVersion == tempRequiredMinOSVersion }) { - // Check if the specified device is in the supported devices of the matching asset - print("GDMF Matched OS Version: \(matchingAsset.productVersion)") - print("GDMF Assets: \(matchingAsset.supportedDevices)") - print("Assessed Model ID: \(Globals.hardwareModelID)") - print("DeviceGDMFSupported: \(matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }))") - } else { - // If no matching product version found or the device is not supported, return false - print("DeviceGDMFSupported: False") - } - } else { - print("No macOS GDMF assets available.") - } - if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { // Find the first macOS asset that matches the product version - var tempRequiredMinOSVersion = PrefsWrapper.requiredMinimumOSVersion - tempRequiredMinOSVersion = "14.5" // Hack so I can test this since 14.99.99 doesn't exist in GDMF var foundMatch = false // osVersions.map { $0.latest.productVersion } for osVersion in macOSSOFAAssets { - if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == tempRequiredMinOSVersion }) { + if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == PrefsWrapper.requiredMinimumOSVersion }) { foundMatch = true // Check if the specified device is in the supported devices of the matching asset - print("SOFA Matched OS Version: \(matchingAsset.productVersion)") - print("SOFA Assets: \(matchingAsset.supportedDevices)") - print("Assessed Model ID: \(Globals.hardwareModelID)") - print("DeviceSOFASupported: \(matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }))") +// print("SOFA Matched OS Version: \(matchingAsset.productVersion)") +// print("SOFA Assets: \(matchingAsset.supportedDevices)") +// print("Assessed Model ID: \(Globals.hardwareModelID)") + // nudgePrimaryState.deviceSupportedByOSVersion = matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) + nudgePrimaryState.deviceSupportedByOSVersion = false } } if !foundMatch { diff --git a/Nudge/UI/StandardMode/RightSide.swift b/Nudge/UI/StandardMode/RightSide.swift index 0541b1fa..0001f57c 100644 --- a/Nudge/UI/StandardMode/RightSide.swift +++ b/Nudge/UI/StandardMode/RightSide.swift @@ -37,14 +37,15 @@ struct StandardModeRightSide: View { VStack(alignment: .center) { HStack { VStack(alignment: .leading, spacing: 5) { + let mainHeaderText = appState.deviceSupportedByOSVersion == true ? getMainHeader().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : getMainHeaderUnsupported().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) HStack { - Text(getMainHeader().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(mainHeaderText) .font(.largeTitle) .minimumScaleFactor(0.5) .frame(maxHeight: 25) .lineLimit(1) } - + HStack { Text(UserInterfaceVariables.subHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.body) diff --git a/Nudge/Utilities/Preferences.swift b/Nudge/Utilities/Preferences.swift index 9370d230..09eaf5d8 100644 --- a/Nudge/Utilities/Preferences.swift +++ b/Nudge/Utilities/Preferences.swift @@ -239,6 +239,16 @@ func getMainHeader() -> String { getUserInterfaceUpdateElementsJSON()?.mainHeader ?? "Your device requires a security update" } +func getMainHeaderUnsupported() -> String { + if CommandLineUtilities().demoModeEnabled() { + return "Your device is no longer capable of security updates (Demo Mode)" + } else if CommandLineUtilities().unitTestingEnabled() { + return "Your device is no longer capable of security updates (Unit Testing Mode)" + } + return UserInterfaceVariables.userInterfaceUpdateElementsProfile?["mainHeaderUnsupported"] as? String ?? + getUserInterfaceUpdateElementsJSON()?.mainHeaderUnsupported ?? "Your device is no longer capable of security updates" +} + func simpleMode() -> Bool { return CommandLineUtilities().simpleModeEnabled() || UserInterfaceVariables.userInterfaceProfile?["simpleMode"] as? Bool ?? From a8f382a646eb0168398741fb9df6905421d4c1de Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 15 May 2024 16:13:54 -0500 Subject: [PATCH 021/141] change the other text ternaries --- .../com.github.macadmins.Nudge.tester.json | 1 + Nudge/UI/SimpleMode/SimpleMode.swift | 2 +- Nudge/UI/StandardMode/RightSide.swift | 13 ++++++------- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 92375ec7..7c25629f 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -59,6 +59,7 @@ "primaryQuitButtonText": "primaryQuitButtonText", "secondaryQuitButtonText": "secondaryQuitButtonText", "subHeader": "subHeader", + "subHeaderUnsupported": "subHeaderUnsupported", "screenShotAltText": "Click to zoom into screenshot" } ] diff --git a/Nudge/UI/SimpleMode/SimpleMode.swift b/Nudge/UI/SimpleMode/SimpleMode.swift index 4673fe32..2e5236db 100644 --- a/Nudge/UI/SimpleMode/SimpleMode.swift +++ b/Nudge/UI/SimpleMode/SimpleMode.swift @@ -30,7 +30,7 @@ struct SimpleMode: View { CompanyLogo() Spacer() - Text(getMainHeader().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion == true ? getMainHeader().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : getMainHeaderUnsupported().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.title) remainingTimeView diff --git a/Nudge/UI/StandardMode/RightSide.swift b/Nudge/UI/StandardMode/RightSide.swift index 0001f57c..e6b67bb8 100644 --- a/Nudge/UI/StandardMode/RightSide.swift +++ b/Nudge/UI/StandardMode/RightSide.swift @@ -37,9 +37,8 @@ struct StandardModeRightSide: View { VStack(alignment: .center) { HStack { VStack(alignment: .leading, spacing: 5) { - let mainHeaderText = appState.deviceSupportedByOSVersion == true ? getMainHeader().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : getMainHeaderUnsupported().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) HStack { - Text(mainHeaderText) + Text(appState.deviceSupportedByOSVersion == true ? getMainHeader().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : getMainHeaderUnsupported().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.largeTitle) .minimumScaleFactor(0.5) .frame(maxHeight: 25) @@ -47,7 +46,7 @@ struct StandardModeRightSide: View { } HStack { - Text(UserInterfaceVariables.subHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion == true ? UserInterfaceVariables.subHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.subHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.body) .fontWeight(.bold) .lineLimit(1) @@ -65,13 +64,13 @@ struct StandardModeRightSide: View { HStack(alignment: .center) { VStack(alignment: .leading, spacing: 1) { HStack { - Text(UserInterfaceVariables.mainContentHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion == true ? UserInterfaceVariables.mainContentHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.callout) .fontWeight(.bold) Spacer() } HStack { - Text(UserInterfaceVariables.mainContentSubHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion == true ? UserInterfaceVariables.mainContentSubHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentSubHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.callout) Spacer() } @@ -89,7 +88,7 @@ struct StandardModeRightSide: View { Divider() HStack { - Text(UserInterfaceVariables.mainContentNote.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion == true ? UserInterfaceVariables.mainContentNote.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentNoteUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.callout) .fontWeight(.bold) .foregroundColor(appState.differentiateWithoutColor ? .accessibleRed : .red) @@ -99,7 +98,7 @@ struct StandardModeRightSide: View { ScrollView(.vertical) { VStack { HStack { - Text(UserInterfaceVariables.mainContentText.replacingOccurrences(of: "\\n", with: "\n").localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion == true ? UserInterfaceVariables.mainContentText.replacingOccurrences(of: "\\n", with: "\n").localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentTextUnsupported.replacingOccurrences(of: "\\n", with: "\n").localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.callout) .multilineTextAlignment(.leading) Spacer() From bc956cab5b6442de0a183c222d04c40aedf0fb6e Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 09:37:58 -0500 Subject: [PATCH 022/141] sort the keys --- Nudge/Preferences/PreferencesStructure.swift | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 40bce2a8..38cfdfab 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -410,14 +410,14 @@ extension UpdateElement { customDeferralDropdownText: String? = nil, informationButtonText: String? = nil, mainContentHeader: String? = nil, - mainContentNote: String? = nil, - mainContentSubHeader: String? = nil, - mainContentText: String? = nil, - mainHeader: String? = nil, mainContentHeaderUnsupported: String? = nil, + mainContentNote: String? = nil, mainContentNoteUnsupported: String? = nil, + mainContentSubHeader: String? = nil, mainContentSubHeaderUnsupported: String? = nil, + mainContentText: String? = nil, mainContentTextUnsupported: String? = nil, + mainHeader: String? = nil, mainHeaderUnsupported: String? = nil, oneDayDeferralButtonText: String? = nil, oneHourDeferralButtonText: String? = nil, @@ -434,14 +434,14 @@ extension UpdateElement { customDeferralDropdownText: customDeferralDropdownText ?? self.customDeferralDropdownText, informationButtonText: informationButtonText ?? self.informationButtonText, mainContentHeader: mainContentHeader ?? self.mainContentHeader, - mainContentNote: mainContentNote ?? self.mainContentNote, - mainContentSubHeader: mainContentSubHeader ?? self.mainContentSubHeader, - mainContentText: mainContentText ?? self.mainContentText, - mainHeader: mainHeader ?? self.mainHeader, mainContentHeaderUnsupported: mainContentHeaderUnsupported ?? self.mainContentHeaderUnsupported, + mainContentNote: mainContentNote ?? self.mainContentNote, mainContentNoteUnsupported: mainContentNoteUnsupported ?? self.mainContentNoteUnsupported, + mainContentSubHeader: mainContentSubHeader ?? self.mainContentSubHeader, mainContentSubHeaderUnsupported: mainContentSubHeaderUnsupported ?? self.mainContentSubHeaderUnsupported, + mainContentText: mainContentText ?? self.mainContentText, mainContentTextUnsupported: mainContentTextUnsupported ?? self.mainContentTextUnsupported, + mainHeader: mainHeader ?? self.mainHeader, mainHeaderUnsupported: mainHeaderUnsupported ?? self.mainHeaderUnsupported, oneDayDeferralButtonText: oneDayDeferralButtonText ?? self.oneDayDeferralButtonText, oneHourDeferralButtonText: oneHourDeferralButtonText ?? self.oneHourDeferralButtonText, From 2afb77888ccfbc8557a468c78eadaf0685b9fcf9 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 09:45:13 -0500 Subject: [PATCH 023/141] finish sorting --- Nudge/Preferences/PreferencesStructure.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 38cfdfab..464ff61b 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -375,13 +375,13 @@ extension UserInterface { // MARK: - UpdateElement struct UpdateElement: Codable { var language, actionButtonText, customDeferralButtonText, customDeferralDropdownText, informationButtonText: String? - var mainContentHeader, mainContentNote, mainContentSubHeader, mainContentText, mainHeader: String? - var mainContentHeaderUnsupported, mainContentNoteUnsupported, mainContentSubHeaderUnsupported, mainContentTextUnsupported, mainHeaderUnsupported: String? + var mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported: String? + var mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported: String? var oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText: String? enum CodingKeys: String, CodingKey { case language = "_language" - case actionButtonText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, mainContentHeader, mainContentNote, mainContentSubHeader, mainContentText, mainHeader, mainContentHeaderUnsupported, mainContentNoteUnsupported, mainContentSubHeaderUnsupported, mainContentTextUnsupported, mainHeaderUnsupported, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText + case actionButtonText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText } } From cd53504025efb45ada4e0b065c7d401d0012f307 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 09:59:53 -0500 Subject: [PATCH 024/141] flesh out device supported logic --- .../com.github.macadmins.Nudge.tester.json | 1 + .../Preferences/DefaultPreferencesNudge.swift | 6 +++ Nudge/Preferences/PreferencesStructure.swift | 4 +- Nudge/UI/Main.swift | 42 ++++++++++--------- Nudge/UI/SimpleMode/SimpleMode.swift | 6 ++- Nudge/UI/StandardMode/RightSide.swift | 24 ++++++----- Nudge/Utilities/UILogic.swift | 4 +- 7 files changed, 53 insertions(+), 34 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 7c25629f..c1f4f6ba 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -10,6 +10,7 @@ "acceptableCameraUsage": true, "acceptableScreenSharingUsage": true, "attemptToBlockApplicationLaunches": true, + "attemptToCheckForSupportedDevice": true, "blockedApplicationBundleIDs": [ "com.microsoft.VSCode", "us.zoom.xos" diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 810d2b48..10c68fbc 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -113,6 +113,12 @@ struct OptionalFeatureVariables { false } + static var attemptToCheckForSupportedDevice: Bool { + optionalFeaturesProfile?["attemptToCheckForSupportedDevice"] as? Bool ?? + optionalFeaturesJSON?.attemptToCheckForSupportedDevice ?? + false + } + static var attemptToFetchMajorUpgrade: Bool { optionalFeaturesProfile?["attemptToFetchMajorUpgrade"] as? Bool ?? optionalFeaturesJSON?.attemptToFetchMajorUpgrade ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 464ff61b..d73221b7 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -51,7 +51,7 @@ extension NudgePreferences { // MARK: - OptionalFeatures struct OptionalFeatures: Codable { var acceptableApplicationBundleIDs, acceptableAssertionApplicationNames: [String]? - var acceptableAssertionUsage, acceptableCameraUsage, acceptableScreenSharingUsage, aggressiveUserExperience, aggressiveUserFullScreenExperience, asynchronousSoftwareUpdate, attemptToBlockApplicationLaunches, attemptToFetchMajorUpgrade: Bool? + var acceptableAssertionUsage, acceptableCameraUsage, acceptableScreenSharingUsage, aggressiveUserExperience, aggressiveUserFullScreenExperience, asynchronousSoftwareUpdate, attemptToBlockApplicationLaunches, attemptToCheckForSupportedDevice, attemptToFetchMajorUpgrade: Bool? var blockedApplicationBundleIDs: [String]? var disableSoftwareUpdateWorkflow, enforceMinorUpdates, terminateApplicationsOnLaunch, utilizeSOFAFeed: Bool? } @@ -84,6 +84,7 @@ extension OptionalFeatures { aggressiveUserFullScreenExperience: Bool? = nil, asynchronousSoftwareUpdate: Bool? = nil, attemptToBlockApplicationLaunches: Bool? = nil, + attemptToCheckForSupportedDevice: Bool? = nil, attemptToFetchMajorUpgrade: Bool? = nil, blockedApplicationBundleIDs: [String]? = nil, disableSoftwareUpdateWorkflow: Bool? = nil, @@ -101,6 +102,7 @@ extension OptionalFeatures { aggressiveUserFullScreenExperience: aggressiveUserFullScreenExperience ?? self.aggressiveUserFullScreenExperience, asynchronousSoftwareUpdate: asynchronousSoftwareUpdate ?? self.asynchronousSoftwareUpdate, attemptToBlockApplicationLaunches: attemptToBlockApplicationLaunches ?? self.attemptToBlockApplicationLaunches, + attemptToCheckForSupportedDevice: attemptToCheckForSupportedDevice ?? self.attemptToCheckForSupportedDevice, attemptToFetchMajorUpgrade: attemptToFetchMajorUpgrade ?? self.attemptToFetchMajorUpgrade, blockedApplicationBundleIDs: blockedApplicationBundleIDs ?? self.blockedApplicationBundleIDs, disableSoftwareUpdateWorkflow: disableSoftwareUpdateWorkflow ?? self.disableSoftwareUpdateWorkflow, diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 237792ed..0782e385 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -174,27 +174,31 @@ class AppDelegate: NSObject, NSApplicationDelegate { // Pre-Launch Logic func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") - if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { - // Find the first macOS asset that matches the product version - var foundMatch = false - // osVersions.map { $0.latest.productVersion } - for osVersion in macOSSOFAAssets { - if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == PrefsWrapper.requiredMinimumOSVersion }) { - foundMatch = true - // Check if the specified device is in the supported devices of the matching asset -// print("SOFA Matched OS Version: \(matchingAsset.productVersion)") -// print("SOFA Assets: \(matchingAsset.supportedDevices)") -// print("Assessed Model ID: \(Globals.hardwareModelID)") - // nudgePrimaryState.deviceSupportedByOSVersion = matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) - nudgePrimaryState.deviceSupportedByOSVersion = false + if OptionalFeatureVariables.utilizeSOFAFeed { + if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { + // Find the first macOS asset that matches the product version + var foundMatch = false + // osVersions.map { $0.latest.productVersion } + for osVersion in macOSSOFAAssets { + if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == PrefsWrapper.requiredMinimumOSVersion }) { + foundMatch = true + // Check if the specified device is in the supported devices of the matching asset + // print("SOFA Matched OS Version: \(matchingAsset.productVersion)") + // print("SOFA Assets: \(matchingAsset.supportedDevices)") + // print("Assessed Model ID: \(Globals.hardwareModelID)") + if OptionalFeatureVariables.attemptToCheckForSupportedDevice { + nudgePrimaryState.deviceSupportedByOSVersion = matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) + nudgePrimaryState.deviceSupportedByOSVersion = false + } + } } + if !foundMatch { + // If no matching product version found or the device is not supported, return false + print("DeviceSOFASupported: False") + } + } else { + print("No macOS SOFA assets available.") } - if !foundMatch { - // If no matching product version found or the device is not supported, return false - print("DeviceSOFASupported: False") - } - } else { - print("No macOS SOFA assets available.") } handleSMAppService() checkForBadProfilePath() diff --git a/Nudge/UI/SimpleMode/SimpleMode.swift b/Nudge/UI/SimpleMode/SimpleMode.swift index 2e5236db..5ef26dce 100644 --- a/Nudge/UI/SimpleMode/SimpleMode.swift +++ b/Nudge/UI/SimpleMode/SimpleMode.swift @@ -30,7 +30,7 @@ struct SimpleMode: View { CompanyLogo() Spacer() - Text(appState.deviceSupportedByOSVersion == true ? getMainHeader().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : getMainHeaderUnsupported().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion ? getMainHeader().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : getMainHeaderUnsupported().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.title) remainingTimeView @@ -40,7 +40,9 @@ struct SimpleMode: View { } Spacer() - updateButton + if appState.deviceSupportedByOSVersion { + updateButton + } Spacer() } } diff --git a/Nudge/UI/StandardMode/RightSide.swift b/Nudge/UI/StandardMode/RightSide.swift index e6b67bb8..cdba747d 100644 --- a/Nudge/UI/StandardMode/RightSide.swift +++ b/Nudge/UI/StandardMode/RightSide.swift @@ -38,7 +38,7 @@ struct StandardModeRightSide: View { HStack { VStack(alignment: .leading, spacing: 5) { HStack { - Text(appState.deviceSupportedByOSVersion == true ? getMainHeader().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : getMainHeaderUnsupported().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion ? getMainHeader().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : getMainHeaderUnsupported().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.largeTitle) .minimumScaleFactor(0.5) .frame(maxHeight: 25) @@ -46,7 +46,7 @@ struct StandardModeRightSide: View { } HStack { - Text(appState.deviceSupportedByOSVersion == true ? UserInterfaceVariables.subHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.subHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.subHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.subHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.body) .fontWeight(.bold) .lineLimit(1) @@ -64,31 +64,33 @@ struct StandardModeRightSide: View { HStack(alignment: .center) { VStack(alignment: .leading, spacing: 1) { HStack { - Text(appState.deviceSupportedByOSVersion == true ? UserInterfaceVariables.mainContentHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.mainContentHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.callout) .fontWeight(.bold) Spacer() } HStack { - Text(appState.deviceSupportedByOSVersion == true ? UserInterfaceVariables.mainContentSubHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentSubHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.mainContentSubHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentSubHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.callout) Spacer() } } Spacer() - Button(action: { - UIUtilities().updateDevice() - }) { - Text(UserInterfaceVariables.actionButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + if appState.deviceSupportedByOSVersion { + Button(action: { + UIUtilities().updateDevice() + }) { + Text(UserInterfaceVariables.actionButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + } + .keyboardShortcut(.defaultAction) } - .keyboardShortcut(.defaultAction) } Divider() HStack { - Text(appState.deviceSupportedByOSVersion == true ? UserInterfaceVariables.mainContentNote.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentNoteUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.mainContentNote.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentNoteUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.callout) .fontWeight(.bold) .foregroundColor(appState.differentiateWithoutColor ? .accessibleRed : .red) @@ -98,7 +100,7 @@ struct StandardModeRightSide: View { ScrollView(.vertical) { VStack { HStack { - Text(appState.deviceSupportedByOSVersion == true ? UserInterfaceVariables.mainContentText.replacingOccurrences(of: "\\n", with: "\n").localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentTextUnsupported.replacingOccurrences(of: "\\n", with: "\n").localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.mainContentText.replacingOccurrences(of: "\\n", with: "\n").localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentTextUnsupported.replacingOccurrences(of: "\\n", with: "\n").localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .font(.callout) .multilineTextAlignment(.leading) Spacer() diff --git a/Nudge/Utilities/UILogic.swift b/Nudge/Utilities/UILogic.swift index 4764ec87..8414b272 100644 --- a/Nudge/Utilities/UILogic.swift +++ b/Nudge/Utilities/UILogic.swift @@ -245,7 +245,9 @@ private func shouldActivateNudgeBasedOnAggressiveExperience(_ runningApplication } AppStateManager().activateNudge() if !CommandLineUtilities().unitTestingEnabled() { - UIUtilities().updateDevice(userClicked: false) + if nudgePrimaryState.deviceSupportedByOSVersion { + UIUtilities().updateDevice(userClicked: false) + } } return true } else { From 098d361b979fe24d4f95942804649ff1d05a5bfd Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 10:09:53 -0500 Subject: [PATCH 025/141] add sofa logging events --- Nudge/UI/Main.swift | 18 +++++++++--------- Nudge/Utilities/Logger.swift | 1 + 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 0782e385..30b6e8cc 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -176,28 +176,28 @@ class AppDelegate: NSObject, NSApplicationDelegate { // print("applicationWillFinishLaunching") if OptionalFeatureVariables.utilizeSOFAFeed { if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { - // Find the first macOS asset that matches the product version var foundMatch = false - // osVersions.map { $0.latest.productVersion } for osVersion in macOSSOFAAssets { if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == PrefsWrapper.requiredMinimumOSVersion }) { - foundMatch = true // Check if the specified device is in the supported devices of the matching asset - // print("SOFA Matched OS Version: \(matchingAsset.productVersion)") - // print("SOFA Assets: \(matchingAsset.supportedDevices)") - // print("Assessed Model ID: \(Globals.hardwareModelID)") + LogManager.notice("SOFA Matched OS Version: \(matchingAsset.productVersion)", logger: sofaLog) + LogManager.notice("SOFA Assets: \(matchingAsset.supportedDevices)", logger: sofaLog) if OptionalFeatureVariables.attemptToCheckForSupportedDevice { - nudgePrimaryState.deviceSupportedByOSVersion = matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) + LogManager.notice("Assessed Model ID: \(Globals.hardwareModelID)", logger: sofaLog) + let deviceMatchFound = matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) + LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) + nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound nudgePrimaryState.deviceSupportedByOSVersion = false } + foundMatch = true } } if !foundMatch { // If no matching product version found or the device is not supported, return false - print("DeviceSOFASupported: False") + LogManager.notice("Could not find requiredMinimumOSVersion in SOFA feed", logger: sofaLog) } } else { - print("No macOS SOFA assets available.") + LogManager.notice("Could not fetch SOFA feed", logger: sofaLog) } } handleSMAppService() diff --git a/Nudge/Utilities/Logger.swift b/Nudge/Utilities/Logger.swift index 5d3cd5a6..eab199a6 100644 --- a/Nudge/Utilities/Logger.swift +++ b/Nudge/Utilities/Logger.swift @@ -47,6 +47,7 @@ let uiLog = LogManager.createLogger(category: "user-interface") let softwareupdateDeviceLog = LogManager.createLogger(category: "softwareupdate-device") let softwareupdateListLog = LogManager.createLogger(category: "softwareupdate-list") let softwareupdateDownloadLog = LogManager.createLogger(category: "softwareupdate-download") +let sofaLog = LogManager.createLogger(category: "sofa") // Log State class LogState { From 335b1bf0410cef4dd5b98316c5301977ddc3fe13 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 10:33:12 -0500 Subject: [PATCH 026/141] add unsupportedURL and informationButtonTextUnsupported --- .../com.github.macadmins.Nudge.tester.json | 4 +- .../Preferences/DefaultPreferencesNudge.swift | 12 ++++ Nudge/Preferences/PreferencesStructure.swift | 68 +++++++++++++++++-- Nudge/UI/Common/InformationButton.swift | 32 ++++++--- Nudge/Utilities/Preferences.swift | 21 ++++++ Nudge/Utilities/Utils.swift | 8 +++ 6 files changed, 130 insertions(+), 15 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index c1f4f6ba..264b4008 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -22,7 +22,8 @@ { "aboutUpdateURL": "https://apple.com", "requiredInstallationDate": "2025-01-01T00:00:00Z", - "requiredMinimumOSVersion": "14.5" + "requiredMinimumOSVersion": "14.5", + "unsupportedURL": "https://google.com", } ], "userExperience": { @@ -45,6 +46,7 @@ "customDeferralButtonText": "customDeferralButtonText", "customDeferralDropdownText": "customDeferralDropdownText", "informationButtonText": "informationButtonText", + "informationButtonTextUnsupported": "informationButtonTextUnsupported", "mainContentHeader": "mainContentHeader", "mainContentHeaderUnsupported": "mainContentHeaderUnsupported", "mainContentNote": "mainContentNote", diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 10c68fbc..b13bbbb8 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -179,6 +179,12 @@ struct OSVersionRequirementVariables { static var requiredMinimumOSVersion: String { try! OSVersion(PrefsWrapper.requiredMinimumOSVersion).description } + + static var unsupportedURL: String { + getUnsupportedURL(OSVerReq: osVersionRequirementsProfile) ?? + getUnsupportedURL(OSVerReq: osVersionRequirementsJSON) ?? + "" + } } @@ -373,6 +379,12 @@ struct UserInterfaceVariables { "More Info" } + static var informationButtonTextUnsupported: String { + userInterfaceUpdateElementsProfile?["informationButtonTextUnsupported"] as? String ?? + userInterfaceUpdateElementsJSON?.informationButtonTextUnsupported ?? + "Replace Your Device" + } + static var mainContentHeader: String { userInterfaceUpdateElementsProfile?["mainContentHeader"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentHeader ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index d73221b7..4de187db 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -120,6 +120,8 @@ struct OSVersionRequirement: Codable { var actionButtonPath, majorUpgradeAppPath: String? var requiredInstallationDate: Date? var requiredMinimumOSVersion, targetedOSVersionsRule: String? + var unsupportedURL: String? + var unsupportedURLs: [UnsupportedURL]? } // MARK: OSVersionRequirement convenience initializers and mutators @@ -130,8 +132,9 @@ extension OSVersionRequirement { self.majorUpgradeAppPath = fromDictionary["majorUpgradeAppPath"] as? String self.requiredMinimumOSVersion = fromDictionary["requiredMinimumOSVersion"] as? String self.targetedOSVersionsRule = fromDictionary["targetedOSVersionsRule"] as? String + self.unsupportedURL = fromDictionary["unsupportedURL"] as? String - // Handling AboutUpdateURLs + // Handling AboutUpdateURLs and UnsupportedURLs if let aboutURLs = fromDictionary["aboutUpdateURLs"] as? [[String: String]] { self.aboutUpdateURLs = aboutURLs.compactMap { dict in guard let language = dict["_language"], let url = dict["aboutUpdateURL"] else { return nil } @@ -141,6 +144,15 @@ extension OSVersionRequirement { self.aboutUpdateURLs = [] } + if let unsupportedURLs = fromDictionary["unsupportedURLs"] as? [[String: String]] { + self.unsupportedURLs = unsupportedURLs.compactMap { dict in + guard let language = dict["_language"], let url = dict["unsupportedURL"] else { return nil } + return UnsupportedURL(language: language, unsupportedURL: url) + } + } else { + self.unsupportedURLs = [] + } + // Handling requiredInstallationDate // Jamf JSON Schema for mobileconfigurations do not support Date types (JSON does not support it) // In order to support this, an admin would need to pass a string and then coerce it into our Date format @@ -177,7 +189,9 @@ extension OSVersionRequirement { majorUpgradeAppPath: String? = nil, requiredInstallationDate: Date? = nil, requiredMinimumOSVersion: String? = nil, - targetedOSVersionsRule: String? = nil + targetedOSVersionsRule: String? = nil, + unsupportedURL: String? = nil, + unsupportedURLs: [UnsupportedURL]? = nil ) -> OSVersionRequirement { return OSVersionRequirement( aboutUpdateURL: aboutUpdateURL ?? self.aboutUpdateURL, @@ -186,7 +200,9 @@ extension OSVersionRequirement { majorUpgradeAppPath: majorUpgradeAppPath ?? self.majorUpgradeAppPath, requiredInstallationDate: requiredInstallationDate ?? self.requiredInstallationDate, requiredMinimumOSVersion: requiredMinimumOSVersion ?? self.requiredMinimumOSVersion, - targetedOSVersionsRule: targetedOSVersionsRule ?? self.targetedOSVersionsRule + targetedOSVersionsRule: targetedOSVersionsRule ?? self.targetedOSVersionsRule, + unsupportedURL: unsupportedURL ?? self.unsupportedURL, + unsupportedURLs: unsupportedURLs ?? self.unsupportedURLs ) } } @@ -231,6 +247,46 @@ extension AboutUpdateURL { } } +// MARK: - UnsupportedURL +struct UnsupportedURL: Codable { + var language: String? + var unsupportedURL: String? + + enum CodingKeys: String, CodingKey { + case language = "_language" + case unsupportedURL + } +} + +// MARK: UnsupportedURL convenience initializers and mutators +extension UnsupportedURL { + init(data: Data) throws { + self = try JSONDecoder().decode(UnsupportedURL.self, from: data) + } + + init(_ json: String, using encoding: String.Encoding = .utf8) throws { + guard let data = json.data(using: encoding) else { + throw NSError(domain: "JSONDecoding", code: 0, userInfo: [NSLocalizedDescriptionKey: "Invalid JSON string."]) + } + try self.init(data: data) + } + + init(fromURL url: URL) throws { + let data = try Data(contentsOf: url) + try self.init(data: data) + } + + func with( + language: String? = nil, + unsupportedURL: String? = nil + ) -> UnsupportedURL { + return UnsupportedURL( + language: language ?? self.language, + unsupportedURL: unsupportedURL ?? self.unsupportedURL + ) + } +} + // MARK: - UserExperience struct UserExperience: Codable { var allowGracePeriods, allowLaterDeferralButton, allowMovableWindow, allowUserQuitDeferrals: Bool? @@ -376,14 +432,14 @@ extension UserInterface { // MARK: - UpdateElement struct UpdateElement: Codable { - var language, actionButtonText, customDeferralButtonText, customDeferralDropdownText, informationButtonText: String? + var language, actionButtonText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, informationButtonTextUnsupported: String? var mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported: String? var mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported: String? var oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText: String? enum CodingKeys: String, CodingKey { case language = "_language" - case actionButtonText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText + case actionButtonText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, informationButtonTextUnsupported, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText } } @@ -411,6 +467,7 @@ extension UpdateElement { customDeferralButtonText: String? = nil, customDeferralDropdownText: String? = nil, informationButtonText: String? = nil, + informationButtonTextUnsupported: String? = nil, mainContentHeader: String? = nil, mainContentHeaderUnsupported: String? = nil, mainContentNote: String? = nil, @@ -435,6 +492,7 @@ extension UpdateElement { customDeferralButtonText: customDeferralButtonText ?? self.customDeferralButtonText, customDeferralDropdownText: customDeferralDropdownText ?? self.customDeferralDropdownText, informationButtonText: informationButtonText ?? self.informationButtonText, + informationButtonTextUnsupported: informationButtonTextUnsupported ?? self.informationButtonTextUnsupported, mainContentHeader: mainContentHeader ?? self.mainContentHeader, mainContentHeaderUnsupported: mainContentHeaderUnsupported ?? self.mainContentHeaderUnsupported, mainContentNote: mainContentNote ?? self.mainContentNote, diff --git a/Nudge/UI/Common/InformationButton.swift b/Nudge/UI/Common/InformationButton.swift index 3b9bfeb0..41c742c8 100644 --- a/Nudge/UI/Common/InformationButton.swift +++ b/Nudge/UI/Common/InformationButton.swift @@ -19,17 +19,31 @@ struct InformationButton: View { } private var informationButton: some View { - guard OSVersionRequirementVariables.aboutUpdateURL != "" else { return AnyView(EmptyView()) } - - return AnyView( - Button(action: UIUtilities().openMoreInfo) { - Text(UserInterfaceVariables.informationButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) - .foregroundColor(dynamicTextColor) - } + if appState.deviceSupportedByOSVersion { + guard OSVersionRequirementVariables.aboutUpdateURL != "" else { return AnyView(EmptyView()) } + + return AnyView( + Button(action: UIUtilities().openMoreInfo) { + Text(UserInterfaceVariables.informationButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + .foregroundColor(dynamicTextColor) + } + .buttonStyle(.plain) + .help("Click for more information about the security update".localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + .onHoverEffect() + ) + } else { + guard OSVersionRequirementVariables.unsupportedURL != "" else { return AnyView(EmptyView()) } + + return AnyView( + Button(action: UIUtilities().openMoreInfoUnsupported) { + Text(UserInterfaceVariables.informationButtonTextUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + .foregroundColor(dynamicTextColor) + } .buttonStyle(.plain) - .help("Click for more information about the security update".localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + .help("Click for more information about replacing your device".localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .onHoverEffect() - ) + ) + } } private var dynamicTextColor: Color { diff --git a/Nudge/Utilities/Preferences.swift b/Nudge/Utilities/Preferences.swift index 09eaf5d8..9a037ea5 100644 --- a/Nudge/Utilities/Preferences.swift +++ b/Nudge/Utilities/Preferences.swift @@ -122,6 +122,27 @@ private func getOSVersionRequirements(from requirements: [OSVersionRequirement]? return fullMatch ?? partialMatch ?? defaultMatch ?? nil } +func getUnsupportedURL(OSVerReq: OSVersionRequirement?) -> String? { + if CommandLineUtilities().demoModeEnabled() || CommandLineUtilities().unitTestingEnabled() { + return "https://apple.com" + } + + if let update = OSVerReq?.unsupportedURL { + return update + } + + let desiredLanguage = getDesiredLanguage() + if let updates = OSVerReq?.unsupportedURLs { + for subUpdate in updates { + if subUpdate.language == desiredLanguage { + return subUpdate.unsupportedURL ?? "" + } + } + } + + return nil +} + // userExperience // Even if profile/JSON is installed, return nil if in demo-mode func getUserExperienceJSON() -> UserExperience? { diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 3b6d92af..da29da00 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -1059,6 +1059,14 @@ struct UIUtilities { NSWorkspace.shared.open(url) } + func openMoreInfoUnsupported() { + guard let url = URL(string: OSVersionRequirementVariables.unsupportedURL) else { + return + } + LogManager.notice("User clicked moreInfo button in unsupported state", logger: uiLog) + NSWorkspace.shared.open(url) + } + private func postUpdateDeviceActions(userClicked: Bool) { if userClicked { LogManager.notice("User clicked updateDevice", logger: uiLog) From fc0ce05aab8d572c2f9a7ca1d67fcbe2739288cb Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 11:12:07 -0500 Subject: [PATCH 027/141] start testing for actively exploited cve info --- Nudge/UI/Main.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 30b6e8cc..b476c2f3 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -178,13 +178,17 @@ class AppDelegate: NSObject, NSApplicationDelegate { if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { var foundMatch = false for osVersion in macOSSOFAAssets { - if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == PrefsWrapper.requiredMinimumOSVersion }) { + var test = PrefsWrapper.requiredMinimumOSVersion + test = "14.4" + if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == test }) { // Check if the specified device is in the supported devices of the matching asset LogManager.notice("SOFA Matched OS Version: \(matchingAsset.productVersion)", logger: sofaLog) LogManager.notice("SOFA Assets: \(matchingAsset.supportedDevices)", logger: sofaLog) if OptionalFeatureVariables.attemptToCheckForSupportedDevice { LogManager.notice("Assessed Model ID: \(Globals.hardwareModelID)", logger: sofaLog) let deviceMatchFound = matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) + print("CVEs: \(matchingAsset.cves)") + print("Actively Exploited CVEs: \(matchingAsset.activelyExploitedCVEs.count > 0)") LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound nudgePrimaryState.deviceSupportedByOSVersion = false From 0fb6528ed524a15b12911b473edc1b818922f413 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 11:14:56 -0500 Subject: [PATCH 028/141] TODOs so I don't forget --- Nudge/UI/Main.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index b476c2f3..4f746d00 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -174,6 +174,12 @@ class AppDelegate: NSObject, NSApplicationDelegate { // Pre-Launch Logic func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") + // TODO: Implement SOFA Caching + // TODO: Implement requiredInstallationDate values SLAs for Actively Exploited vs Not based on ReleaseDate sofa key + // TODO: Implement Actively Exploited sidebar info on standardMode + // TODO: Implement "latest" for sofa vs hardcoded requiredInstallationVersion + // TODO: Add more logging to "unsupported devices" UI. + // TODO: Add localization for "unsupported devices" text fields if OptionalFeatureVariables.utilizeSOFAFeed { if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { var foundMatch = false From 027450e5a91c9c510aa42857a238d747aa4c6031 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 11:18:34 -0500 Subject: [PATCH 029/141] more todo notes --- Nudge/UI/Main.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 4f746d00..9874349a 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -174,12 +174,14 @@ class AppDelegate: NSObject, NSApplicationDelegate { // Pre-Launch Logic func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") - // TODO: Implement SOFA Caching + // TODO: Implement SOFA Caching with key refreshSOFAFeedTime // TODO: Implement requiredInstallationDate values SLAs for Actively Exploited vs Not based on ReleaseDate sofa key + // TODO: activelyExploitedInstallationSLA, standardInstallationSLA // TODO: Implement Actively Exploited sidebar info on standardMode // TODO: Implement "latest" for sofa vs hardcoded requiredInstallationVersion // TODO: Add more logging to "unsupported devices" UI. // TODO: Add localization for "unsupported devices" text fields + // TODO: Get someone to update JAMF JSON schema for all the new keys and wiki if OptionalFeatureVariables.utilizeSOFAFeed { if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { var foundMatch = false From ad4247bfe600668fa09715387cbf60e08b357502 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 12:59:33 -0500 Subject: [PATCH 030/141] handle new sofa values for "Latest" --- Nudge/3rd Party Assets/sofa.swift | 8 ++++++++ Nudge/UI/Main.swift | 29 +++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift index 085a3b1f..8c066a0b 100644 --- a/Nudge/3rd Party Assets/sofa.swift +++ b/Nudge/3rd Party Assets/sofa.swift @@ -44,6 +44,10 @@ struct LatestOS: Codable { let releaseDate: Date? let expirationDate: Date let supportedDevices: [String] + let securityInfo: String + let cves: [String: Bool] + let activelyExploitedCVEs: [String] + let uniqueCVEsCount: Int enum CodingKeys: String, CodingKey { case productVersion = "ProductVersion" @@ -51,6 +55,10 @@ struct LatestOS: Codable { case releaseDate = "ReleaseDate" case expirationDate = "ExpirationDate" case supportedDevices = "SupportedDevices" + case securityInfo = "SecurityInfo" + case cves = "CVEs" + case activelyExploitedCVEs = "ActivelyExploitedCVEs" + case uniqueCVEsCount = "UniqueCVEsCount" } } diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 9874349a..cb1dcaae 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -188,20 +188,37 @@ class AppDelegate: NSObject, NSApplicationDelegate { for osVersion in macOSSOFAAssets { var test = PrefsWrapper.requiredMinimumOSVersion test = "14.4" - if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == test }) { + test = "latest" + if test == "latest" { // Check if the specified device is in the supported devices of the matching asset - LogManager.notice("SOFA Matched OS Version: \(matchingAsset.productVersion)", logger: sofaLog) - LogManager.notice("SOFA Assets: \(matchingAsset.supportedDevices)", logger: sofaLog) + LogManager.notice("SOFA Matched OS Version: \(osVersion.latest.productVersion)", logger: sofaLog) + LogManager.notice("SOFA Assets: \(osVersion.latest.supportedDevices)", logger: sofaLog) if OptionalFeatureVariables.attemptToCheckForSupportedDevice { LogManager.notice("Assessed Model ID: \(Globals.hardwareModelID)", logger: sofaLog) - let deviceMatchFound = matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) - print("CVEs: \(matchingAsset.cves)") - print("Actively Exploited CVEs: \(matchingAsset.activelyExploitedCVEs.count > 0)") + let deviceMatchFound = osVersion.latest.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) + print("CVEs: \(osVersion.latest.cves)") + print("Actively Exploited CVEs: \(osVersion.latest.activelyExploitedCVEs.count > 0)") LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound nudgePrimaryState.deviceSupportedByOSVersion = false } foundMatch = true + } else { + if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == test }) { + // Check if the specified device is in the supported devices of the matching asset + LogManager.notice("SOFA Matched OS Version: \(matchingAsset.productVersion)", logger: sofaLog) + LogManager.notice("SOFA Assets: \(matchingAsset.supportedDevices)", logger: sofaLog) + if OptionalFeatureVariables.attemptToCheckForSupportedDevice { + LogManager.notice("Assessed Model ID: \(Globals.hardwareModelID)", logger: sofaLog) + let deviceMatchFound = matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) + print("CVEs: \(matchingAsset.cves)") + print("Actively Exploited CVEs: \(matchingAsset.activelyExploitedCVEs.count > 0)") + LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) + nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound + nudgePrimaryState.deviceSupportedByOSVersion = false + } + foundMatch = true + } } } if !foundMatch { From d290f0e64f81a2281643c8675ac5ea7bc0b1cb27 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 14:18:32 -0500 Subject: [PATCH 031/141] first attempt at implementing "latest" with ui --- .../com.github.macadmins.Nudge.tester.json | 2 +- .../Preferences/DefaultPreferencesNudge.swift | 6 +++++- Nudge/UI/Defaults.swift | 1 + Nudge/UI/Main.swift | 18 ++++++++++-------- Nudge/UI/StandardMode/LeftSide.swift | 2 +- Nudge/Utilities/SoftwareUpdate.swift | 8 ++++---- Nudge/Utilities/Utils.swift | 8 ++++---- 7 files changed, 26 insertions(+), 19 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 264b4008..9bcfed7e 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -22,7 +22,7 @@ { "aboutUpdateURL": "https://apple.com", "requiredInstallationDate": "2025-01-01T00:00:00Z", - "requiredMinimumOSVersion": "14.5", + "requiredMinimumOSVersion": "latest", "unsupportedURL": "https://google.com", } ], diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index b13bbbb8..dbbbf4ac 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -177,7 +177,11 @@ struct OSVersionRequirementVariables { } static var requiredMinimumOSVersion: String { - try! OSVersion(PrefsWrapper.requiredMinimumOSVersion).description + if PrefsWrapper.requiredMinimumOSVersion == "latest" { + PrefsWrapper.requiredMinimumOSVersion + } else { + try! OSVersion(PrefsWrapper.requiredMinimumOSVersion).description + } } static var unsupportedURL: String { diff --git a/Nudge/UI/Defaults.swift b/Nudge/UI/Defaults.swift index 175f21e8..e92079c4 100644 --- a/Nudge/UI/Defaults.swift +++ b/Nudge/UI/Defaults.swift @@ -78,6 +78,7 @@ class AppState: ObservableObject { @Published var hoursRemaining = DateManager().getNumberOfHoursRemaining() @Published var lastRefreshTime = DateManager().getFormattedDate() @Published var requireDualQuitButtons = false + @Published var requiredMinimumOSVersion = OSVersionRequirementVariables.requiredMinimumOSVersion @Published var shouldExit = false @Published var timerCycle = 0 @Published var userDeferrals = Globals.nudgeDefaults.object(forKey: "userDeferrals") as? Int ?? 0 diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index cb1dcaae..c71d8047 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -179,6 +179,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { // TODO: activelyExploitedInstallationSLA, standardInstallationSLA // TODO: Implement Actively Exploited sidebar info on standardMode // TODO: Implement "latest" for sofa vs hardcoded requiredInstallationVersion + // TODO: Implement "latest-minor" or something for implementing all of the minor releases. // TODO: Add more logging to "unsupported devices" UI. // TODO: Add localization for "unsupported devices" text fields // TODO: Get someone to update JAMF JSON schema for all the new keys and wiki @@ -186,11 +187,9 @@ class AppDelegate: NSObject, NSApplicationDelegate { if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { var foundMatch = false for osVersion in macOSSOFAAssets { - var test = PrefsWrapper.requiredMinimumOSVersion - test = "14.4" - test = "latest" - if test == "latest" { + if PrefsWrapper.requiredMinimumOSVersion == "latest" { // Check if the specified device is in the supported devices of the matching asset + nudgePrimaryState.requiredMinimumOSVersion = osVersion.latest.productVersion LogManager.notice("SOFA Matched OS Version: \(osVersion.latest.productVersion)", logger: sofaLog) LogManager.notice("SOFA Assets: \(osVersion.latest.supportedDevices)", logger: sofaLog) if OptionalFeatureVariables.attemptToCheckForSupportedDevice { @@ -200,11 +199,11 @@ class AppDelegate: NSObject, NSApplicationDelegate { print("Actively Exploited CVEs: \(osVersion.latest.activelyExploitedCVEs.count > 0)") LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound - nudgePrimaryState.deviceSupportedByOSVersion = false + // nudgePrimaryState.deviceSupportedByOSVersion = false } foundMatch = true } else { - if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == test }) { + if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == nudgePrimaryState.requiredMinimumOSVersion }) { // Check if the specified device is in the supported devices of the matching asset LogManager.notice("SOFA Matched OS Version: \(matchingAsset.productVersion)", logger: sofaLog) LogManager.notice("SOFA Assets: \(matchingAsset.supportedDevices)", logger: sofaLog) @@ -215,15 +214,18 @@ class AppDelegate: NSObject, NSApplicationDelegate { print("Actively Exploited CVEs: \(matchingAsset.activelyExploitedCVEs.count > 0)") LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound - nudgePrimaryState.deviceSupportedByOSVersion = false + // nudgePrimaryState.deviceSupportedByOSVersion = false } foundMatch = true } } + if foundMatch { + break + } } if !foundMatch { // If no matching product version found or the device is not supported, return false - LogManager.notice("Could not find requiredMinimumOSVersion in SOFA feed", logger: sofaLog) + LogManager.notice("Could not find requiredMinimumOSVersion \(nudgePrimaryState.requiredMinimumOSVersion) in SOFA feed", logger: sofaLog) } } else { LogManager.notice("Could not fetch SOFA feed", logger: sofaLog) diff --git a/Nudge/UI/StandardMode/LeftSide.swift b/Nudge/UI/StandardMode/LeftSide.swift index a57a9c05..16ad91f7 100644 --- a/Nudge/UI/StandardMode/LeftSide.swift +++ b/Nudge/UI/StandardMode/LeftSide.swift @@ -36,7 +36,7 @@ struct StandardModeLeftSide: View { private var informationStack: some View { VStack(alignment: .center, spacing: interLineSpacing) { - InfoRow(label: "Required OS Version:", value: String(OSVersionRequirementVariables.requiredMinimumOSVersion), boldText: true) + InfoRow(label: "Required OS Version:", value: String(appState.requiredMinimumOSVersion), boldText: true) InfoRow(label: "Current OS Version:", value: GlobalVariables.currentOSVersion) remainingTimeRow if UserInterfaceVariables.showDeferralCount { diff --git a/Nudge/Utilities/SoftwareUpdate.swift b/Nudge/Utilities/SoftwareUpdate.swift index c3c551e1..6955edcd 100644 --- a/Nudge/Utilities/SoftwareUpdate.swift +++ b/Nudge/Utilities/SoftwareUpdate.swift @@ -34,7 +34,7 @@ class SoftwareUpdate { if OptionalFeatureVariables.attemptToFetchMajorUpgrade, !majorUpgradeAppPathExists, !majorUpgradeBackupAppPathExists { LogManager.notice("Device requires major upgrade - attempting download", logger: softwareupdateListLog) - let (output, error, exitCode) = SubProcessUtilities().runProcess(launchPath: "/usr/sbin/softwareupdate", arguments: ["--fetch-full-installer", "--full-installer-version", OSVersionRequirementVariables.requiredMinimumOSVersion]) + let (output, error, exitCode) = SubProcessUtilities().runProcess(launchPath: "/usr/sbin/softwareupdate", arguments: ["--fetch-full-installer", "--full-installer-version", nudgePrimaryState.requiredMinimumOSVersion]) if exitCode != 0 { LogManager.error("Error downloading software update: \(error)", logger: softwareupdateDownloadLog) @@ -54,8 +54,8 @@ class SoftwareUpdate { let softwareupdateList = self.list() let updateLabel = extractUpdateLabel(from: softwareupdateList) - if !softwareupdateList.contains(OSVersionRequirementVariables.requiredMinimumOSVersion) || updateLabel.isEmpty { - LogManager.notice("Software update did not find \(OSVersionRequirementVariables.requiredMinimumOSVersion) available for download - skipping download attempt", logger: softwareupdateListLog) + if !softwareupdateList.contains(nudgePrimaryState.requiredMinimumOSVersion) || updateLabel.isEmpty { + LogManager.notice("Software update did not find \(nudgePrimaryState.requiredMinimumOSVersion) available for download - skipping download attempt", logger: softwareupdateListLog) return } @@ -77,7 +77,7 @@ class SoftwareUpdate { for line in lines { if line.contains("Label:") { let labelPart = line.split(separator: ":").map { $0.trimmingCharacters(in: .whitespaces) } - if labelPart.count > 1 && labelPart[1].contains(OSVersionRequirementVariables.requiredMinimumOSVersion) { + if labelPart.count > 1 && labelPart[1].contains(nudgePrimaryState.requiredMinimumOSVersion) { updateLabel = labelPart[1] break } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index da29da00..9fa4a8fd 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -685,7 +685,7 @@ struct ImageManager { struct LoggerUtilities { func logRequiredMinimumOSVersion() { if !requiredMinimumOSVersionNil() { - Globals.nudgeDefaults.set(OSVersionRequirementVariables.requiredMinimumOSVersion, forKey: "requiredMinimumOSVersion") + Globals.nudgeDefaults.set(nudgePrimaryState.requiredMinimumOSVersion, forKey: "requiredMinimumOSVersion") } } @@ -1134,7 +1134,7 @@ struct UIUtilities { struct VersionManager { static func fullyUpdated() -> Bool { let currentOSVersion = GlobalVariables.currentOSVersion - let requiredMinimumOSVersion = OSVersionRequirementVariables.requiredMinimumOSVersion + let requiredMinimumOSVersion = nudgePrimaryState.requiredMinimumOSVersion let fullyUpdated = versionGreaterThanOrEqual(currentVersion: currentOSVersion, newVersion: requiredMinimumOSVersion) if fullyUpdated { LogManager.notice("Current operating system (\(currentOSVersion)) is greater than or equal to required operating system (\(requiredMinimumOSVersion))", logger: utilsLog) @@ -1150,7 +1150,7 @@ struct VersionManager { } static func getMajorRequiredNudgeOSVersion() -> Int { - guard let majorVersion = Int(OSVersionRequirementVariables.requiredMinimumOSVersion.split(separator: ".").first ?? "") else { + guard let majorVersion = Int(nudgePrimaryState.requiredMinimumOSVersion.split(separator: ".").first ?? "") else { LogManager.error("Invalid format for requiredMinimumOSVersion", logger: utilsLog) return 0 } @@ -1173,7 +1173,7 @@ struct VersionManager { } static func newNudgeEvent() -> Bool { - versionGreaterThan(currentVersion: OSVersionRequirementVariables.requiredMinimumOSVersion, newVersion: nudgePrimaryState.userRequiredMinimumOSVersion) + versionGreaterThan(currentVersion: nudgePrimaryState.requiredMinimumOSVersion, newVersion: nudgePrimaryState.userRequiredMinimumOSVersion) } // Adapted from https://stackoverflow.com/a/25453654 From c12fb995e15b6fe049d59a7e06f7d1ab4fbb4899 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 14:50:40 -0500 Subject: [PATCH 032/141] add activelyExploitedInstallationSLA and standardInstallationSLA --- Nudge/Preferences/DefaultPreferencesNudge.swift | 14 +++++++++++++- Nudge/Preferences/PreferencesStructure.swift | 14 ++++++++++++-- Nudge/UI/Main.swift | 13 ++++++++----- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index dbbbf4ac..a5518eb5 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -169,7 +169,13 @@ struct OSVersionRequirementVariables { getAboutUpdateURL(OSVerReq: osVersionRequirementsJSON) ?? "" } - + + static var activelyExploitedInstallationSLA: Int { + osVersionRequirementsProfile?.activelyExploitedInstallationSLA ?? + osVersionRequirementsJSON?.activelyExploitedInstallationSLA ?? + 14 + } + static var majorUpgradeAppPath: String { osVersionRequirementsProfile?.majorUpgradeAppPath ?? osVersionRequirementsJSON?.majorUpgradeAppPath ?? @@ -184,6 +190,12 @@ struct OSVersionRequirementVariables { } } + static var standardInstallationSLA: Int { + osVersionRequirementsProfile?.standardInstallationSLA ?? + osVersionRequirementsJSON?.standardInstallationSLA ?? + 28 + } + static var unsupportedURL: String { getUnsupportedURL(OSVerReq: osVersionRequirementsProfile) ?? getUnsupportedURL(OSVerReq: osVersionRequirementsJSON) ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 4de187db..e9163eaf 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -117,9 +117,13 @@ extension OptionalFeatures { struct OSVersionRequirement: Codable { var aboutUpdateURL: String? var aboutUpdateURLs: [AboutUpdateURL]? - var actionButtonPath, majorUpgradeAppPath: String? + var actionButtonPath: String? + var activelyExploitedInstallationSLA: Int? + var majorUpgradeAppPath: String? var requiredInstallationDate: Date? - var requiredMinimumOSVersion, targetedOSVersionsRule: String? + var requiredMinimumOSVersion: String? + var standardInstallationSLA: Int? + var targetedOSVersionsRule: String? var unsupportedURL: String? var unsupportedURLs: [UnsupportedURL]? } @@ -129,8 +133,10 @@ extension OSVersionRequirement { init(fromDictionary: [String: AnyObject]) { self.aboutUpdateURL = fromDictionary["aboutUpdateURL"] as? String self.actionButtonPath = fromDictionary["actionButtonPath"] as? String + self.activelyExploitedInstallationSLA = fromDictionary["activelyExploitedInstallationSLA"] as? Int self.majorUpgradeAppPath = fromDictionary["majorUpgradeAppPath"] as? String self.requiredMinimumOSVersion = fromDictionary["requiredMinimumOSVersion"] as? String + self.standardInstallationSLA = fromDictionary["standardInstallationSLA"] as? Int self.targetedOSVersionsRule = fromDictionary["targetedOSVersionsRule"] as? String self.unsupportedURL = fromDictionary["unsupportedURL"] as? String @@ -186,9 +192,11 @@ extension OSVersionRequirement { aboutUpdateURL: String? = nil, aboutUpdateURLs: [AboutUpdateURL]? = nil, actionButtonPath: String? = nil, + activelyExploitedInstallationSLA: Int? = nil, majorUpgradeAppPath: String? = nil, requiredInstallationDate: Date? = nil, requiredMinimumOSVersion: String? = nil, + standardInstallationSLA: Int? = nil, targetedOSVersionsRule: String? = nil, unsupportedURL: String? = nil, unsupportedURLs: [UnsupportedURL]? = nil @@ -197,9 +205,11 @@ extension OSVersionRequirement { aboutUpdateURL: aboutUpdateURL ?? self.aboutUpdateURL, aboutUpdateURLs: aboutUpdateURLs ?? self.aboutUpdateURLs, actionButtonPath: actionButtonPath ?? self.actionButtonPath, + activelyExploitedInstallationSLA: activelyExploitedInstallationSLA ?? self.activelyExploitedInstallationSLA, majorUpgradeAppPath: majorUpgradeAppPath ?? self.majorUpgradeAppPath, requiredInstallationDate: requiredInstallationDate ?? self.requiredInstallationDate, requiredMinimumOSVersion: requiredMinimumOSVersion ?? self.requiredMinimumOSVersion, + standardInstallationSLA: standardInstallationSLA ?? self.standardInstallationSLA, targetedOSVersionsRule: targetedOSVersionsRule ?? self.targetedOSVersionsRule, unsupportedURL: unsupportedURL ?? self.unsupportedURL, unsupportedURLs: unsupportedURLs ?? self.unsupportedURLs diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index c71d8047..953123e1 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -175,10 +175,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") // TODO: Implement SOFA Caching with key refreshSOFAFeedTime - // TODO: Implement requiredInstallationDate values SLAs for Actively Exploited vs Not based on ReleaseDate sofa key - // TODO: activelyExploitedInstallationSLA, standardInstallationSLA // TODO: Implement Actively Exploited sidebar info on standardMode - // TODO: Implement "latest" for sofa vs hardcoded requiredInstallationVersion // TODO: Implement "latest-minor" or something for implementing all of the minor releases. // TODO: Add more logging to "unsupported devices" UI. // TODO: Add localization for "unsupported devices" text fields @@ -190,13 +187,19 @@ class AppDelegate: NSObject, NSApplicationDelegate { if PrefsWrapper.requiredMinimumOSVersion == "latest" { // Check if the specified device is in the supported devices of the matching asset nudgePrimaryState.requiredMinimumOSVersion = osVersion.latest.productVersion + let activelyExploited = osVersion.latest.activelyExploitedCVEs.count > 0 + LogManager.notice("SOFA Actively Exploited CVEs: \(activelyExploited)", logger: sofaLog) + let slaExtension = activelyExploited ? OSVersionRequirementVariables.activelyExploitedInstallationSLA * 86400 : OSVersionRequirementVariables.standardInstallationSLA * 86400 + requiredInstallationDate = osVersion.latest.releaseDate?.addingTimeInterval(TimeInterval(slaExtension)) ?? DateManager().getCurrentDate().addingTimeInterval(1209600) + LogManager.notice("Extending requiredInstallationDate to \(requiredInstallationDate)", logger: sofaLog) LogManager.notice("SOFA Matched OS Version: \(osVersion.latest.productVersion)", logger: sofaLog) LogManager.notice("SOFA Assets: \(osVersion.latest.supportedDevices)", logger: sofaLog) + LogManager.notice("SOFA CVEs: \(osVersion.latest.cves)", logger: sofaLog) + if OptionalFeatureVariables.attemptToCheckForSupportedDevice { LogManager.notice("Assessed Model ID: \(Globals.hardwareModelID)", logger: sofaLog) let deviceMatchFound = osVersion.latest.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) - print("CVEs: \(osVersion.latest.cves)") - print("Actively Exploited CVEs: \(osVersion.latest.activelyExploitedCVEs.count > 0)") + LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound // nudgePrimaryState.deviceSupportedByOSVersion = false From 0764e29e67f1e31f42f6145a997f61e0e69e8656 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 14:57:13 -0500 Subject: [PATCH 033/141] add actively exploited UI --- Nudge/UI/Defaults.swift | 1 + Nudge/UI/Main.swift | 7 +++---- Nudge/UI/StandardMode/LeftSide.swift | 3 +++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Nudge/UI/Defaults.swift b/Nudge/UI/Defaults.swift index e92079c4..e4f87795 100644 --- a/Nudge/UI/Defaults.swift +++ b/Nudge/UI/Defaults.swift @@ -65,6 +65,7 @@ struct UIConstants { } class AppState: ObservableObject { + @Published var activelyExploitedCVEs = false @Published var afterFirstStateChange = false @Published var allowButtons = true @Published var daysRemaining = DateManager().getNumberOfDaysBetween() diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 953123e1..409dcc37 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -175,7 +175,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") // TODO: Implement SOFA Caching with key refreshSOFAFeedTime - // TODO: Implement Actively Exploited sidebar info on standardMode // TODO: Implement "latest-minor" or something for implementing all of the minor releases. // TODO: Add more logging to "unsupported devices" UI. // TODO: Add localization for "unsupported devices" text fields @@ -187,9 +186,9 @@ class AppDelegate: NSObject, NSApplicationDelegate { if PrefsWrapper.requiredMinimumOSVersion == "latest" { // Check if the specified device is in the supported devices of the matching asset nudgePrimaryState.requiredMinimumOSVersion = osVersion.latest.productVersion - let activelyExploited = osVersion.latest.activelyExploitedCVEs.count > 0 - LogManager.notice("SOFA Actively Exploited CVEs: \(activelyExploited)", logger: sofaLog) - let slaExtension = activelyExploited ? OSVersionRequirementVariables.activelyExploitedInstallationSLA * 86400 : OSVersionRequirementVariables.standardInstallationSLA * 86400 + nudgePrimaryState.activelyExploitedCVEs = osVersion.latest.activelyExploitedCVEs.count > 0 + LogManager.notice("SOFA Actively Exploited CVEs: \(nudgePrimaryState.activelyExploitedCVEs)", logger: sofaLog) + let slaExtension = nudgePrimaryState.activelyExploitedCVEs ? OSVersionRequirementVariables.activelyExploitedInstallationSLA * 86400 : OSVersionRequirementVariables.standardInstallationSLA * 86400 requiredInstallationDate = osVersion.latest.releaseDate?.addingTimeInterval(TimeInterval(slaExtension)) ?? DateManager().getCurrentDate().addingTimeInterval(1209600) LogManager.notice("Extending requiredInstallationDate to \(requiredInstallationDate)", logger: sofaLog) LogManager.notice("SOFA Matched OS Version: \(osVersion.latest.productVersion)", logger: sofaLog) diff --git a/Nudge/UI/StandardMode/LeftSide.swift b/Nudge/UI/StandardMode/LeftSide.swift index 16ad91f7..ea9ea8ff 100644 --- a/Nudge/UI/StandardMode/LeftSide.swift +++ b/Nudge/UI/StandardMode/LeftSide.swift @@ -37,6 +37,9 @@ struct StandardModeLeftSide: View { private var informationStack: some View { VStack(alignment: .center, spacing: interLineSpacing) { InfoRow(label: "Required OS Version:", value: String(appState.requiredMinimumOSVersion), boldText: true) + if OptionalFeatureVariables.utilizeSOFAFeed { + InfoRow(label: "Actively Exploited CVEs:", value: String(appState.activelyExploitedCVEs).capitalized, boldText: appState.activelyExploitedCVEs) + } InfoRow(label: "Current OS Version:", value: GlobalVariables.currentOSVersion) remainingTimeRow if UserInterfaceVariables.showDeferralCount { From 90974f41bce40fece1ae945fcfc3987f5428833b Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 14:58:16 -0500 Subject: [PATCH 034/141] more todo --- Nudge/UI/Main.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 409dcc37..ea59de8b 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -175,6 +175,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") // TODO: Implement SOFA Caching with key refreshSOFAFeedTime + // TODO: Reset sofa after x amount of time // TODO: Implement "latest-minor" or something for implementing all of the minor releases. // TODO: Add more logging to "unsupported devices" UI. // TODO: Add localization for "unsupported devices" text fields From 51184f71e5770b9f4ddf9e950d0ed772d2549e1a Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 16:07:49 -0500 Subject: [PATCH 035/141] markdown provided unsupported device --- .../com.github.macadmins.Nudge.tester.json | 14 +++++++------- Nudge/Preferences/DefaultPreferencesNudge.swift | 16 ++++++++-------- Nudge/UI/Common/InformationButton.swift | 4 ++-- Nudge/UI/Main.swift | 2 +- Nudge/UI/StandardMode/RightSide.swift | 15 ++++++--------- Nudge/Utilities/Preferences.swift | 6 +++--- 6 files changed, 27 insertions(+), 30 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 9bcfed7e..7196d164 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -46,23 +46,23 @@ "customDeferralButtonText": "customDeferralButtonText", "customDeferralDropdownText": "customDeferralDropdownText", "informationButtonText": "informationButtonText", - "informationButtonTextUnsupported": "informationButtonTextUnsupported", + "informationButtonTextUnsupported1": "informationButtonTextUnsupported", "mainContentHeader": "mainContentHeader", - "mainContentHeaderUnsupported": "mainContentHeaderUnsupported", + "mainContentHeaderUnsupported1": "mainContentHeaderUnsupported", "mainContentNote": "mainContentNote", - "mainContentNoteUnsupported": "mainContentNoteUnsupported", + "mainContentNoteUnsupported1": "mainContentNoteUnsupported", "mainContentSubHeader": "mainContentSubHeader", - "mainContentSubHeaderUnsupported": "mainContentSubHeaderUnsupported", + "mainContentSubHeaderUnsupported1": "mainContentSubHeaderUnsupported", "mainContentText": "mainContentText", - "mainContentTextUnsupported": "mainContentTextUnsupported", + "mainContentTextUnsupported1": "mainContentTextUnsupported", "mainHeader": "mainHeader", - "mainHeaderUnsupported": "mainHeaderUnsupported", + "mainHeaderUnsupported1": "mainHeaderUnsupported", "oneDayDeferralButtonText": "oneDayDeferralButtonText", "oneHourDeferralButtonText": "oneHourDeferralButtonText", "primaryQuitButtonText": "primaryQuitButtonText", "secondaryQuitButtonText": "secondaryQuitButtonText", "subHeader": "subHeader", - "subHeaderUnsupported": "subHeaderUnsupported", + "subHeaderUnsupported1": "subHeaderUnsupported", "screenShotAltText": "Click to zoom into screenshot" } ] diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index a5518eb5..1f3181d1 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -404,25 +404,25 @@ struct UserInterfaceVariables { static var mainContentHeader: String { userInterfaceUpdateElementsProfile?["mainContentHeader"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentHeader ?? - "Your device will restart during this update" + "**Your device will restart during this update**" } static var mainContentHeaderUnsupported: String { userInterfaceUpdateElementsProfile?["mainContentHeaderUnsupported"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentHeaderUnsupported ?? - "Your device will restart during this update" + "**Your device is no longer capable of receving critical security updates**" } static var mainContentNote: String { userInterfaceUpdateElementsProfile?["mainContentNote"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentNote ?? - "Important Notes" + "**Important Notes**" } static var mainContentNoteUnsupported: String { userInterfaceUpdateElementsProfile?["mainContentNoteUnsupported"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentNoteUnsupported ?? - "Important Notes" + "**Important Notes**" } static var mainContentSubHeader: String { @@ -434,7 +434,7 @@ struct UserInterfaceVariables { static var mainContentSubHeaderUnsupported: String { userInterfaceUpdateElementsProfile?["mainContentSubHeaderUnsupported"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentSubHeaderUnsupported ?? - "Updates can take around 30 minutes to complete" + "Please work with your local IT team to obtain a replacement device" } static var mainContentText: String { @@ -446,7 +446,7 @@ struct UserInterfaceVariables { static var mainContentTextUnsupported: String { userInterfaceUpdateElementsProfile?["mainContentTextUnsupported"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentTextUnsupported ?? - "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not update your device, you may lose access to some items necessary for your day-to-day tasks.\n\nTo begin the update, simply click on the Update Device button and follow the provided steps." + "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not obtain a replacement device, you will lose access to some items necessary for your day-to-day tasks.\n\nFor more information about this, please click on the **Replace Your Device** button." } static var primaryQuitButtonText: String { @@ -476,13 +476,13 @@ struct UserInterfaceVariables { static var subHeader: String { userInterfaceUpdateElementsProfile?["subHeader"] as? String ?? userInterfaceUpdateElementsJSON?.subHeader ?? - "A friendly reminder from your local IT team" + "**A friendly reminder from your local IT team**" } static var subHeaderUnsupported: String { userInterfaceUpdateElementsProfile?["subHeaderUnsupported"] as? String ?? userInterfaceUpdateElementsJSON?.subHeaderUnsupported ?? - "A friendly reminder from your local IT team" + "**A friendly reminder from your local IT team**" } diff --git a/Nudge/UI/Common/InformationButton.swift b/Nudge/UI/Common/InformationButton.swift index 41c742c8..04e7763d 100644 --- a/Nudge/UI/Common/InformationButton.swift +++ b/Nudge/UI/Common/InformationButton.swift @@ -24,7 +24,7 @@ struct InformationButton: View { return AnyView( Button(action: UIUtilities().openMoreInfo) { - Text(UserInterfaceVariables.informationButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(.init(UserInterfaceVariables.informationButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) .foregroundColor(dynamicTextColor) } .buttonStyle(.plain) @@ -36,7 +36,7 @@ struct InformationButton: View { return AnyView( Button(action: UIUtilities().openMoreInfoUnsupported) { - Text(UserInterfaceVariables.informationButtonTextUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(.init(UserInterfaceVariables.informationButtonTextUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) .foregroundColor(dynamicTextColor) } .buttonStyle(.plain) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index ea59de8b..6d60fb1a 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -202,7 +202,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound - // nudgePrimaryState.deviceSupportedByOSVersion = false + nudgePrimaryState.deviceSupportedByOSVersion = false } foundMatch = true } else { diff --git a/Nudge/UI/StandardMode/RightSide.swift b/Nudge/UI/StandardMode/RightSide.swift index cdba747d..5ff5966a 100644 --- a/Nudge/UI/StandardMode/RightSide.swift +++ b/Nudge/UI/StandardMode/RightSide.swift @@ -38,7 +38,7 @@ struct StandardModeRightSide: View { HStack { VStack(alignment: .leading, spacing: 5) { HStack { - Text(appState.deviceSupportedByOSVersion ? getMainHeader().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : getMainHeaderUnsupported().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(.init(appState.deviceSupportedByOSVersion ? getMainHeader().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : getMainHeaderUnsupported().localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) .font(.largeTitle) .minimumScaleFactor(0.5) .frame(maxHeight: 25) @@ -46,9 +46,8 @@ struct StandardModeRightSide: View { } HStack { - Text(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.subHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.subHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(.init(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.subHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.subHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) .font(.body) - .fontWeight(.bold) .lineLimit(1) } } @@ -64,9 +63,8 @@ struct StandardModeRightSide: View { HStack(alignment: .center) { VStack(alignment: .leading, spacing: 1) { HStack { - Text(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.mainContentHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(.init(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.mainContentHeader.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentHeaderUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) .font(.callout) - .fontWeight(.bold) Spacer() } HStack { @@ -81,7 +79,7 @@ struct StandardModeRightSide: View { Button(action: { UIUtilities().updateDevice() }) { - Text(UserInterfaceVariables.actionButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(.init(UserInterfaceVariables.actionButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) } .keyboardShortcut(.defaultAction) } @@ -90,9 +88,8 @@ struct StandardModeRightSide: View { Divider() HStack { - Text(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.mainContentNote.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentNoteUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(.init(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.mainContentNote.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentNoteUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) .font(.callout) - .fontWeight(.bold) .foregroundColor(appState.differentiateWithoutColor ? .accessibleRed : .red) Spacer() } @@ -100,7 +97,7 @@ struct StandardModeRightSide: View { ScrollView(.vertical) { VStack { HStack { - Text(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.mainContentText.replacingOccurrences(of: "\\n", with: "\n").localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentTextUnsupported.replacingOccurrences(of: "\\n", with: "\n").localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + Text(.init(appState.deviceSupportedByOSVersion ? UserInterfaceVariables.mainContentText.replacingOccurrences(of: "\\n", with: "\n").localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)) : UserInterfaceVariables.mainContentTextUnsupported.replacingOccurrences(of: "\\n", with: "\n").localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) .font(.callout) .multilineTextAlignment(.leading) Spacer() diff --git a/Nudge/Utilities/Preferences.swift b/Nudge/Utilities/Preferences.swift index 9a037ea5..bc2707e4 100644 --- a/Nudge/Utilities/Preferences.swift +++ b/Nudge/Utilities/Preferences.swift @@ -262,12 +262,12 @@ func getMainHeader() -> String { func getMainHeaderUnsupported() -> String { if CommandLineUtilities().demoModeEnabled() { - return "Your device is no longer capable of security updates (Demo Mode)" + return "Your device requires a security update (Demo Mode)" } else if CommandLineUtilities().unitTestingEnabled() { - return "Your device is no longer capable of security updates (Unit Testing Mode)" + return "Your device requires a security update (Unit Testing Mode)" } return UserInterfaceVariables.userInterfaceUpdateElementsProfile?["mainHeaderUnsupported"] as? String ?? - getUserInterfaceUpdateElementsJSON()?.mainHeaderUnsupported ?? "Your device is no longer capable of security updates" + getUserInterfaceUpdateElementsJSON()?.mainHeaderUnsupported ?? "Your device requires a security update" } func simpleMode() -> Bool { From 0d54d7c057de9428680c4bdbfaa92059cb9edf82 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 17 May 2024 16:34:39 -0500 Subject: [PATCH 036/141] add overlay --- Nudge/UI/Common/CompanyLogo.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Nudge/UI/Common/CompanyLogo.swift b/Nudge/UI/Common/CompanyLogo.swift index 751744d2..f9000375 100644 --- a/Nudge/UI/Common/CompanyLogo.swift +++ b/Nudge/UI/Common/CompanyLogo.swift @@ -19,6 +19,7 @@ struct CompanyLogo: View { Group { if shouldShowCompanyLogo() { companyImage + .overlay(companyImageOverlay, alignment: .topTrailing) } else if UIUtilities().showEasterEgg() { easterEggView } else { @@ -49,6 +50,16 @@ struct CompanyLogo: View { } } + private var companyImageOverlay: some View { + guard !appState.deviceSupportedByOSVersion else { return AnyView(EmptyView()) } + return AnyView( + Image(systemName: "exclamationmark.triangle") + .symbolRenderingMode(.hierarchical) + .foregroundStyle(Color.red) + .font(.title) + ) + } + private var defaultImage: some View { Image(systemName: "applelogo") .customResizable(width: uiConstants.logoWidth, height: uiConstants.logoHeight) From a010370b189444095c95eb033affa0bcca50e16b Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 21 May 2024 09:27:44 -0500 Subject: [PATCH 037/141] move to xcode 15.4 --- build_nudge.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_nudge.zsh b/build_nudge.zsh index bb9949fa..26c6d83d 100755 --- a/build_nudge.zsh +++ b/build_nudge.zsh @@ -3,7 +3,7 @@ # Build script for Nudge # Variables -XCODE_PATH="/Applications/Xcode_15.2.app" +XCODE_PATH="/Applications/Xcode_15.4.app" APP_SIGNING_IDENTITY="Developer ID Application: Mac Admins Open Source (T4SK8ZXCXG)" INSTALLER_SIGNING_IDENTITY="Developer ID Installer: Mac Admins Open Source (T4SK8ZXCXG)" MP_SHA="71c57fcfdf43692adcd41fa7305be08f66bae3e5" From a3e984d42195b06bcb7a0d18f669f500724d7144 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 21 May 2024 12:52:21 -0500 Subject: [PATCH 038/141] add logic for sofa caching --- .../Preferences/DefaultPreferencesNudge.swift | 6 +++ Nudge/Preferences/PreferencesStructure.swift | 6 ++- Nudge/UI/Main.swift | 2 - Nudge/Utilities/Utils.swift | 43 ++++++++++++++++--- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 1f3181d1..97a320e9 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -143,6 +143,12 @@ struct OptionalFeatureVariables { false } + static var refreshSOFAFeedTime: Int { + optionalFeaturesProfile?["refreshSOFAFeedTime"] as? Int ?? + optionalFeaturesJSON?.refreshSOFAFeedTime ?? + 86400 + } + static var terminateApplicationsOnLaunch: Bool { optionalFeaturesProfile?["terminateApplicationsOnLaunch"] as? Bool ?? optionalFeaturesJSON?.terminateApplicationsOnLaunch ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index e9163eaf..e9403baf 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -53,7 +53,9 @@ struct OptionalFeatures: Codable { var acceptableApplicationBundleIDs, acceptableAssertionApplicationNames: [String]? var acceptableAssertionUsage, acceptableCameraUsage, acceptableScreenSharingUsage, aggressiveUserExperience, aggressiveUserFullScreenExperience, asynchronousSoftwareUpdate, attemptToBlockApplicationLaunches, attemptToCheckForSupportedDevice, attemptToFetchMajorUpgrade: Bool? var blockedApplicationBundleIDs: [String]? - var disableSoftwareUpdateWorkflow, enforceMinorUpdates, terminateApplicationsOnLaunch, utilizeSOFAFeed: Bool? + var disableSoftwareUpdateWorkflow, enforceMinorUpdates: Bool? + var refreshSOFAFeedTime: Int? + var terminateApplicationsOnLaunch, utilizeSOFAFeed: Bool? } // MARK: OptionalFeatures convenience initializers and mutators @@ -89,6 +91,7 @@ extension OptionalFeatures { blockedApplicationBundleIDs: [String]? = nil, disableSoftwareUpdateWorkflow: Bool? = nil, enforceMinorUpdates: Bool? = nil, + refreshSOFAFeedTime: Int? = nil, terminateApplicationsOnLaunch: Bool? = nil, utilizeSOFAFeed: Bool? = nil ) -> OptionalFeatures { @@ -107,6 +110,7 @@ extension OptionalFeatures { blockedApplicationBundleIDs: blockedApplicationBundleIDs ?? self.blockedApplicationBundleIDs, disableSoftwareUpdateWorkflow: disableSoftwareUpdateWorkflow ?? self.disableSoftwareUpdateWorkflow, enforceMinorUpdates: enforceMinorUpdates ?? self.enforceMinorUpdates, + refreshSOFAFeedTime: refreshSOFAFeedTime ?? self.refreshSOFAFeedTime, terminateApplicationsOnLaunch: terminateApplicationsOnLaunch ?? self.terminateApplicationsOnLaunch, utilizeSOFAFeed: utilizeSOFAFeed ?? self.utilizeSOFAFeed ) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 6d60fb1a..ae09ce48 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -174,8 +174,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { // Pre-Launch Logic func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") - // TODO: Implement SOFA Caching with key refreshSOFAFeedTime - // TODO: Reset sofa after x amount of time // TODO: Implement "latest-minor" or something for implementing all of the minor releases. // TODO: Add more logging to "unsupported devices" UI. // TODO: Add localization for "unsupported devices" text fields diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 9fa4a8fd..b1c07f7f 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -108,7 +108,7 @@ struct AppStateManager { exit(0) } - private func getCreationDateForPath(_ path: String, testFileDate: Date?) -> Date? { + func getCreationDateForPath(_ path: String, testFileDate: Date?) -> Date? { let attributes = try? FileManager.default.attributesOfItem(atPath: path) let creationDate = attributes?[.creationDate] as? Date return testFileDate ?? creationDate @@ -828,21 +828,54 @@ struct NetworkFileManager { if !OptionalFeatureVariables.utilizeSOFAFeed { return nil } + let fileManager = FileManager.default + let appSupportDirectory = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! + let appDirectory = appSupportDirectory.appendingPathComponent(Bundle.main.bundleIdentifier ?? "com.github.macadmins.Nudge") + let sofaFile = "sofa-macos_data_feed.json" + let sofaPath = appDirectory.appendingPathComponent(sofaFile) + if fileManager.fileExists(atPath: sofaPath.path) { + let sofaPathCreationDate = AppStateManager().getCreationDateForPath(sofaPath.path, testFileDate: nil) + // Use Cache as it is within time inverval + if TimeInterval(OptionalFeatureVariables.refreshSOFAFeedTime) >= Date().timeIntervalSince(sofaPathCreationDate!) { + LogManager.info("Utilizing previously cached SOFA json", logger: sofaLog) + do { + let sofaData = try Data(contentsOf: sofaPath) + let assetInfo = try MacOSDataFeed(data: sofaData) + return assetInfo + } catch { + LogManager.error("Failed to decode local sofa JSON: \(error.localizedDescription)", logger: sofaLog) + LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) + } + } + } else { + // Ensure the Application Support directory exists + if !fileManager.fileExists(atPath: appDirectory.path) { + do { + try fileManager.createDirectory(at: appDirectory, withIntermediateDirectories: true, attributes: nil) + } catch { + LogManager.error("Failed to create Nudge's Application Support directory: \(error.localizedDescription)", logger: utilsLog) + } + } + } + if let url = URL(string: "https://sofa.macadmins.io/v1/macos_data_feed.json") { let sofaData = SOFA().URLSync(url: url) if (sofaData.error == nil) { do { + if fileManager.fileExists(atPath: appDirectory.path) { + try sofaData.data!.write(to: sofaPath) + } let assetInfo = try MacOSDataFeed(data: sofaData.data!) return assetInfo } catch { - LogManager.error("Failed to decode sofa JSON: \(error.localizedDescription)", logger: utilsLog) - LogManager.error("Failed to decode sofa JSON: \(error)", logger: utilsLog) + LogManager.error("Failed to decode sofa JSON: \(error.localizedDescription)", logger: sofaLog) + LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) } } else { - LogManager.error("Failed to fetch sofa JSON: \(sofaData.error!.localizedDescription)", logger: utilsLog) + LogManager.error("Failed to fetch sofa JSON: \(sofaData.error!.localizedDescription)", logger: sofaLog) } } else { - LogManager.error("Failed to decode sofa JSON URL string", logger: utilsLog) + LogManager.error("Failed to decode sofa JSON URL string", logger: sofaLog) } return nil } From 93757a897cc658d1a964cf0baa3a3335496ba844 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 21 May 2024 16:03:03 -0500 Subject: [PATCH 039/141] 2.0.0 release and more notes --- CHANGELOG.md | 24 +++++++++++++++++++++--- Nudge.xcodeproj/project.pbxproj | 4 ++-- Nudge/Info.plist | 4 ++-- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8781556..8876904f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,16 +4,34 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.2.0] - 2024-05-08 +## [2.0.0] - 2024-05-21 Requires macOS 12.0 and higher. Further releases and feature requests may make this macOS 13 and higher depending on code complexity. ### Changed -Upcoming +- You can now pass the string `latest` in the `requiredMinimumOSVersion` key + - This requires utilizing the SOFA feed features to properly work + - Nudge will then utilize two date integers to automatically calculate the `requiredInstallationDate` + - `activelyExploitedInstallationSLA` under the `osVersionRequirement` key will default to 14 days + - `standardInstallationSLA` under the `osVersionRequirement` key will default to 28 days + - These dates are calculated against the `ReleaseDate` key in the SOFA feed ### Fixed Upcoming + ### Added -Upcoming +- An admin can now allow users to move the Nudge window with `userExperience` key `allowMovableWindow` +- Basic SwiftUI support for Markdown text options + - Utilizing Apple's markdown features, you can now utilize, bold, italic, underline, subscript and url links directly into any of the text fields +- [SOFA](https://github.com/macadmins/sofa) feed support + - Set the `utilizeSOFAFeed` key `true` under `optionalFeatures` to enable this feature + - Nudge will by default check the feed every 24 hours. + - In order to change this, please configure the `refreshSOFAFeedTime` key under `optionalFeatures` in seconds +- "Unsupported" device UI in standard mode that utilizes the SOFA feed + - Set the `attemptToCheckForSupportedDevice` key `true` under `optionalFeatures` to enable this feature + - There are now keys to set all of text fields + - `informationButtonTextUnsupported`, `mainContentHeaderUnsupported`, `mainContentNoteUnsupported`, `mainContentSubHeaderUnsupported`, `mainContentTextUnsupported`, `subHeaderUnsupported` + - `unsupportedURL` and `unsupportedURLs` can change the information button itself, but it will remain in the `osVersionRequirement` key with `unsupportedURLs` and `unsupportedURLs`. + - An icon will appear as an overlay on top of the company image to further emphasize the device is no longer supported ## [1.1.16] - 2024-03-13 This will be the **final Nudge release** for macOS 11 and potentially other versions of macOS. diff --git a/Nudge.xcodeproj/project.pbxproj b/Nudge.xcodeproj/project.pbxproj index 9f563e03..783f770f 100644 --- a/Nudge.xcodeproj/project.pbxproj +++ b/Nudge.xcodeproj/project.pbxproj @@ -690,7 +690,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12.0; - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 2.0.0; PRODUCT_BUNDLE_IDENTIFIER = com.github.macadmins.Nudge; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -721,7 +721,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 12.0; - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 2.0.0; PRODUCT_BUNDLE_IDENTIFIER = com.github.macadmins.Nudge; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/Nudge/Info.plist b/Nudge/Info.plist index 90c42a07..9eee977e 100644 --- a/Nudge/Info.plist +++ b/Nudge/Info.plist @@ -15,9 +15,9 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.2.0 + 2.0.0 CFBundleVersion - 1.2.0 + 2.0.0 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion From 67936c404c643039e102bc77650d6715a8ce4d15 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 21 May 2024 16:07:59 -0500 Subject: [PATCH 040/141] macos13 to macos14 for new xcode --- .github/workflows/build_nudge_pr.yml | 2 +- .github/workflows/build_nudge_prerelease.yml | 2 +- .github/workflows/build_nudge_prerelease_manual.yml | 2 +- .github/workflows/build_nudge_release.yml | 2 +- .github/workflows/build_nudge_release_manual.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build_nudge_pr.yml b/.github/workflows/build_nudge_pr.yml index f297cd0b..7954ea00 100644 --- a/.github/workflows/build_nudge_pr.yml +++ b/.github/workflows/build_nudge_pr.yml @@ -6,7 +6,7 @@ on: jobs: build: - runs-on: macos-13 + runs-on: macos-14-large if: contains(github.event.pull_request.labels.*.name, 'safe to test') steps: diff --git a/.github/workflows/build_nudge_prerelease.yml b/.github/workflows/build_nudge_prerelease.yml index 6a43d70c..a432b351 100644 --- a/.github/workflows/build_nudge_prerelease.yml +++ b/.github/workflows/build_nudge_prerelease.yml @@ -15,7 +15,7 @@ on: jobs: build: - runs-on: macos-13 + runs-on: macos-14-large steps: - name: Checkout nudge repo diff --git a/.github/workflows/build_nudge_prerelease_manual.yml b/.github/workflows/build_nudge_prerelease_manual.yml index ed3b64cb..3fb96e25 100644 --- a/.github/workflows/build_nudge_prerelease_manual.yml +++ b/.github/workflows/build_nudge_prerelease_manual.yml @@ -7,7 +7,7 @@ on: [workflow_dispatch] jobs: build: - runs-on: macos-13 + runs-on: macos-14-large steps: - name: Checkout nudge repo diff --git a/.github/workflows/build_nudge_release.yml b/.github/workflows/build_nudge_release.yml index 4a045ba7..c9a158b3 100644 --- a/.github/workflows/build_nudge_release.yml +++ b/.github/workflows/build_nudge_release.yml @@ -15,7 +15,7 @@ on: jobs: build: - runs-on: macos-13 + runs-on: macos-14-large steps: - name: Checkout nudge repo diff --git a/.github/workflows/build_nudge_release_manual.yml b/.github/workflows/build_nudge_release_manual.yml index 91bbddc2..a4d31400 100644 --- a/.github/workflows/build_nudge_release_manual.yml +++ b/.github/workflows/build_nudge_release_manual.yml @@ -7,7 +7,7 @@ on: [workflow_dispatch] jobs: build: - runs-on: macos-13 + runs-on: macos-14-large steps: - name: Checkout nudge repo From 0c6535f7b7bc76d21895cb85585469dafb7d5c56 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 21 May 2024 16:12:16 -0500 Subject: [PATCH 041/141] dont try -large --- .github/workflows/build_nudge_pr.yml | 2 +- .github/workflows/build_nudge_prerelease.yml | 2 +- .github/workflows/build_nudge_prerelease_manual.yml | 2 +- .github/workflows/build_nudge_release.yml | 2 +- .github/workflows/build_nudge_release_manual.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build_nudge_pr.yml b/.github/workflows/build_nudge_pr.yml index 7954ea00..ff366fd1 100644 --- a/.github/workflows/build_nudge_pr.yml +++ b/.github/workflows/build_nudge_pr.yml @@ -6,7 +6,7 @@ on: jobs: build: - runs-on: macos-14-large + runs-on: macos-14 if: contains(github.event.pull_request.labels.*.name, 'safe to test') steps: diff --git a/.github/workflows/build_nudge_prerelease.yml b/.github/workflows/build_nudge_prerelease.yml index a432b351..56983b78 100644 --- a/.github/workflows/build_nudge_prerelease.yml +++ b/.github/workflows/build_nudge_prerelease.yml @@ -15,7 +15,7 @@ on: jobs: build: - runs-on: macos-14-large + runs-on: macos-14 steps: - name: Checkout nudge repo diff --git a/.github/workflows/build_nudge_prerelease_manual.yml b/.github/workflows/build_nudge_prerelease_manual.yml index 3fb96e25..141937db 100644 --- a/.github/workflows/build_nudge_prerelease_manual.yml +++ b/.github/workflows/build_nudge_prerelease_manual.yml @@ -7,7 +7,7 @@ on: [workflow_dispatch] jobs: build: - runs-on: macos-14-large + runs-on: macos-14 steps: - name: Checkout nudge repo diff --git a/.github/workflows/build_nudge_release.yml b/.github/workflows/build_nudge_release.yml index c9a158b3..d5ccbece 100644 --- a/.github/workflows/build_nudge_release.yml +++ b/.github/workflows/build_nudge_release.yml @@ -15,7 +15,7 @@ on: jobs: build: - runs-on: macos-14-large + runs-on: macos-14 steps: - name: Checkout nudge repo diff --git a/.github/workflows/build_nudge_release_manual.yml b/.github/workflows/build_nudge_release_manual.yml index a4d31400..97551cb5 100644 --- a/.github/workflows/build_nudge_release_manual.yml +++ b/.github/workflows/build_nudge_release_manual.yml @@ -7,7 +7,7 @@ on: [workflow_dispatch] jobs: build: - runs-on: macos-14-large + runs-on: macos-14 steps: - name: Checkout nudge repo From 5f4b89931d5f84a496b3f8ce94eabfc4c20307ae Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 21 May 2024 17:00:24 -0500 Subject: [PATCH 042/141] fix changelog --- CHANGELOG.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8876904f..466ed191 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,11 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t ### Changed - You can now pass the string `latest` in the `requiredMinimumOSVersion` key - - This requires utilizing the SOFA feed features to properly work - - Nudge will then utilize two date integers to automatically calculate the `requiredInstallationDate` - - `activelyExploitedInstallationSLA` under the `osVersionRequirement` key will default to 14 days - - `standardInstallationSLA` under the `osVersionRequirement` key will default to 28 days - - These dates are calculated against the `ReleaseDate` key in the SOFA feed + - This requires utilizing the SOFA feed features to properly work + - Nudge will then utilize two date integers to automatically calculate the `requiredInstallationDate` + - `activelyExploitedInstallationSLA` under the `osVersionRequirement` key will default to 14 days + - `standardInstallationSLA` under the `osVersionRequirement` key will default to 28 days + - These dates are calculated against the `ReleaseDate` key in the SOFA feed ### Fixed Upcoming @@ -21,17 +21,17 @@ Upcoming ### Added - An admin can now allow users to move the Nudge window with `userExperience` key `allowMovableWindow` - Basic SwiftUI support for Markdown text options - - Utilizing Apple's markdown features, you can now utilize, bold, italic, underline, subscript and url links directly into any of the text fields + - Utilizing Apple's markdown features, you can now utilize, bold, italic, underline, subscript and url links directly into any of the text fields - [SOFA](https://github.com/macadmins/sofa) feed support - - Set the `utilizeSOFAFeed` key `true` under `optionalFeatures` to enable this feature - - Nudge will by default check the feed every 24 hours. - - In order to change this, please configure the `refreshSOFAFeedTime` key under `optionalFeatures` in seconds + - Set the `utilizeSOFAFeed` key `true` under `optionalFeatures` to enable this feature + - Nudge will by default check the feed every 24 hours. + - In order to change this, please configure the `refreshSOFAFeedTime` key under `optionalFeatures` in seconds - "Unsupported" device UI in standard mode that utilizes the SOFA feed - - Set the `attemptToCheckForSupportedDevice` key `true` under `optionalFeatures` to enable this feature - - There are now keys to set all of text fields - - `informationButtonTextUnsupported`, `mainContentHeaderUnsupported`, `mainContentNoteUnsupported`, `mainContentSubHeaderUnsupported`, `mainContentTextUnsupported`, `subHeaderUnsupported` - - `unsupportedURL` and `unsupportedURLs` can change the information button itself, but it will remain in the `osVersionRequirement` key with `unsupportedURLs` and `unsupportedURLs`. - - An icon will appear as an overlay on top of the company image to further emphasize the device is no longer supported + - Set the `attemptToCheckForSupportedDevice` key `true` under `optionalFeatures` to enable this feature + - There are now keys to set all of text fields + - `informationButtonTextUnsupported`, `mainContentHeaderUnsupported`, `mainContentNoteUnsupported`, `mainContentSubHeaderUnsupported`, `mainContentTextUnsupported`, `subHeaderUnsupported` + - `unsupportedURL` and `unsupportedURLs` can change the information button itself, but it will remain in the `osVersionRequirement` key with `unsupportedURLs` and `unsupportedURLs`. + - An icon will appear as an overlay on top of the company image to further emphasize the device is no longer supported ## [1.1.16] - 2024-03-13 This will be the **final Nudge release** for macOS 11 and potentially other versions of macOS. From bc7ec7e0d6ae47b676e67ddcbc7ad3470bb6dbe0 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 21 May 2024 17:06:18 -0500 Subject: [PATCH 043/141] remove forced unsupported --- Nudge/UI/Main.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index ae09ce48..af6a067d 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -178,6 +178,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { // TODO: Add more logging to "unsupported devices" UI. // TODO: Add localization for "unsupported devices" text fields // TODO: Get someone to update JAMF JSON schema for all the new keys and wiki + // TODO: add support for custom sofa feed url if OptionalFeatureVariables.utilizeSOFAFeed { if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { var foundMatch = false @@ -185,6 +186,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { if PrefsWrapper.requiredMinimumOSVersion == "latest" { // Check if the specified device is in the supported devices of the matching asset nudgePrimaryState.requiredMinimumOSVersion = osVersion.latest.productVersion + // nudgePrimaryState.requiredMinimumOSVersion = "14.6" // TODO: remove when testing is done nudgePrimaryState.activelyExploitedCVEs = osVersion.latest.activelyExploitedCVEs.count > 0 LogManager.notice("SOFA Actively Exploited CVEs: \(nudgePrimaryState.activelyExploitedCVEs)", logger: sofaLog) let slaExtension = nudgePrimaryState.activelyExploitedCVEs ? OSVersionRequirementVariables.activelyExploitedInstallationSLA * 86400 : OSVersionRequirementVariables.standardInstallationSLA * 86400 @@ -200,7 +202,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound - nudgePrimaryState.deviceSupportedByOSVersion = false + // nudgePrimaryState.deviceSupportedByOSVersion = false // TODO: remove when testing is done } foundMatch = true } else { From c5c1dd4e5c0924c9e7463e65419c33ad4bc5b855 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 21 May 2024 17:14:37 -0500 Subject: [PATCH 044/141] add another todo --- Nudge/UI/Main.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index af6a067d..7c4a30a6 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -179,6 +179,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { // TODO: Add localization for "unsupported devices" text fields // TODO: Get someone to update JAMF JSON schema for all the new keys and wiki // TODO: add support for custom sofa feed url + // TODO: check the sofa json etag even after the timelimit age to reduce more bandwidth if OptionalFeatureVariables.utilizeSOFAFeed { if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { var foundMatch = false From 45928ced8a4b31baf4091007624023858fe7b124 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 22 May 2024 08:37:01 -0500 Subject: [PATCH 045/141] remove unneccessary key for testing latest --- Example Assets/com.github.macadmins.Nudge.tester.json | 1 - 1 file changed, 1 deletion(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 7196d164..970ba928 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -21,7 +21,6 @@ "osVersionRequirements": [ { "aboutUpdateURL": "https://apple.com", - "requiredInstallationDate": "2025-01-01T00:00:00Z", "requiredMinimumOSVersion": "latest", "unsupportedURL": "https://google.com", } From 94685906a485db4be28c7892e580bea7c5d92a35 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 22 May 2024 09:02:28 -0500 Subject: [PATCH 046/141] add support for "latest-supported" --- Example Assets/com.github.macadmins.Nudge.tester.json | 2 +- Nudge/Preferences/DefaultPreferencesNudge.swift | 2 +- Nudge/UI/Main.swift | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 970ba928..f56eeec5 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -21,7 +21,7 @@ "osVersionRequirements": [ { "aboutUpdateURL": "https://apple.com", - "requiredMinimumOSVersion": "latest", + "requiredMinimumOSVersion": "latest-supported", "unsupportedURL": "https://google.com", } ], diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 97a320e9..b3552a13 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -189,7 +189,7 @@ struct OSVersionRequirementVariables { } static var requiredMinimumOSVersion: String { - if PrefsWrapper.requiredMinimumOSVersion == "latest" { + if ["latest", "latest-supported", "latest-major"].contains(PrefsWrapper.requiredMinimumOSVersion) { PrefsWrapper.requiredMinimumOSVersion } else { try! OSVersion(PrefsWrapper.requiredMinimumOSVersion).description diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 7c4a30a6..afbb99fa 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -184,7 +184,12 @@ class AppDelegate: NSObject, NSApplicationDelegate { if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { var foundMatch = false for osVersion in macOSSOFAAssets { - if PrefsWrapper.requiredMinimumOSVersion == "latest" { + if ["latest", "latest-supported", "latest-major"].contains(PrefsWrapper.requiredMinimumOSVersion) { + if PrefsWrapper.requiredMinimumOSVersion == "latest-supported" { + if VersionManager.getMajorOSVersion() != Int(osVersion.osVersion.split(separator: " ").last!) { + continue + } + } // Check if the specified device is in the supported devices of the matching asset nudgePrimaryState.requiredMinimumOSVersion = osVersion.latest.productVersion // nudgePrimaryState.requiredMinimumOSVersion = "14.6" // TODO: remove when testing is done From 3b364189d5f54f1f579db5af90e09342878a3de7 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 22 May 2024 09:29:03 -0500 Subject: [PATCH 047/141] add logic to test bundle profile --- .../com.github.macadmins.Nudge.tester.plist | 123 ++++++++++++++++++ Nudge.xcodeproj/project.pbxproj | 4 + ...udge - Debug (-bundle-mode-json).xcscheme} | 2 +- ...ge - Debug (-bundle-mode-profile).xcscheme | 104 +++++++++++++++ .../Nudge - Debug (-demo-mode).xcscheme | 2 +- .../xcschemes/xcschememanagement.plist | 13 +- Nudge/Utilities/Utils.swift | 22 +++- 7 files changed, 260 insertions(+), 10 deletions(-) create mode 100644 Example Assets/com.github.macadmins.Nudge.tester.plist rename Nudge.xcodeproj/xcshareddata/xcschemes/{Nudge - Debug (-bundle-mode).xcscheme => Nudge - Debug (-bundle-mode-json).xcscheme} (98%) create mode 100644 Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-bundle-mode-profile).xcscheme diff --git a/Example Assets/com.github.macadmins.Nudge.tester.plist b/Example Assets/com.github.macadmins.Nudge.tester.plist new file mode 100644 index 00000000..a58bd10d --- /dev/null +++ b/Example Assets/com.github.macadmins.Nudge.tester.plist @@ -0,0 +1,123 @@ + + + + + optionalFeatures + + acceptableAssertionApplicationNames + + zoom.us + Meeting Center + Google Chrome + Safari + + acceptableAssertionUsage + + acceptableCameraUsage + + acceptableScreenSharingUsage + + attemptToBlockApplicationLaunches + + attemptToCheckForSupportedDevice + + blockedApplicationBundleIDs + + com.microsoft.VSCode + us.zoom.xos + + terminateApplicationsOnLaunch + + utilizeSOFAFeed + + + osVersionRequirements + + + aboutUpdateURL + https://apple.com + requiredMinimumOSVersion + latest-supported + unsupportedURL + https://google.com + + + userExperience + + elapsedRefreshCycle + 10 + initialRefreshCycle + 10 + loadLaunchAgent + + nudgeRefreshCycle + 5 + randomDelay + + + userInterface + + iconDarkPath + https://github.com/macadmins/nudge/blob/main/assets/NudgeIconInverted.png?raw=true + iconLightPath + https://github.com/macadmins/nudge/blob/main/assets/NudgeIcon.png?raw=true + screenShotDarkPath + https://github.com/macadmins/nudge/blob/main/assets/standard_mode/demo_dark_1_icon.png?raw=true + screenShotLightPath + https://github.com/macadmins/nudge/blob/main/assets/standard_mode/demo_light_1_icon.png?raw=true + simpleMode + + updateElements + + + _language + en + actionButtonText + actionButtonText + customDeferralButtonText + customDeferralButtonText + customDeferralDropdownText + customDeferralDropdownText + informationButtonText + informationButtonText + informationButtonTextUnsupported1 + informationButtonTextUnsupported + mainContentHeader + mainContentHeader + mainContentHeaderUnsupported1 + mainContentHeaderUnsupported + mainContentNote + mainContentNote + mainContentNoteUnsupported1 + mainContentNoteUnsupported + mainContentSubHeader + mainContentSubHeader + mainContentSubHeaderUnsupported1 + mainContentSubHeaderUnsupported + mainContentText + mainContentText + mainContentTextUnsupported1 + mainContentTextUnsupported + mainHeader + mainHeader + mainHeaderUnsupported1 + mainHeaderUnsupported + oneDayDeferralButtonText + oneDayDeferralButtonText + oneHourDeferralButtonText + oneHourDeferralButtonText + primaryQuitButtonText + primaryQuitButtonText + screenShotAltText + Click to zoom into screenshot + secondaryQuitButtonText + secondaryQuitButtonText + subHeader + subHeader + subHeaderUnsupported1 + subHeaderUnsupported + + + + + diff --git a/Nudge.xcodeproj/project.pbxproj b/Nudge.xcodeproj/project.pbxproj index 783f770f..c51b9710 100644 --- a/Nudge.xcodeproj/project.pbxproj +++ b/Nudge.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ 636C4B4A25D1BECE0004A791 /* DefaultPreferencesNudge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636C4B4925D1BECE0004A791 /* DefaultPreferencesNudge.swift */; }; 636C4B7625D4306A0004A791 /* UILogic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636C4B7525D4306A0004A791 /* UILogic.swift */; }; 637CEBC12A30C9E700EFA3E9 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 637CEBC02A30C9E700EFA3E9 /* Localizable.xcstrings */; }; + 6388B6972BFE363B0094F26B /* com.github.macadmins.Nudge.tester.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6388B6962BFE363B0094F26B /* com.github.macadmins.Nudge.tester.plist */; }; 639B6B0F25DC9ED300E38EC1 /* com.github.macadmins.Nudge.mobileconfig in Resources */ = {isa = PBXBuildFile; fileRef = 639B6B0E25DC9ED300E38EC1 /* com.github.macadmins.Nudge.mobileconfig */; }; 639B6B3B25DF200C00E38EC1 /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 639B6B3A25DF200C00E38EC1 /* Preferences.swift */; }; 639B6B5825DF377B00E38EC1 /* DeviceInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 639B6B5725DF377B00E38EC1 /* DeviceInfo.swift */; }; @@ -101,6 +102,7 @@ 636C4B4925D1BECE0004A791 /* DefaultPreferencesNudge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultPreferencesNudge.swift; sourceTree = ""; }; 636C4B7525D4306A0004A791 /* UILogic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UILogic.swift; sourceTree = ""; }; 637CEBC02A30C9E700EFA3E9 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; + 6388B6962BFE363B0094F26B /* com.github.macadmins.Nudge.tester.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = com.github.macadmins.Nudge.tester.plist; sourceTree = ""; }; 6397293C26CDBA4C00BDAF42 /* Nudge-Debug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Nudge-Debug.entitlements"; sourceTree = ""; }; 639B6B0E25DC9ED300E38EC1 /* com.github.macadmins.Nudge.mobileconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = com.github.macadmins.Nudge.mobileconfig; sourceTree = ""; }; 639B6B3A25DF200C00E38EC1 /* Preferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Preferences.swift; sourceTree = ""; }; @@ -164,6 +166,7 @@ 639B6B0E25DC9ED300E38EC1 /* com.github.macadmins.Nudge.mobileconfig */, 035C2AEB25D8ABC400429458 /* com.github.macadmins.Nudge.json */, 63C6A08D2833FB6500D5264A /* com.github.macadmins.Nudge.tester.json */, + 6388B6962BFE363B0094F26B /* com.github.macadmins.Nudge.tester.plist */, ); path = "Example Assets"; sourceTree = ""; @@ -451,6 +454,7 @@ 63D7D0E725C9E9A500236281 /* Assets.xcassets in Resources */, 639B6B0F25DC9ED300E38EC1 /* com.github.macadmins.Nudge.mobileconfig in Resources */, 73CC1D7829B81EE500FBF8E2 /* com.github.macadmins.Nudge.SMAppService.plist in Resources */, + 6388B6972BFE363B0094F26B /* com.github.macadmins.Nudge.tester.plist in Resources */, 63C6A08E2833FB6500D5264A /* com.github.macadmins.Nudge.tester.json in Resources */, 035C2AEC25D8ABC400429458 /* com.github.macadmins.Nudge.json in Resources */, 6316F0E72832CA0700E1354D /* Schema in Resources */, diff --git a/Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-bundle-mode).xcscheme b/Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-bundle-mode-json).xcscheme similarity index 98% rename from Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-bundle-mode).xcscheme rename to Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-bundle-mode-json).xcscheme index cbd5eef3..780f078a 100644 --- a/Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-bundle-mode).xcscheme +++ b/Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-bundle-mode-json).xcscheme @@ -72,7 +72,7 @@ diff --git a/Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-bundle-mode-profile).xcscheme b/Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-bundle-mode-profile).xcscheme new file mode 100644 index 00000000..2989bbfe --- /dev/null +++ b/Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-bundle-mode-profile).xcscheme @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-demo-mode).xcscheme b/Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-demo-mode).xcscheme index cd3f835a..ecb73650 100644 --- a/Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-demo-mode).xcscheme +++ b/Nudge.xcodeproj/xcshareddata/xcschemes/Nudge - Debug (-demo-mode).xcscheme @@ -72,7 +72,7 @@ diff --git a/Nudge.xcodeproj/xcuserdata/erikg.xcuserdatad/xcschemes/xcschememanagement.plist b/Nudge.xcodeproj/xcuserdata/erikg.xcuserdatad/xcschemes/xcschememanagement.plist index a62fd3de..4ac0238e 100644 --- a/Nudge.xcodeproj/xcuserdata/erikg.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Nudge.xcodeproj/xcuserdata/erikg.xcuserdatad/xcschemes/xcschememanagement.plist @@ -4,11 +4,16 @@ SchemeUserState - Nudge - Debug (-bundle-mode).xcscheme_^#shared#^_ + Nudge - Debug (-bundle-mode-json).xcscheme_^#shared#^_ orderHint 4 + Nudge - Debug (-bundle-mode-profile).xcscheme_^#shared#^_ + + orderHint + 5 + Nudge - Debug (-demo-mode).xcscheme_^#shared#^_ orderHint @@ -22,12 +27,12 @@ Nudge - Debug (-demo-mode, -force-screenshot-icon).xcscheme_^#shared#^_ orderHint - 5 + 6 Nudge - Debug (-demo-mode, -simple-mode).xcscheme_^#shared#^_ orderHint - 6 + 7 Nudge - Debug (-simple-mode).xcscheme_^#shared#^_ @@ -42,7 +47,7 @@ Nudge - Release.xcscheme_^#shared#^_ orderHint - 7 + 8 Nudge Release.xcscheme_^#shared#^_ diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index b1c07f7f..33fb7e88 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -286,10 +286,19 @@ struct CameraUtilities { struct CommandLineUtilities { let arguments = Set(CommandLine.arguments) - func bundleModeEnabled() -> Bool { - let argumentPassed = arguments.contains("-bundle-mode") + func bundleModeJSONEnabled() -> Bool { + let argumentPassed = arguments.contains("-bundle-mode-json") if argumentPassed && !nudgeLogState.hasLoggedBundleMode { - LogManager.debug("-bundle-mode argument passed", logger: uiLog) + LogManager.debug("-bundle-mode-json argument passed", logger: uiLog) + nudgeLogState.hasLoggedBundleMode = true + } + return argumentPassed + } + + func bundleModeProfileEnabled() -> Bool { + let argumentPassed = arguments.contains("-bundle-mode-profile") + if argumentPassed && !nudgeLogState.hasLoggedBundleMode { + LogManager.debug("-bundle-mode-profile argument passed", logger: uiLog) nudgeLogState.hasLoggedBundleMode = true } return argumentPassed @@ -904,11 +913,16 @@ struct NetworkFileManager { return nil } - if CommandLineUtilities().bundleModeEnabled(), let bundleUrl = Globals.bundle.url(forResource: "com.github.macadmins.Nudge.tester", withExtension: "json") { + if CommandLineUtilities().bundleModeJSONEnabled(), let bundleUrl = Globals.bundle.url(forResource: "com.github.macadmins.Nudge.tester", withExtension: "json") { LogManager.debug("JSON url: \(bundleUrl)", logger: utilsLog) return decodeNudgePreferences(from: bundleUrl) } + if CommandLineUtilities().bundleModeProfileEnabled(), let bundleUrl = Globals.bundle.url(forResource: "com.github.macadmins.Nudge.tester", withExtension: "plist") { + LogManager.debug("Profile url: \(bundleUrl)", logger: utilsLog) + return decodeNudgePreferences(from: bundleUrl) + } + if let jsonUrl = URL(string: url) { LogManager.debug("JSON url: \(url)", logger: utilsLog) return decodeNudgePreferences(from: jsonUrl) From 1ba078ff3214b4de18bc5f35837b1bac1516e806 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 22 May 2024 12:27:26 -0500 Subject: [PATCH 048/141] finish all the wrapping around local plist --- Nudge/Utilities/Preferences.swift | 138 +++++++++++++++++++++++++----- Nudge/Utilities/Utils.swift | 39 +++++++-- 2 files changed, 146 insertions(+), 31 deletions(-) diff --git a/Nudge/Utilities/Preferences.swift b/Nudge/Utilities/Preferences.swift index bc2707e4..7bdd5d39 100644 --- a/Nudge/Utilities/Preferences.swift +++ b/Nudge/Utilities/Preferences.swift @@ -33,19 +33,37 @@ func getOptionalFeaturesJSON() -> OptionalFeatures? { } func getOptionalFeaturesProfile() -> [String: Any]? { - guard !CommandLineUtilities().demoModeEnabled(), - !CommandLineUtilities().unitTestingEnabled(), - let optionalFeatures = Globals.nudgeDefaults.dictionary(forKey: "optionalFeatures") else { + if CommandLineUtilities().demoModeEnabled() || CommandLineUtilities().unitTestingEnabled() { logEmptyKey("optionalFeatures", forJSON: false) return nil } - return optionalFeatures + + // Check if the Data is empty + if Globals.configProfile.isEmpty { + logEmptyKey("optionalFeatures", forJSON: false) + return nil + } + + do { + // Attempt to decode the plist Data into a dictionary + if let dictionary = try PropertyListSerialization.propertyList(from: Globals.configProfile, options: [], format: nil) as? [String: Any], + let optionalFeatures = dictionary["optionalFeatures"] as? [String: Any] { + return optionalFeatures + } else { + logEmptyKey("optionalFeatures", forJSON: false) + return nil + } + } catch { + print("Failed to decode plist: \(error)") + return nil + } } private func logEmptyKey(_ key: String, forJSON: Bool) { if !nudgeLogState.afterFirstLaunch { let log = forJSON ? prefsJSONLog : prefsProfileLog - LogManager.info("\(key) key is empty", logger: log) + let type = forJSON ? "json" : "profile" + LogManager.info("\(key) key is empty - \(type)", logger: log) } } @@ -83,13 +101,31 @@ func getOSVersionRequirementsJSON() -> OSVersionRequirement? { } func getOSVersionRequirementsProfile() -> OSVersionRequirement? { - guard let osRequirementsArray = Globals.nudgeDefaults.array(forKey: "osVersionRequirements") as? [[String: AnyObject]] else { + if CommandLineUtilities().demoModeEnabled() || CommandLineUtilities().unitTestingEnabled() { + logEmptyKey("osVersionRequirements", forJSON: false) + return nil + } + + // Check if the Data is empty + if Globals.configProfile.isEmpty { logEmptyKey("osVersionRequirements", forJSON: false) return nil } - let requirements = osRequirementsArray.map { OSVersionRequirement(fromDictionary: $0) } - return getOSVersionRequirements(from: requirements) + do { + // Attempt to decode the plist Data into a dictionary + if let dictionary = try PropertyListSerialization.propertyList(from: Globals.configProfile, options: [], format: nil) as? [String: Any], + let osVersionRequirements = dictionary["osVersionRequirements"] as? [[String: AnyObject]] { + let requirements = osVersionRequirements.map { OSVersionRequirement(fromDictionary: $0) } + return getOSVersionRequirements(from: requirements) + } else { + logEmptyKey("osVersionRequirements", forJSON: false) + return nil + } + } catch { + print("Failed to decode plist: \(error)") + return nil + } } private func getOSVersionRequirements(from requirements: [OSVersionRequirement]?) -> OSVersionRequirement? { @@ -156,13 +192,30 @@ func getUserExperienceJSON() -> UserExperience? { } func getUserExperienceProfile() -> [String: Any]? { - guard !CommandLineUtilities().demoModeEnabled(), - !CommandLineUtilities().unitTestingEnabled(), - let userExperience = Globals.nudgeDefaults.dictionary(forKey: "userExperience") else { + if CommandLineUtilities().demoModeEnabled() || CommandLineUtilities().unitTestingEnabled() { logEmptyKey("userExperience", forJSON: false) return nil } - return userExperience + + // Check if the Data is empty + if Globals.configProfile.isEmpty { + logEmptyKey("userExperience", forJSON: false) + return nil + } + + do { + // Attempt to decode the plist Data into a dictionary + if let dictionary = try PropertyListSerialization.propertyList(from: Globals.configProfile, options: [], format: nil) as? [String: Any], + let userExperience = dictionary["userExperience"] as? [String: Any] { + return userExperience + } else { + logEmptyKey("userExperience", forJSON: false) + return nil + } + } catch { + print("Failed to decode plist: \(error)") + return nil + } } // userInterface @@ -187,13 +240,30 @@ func getUserInterfaceJSON() -> UserInterface? { } func getUserInterfaceProfile() -> [String: Any]? { - guard !CommandLineUtilities().demoModeEnabled(), - !CommandLineUtilities().unitTestingEnabled(), - let userInterface = Globals.nudgeDefaults.dictionary(forKey: "userInterface") else { + if CommandLineUtilities().demoModeEnabled() || CommandLineUtilities().unitTestingEnabled() { logEmptyKey("userInterface", forJSON: false) return nil } - return userInterface + + // Check if the Data is empty + if Globals.configProfile.isEmpty { + logEmptyKey("userInterface", forJSON: false) + return nil + } + + do { + // Attempt to decode the plist Data into a dictionary + if let dictionary = try PropertyListSerialization.propertyList(from: Globals.configProfile, options: [], format: nil) as? [String: Any], + let userInterface = dictionary["userInterface"] as? [String: Any] { + return userInterface + } else { + logEmptyKey("userInterface", forJSON: false) + return nil + } + } catch { + print("Failed to decode plist: \(error)") + return nil + } } // Loop through JSON userInterface -> updateElements preferences and then compare language @@ -206,16 +276,38 @@ func getUserInterfaceUpdateElementsJSON() -> UpdateElement? { } func getUserInterfaceUpdateElementsProfile() -> [String: AnyObject]? { - // Mutate the profile into our required construct - guard let updateElementsArray = UserInterfaceVariables.userInterfaceProfile?["updateElements"] as? [[String: AnyObject]] else { + if CommandLineUtilities().demoModeEnabled() || CommandLineUtilities().unitTestingEnabled() { logEmptyKey("updateElements", forJSON: false) return nil } - return getMatchingUpdateElements( - updateElements: updateElementsArray, - languageKey: "_language", - logKey: "Profile" - ) + + // Check if the Data is empty + if Globals.configProfile.isEmpty { + logEmptyKey("updateElements", forJSON: false) + return nil + } + + do { + // Attempt to decode the plist Data into a dictionary + if let dictionary = try PropertyListSerialization.propertyList(from: Globals.configProfile, options: [], format: nil) as? [String: Any], + let userInterface = dictionary["userInterface"] as? [String: Any] { + guard let updateElementsArray = userInterface["updateElements"] as? [[String: AnyObject]] else { + logEmptyKey("updateElements", forJSON: false) + return nil + } + return getMatchingUpdateElements( + updateElements: updateElementsArray, + languageKey: "_language", + logKey: "Profile" + ) + } else { + logEmptyKey("updateElements", forJSON: false) + return nil + } + } catch { + print("Failed to decode plist: \(error)") + return nil + } } private func getMatchingUpdateElements(updateElements: [T]?, languageKey: String, logKey: String) -> T? { diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 33fb7e88..717c7467 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -396,10 +396,33 @@ struct ConfigurationManager { func getConfigurationAsProfile() -> Data { var nudgeProfileConfig = [String: Any]() - nudgeProfileConfig["optionalFeatures"] = Globals.nudgeDefaults.dictionary(forKey: "optionalFeatures") - nudgeProfileConfig["osVersionRequirements"] = Globals.nudgeDefaults.array(forKey: "osVersionRequirements") - nudgeProfileConfig["userExperience"] = Globals.nudgeDefaults.dictionary(forKey: "userExperience") - nudgeProfileConfig["userInterface"] = Globals.nudgeDefaults.dictionary(forKey: "userInterface") + if CommandLineUtilities().bundleModeJSONEnabled() { + return Data() + } + if CommandLineUtilities().bundleModeProfileEnabled(), let bundleUrl = Globals.bundle.url(forResource: "com.github.macadmins.Nudge.tester", withExtension: "plist") { + LogManager.debug("Profile url: \(bundleUrl)", logger: utilsLog) + guard let data = try? Data(contentsOf: bundleUrl) else { + LogManager.error("Failed to load profile data from URL.", logger: uiLog) + return Data() + } + do { + let plist = try PropertyListSerialization.propertyList(from: data, options: [], format: nil) + if let dictionary = plist as? [String: AnyObject] { + nudgeProfileConfig = dictionary + } else { + LogManager.error("Plist is not a dictionary.", logger: uiLog) + return Data() + } + } catch { + LogManager.error("Error reading plist: \(error)", logger: uiLog) + return Data() + } + } else { + nudgeProfileConfig["optionalFeatures"] = Globals.nudgeDefaults.dictionary(forKey: "optionalFeatures") + nudgeProfileConfig["osVersionRequirements"] = Globals.nudgeDefaults.array(forKey: "osVersionRequirements") + nudgeProfileConfig["userExperience"] = Globals.nudgeDefaults.dictionary(forKey: "userExperience") + nudgeProfileConfig["userInterface"] = Globals.nudgeDefaults.dictionary(forKey: "userInterface") + } guard !nudgeProfileConfig.isEmpty, let plistData = try? PropertyListSerialization.data(fromPropertyList: nudgeProfileConfig, format: .xml, options: 0), @@ -783,7 +806,7 @@ struct NetworkFileManager { private func decodeNudgePreferences(from url: URL) -> NudgePreferences? { guard let data = try? Data(contentsOf: url) else { if Globals.configProfile.isEmpty { - LogManager.error("Failed to load data from URL: \(url)", logger: prefsJSONLog) + LogManager.error("Failed to load data from URL: \(url)", logger: prefsProfileLog) } return nil } @@ -919,8 +942,8 @@ struct NetworkFileManager { } if CommandLineUtilities().bundleModeProfileEnabled(), let bundleUrl = Globals.bundle.url(forResource: "com.github.macadmins.Nudge.tester", withExtension: "plist") { - LogManager.debug("Profile url: \(bundleUrl)", logger: utilsLog) - return decodeNudgePreferences(from: bundleUrl) + LogManager.debug("Using embedded plist url: \(bundleUrl)", logger: utilsLog) + return nil } if let jsonUrl = URL(string: url) { @@ -1198,7 +1221,7 @@ struct VersionManager { static func getMajorRequiredNudgeOSVersion() -> Int { guard let majorVersion = Int(nudgePrimaryState.requiredMinimumOSVersion.split(separator: ".").first ?? "") else { - LogManager.error("Invalid format for requiredMinimumOSVersion", logger: utilsLog) + LogManager.error("Invalid format for requiredMinimumOSVersion - value is \(nudgePrimaryState.requiredMinimumOSVersion)", logger: utilsLog) return 0 } logOSVersion(majorVersion, for: "Major required OS version") From 4b33f1d1a61454bf3598a79263d87d5867843901 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 22 May 2024 12:27:53 -0500 Subject: [PATCH 049/141] fix key typo for utilizeSOFAFeed on mdm profiles --- Nudge/Preferences/DefaultPreferencesNudge.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index b3552a13..85de33af 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -156,7 +156,7 @@ struct OptionalFeatureVariables { } static var utilizeSOFAFeed: Bool { - optionalFeaturesProfile?["utilizeSOFAFeedh"] as? Bool ?? + optionalFeaturesProfile?["utilizeSOFAFeed"] as? Bool ?? optionalFeaturesJSON?.utilizeSOFAFeed ?? false } From d7f041aea169c78d228a85e6d970ed219927e9c2 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 23 May 2024 11:13:55 -0500 Subject: [PATCH 050/141] simplify the sofa logic and add latest-* supported --- CHANGELOG.md | 14 ++- .../com.github.macadmins.Nudge.tester.json | 3 +- .../com.github.macadmins.Nudge.tester.plist | 2 - Nudge/3rd Party Assets/sofa.swift | 23 +++- .../Preferences/DefaultPreferencesNudge.swift | 36 ++++--- Nudge/Preferences/PreferencesStructure.swift | 16 ++- Nudge/UI/Main.swift | 101 ++++++++++-------- 7 files changed, 127 insertions(+), 68 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 466ed191..03066044 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,17 +8,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Requires macOS 12.0 and higher. Further releases and feature requests may make this macOS 13 and higher depending on code complexity. ### Changed -- You can now pass the string `latest` in the `requiredMinimumOSVersion` key +- You can now pass the strings `latest`, `latest-supported` and `latest-minor` in the `requiredMinimumOSVersion` key + - `latest`: always force latest release and if the machine can't this version, show the new "unsupported device" user interface + - `latest-supported`: always get the latest version sofa shows that is supported by this device + - `latest-minor`: stay in the current major release and get the latest minor updates available - This requires utilizing the SOFA feed features to properly work - Nudge will then utilize two date integers to automatically calculate the `requiredInstallationDate` - - `activelyExploitedInstallationSLA` under the `osVersionRequirement` key will default to 14 days + - `activelyExploitedCVEsInstallationSLA` under the `osVersionRequirement` key will default to 14 days + - `nonActivelyExploitedCVEsSLA` under the `osVersionRequirement` key will default to 21 days - `standardInstallationSLA` under the `osVersionRequirement` key will default to 28 days - These dates are calculated against the `ReleaseDate` key in the SOFA feed + - If you'd like to not have nudge events for releases without any known CVEs, please configure the `disableNudgeForStandardInstalls` key under `optionalFeatures` to true ### Fixed Upcoming ### Added +- Remote URLs can now be used on `iconDarkPath`, `iconLightPath`, `screenShotDarkPath` and `screenShotLightPath` - An admin can now allow users to move the Nudge window with `userExperience` key `allowMovableWindow` - Basic SwiftUI support for Markdown text options - Utilizing Apple's markdown features, you can now utilize, bold, italic, underline, subscript and url links directly into any of the text fields @@ -26,8 +32,8 @@ Upcoming - Set the `utilizeSOFAFeed` key `true` under `optionalFeatures` to enable this feature - Nudge will by default check the feed every 24 hours. - In order to change this, please configure the `refreshSOFAFeedTime` key under `optionalFeatures` in seconds -- "Unsupported" device UI in standard mode that utilizes the SOFA feed - - Set the `attemptToCheckForSupportedDevice` key `true` under `optionalFeatures` to enable this feature +- "Unsupported device" UI in standard mode that utilizes the SOFA feed + - Set the `attemptToCheckForSupportedDevice` key `false` under `optionalFeatures` to disable this feature - There are now keys to set all of text fields - `informationButtonTextUnsupported`, `mainContentHeaderUnsupported`, `mainContentNoteUnsupported`, `mainContentSubHeaderUnsupported`, `mainContentTextUnsupported`, `subHeaderUnsupported` - `unsupportedURL` and `unsupportedURLs` can change the information button itself, but it will remain in the `osVersionRequirement` key with `unsupportedURLs` and `unsupportedURLs`. diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index f56eeec5..8c921705 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -10,7 +10,6 @@ "acceptableCameraUsage": true, "acceptableScreenSharingUsage": true, "attemptToBlockApplicationLaunches": true, - "attemptToCheckForSupportedDevice": true, "blockedApplicationBundleIDs": [ "com.microsoft.VSCode", "us.zoom.xos" @@ -21,7 +20,7 @@ "osVersionRequirements": [ { "aboutUpdateURL": "https://apple.com", - "requiredMinimumOSVersion": "latest-supported", + "requiredMinimumOSVersion": "latest", "unsupportedURL": "https://google.com", } ], diff --git a/Example Assets/com.github.macadmins.Nudge.tester.plist b/Example Assets/com.github.macadmins.Nudge.tester.plist index a58bd10d..9654d0a5 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.plist +++ b/Example Assets/com.github.macadmins.Nudge.tester.plist @@ -19,8 +19,6 @@ attemptToBlockApplicationLaunches - attemptToCheckForSupportedDevice - blockedApplicationBundleIDs com.microsoft.VSCode diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift index 8c066a0b..bc4ca3fd 100644 --- a/Nudge/3rd Party Assets/sofa.swift +++ b/Nudge/3rd Party Assets/sofa.swift @@ -39,6 +39,17 @@ struct SofaOSVersion: Codable { } } +protocol OSInformation { + var productVersion: String { get } + var build: String { get } + var releaseDate: Date? { get } + var securityInfo: String { get } + var supportedDevices: [String] { get } + var cves: [String: Bool] { get } + var activelyExploitedCVEs: [String] { get } + var uniqueCVEsCount: Int { get } +} + struct LatestOS: Codable { let productVersion, build: String let releaseDate: Date? @@ -62,9 +73,13 @@ struct LatestOS: Codable { } } +extension LatestOS: OSInformation { + // All required properties are already implemented +} + struct SecurityRelease: Codable { let updateName, productVersion: String - let releaseDate: Date + let releaseDate: Date? let securityInfo: String let supportedDevices: [String] let cves: [String: Bool] @@ -84,6 +99,12 @@ struct SecurityRelease: Codable { } } +extension SecurityRelease: OSInformation { + var build: String { + "" + } // fake out build for now +} + struct SupportedModel: Codable { let model: String let url: String diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 85de33af..2ac6fd18 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -116,7 +116,7 @@ struct OptionalFeatureVariables { static var attemptToCheckForSupportedDevice: Bool { optionalFeaturesProfile?["attemptToCheckForSupportedDevice"] as? Bool ?? optionalFeaturesJSON?.attemptToCheckForSupportedDevice ?? - false + true } static var attemptToFetchMajorUpgrade: Bool { @@ -131,18 +131,24 @@ struct OptionalFeatureVariables { [String]() } - static var enforceMinorUpdates: Bool { - optionalFeaturesProfile?["enforceMinorUpdates"] as? Bool ?? - optionalFeaturesJSON?.enforceMinorUpdates ?? - true - } - static var disableSoftwareUpdateWorkflow: Bool { optionalFeaturesProfile?["disableSoftwareUpdateWorkflow"] as? Bool ?? optionalFeaturesJSON?.disableSoftwareUpdateWorkflow ?? false } + static var disableNudgeForStandardInstalls: Bool { + optionalFeaturesProfile?["disableNudgeForStandardInstalls"] as? Bool ?? + optionalFeaturesJSON?.disableNudgeForStandardInstalls ?? + false + } + + static var enforceMinorUpdates: Bool { + optionalFeaturesProfile?["enforceMinorUpdates"] as? Bool ?? + optionalFeaturesJSON?.enforceMinorUpdates ?? + true + } + static var refreshSOFAFeedTime: Int { optionalFeaturesProfile?["refreshSOFAFeedTime"] as? Int ?? optionalFeaturesJSON?.refreshSOFAFeedTime ?? @@ -176,9 +182,9 @@ struct OSVersionRequirementVariables { "" } - static var activelyExploitedInstallationSLA: Int { - osVersionRequirementsProfile?.activelyExploitedInstallationSLA ?? - osVersionRequirementsJSON?.activelyExploitedInstallationSLA ?? + static var activelyExploitedCVEsInstallationSLA: Int { + osVersionRequirementsProfile?.activelyExploitedCVEsInstallationSLA ?? + osVersionRequirementsJSON?.activelyExploitedCVEsInstallationSLA ?? 14 } @@ -187,9 +193,15 @@ struct OSVersionRequirementVariables { osVersionRequirementsJSON?.majorUpgradeAppPath ?? "" } - + + static var nonActivelyExploitedCVEsSLA: Int { + osVersionRequirementsProfile?.nonActivelyExploitedCVEsSLA ?? + osVersionRequirementsJSON?.nonActivelyExploitedCVEsSLA ?? + 21 + } + static var requiredMinimumOSVersion: String { - if ["latest", "latest-supported", "latest-major"].contains(PrefsWrapper.requiredMinimumOSVersion) { + if ["latest", "latest-supported", "latest-minor"].contains(PrefsWrapper.requiredMinimumOSVersion) { PrefsWrapper.requiredMinimumOSVersion } else { try! OSVersion(PrefsWrapper.requiredMinimumOSVersion).description diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index e9403baf..906d1b84 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -53,7 +53,7 @@ struct OptionalFeatures: Codable { var acceptableApplicationBundleIDs, acceptableAssertionApplicationNames: [String]? var acceptableAssertionUsage, acceptableCameraUsage, acceptableScreenSharingUsage, aggressiveUserExperience, aggressiveUserFullScreenExperience, asynchronousSoftwareUpdate, attemptToBlockApplicationLaunches, attemptToCheckForSupportedDevice, attemptToFetchMajorUpgrade: Bool? var blockedApplicationBundleIDs: [String]? - var disableSoftwareUpdateWorkflow, enforceMinorUpdates: Bool? + var disableNudgeForStandardInstalls, disableSoftwareUpdateWorkflow, enforceMinorUpdates: Bool? var refreshSOFAFeedTime: Int? var terminateApplicationsOnLaunch, utilizeSOFAFeed: Bool? } @@ -89,6 +89,7 @@ extension OptionalFeatures { attemptToCheckForSupportedDevice: Bool? = nil, attemptToFetchMajorUpgrade: Bool? = nil, blockedApplicationBundleIDs: [String]? = nil, + disableNudgeForStandardInstalls: Bool? = nil, disableSoftwareUpdateWorkflow: Bool? = nil, enforceMinorUpdates: Bool? = nil, refreshSOFAFeedTime: Int? = nil, @@ -108,6 +109,7 @@ extension OptionalFeatures { attemptToCheckForSupportedDevice: attemptToCheckForSupportedDevice ?? self.attemptToCheckForSupportedDevice, attemptToFetchMajorUpgrade: attemptToFetchMajorUpgrade ?? self.attemptToFetchMajorUpgrade, blockedApplicationBundleIDs: blockedApplicationBundleIDs ?? self.blockedApplicationBundleIDs, + disableNudgeForStandardInstalls: disableNudgeForStandardInstalls ?? self.disableNudgeForStandardInstalls, disableSoftwareUpdateWorkflow: disableSoftwareUpdateWorkflow ?? self.disableSoftwareUpdateWorkflow, enforceMinorUpdates: enforceMinorUpdates ?? self.enforceMinorUpdates, refreshSOFAFeedTime: refreshSOFAFeedTime ?? self.refreshSOFAFeedTime, @@ -122,8 +124,9 @@ struct OSVersionRequirement: Codable { var aboutUpdateURL: String? var aboutUpdateURLs: [AboutUpdateURL]? var actionButtonPath: String? - var activelyExploitedInstallationSLA: Int? + var activelyExploitedCVEsInstallationSLA: Int? var majorUpgradeAppPath: String? + var nonActivelyExploitedCVEsSLA: Int? var requiredInstallationDate: Date? var requiredMinimumOSVersion: String? var standardInstallationSLA: Int? @@ -137,8 +140,9 @@ extension OSVersionRequirement { init(fromDictionary: [String: AnyObject]) { self.aboutUpdateURL = fromDictionary["aboutUpdateURL"] as? String self.actionButtonPath = fromDictionary["actionButtonPath"] as? String - self.activelyExploitedInstallationSLA = fromDictionary["activelyExploitedInstallationSLA"] as? Int + self.activelyExploitedCVEsInstallationSLA = fromDictionary["activelyExploitedCVEsInstallationSLA"] as? Int self.majorUpgradeAppPath = fromDictionary["majorUpgradeAppPath"] as? String + self.nonActivelyExploitedCVEsSLA = fromDictionary["nonActivelyExploitedCVEsSLA"] as? Int self.requiredMinimumOSVersion = fromDictionary["requiredMinimumOSVersion"] as? String self.standardInstallationSLA = fromDictionary["standardInstallationSLA"] as? Int self.targetedOSVersionsRule = fromDictionary["targetedOSVersionsRule"] as? String @@ -196,8 +200,9 @@ extension OSVersionRequirement { aboutUpdateURL: String? = nil, aboutUpdateURLs: [AboutUpdateURL]? = nil, actionButtonPath: String? = nil, - activelyExploitedInstallationSLA: Int? = nil, + activelyExploitedCVEsInstallationSLA: Int? = nil, majorUpgradeAppPath: String? = nil, + nonActivelyExploitedCVEsSLA: Int? = nil, requiredInstallationDate: Date? = nil, requiredMinimumOSVersion: String? = nil, standardInstallationSLA: Int? = nil, @@ -209,8 +214,9 @@ extension OSVersionRequirement { aboutUpdateURL: aboutUpdateURL ?? self.aboutUpdateURL, aboutUpdateURLs: aboutUpdateURLs ?? self.aboutUpdateURLs, actionButtonPath: actionButtonPath ?? self.actionButtonPath, - activelyExploitedInstallationSLA: activelyExploitedInstallationSLA ?? self.activelyExploitedInstallationSLA, + activelyExploitedCVEsInstallationSLA: activelyExploitedCVEsInstallationSLA ?? self.activelyExploitedCVEsInstallationSLA, majorUpgradeAppPath: majorUpgradeAppPath ?? self.majorUpgradeAppPath, + nonActivelyExploitedCVEsSLA: nonActivelyExploitedCVEsSLA ?? self.nonActivelyExploitedCVEsSLA, requiredInstallationDate: requiredInstallationDate ?? self.requiredInstallationDate, requiredMinimumOSVersion: requiredMinimumOSVersion ?? self.requiredMinimumOSVersion, standardInstallationSLA: standardInstallationSLA ?? self.standardInstallationSLA, diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index afbb99fa..b6fb3314 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -181,63 +181,80 @@ class AppDelegate: NSObject, NSApplicationDelegate { // TODO: add support for custom sofa feed url // TODO: check the sofa json etag even after the timelimit age to reduce more bandwidth if OptionalFeatureVariables.utilizeSOFAFeed { + var selectedOS: OSInformation? + var foundMatch = false if let macOSSOFAAssets = Globals.sofaAssets?.osVersions { - var foundMatch = false for osVersion in macOSSOFAAssets { - if ["latest", "latest-supported", "latest-major"].contains(PrefsWrapper.requiredMinimumOSVersion) { - if PrefsWrapper.requiredMinimumOSVersion == "latest-supported" { - if VersionManager.getMajorOSVersion() != Int(osVersion.osVersion.split(separator: " ").last!) { - continue - } + if PrefsWrapper.requiredMinimumOSVersion == "latest" { + selectedOS = osVersion.latest + } else if PrefsWrapper.requiredMinimumOSVersion == "latest-minor" { + if VersionManager.getMajorOSVersion() == Int(osVersion.osVersion.split(separator: " ").last!) { + selectedOS = osVersion.latest + } else { + continue } - // Check if the specified device is in the supported devices of the matching asset - nudgePrimaryState.requiredMinimumOSVersion = osVersion.latest.productVersion - // nudgePrimaryState.requiredMinimumOSVersion = "14.6" // TODO: remove when testing is done - nudgePrimaryState.activelyExploitedCVEs = osVersion.latest.activelyExploitedCVEs.count > 0 - LogManager.notice("SOFA Actively Exploited CVEs: \(nudgePrimaryState.activelyExploitedCVEs)", logger: sofaLog) - let slaExtension = nudgePrimaryState.activelyExploitedCVEs ? OSVersionRequirementVariables.activelyExploitedInstallationSLA * 86400 : OSVersionRequirementVariables.standardInstallationSLA * 86400 - requiredInstallationDate = osVersion.latest.releaseDate?.addingTimeInterval(TimeInterval(slaExtension)) ?? DateManager().getCurrentDate().addingTimeInterval(1209600) - LogManager.notice("Extending requiredInstallationDate to \(requiredInstallationDate)", logger: sofaLog) - LogManager.notice("SOFA Matched OS Version: \(osVersion.latest.productVersion)", logger: sofaLog) - LogManager.notice("SOFA Assets: \(osVersion.latest.supportedDevices)", logger: sofaLog) - LogManager.notice("SOFA CVEs: \(osVersion.latest.cves)", logger: sofaLog) - + } else if PrefsWrapper.requiredMinimumOSVersion == "latest-supported" { if OptionalFeatureVariables.attemptToCheckForSupportedDevice { - LogManager.notice("Assessed Model ID: \(Globals.hardwareModelID)", logger: sofaLog) - let deviceMatchFound = osVersion.latest.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) - - LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) - nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound - // nudgePrimaryState.deviceSupportedByOSVersion = false // TODO: remove when testing is done + selectedOS = osVersion.securityReleases.first + if !selectedOS!.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) { + continue + } + } else { + LogManager.notice("Attempting to use latest-supported without supported device UI features. Please set attemptToCheckForSupportedDevice to true", logger: sofaLog) + break } - foundMatch = true } else { - if let matchingAsset = osVersion.securityReleases.first(where: { $0.productVersion == nudgePrimaryState.requiredMinimumOSVersion }) { - // Check if the specified device is in the supported devices of the matching asset - LogManager.notice("SOFA Matched OS Version: \(matchingAsset.productVersion)", logger: sofaLog) - LogManager.notice("SOFA Assets: \(matchingAsset.supportedDevices)", logger: sofaLog) - if OptionalFeatureVariables.attemptToCheckForSupportedDevice { - LogManager.notice("Assessed Model ID: \(Globals.hardwareModelID)", logger: sofaLog) - let deviceMatchFound = matchingAsset.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) - print("CVEs: \(matchingAsset.cves)") - print("Actively Exploited CVEs: \(matchingAsset.activelyExploitedCVEs.count > 0)") - LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) - nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound - // nudgePrimaryState.deviceSupportedByOSVersion = false - } - foundMatch = true + if osVersion.securityReleases.first(where: { $0.productVersion == nudgePrimaryState.requiredMinimumOSVersion }) != nil { + selectedOS = osVersion.securityReleases.first + } else { + continue } } - if foundMatch { - break + let activelyExploitedCVEs = selectedOS!.activelyExploitedCVEs.count > 0 + let presentCVEs = selectedOS!.cves.count > 0 + let slaExtension: TimeInterval + switch (activelyExploitedCVEs, presentCVEs) { + case (false, true): + slaExtension = TimeInterval(OSVersionRequirementVariables.nonActivelyExploitedCVEsSLA * 86400) + case (true, true): + slaExtension = TimeInterval(OSVersionRequirementVariables.activelyExploitedCVEsInstallationSLA * 86400) + case (false, false): + slaExtension = TimeInterval(OSVersionRequirementVariables.standardInstallationSLA * 86400) + default: + slaExtension = TimeInterval(OSVersionRequirementVariables.standardInstallationSLA * 86400) + } + + if OptionalFeatureVariables.disableNudgeForStandardInstalls && !presentCVEs { + LogManager.notice("No known CVEs for \(selectedOS!.productVersion) and disableNudgeForStandardInstalls is set to true", logger: sofaLog) + AppStateManager().exitNudge() + } + LogManager.notice("SOFA Actively Exploited CVEs: \(activelyExploitedCVEs)", logger: sofaLog) + + // Start setting UI fields + nudgePrimaryState.requiredMinimumOSVersion = osVersion.latest.productVersion + nudgePrimaryState.activelyExploitedCVEs = activelyExploitedCVEs + requiredInstallationDate = selectedOS!.releaseDate?.addingTimeInterval(slaExtension) ?? DateManager().getCurrentDate().addingTimeInterval(TimeInterval(OSVersionRequirementVariables.standardInstallationSLA * 86400)) + + LogManager.notice("Extending requiredInstallationDate to \(requiredInstallationDate)", logger: sofaLog) + LogManager.notice("SOFA Matched OS Version: \(selectedOS!.productVersion)", logger: sofaLog) + LogManager.notice("SOFA Assets: \(selectedOS!.supportedDevices)", logger: sofaLog) + LogManager.notice("SOFA CVEs: \(selectedOS!.cves)", logger: sofaLog) + + if OptionalFeatureVariables.attemptToCheckForSupportedDevice { + LogManager.notice("Assessed Model ID: \(Globals.hardwareModelID)", logger: sofaLog) + let deviceMatchFound = selectedOS!.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) + LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) + nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound } + foundMatch = true + break } if !foundMatch { // If no matching product version found or the device is not supported, return false LogManager.notice("Could not find requiredMinimumOSVersion \(nudgePrimaryState.requiredMinimumOSVersion) in SOFA feed", logger: sofaLog) } } else { - LogManager.notice("Could not fetch SOFA feed", logger: sofaLog) + LogManager.error("Could not fetch SOFA feed", logger: sofaLog) } } handleSMAppService() From 5fbd5178854f78edec99ce5eef653e9faab41257 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 23 May 2024 11:19:34 -0500 Subject: [PATCH 051/141] fix bug when matching requiredMinimumOSVersion with OS version values --- Nudge/UI/Main.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index b6fb3314..b0898472 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -174,7 +174,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { // Pre-Launch Logic func applicationWillFinishLaunching(_ notification: Notification) { // print("applicationWillFinishLaunching") - // TODO: Implement "latest-minor" or something for implementing all of the minor releases. // TODO: Add more logging to "unsupported devices" UI. // TODO: Add localization for "unsupported devices" text fields // TODO: Get someone to update JAMF JSON schema for all the new keys and wiki @@ -205,7 +204,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } else { if osVersion.securityReleases.first(where: { $0.productVersion == nudgePrimaryState.requiredMinimumOSVersion }) != nil { - selectedOS = osVersion.securityReleases.first + selectedOS = osVersion.securityReleases.first(where: { $0.productVersion == nudgePrimaryState.requiredMinimumOSVersion }) } else { continue } From 1e0fa3d8d862e45219353d3ba4244879d40d93ec Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 23 May 2024 11:19:52 -0500 Subject: [PATCH 052/141] test the skip macOS versions no CVE logic --- Example Assets/com.github.macadmins.Nudge.tester.json | 1 + 1 file changed, 1 insertion(+) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 8c921705..26200cda 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -14,6 +14,7 @@ "com.microsoft.VSCode", "us.zoom.xos" ], + "disableNudgeForStandardInstalls": true, "terminateApplicationsOnLaunch": false, "utilizeSOFAFeed": true }, From 863477a2d64d1fbce98e814f63e54196a8eed76a Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 23 May 2024 11:32:00 -0500 Subject: [PATCH 053/141] add showActivelyExploitedCVEs --- CHANGELOG.md | 2 ++ Nudge/Preferences/DefaultPreferencesNudge.swift | 6 ++++++ Nudge/Preferences/PreferencesStructure.swift | 4 +++- Nudge/UI/StandardMode/LeftSide.swift | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03066044..b352d1a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,8 @@ Upcoming ### Added - Remote URLs can now be used on `iconDarkPath`, `iconLightPath`, `screenShotDarkPath` and `screenShotLightPath` +- Actively Exploited CVEs in the left sidebar + - To disable this item, please configure the `showActivelyExploitedCVEs` key under `userInterface` to false - An admin can now allow users to move the Nudge window with `userExperience` key `allowMovableWindow` - Basic SwiftUI support for Markdown text options - Utilizing Apple's markdown features, you can now utilize, bold, italic, underline, subscript and url links directly into any of the text fields diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 2ac6fd18..f25f280c 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -479,6 +479,12 @@ struct UserInterfaceVariables { "I understand" } + static var showActivelyExploitedCVEs: Bool { + userInterfaceProfile?["showActivelyExploitedCVEs"] as? Bool ?? + userInterfaceJSON?.showActivelyExploitedCVEs ?? + true + } + static var showDeferralCount: Bool { userInterfaceProfile?["showDeferralCount"] as? Bool ?? userInterfaceJSON?.showDeferralCount ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 906d1b84..2cc64cab 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -397,7 +397,7 @@ struct UserInterface: Codable { var actionButtonPath, fallbackLanguage: String? var forceFallbackLanguage, forceScreenShotIcon: Bool? var iconDarkPath, iconLightPath, screenShotDarkPath, screenShotLightPath: String? - var showDeferralCount, simpleMode, singleQuitButton: Bool? + var showActivelyExploitedCVEs, showDeferralCount, simpleMode, singleQuitButton: Bool? var updateElements: [UpdateElement]? } @@ -428,6 +428,7 @@ extension UserInterface { iconLightPath: String? = nil, screenShotDarkPath: String? = nil, screenShotLightPath: String? = nil, + showActivelyExploitedCVEs: Bool? = nil, showDeferralCount: Bool? = nil, simpleMode: Bool? = nil, singleQuitButton: Bool? = nil, @@ -442,6 +443,7 @@ extension UserInterface { iconLightPath: iconLightPath ?? self.iconLightPath, screenShotDarkPath: screenShotDarkPath ?? self.screenShotDarkPath, screenShotLightPath: screenShotLightPath ?? self.screenShotLightPath, + showActivelyExploitedCVEs: showActivelyExploitedCVEs ?? self.showActivelyExploitedCVEs, showDeferralCount: showDeferralCount ?? self.showDeferralCount, simpleMode: simpleMode ?? self.simpleMode, singleQuitButton: singleQuitButton ?? self.singleQuitButton, diff --git a/Nudge/UI/StandardMode/LeftSide.swift b/Nudge/UI/StandardMode/LeftSide.swift index ea9ea8ff..b57efc0f 100644 --- a/Nudge/UI/StandardMode/LeftSide.swift +++ b/Nudge/UI/StandardMode/LeftSide.swift @@ -37,7 +37,7 @@ struct StandardModeLeftSide: View { private var informationStack: some View { VStack(alignment: .center, spacing: interLineSpacing) { InfoRow(label: "Required OS Version:", value: String(appState.requiredMinimumOSVersion), boldText: true) - if OptionalFeatureVariables.utilizeSOFAFeed { + if OptionalFeatureVariables.utilizeSOFAFeed && UserInterfaceVariables.showActivelyExploitedCVEs { InfoRow(label: "Actively Exploited CVEs:", value: String(appState.activelyExploitedCVEs).capitalized, boldText: appState.activelyExploitedCVEs) } InfoRow(label: "Current OS Version:", value: GlobalVariables.currentOSVersion) From 8a490797412404341a7adf58f5982603000551f5 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 08:17:42 -0500 Subject: [PATCH 054/141] active exploit cve test to red when true --- Nudge/UI/StandardMode/LeftSide.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nudge/UI/StandardMode/LeftSide.swift b/Nudge/UI/StandardMode/LeftSide.swift index b57efc0f..0d5d858f 100644 --- a/Nudge/UI/StandardMode/LeftSide.swift +++ b/Nudge/UI/StandardMode/LeftSide.swift @@ -38,7 +38,7 @@ struct StandardModeLeftSide: View { VStack(alignment: .center, spacing: interLineSpacing) { InfoRow(label: "Required OS Version:", value: String(appState.requiredMinimumOSVersion), boldText: true) if OptionalFeatureVariables.utilizeSOFAFeed && UserInterfaceVariables.showActivelyExploitedCVEs { - InfoRow(label: "Actively Exploited CVEs:", value: String(appState.activelyExploitedCVEs).capitalized, boldText: appState.activelyExploitedCVEs) + InfoRow(label: "Actively Exploited CVEs:", value: String(appState.activelyExploitedCVEs).capitalized, isHighlighted: appState.activelyExploitedCVEs ? true : false, boldText: appState.activelyExploitedCVEs) } InfoRow(label: "Current OS Version:", value: GlobalVariables.currentOSVersion) remainingTimeRow From 818503632ff5bbb6b927d1b69081c6c6dc82517e Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 08:31:01 -0500 Subject: [PATCH 055/141] add user-agent in sofa request --- Nudge/3rd Party Assets/sofa.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift index bc4ca3fd..31a3deac 100644 --- a/Nudge/3rd Party Assets/sofa.swift +++ b/Nudge/3rd Party Assets/sofa.swift @@ -224,7 +224,8 @@ extension MacOSDataFeed { class SOFA: NSObject, URLSessionDelegate { func URLSync(url: URL, maxRetries: Int = 3) -> (data: Data?, response: URLResponse?, error: Error?) { let semaphore = DispatchSemaphore(value: 0) - let request = URLRequest(url: url) + var request = URLRequest(url: url) + request.setValue("\(Globals.bundleID)/\(VersionManager.getNudgeVersion())", forHTTPHeaderField: "User-Agent") let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil) var attempts = 0 From 31dd94b6b1223b23fa6d4a2c05ec2ea55a00445f Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 08:31:12 -0500 Subject: [PATCH 056/141] move to globals.bundleid for all bundleid calls --- Nudge/Utilities/Logger.swift | 2 +- Nudge/Utilities/Utils.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Nudge/Utilities/Logger.swift b/Nudge/Utilities/Logger.swift index eab199a6..d58294b4 100644 --- a/Nudge/Utilities/Logger.swift +++ b/Nudge/Utilities/Logger.swift @@ -10,7 +10,7 @@ import os // Logger Manager struct LogManager { - static private let bundleID = Bundle.main.bundleIdentifier ?? "com.github.macadmins.Nudge" + static private let bundleID = Globals.bundleID static func createLogger(category: String) -> Logger { return Logger(subsystem: bundleID, category: category) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 717c7467..f5b32883 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -862,7 +862,7 @@ struct NetworkFileManager { } let fileManager = FileManager.default let appSupportDirectory = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! - let appDirectory = appSupportDirectory.appendingPathComponent(Bundle.main.bundleIdentifier ?? "com.github.macadmins.Nudge") + let appDirectory = appSupportDirectory.appendingPathComponent(Globals.bundleID) let sofaFile = "sofa-macos_data_feed.json" let sofaPath = appDirectory.appendingPathComponent(sofaFile) if fileManager.fileExists(atPath: sofaPath.path) { From ead34ff95e1c594f94f09c7f02e1eded9257f7e4 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 08:37:53 -0500 Subject: [PATCH 057/141] add customSOFAFeedURL --- CHANGELOG.md | 1 + Nudge/Preferences/DefaultPreferencesNudge.swift | 6 ++++++ Nudge/Preferences/PreferencesStructure.swift | 3 +++ Nudge/UI/Main.swift | 1 - Nudge/Utilities/Utils.swift | 2 +- 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b352d1a7..7e25cd83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ Upcoming - Set the `utilizeSOFAFeed` key `true` under `optionalFeatures` to enable this feature - Nudge will by default check the feed every 24 hours. - In order to change this, please configure the `refreshSOFAFeedTime` key under `optionalFeatures` in seconds + - If you are utilizing a custom sofa feed, please configure the `customSOFAFeedURL` key under `optionalFeatures` - "Unsupported device" UI in standard mode that utilizes the SOFA feed - Set the `attemptToCheckForSupportedDevice` key `false` under `optionalFeatures` to disable this feature - There are now keys to set all of text fields diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index f25f280c..b3ecd703 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -131,6 +131,12 @@ struct OptionalFeatureVariables { [String]() } + static var customSOFAFeedURL: String { + optionalFeaturesProfile?["customSOFAFeedURL"] as? String ?? + optionalFeaturesJSON?.customSOFAFeedURL ?? + "https://sofa.macadmins.io/v1/macos_data_feed.json" + } + static var disableSoftwareUpdateWorkflow: Bool { optionalFeaturesProfile?["disableSoftwareUpdateWorkflow"] as? Bool ?? optionalFeaturesJSON?.disableSoftwareUpdateWorkflow ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 2cc64cab..b7d91243 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -53,6 +53,7 @@ struct OptionalFeatures: Codable { var acceptableApplicationBundleIDs, acceptableAssertionApplicationNames: [String]? var acceptableAssertionUsage, acceptableCameraUsage, acceptableScreenSharingUsage, aggressiveUserExperience, aggressiveUserFullScreenExperience, asynchronousSoftwareUpdate, attemptToBlockApplicationLaunches, attemptToCheckForSupportedDevice, attemptToFetchMajorUpgrade: Bool? var blockedApplicationBundleIDs: [String]? + var customSOFAFeedURL: String? var disableNudgeForStandardInstalls, disableSoftwareUpdateWorkflow, enforceMinorUpdates: Bool? var refreshSOFAFeedTime: Int? var terminateApplicationsOnLaunch, utilizeSOFAFeed: Bool? @@ -89,6 +90,7 @@ extension OptionalFeatures { attemptToCheckForSupportedDevice: Bool? = nil, attemptToFetchMajorUpgrade: Bool? = nil, blockedApplicationBundleIDs: [String]? = nil, + customSOFAFeedURL: String? = nil, disableNudgeForStandardInstalls: Bool? = nil, disableSoftwareUpdateWorkflow: Bool? = nil, enforceMinorUpdates: Bool? = nil, @@ -109,6 +111,7 @@ extension OptionalFeatures { attemptToCheckForSupportedDevice: attemptToCheckForSupportedDevice ?? self.attemptToCheckForSupportedDevice, attemptToFetchMajorUpgrade: attemptToFetchMajorUpgrade ?? self.attemptToFetchMajorUpgrade, blockedApplicationBundleIDs: blockedApplicationBundleIDs ?? self.blockedApplicationBundleIDs, + customSOFAFeedURL: customSOFAFeedURL ?? self.customSOFAFeedURL, disableNudgeForStandardInstalls: disableNudgeForStandardInstalls ?? self.disableNudgeForStandardInstalls, disableSoftwareUpdateWorkflow: disableSoftwareUpdateWorkflow ?? self.disableSoftwareUpdateWorkflow, enforceMinorUpdates: enforceMinorUpdates ?? self.enforceMinorUpdates, diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index b0898472..e2a585aa 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -177,7 +177,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { // TODO: Add more logging to "unsupported devices" UI. // TODO: Add localization for "unsupported devices" text fields // TODO: Get someone to update JAMF JSON schema for all the new keys and wiki - // TODO: add support for custom sofa feed url // TODO: check the sofa json etag even after the timelimit age to reduce more bandwidth if OptionalFeatureVariables.utilizeSOFAFeed { var selectedOS: OSInformation? diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index f5b32883..4f600404 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -890,7 +890,7 @@ struct NetworkFileManager { } } - if let url = URL(string: "https://sofa.macadmins.io/v1/macos_data_feed.json") { + if let url = URL(string: OptionalFeatureVariables.customSOFAFeedURL) { let sofaData = SOFA().URLSync(url: url) if (sofaData.error == nil) { do { From c5bf7cc43e7597c8143b75f1f7f6c578ad1d788d Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 12:02:58 -0500 Subject: [PATCH 058/141] add etag logic even though it doesn't work in syncronous calls --- Nudge/3rd Party Assets/sofa.swift | 35 +++++++++++++++++++-------- Nudge/Utilities/Utils.swift | 39 ++++++++++++++++++++++++------- 2 files changed, 55 insertions(+), 19 deletions(-) diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift index 31a3deac..4e00a315 100644 --- a/Nudge/3rd Party Assets/sofa.swift +++ b/Nudge/3rd Party Assets/sofa.swift @@ -222,39 +222,54 @@ extension MacOSDataFeed { } class SOFA: NSObject, URLSessionDelegate { - func URLSync(url: URL, maxRetries: Int = 3) -> (data: Data?, response: URLResponse?, error: Error?) { + func URLSync(url: URL, maxRetries: Int = 3) -> (data: Data?, response: URLResponse?, error: Error?, responseCode: Int?) { let semaphore = DispatchSemaphore(value: 0) + let lastEtag = Globals.nudgeDefaults.string(forKey: "LastEtag") ?? "" var request = URLRequest(url: url) - request.setValue("\(Globals.bundleID)/\(VersionManager.getNudgeVersion())", forHTTPHeaderField: "User-Agent") let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil) + request.addValue("\(Globals.bundleID)/\(VersionManager.getNudgeVersion())", forHTTPHeaderField: "User-Agent") + request.setValue(lastEtag, forHTTPHeaderField: "If-None-Match") var attempts = 0 var responseData: Data? var response: URLResponse? var responseError: Error? + var responseCode: Int? // Retry loop while attempts < maxRetries { attempts += 1 let task = session.dataTask(with: request) { data, resp, error in + guard let httpResponse = resp as? HTTPURLResponse else { + print("Error receiving response: \(error?.localizedDescription ?? "No error information")") + semaphore.signal() + return + } + + responseCode = httpResponse.statusCode + if responseCode == 200 { + if let etag = httpResponse.allHeaderFields["Etag"] as? String { + Globals.nudgeDefaults.set(etag, forKey: "LastEtag") + } + } + responseData = data response = resp responseError = error semaphore.signal() } task.resume() - semaphore.wait() - // Break the loop if the task succeeded or return an error other than a timeout - if responseError == nil || (responseError! as NSError).code != NSURLErrorTimedOut { - break - } else if attempts < maxRetries { - // Reset the error to try again - responseError = nil + // Check if we should retry the request + if let error = responseError as NSError? { + if error.code == NSURLErrorTimedOut && attempts < maxRetries { + continue // Retry only if it's a timeout error + } + break // Break for all other errors or no errors } } - return (responseData, response, responseError) + return (responseData, response, responseError, responseCode) } } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 4f600404..6f0f3c1d 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -110,6 +110,9 @@ struct AppStateManager { func getCreationDateForPath(_ path: String, testFileDate: Date?) -> Date? { let attributes = try? FileManager.default.attributesOfItem(atPath: path) + if attributes?[.size] as? Int == 0 { + return DateManager().coerceStringToDate(dateString: "2020-08-06T00:00:00Z") + } let creationDate = attributes?[.creationDate] as? Date return testFileDate ?? creationDate } @@ -865,7 +868,8 @@ struct NetworkFileManager { let appDirectory = appSupportDirectory.appendingPathComponent(Globals.bundleID) let sofaFile = "sofa-macos_data_feed.json" let sofaPath = appDirectory.appendingPathComponent(sofaFile) - if fileManager.fileExists(atPath: sofaPath.path) { + let sofaJSONExists = fileManager.fileExists(atPath: sofaPath.path) + if sofaJSONExists { let sofaPathCreationDate = AppStateManager().getCreationDateForPath(sofaPath.path, testFileDate: nil) // Use Cache as it is within time inverval if TimeInterval(OptionalFeatureVariables.refreshSOFAFeedTime) >= Date().timeIntervalSince(sofaPathCreationDate!) { @@ -877,7 +881,10 @@ struct NetworkFileManager { } catch { LogManager.error("Failed to decode local sofa JSON: \(error.localizedDescription)", logger: sofaLog) LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) + return nil } + } else { + LogManager.info("Previously cached SOFA json has expired", logger: sofaLog) } } else { // Ensure the Application Support directory exists @@ -893,15 +900,29 @@ struct NetworkFileManager { if let url = URL(string: OptionalFeatureVariables.customSOFAFeedURL) { let sofaData = SOFA().URLSync(url: url) if (sofaData.error == nil) { - do { - if fileManager.fileExists(atPath: appDirectory.path) { - try sofaData.data!.write(to: sofaPath) + if sofaData.responseCode == 304 && sofaJSONExists { + LogManager.info("Utilizing previously cached SOFA json due to Etag not changing", logger: sofaLog) + do { + let sofaData = try Data(contentsOf: sofaPath) + let assetInfo = try MacOSDataFeed(data: sofaData) + return assetInfo + } catch { + LogManager.error("Failed to decode local sofa JSON: \(error.localizedDescription)", logger: sofaLog) + LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) + return nil + } + } else { + do { + if fileManager.fileExists(atPath: appDirectory.path) { + try sofaData.data!.write(to: sofaPath) + } + let assetInfo = try MacOSDataFeed(data: sofaData.data!) + return assetInfo + } catch { + LogManager.error("Failed to decode sofa JSON: \(error.localizedDescription)", logger: sofaLog) + LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) + return nil } - let assetInfo = try MacOSDataFeed(data: sofaData.data!) - return assetInfo - } catch { - LogManager.error("Failed to decode sofa JSON: \(error.localizedDescription)", logger: sofaLog) - LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) } } else { LogManager.error("Failed to fetch sofa JSON: \(sofaData.error!.localizedDescription)", logger: sofaLog) From 8a355358a084f94af1bd9bab90065401b16dc61d Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 12:10:10 -0500 Subject: [PATCH 059/141] move to modified date not creation date --- Nudge/Utilities/Utils.swift | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 6f0f3c1d..13b7561d 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -117,6 +117,15 @@ struct AppStateManager { return testFileDate ?? creationDate } + func getModifiedDateForPath(_ path: String, testFileDate: Date?) -> Date? { + let attributes = try? FileManager.default.attributesOfItem(atPath: path) + if attributes?[.size] as? Int == 0 { + return DateManager().coerceStringToDate(dateString: "2020-08-06T00:00:00Z") + } + let creationDate = attributes?[.modificationDate] as? Date + return testFileDate ?? creationDate + } + // Adapted from https://github.com/ProfileCreator/ProfileCreator/blob/master/ProfileCreator/ProfileCreator/Extensions/ExtensionBundle.swift func getSigningInfo() -> String? { var osStatus = noErr @@ -870,7 +879,7 @@ struct NetworkFileManager { let sofaPath = appDirectory.appendingPathComponent(sofaFile) let sofaJSONExists = fileManager.fileExists(atPath: sofaPath.path) if sofaJSONExists { - let sofaPathCreationDate = AppStateManager().getCreationDateForPath(sofaPath.path, testFileDate: nil) + let sofaPathCreationDate = AppStateManager().getModifiedDateForPath(sofaPath.path, testFileDate: nil) // Use Cache as it is within time inverval if TimeInterval(OptionalFeatureVariables.refreshSOFAFeedTime) >= Date().timeIntervalSince(sofaPathCreationDate!) { LogManager.info("Utilizing previously cached SOFA json", logger: sofaLog) From 2a32c1243054cdb28cc99917e7138406fc9295a2 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 12:16:06 -0500 Subject: [PATCH 060/141] break the loop after one query --- Nudge/3rd Party Assets/sofa.swift | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift index 4e00a315..22f82afc 100644 --- a/Nudge/3rd Party Assets/sofa.swift +++ b/Nudge/3rd Party Assets/sofa.swift @@ -226,7 +226,9 @@ class SOFA: NSObject, URLSessionDelegate { let semaphore = DispatchSemaphore(value: 0) let lastEtag = Globals.nudgeDefaults.string(forKey: "LastEtag") ?? "" var request = URLRequest(url: url) - let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil) + let config = URLSessionConfiguration.default + config.requestCachePolicy = .useProtocolCachePolicy + let session = URLSession(configuration: config, delegate: self, delegateQueue: nil) request.addValue("\(Globals.bundleID)/\(VersionManager.getNudgeVersion())", forHTTPHeaderField: "User-Agent") request.setValue(lastEtag, forHTTPHeaderField: "If-None-Match") var attempts = 0 @@ -235,6 +237,7 @@ class SOFA: NSObject, URLSessionDelegate { var response: URLResponse? var responseError: Error? var responseCode: Int? + var successfulQuery = false // Retry loop while attempts < maxRetries { @@ -251,6 +254,9 @@ class SOFA: NSObject, URLSessionDelegate { if let etag = httpResponse.allHeaderFields["Etag"] as? String { Globals.nudgeDefaults.set(etag, forKey: "LastEtag") } + successfulQuery = true + } else if responseCode == 304 { + successfulQuery = true } responseData = data @@ -261,6 +267,10 @@ class SOFA: NSObject, URLSessionDelegate { task.resume() semaphore.wait() + if successfulQuery { + break + } + // Check if we should retry the request if let error = responseError as NSError? { if error.code == NSURLErrorTimedOut && attempts < maxRetries { From b536468a2c0ed351e18a55f42cb51b7ef9cfbedf Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 12:31:32 -0500 Subject: [PATCH 061/141] move sofa logic to a function so it can be called after other logc --- Nudge/UI/Main.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index e2a585aa..2becefb7 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -171,9 +171,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { // print("applicationWillBecomeActive") } - // Pre-Launch Logic - func applicationWillFinishLaunching(_ notification: Notification) { - // print("applicationWillFinishLaunching") + func sofaPreLaunchLogic() { // TODO: Add more logging to "unsupported devices" UI. // TODO: Add localization for "unsupported devices" text fields // TODO: Get someone to update JAMF JSON schema for all the new keys and wiki @@ -255,11 +253,17 @@ class AppDelegate: NSObject, NSApplicationDelegate { LogManager.error("Could not fetch SOFA feed", logger: sofaLog) } } + } + + // Pre-Launch Logic + func applicationWillFinishLaunching(_ notification: Notification) { + // print("applicationWillFinishLaunching") handleSMAppService() checkForBadProfilePath() handleCommandLineArguments() applyGracePeriodLogic() applyRandomDelayIfNecessary() + sofaPreLaunchLogic() updateNudgeState() handleSoftwareUpdateRequirements() } From 34cd108700ca34b3c62a18b40be33b33ac03735e Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 13:14:29 -0500 Subject: [PATCH 062/141] fix probable issue with xcode tests failing --- Nudge/Utilities/Utils.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 13b7561d..92833ec2 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -110,7 +110,7 @@ struct AppStateManager { func getCreationDateForPath(_ path: String, testFileDate: Date?) -> Date? { let attributes = try? FileManager.default.attributesOfItem(atPath: path) - if attributes?[.size] as? Int == 0 { + if attributes?[.size] as? Int == 0 && testFileDate == nil { return DateManager().coerceStringToDate(dateString: "2020-08-06T00:00:00Z") } let creationDate = attributes?[.creationDate] as? Date @@ -119,7 +119,7 @@ struct AppStateManager { func getModifiedDateForPath(_ path: String, testFileDate: Date?) -> Date? { let attributes = try? FileManager.default.attributesOfItem(atPath: path) - if attributes?[.size] as? Int == 0 { + if attributes?[.size] as? Int == 0 && testFileDate == nil { return DateManager().coerceStringToDate(dateString: "2020-08-06T00:00:00Z") } let creationDate = attributes?[.modificationDate] as? Date From 585712feeb19c03cd2f8fa78ca25af1ccad912a8 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 13:14:53 -0500 Subject: [PATCH 063/141] move todos --- Nudge/3rd Party Assets/sofa.swift | 1 + Nudge/UI/Main.swift | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift index 22f82afc..cee37fde 100644 --- a/Nudge/3rd Party Assets/sofa.swift +++ b/Nudge/3rd Party Assets/sofa.swift @@ -231,6 +231,7 @@ class SOFA: NSObject, URLSessionDelegate { let session = URLSession(configuration: config, delegate: self, delegateQueue: nil) request.addValue("\(Globals.bundleID)/\(VersionManager.getNudgeVersion())", forHTTPHeaderField: "User-Agent") request.setValue(lastEtag, forHTTPHeaderField: "If-None-Match") + // TODO: I'm saving the Etag and sending it, but due to forcing this into a syncronous call, it is always returning a 200 code. When using this in an asycronous method, it eventually returns the 304 response. I'm not sure how to fix this bug. var attempts = 0 var responseData: Data? diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 2becefb7..aaba5f0e 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -175,7 +175,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { // TODO: Add more logging to "unsupported devices" UI. // TODO: Add localization for "unsupported devices" text fields // TODO: Get someone to update JAMF JSON schema for all the new keys and wiki - // TODO: check the sofa json etag even after the timelimit age to reduce more bandwidth if OptionalFeatureVariables.utilizeSOFAFeed { var selectedOS: OSInformation? var foundMatch = false From 0ba119adde85102fff29d64b237070782f7696e9 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 13:48:38 -0500 Subject: [PATCH 064/141] add logic for sofaPeriodLaunchDelay --- CHANGELOG.md | 1 + Nudge/Preferences/DefaultPreferencesNudge.swift | 7 +++++++ Nudge/Preferences/PreferencesStructure.swift | 7 +++++-- Nudge/UI/Main.swift | 11 ++++++++++- Nudge/Utilities/Utils.swift | 14 ++++++++++++++ 5 files changed, 37 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e25cd83..4e559d35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - `nonActivelyExploitedCVEsSLA` under the `osVersionRequirement` key will default to 21 days - `standardInstallationSLA` under the `osVersionRequirement` key will default to 28 days - These dates are calculated against the `ReleaseDate` key in the SOFA feed + - To artificially change the `ReleaseDate` thereby giving your users a default grace period for all SOFA OS updates, please configure the `sofaPeriodLaunchDelay` key under `userExperience` - If you'd like to not have nudge events for releases without any known CVEs, please configure the `disableNudgeForStandardInstalls` key under `optionalFeatures` to true ### Fixed diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index b3ecd703..79fc3554 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -178,6 +178,7 @@ struct OptionalFeatureVariables { var majorUpgradeAppPathExists = FileManager.default.fileExists(atPath: OSVersionRequirementVariables.majorUpgradeAppPath) var majorUpgradeBackupAppPathExists = FileManager.default.fileExists(atPath: NetworkFileManager().getBackupMajorUpgradeAppPath()) var requiredInstallationDate = DateManager().getFormattedDate(date: PrefsWrapper.requiredInstallationDate) +var releaseDate = Date() struct OSVersionRequirementVariables { static var osVersionRequirementsProfile: OSVersionRequirement? = getOSVersionRequirementsProfile() static var osVersionRequirementsJSON: OSVersionRequirement? = getOSVersionRequirementsJSON() @@ -362,6 +363,12 @@ struct UserExperienceVariables { userExperienceJSON?.randomDelay ?? false } + + static var sofaPeriodLaunchDelay: Int { + userExperienceProfile?["sofaPeriodLaunchDelay"] as? Int ?? + userExperienceJSON?.sofaPeriodLaunchDelay ?? + 0 + } } // User Interface diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index b7d91243..5dffecb1 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -324,6 +324,7 @@ struct UserExperience: Codable { var noTimers: Bool? var nudgeRefreshCycle: Int? var randomDelay: Bool? + var sofaPeriodLaunchDelay: Int? } // MARK: UserExperience convenience initializers and mutators @@ -366,7 +367,8 @@ extension UserExperience { maxRandomDelayInSeconds: Int? = nil, noTimers: Bool? = nil, nudgeRefreshCycle: Int? = nil, - randomDelay: Bool? = nil + randomDelay: Bool? = nil, + sofaPeriodLaunchDelay: Int? = nil ) -> UserExperience { return UserExperience( allowGracePeriods: allowGracePeriods ?? self.allowGracePeriods, @@ -390,7 +392,8 @@ extension UserExperience { maxRandomDelayInSeconds: maxRandomDelayInSeconds ?? self.maxRandomDelayInSeconds, noTimers: noTimers ?? self.noTimers, nudgeRefreshCycle: nudgeRefreshCycle ?? self.nudgeRefreshCycle, - randomDelay: randomDelay ?? self.randomDelay + randomDelay: randomDelay ?? self.randomDelay, + sofaPeriodLaunchDelay: sofaPeriodLaunchDelay ?? self.sofaPeriodLaunchDelay ) } } diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index aaba5f0e..aa988820 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -228,6 +228,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { // Start setting UI fields nudgePrimaryState.requiredMinimumOSVersion = osVersion.latest.productVersion nudgePrimaryState.activelyExploitedCVEs = activelyExploitedCVEs + releaseDate = selectedOS!.releaseDate ?? Date() requiredInstallationDate = selectedOS!.releaseDate?.addingTimeInterval(slaExtension) ?? DateManager().getCurrentDate().addingTimeInterval(TimeInterval(OSVersionRequirementVariables.standardInstallationSLA * 86400)) LogManager.notice("Extending requiredInstallationDate to \(requiredInstallationDate)", logger: sofaLog) @@ -261,8 +262,9 @@ class AppDelegate: NSObject, NSApplicationDelegate { checkForBadProfilePath() handleCommandLineArguments() applyGracePeriodLogic() - applyRandomDelayIfNecessary() sofaPreLaunchLogic() + applySOFAPeriodLogic() + applyRandomDelayIfNecessary() updateNudgeState() handleSoftwareUpdateRequirements() } @@ -337,6 +339,13 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } + private func applySOFAPeriodLogic() { + _ = AppStateManager().sofaPeriodLogic() + if nudgePrimaryState.shouldExit { + exit(0) + } + } + private func checkForBadProfilePath() { let badProfilePath = "/Library/Managed Preferences/com.github.macadmins.Nudge.json.plist" if FileManager.default.fileExists(atPath: badProfilePath) { diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 92833ec2..04820447 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -176,6 +176,20 @@ struct AppStateManager { return calculateNewRequiredInstallationDateIfNeeded(currentDate: currentDate, gracePeriodPathCreationDate: gracePeriodPathCreationDate) } + func sofaPeriodLogic(currentDate: Date = DateManager().getCurrentDate(), testFileDate: Date? = nil) -> Date { + if OptionalFeatureVariables.utilizeSOFAFeed { + if releaseDate.addingTimeInterval(TimeInterval(UserExperienceVariables.sofaPeriodLaunchDelay * 86400)) > currentDate { + LogManager.info("Device within sofaPeriodLaunchDelay, exiting Nudge", logger: uiLog) + nudgePrimaryState.shouldExit = true + return currentDate + } else { + LogManager.info("Device outside sofaPeriodLaunchDelay", logger: uiLog) + return PrefsWrapper.requiredInstallationDate + } + } + return PrefsWrapper.requiredInstallationDate + } + private func isDeferralAllowed(threshold: Int, logMessage: String) -> Bool { if CommandLineUtilities().demoModeEnabled() { return true From 34fd8862cb983f121c36d78b4833bfcb0e1ceda3 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 16:10:26 -0500 Subject: [PATCH 065/141] Update changelog --- CHANGELOG.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e559d35..26022eb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Requires macOS 12.0 and higher. Further releases and feature requests may make this macOS 13 and higher depending on code complexity. ### Changed +- Now built on Swift 5.10, Xcode 15.4 and macOS 14 +- New Xcode Scheme `-bundle-mode-profile` to test profile logic + - `-bundle-mode` has been renamed to `-bundle-mode-json` - You can now pass the strings `latest`, `latest-supported` and `latest-minor` in the `requiredMinimumOSVersion` key - `latest`: always force latest release and if the machine can't this version, show the new "unsupported device" user interface - `latest-supported`: always get the latest version sofa shows that is supported by this device @@ -22,10 +25,15 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - If you'd like to not have nudge events for releases without any known CVEs, please configure the `disableNudgeForStandardInstalls` key under `optionalFeatures` to true ### Fixed -Upcoming +- `screenshotDisplay` view had a bug that may result in the screenshot being partially cut off or zoomable +- More descriptive logs when loading json/mdm profile keys +- Refactor portions of the `softwareupdate` logic to reduce potential errors +- Fixed errors when moving to Swift 5.10 ### Added - Remote URLs can now be used on `iconDarkPath`, `iconLightPath`, `screenShotDarkPath` and `screenShotLightPath` + - Please note that these files will be downloaded each time Nudge is ran and there is currently not a way to cache these objects. + - If these files fail to download, a default company logo will be shown. - Actively Exploited CVEs in the left sidebar - To disable this item, please configure the `showActivelyExploitedCVEs` key under `userInterface` to false - An admin can now allow users to move the Nudge window with `userExperience` key `allowMovableWindow` From eb0088ea81d1f86dec93ec62bfdae5e5472b304e Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 16:22:21 -0500 Subject: [PATCH 066/141] -disable-randomDelay --- CHANGELOG.md | 1 + Nudge/UI/Main.swift | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26022eb2..2ab40c4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - Actively Exploited CVEs in the left sidebar - To disable this item, please configure the `showActivelyExploitedCVEs` key under `userInterface` to false - An admin can now allow users to move the Nudge window with `userExperience` key `allowMovableWindow` +- To ease testing, you can now pass `-disable-randomDelay` as an argument to ignore the `randomDelay` key if it is set by a JSON or mobileconfig - Basic SwiftUI support for Markdown text options - Utilizing Apple's markdown features, you can now utilize, bold, italic, underline, subscript and url links directly into any of the text fields - [SOFA](https://github.com/macadmins/sofa) feed support diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index aa988820..27ee53a6 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -332,7 +332,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { } private func applyRandomDelayIfNecessary() { - if UserExperienceVariables.randomDelay { + if UserExperienceVariables.randomDelay && !CommandLine.arguments.contains("-disable-randomDelay") { let delaySeconds = Int.random(in: 1...UserExperienceVariables.maxRandomDelayInSeconds) LogManager.notice("Delaying initial run (in seconds) by: \(delaySeconds)", logger: uiLog) sleep(UInt32(delaySeconds)) From c1aaec229ac662a3c2865b9ad84196510de06ce0 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 16:42:26 -0500 Subject: [PATCH 067/141] activate nudge if blocked application is terminated --- Nudge/UI/Main.swift | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 27ee53a6..5442052f 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -321,7 +321,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { @objc func terminateApplicationSender(_ notification: Notification) { LogManager.info("Application launched - checking if application should be terminated", logger: utilsLog) - terminateApplications() + terminateApplications(afterInitialLaunch: true) } private func applyGracePeriodLogic() { @@ -611,10 +611,11 @@ class AppDelegate: NSObject, NSApplicationDelegate { LogManager.info("Successfully terminated application: \(application.bundleIdentifier ?? "")", logger: utilsLog) } - private func terminateApplications() { + private func terminateApplications(afterInitialLaunch: Bool = false) { guard DateManager().pastRequiredInstallationDate() else { return } + var hasTerminatedAnApplication = false let runningApplications = NSWorkspace.shared.runningApplications for runningApplication in runningApplications { let appBundleID = runningApplication.bundleIdentifier ?? "" @@ -625,8 +626,12 @@ class AppDelegate: NSObject, NSApplicationDelegate { LogManager.info("Found \(appBundleID), terminating application", logger: utilsLog) scheduleLocal(applicationIdentifier: appBundleID) terminateApplication(runningApplication) + hasTerminatedAnApplication = true } } + if hasTerminatedAnApplication && afterInitialLaunch { + AppStateManager().activateNudge() + } } func runSoftwareUpdate() { From 4f3d71367eade1e6589209731b4d2230b62674d2 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 24 May 2024 17:57:34 -0500 Subject: [PATCH 068/141] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ab40c4d..05f134e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,7 +47,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - If you are utilizing a custom sofa feed, please configure the `customSOFAFeedURL` key under `optionalFeatures` - "Unsupported device" UI in standard mode that utilizes the SOFA feed - Set the `attemptToCheckForSupportedDevice` key `false` under `optionalFeatures` to disable this feature - - There are now keys to set all of text fields + - There are new keys to set all of text fields - `informationButtonTextUnsupported`, `mainContentHeaderUnsupported`, `mainContentNoteUnsupported`, `mainContentSubHeaderUnsupported`, `mainContentTextUnsupported`, `subHeaderUnsupported` - `unsupportedURL` and `unsupportedURLs` can change the information button itself, but it will remain in the `osVersionRequirement` key with `unsupportedURLs` and `unsupportedURLs`. - An icon will appear as an overlay on top of the company image to further emphasize the device is no longer supported From b3bce47d1940913b91c5237732741ac3c9284023 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 28 May 2024 09:41:25 -0500 Subject: [PATCH 069/141] add all of the localizations for english --- Localizable.xcstrings | 593 ++++++++++-------- .../Preferences/DefaultPreferencesNudge.swift | 2 +- 2 files changed, 330 insertions(+), 265 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 798d0ac7..a9b6fef8 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -4,222 +4,464 @@ "" : { }, - "A friendly reminder from your local IT team" : { + "**A friendly reminder from your local IT team**" : { + "comment" : "subHeader / subHeaderUnsupported", "extractionState" : "manual", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "En venligt ment påmindelse fra din lokale IT afdeling" + "value" : "**En venligt ment påmindelse fra din lokale IT afdeling**" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Eine freundliche Erinnerung deines IT-Teams" + "value" : "**Eine freundliche Erinnerung deines IT-Teams**" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "A friendly reminder from your local IT team" + "value" : "**A friendly reminder from your local IT team**" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Un recordatorio amistoso de tu equipo IT local" + "value" : "**Un recordatorio amistoso de tu equipo IT local**" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Un rappel amical de votre équipe informatique" + "value" : "**Un rappel amical de votre équipe informatique**" } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "आपके स्थानीय IT से मित्रवत अनुस्मारक" + "value" : "**आपके स्थानीय IT से मित्रवत अनुस्मारक**" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Un cortese promemoria dal tuo team IT locale" + "value" : "**Un cortese promemoria dal tuo team IT locale**" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ローカルITチームからのリマインドです" + "value" : "**ローカルITチームからのリマインドです**" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "로컬 IT 팀에서 알려드립니다" + "value" : "**로컬 IT 팀에서 알려드립니다**" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "En påminnelse fra IT" + "value" : "**En påminnelse fra IT**" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Een herinnering van uw IT-team" + "value" : "**Een herinnering van uw IT-team**" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Przypomnienie IT" + "value" : "**Przypomnienie IT**" } }, "pt" : { "stringUnit" : { "state" : "translated", - "value" : "Um lembrete rápido da sua equipe de TI local" + "value" : "**Um lembrete rápido da sua equipe de TI local**" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Напоминание от команды IT" + "value" : "**Напоминание от команды IT**" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "En påminnelse från IT" + "value" : "**En påminnelse från IT**" } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Дружнє нагадування від вашої IT-команди" + "value" : "**Дружнє нагадування від вашої IT-команди**" } }, "zh" : { "stringUnit" : { "state" : "translated", - "value" : "IT团队的友好提醒" + "value" : "**IT团队的友好提醒**" } } } }, - "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not update your device, you may lose access to some items necessary for your day-to-day tasks.\n\nTo begin the update, simply click on the Update Device button and follow the provided steps." : { + "**Important Notes**" : { + "comment" : "mainContentNote / mainContentNoteUnsupported", "extractionState" : "manual", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "En fuldt opdateret Mac er påkrævet for at IT afdelingen kan beskytte dine data.\n\nHvis du ikke opdaterer din Mac, kan du risikere at miste adgang til muligheder, som er nødvendige i dagligdagen.\n\nFor at påbegynde opdateringen skal du klikke på \"Opdater Mac\"-knappen og følge instruktionerne på skærmen." + "value" : "**Vigtig information**" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ein vollständig aktualisiertes Gerät ist erforderlich, um sicherzustellen, dass die IT-Abteilung dein Gerät effektiv schützen kann.\n\nWenn du dein Gerät nicht aktualisierst, verlierst du möglicherweise den Zugriff auf einige Werkzeuge, die du für deine täglichen Aufgaben benötigst.\n\nUm das Update zu starten, klicke auf die Schaltfläche Gerät Aktualisieren und befolge die angegebenen Schritte." + "value" : "**Wichtige Hinweise**" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not update your device, you may lose access to some items necessary for your day-to-day tasks.\n\nTo begin the update, simply click on the Update Device button and follow the provided steps." + "value" : "**Important Notes**" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Se requiere un dispositivo completamente actualizado para garantizar que IT pueda proteger su dispositivo con precisión.\n\nSi no actualiza su dispositivo, es posible que pierda el acceso a algunos elementos necesarios para sus tareas diarias.\n\nPara comenzar la actualización, simplemente haga clic en el botón Actualizar dispositivo y siga los pasos proporcionados." + "value" : "**Notas importantes**" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Un système entièrement à jour est nécessaire pour garantir que le service informatique puisse protéger votre appareil efficacement.\n\n Si vous ne mettez pas à jour votre appareil, vous risquez de perdre l'accès à certains outils nécessaires à vos tâches quotidiennes.\n\nPour commencer la mise à jour, cliquez simplement sur le bouton Mettre à jour l'appareil et suivez les étapes fournies." + "value" : "**Informations importantes**" } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "पुरी तरह अपडेटेड उपकरण आवश्यक है IT द्वारा आपके उपकरण को सुरक्षित रखने के लिए \n\n यदि उपकरण को अपडेट नही किया तो आप अपने कुछ मूल्यवान नित्य उपयोगी वस्तुएँ खो सकते हैं जो दैन दिन उपयोग के लिए आवश्यक होते है \n\n अपडेट करने के लिए केवल अपडेट बटन दबाये और निर्देशों का पालन करें।" + "value" : "**आवश्यक जानकारी**" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "È necessario un dispositivo completamente aggiornato per garantire che l'IT possa proteggere accuratamente il tuo dispositivo.\n\nSe non aggiorni il dispositivo, potresti perdere l'accesso ad alcuni elementi necessari per le tue attività quotidiane.\n\nPer iniziare l'aggiornamento, fai semplicemente clic sul pulsante Aggiorna dispositivo e segui i passaggi forniti." + "value" : "**Note importanti**" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ITが正確にあなたのデバイスを保護するためには、デバイスを完全に最新にすることが必要です。\n\nデバイスを更新しない場合、日々のタスクに必要なアイテムへのアクセスができなくなる可能性があります。\n\n更新を開始するにはデバイスの更新ボタンをクリックし、指示されたステップに従ってください。" + "value" : "**重要**" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "IT 팀이 귀하의 기기를 정밀하게 보호하기 위하여 최신 업데이트가 기기에 항시 탑재될 것을 요청드립니다.\n\n귀하께서 기기를 업데이트 하지 않는다면, 일상의 업무에 필요한 아이템들의 접근 권한이 상실될 수 있습니다.\n\n기기를 업데이트 하시려면, 기기 업데이트 버튼을 클릭하시고 제공되는 안내를 따르시면 됩니다." + "value" : "**중요 사항**" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Datamaskinen må være oppdatert med de siste sikkerhetsoppdateringene for å være beskyttet.\n\nHvis du ikke oppdaterer datamaskinen, kan det hende at du ikke får tilgang til de nødvendige ressursene.\n\nFor å starte oppdateringen, klikk på Oppdater nå og følg instruksene." + "value" : "**Viktig informasjon**" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Een volledig up-to-date Mac is vereist om ervoor te zorgen dat uw Mac goed beschermd blijft.\n\nAls u uw Mac niet bijwerkt kunnen er restricties op de Mac komen.\n\nOm met de update te beginnen, klikt u op de knop Update Mac en volgt u de stappen." + "value" : "**Belangrijke informatie**" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wymagane jest uaktualnienie urządzenia, aby mieć pewność, że dział IT może w pełni chronić Twoje urządzenie.\n\nJeśli nie zaktualizujesz urządzenia, możesz utracić dostęp do niektórych elementów niezbędnych do wykonywania codziennych zadań.\n\nAby rozpocząć aktualizację, po prostu kliknij przycisk Uaktualnij system i postępuj zgodnie z podanymi krokami." + "value" : "**Ważne informacje**" } }, "pt" : { "stringUnit" : { "state" : "translated", - "value" : "Um dispositivo totalmente atualizado é necessário para garantir que IT possa proteger seu dispositivo com precisão.\n\nSe não atualizar seu dispositivo, é possível que você perca acesso a itens necessários para performar suas tarefas do dia-a-dia.\n\nPara começar a atualização, apenas clique no botão Atualizar Dispositivo e siga as instruções apresentadas." + "value" : "**Notas Importantes**" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Обновления нужны, чтобы IT-команда могла защитить Mac и данные.\n\nЕсли вы не обновите устройство, есть риск потерять доступ к важным для работы сервисам.\n\nЧтобы начать обновление, просто нажмите кнопку установки." + "value" : "**Важные примечания**" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ett system med de senaste uppdateringarna krävs för att IT ska kunna säkerställa att din dator är skyddad.\n\nOm du inte uppdaterar systemet kommer du kanske inte kunna komma åt nödvändinga resurser.\n\nFör att påbörja uppdateringen, klicka på Uppdatera och följ stegen." + "value" : "**Viktig information**" } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Потрібен повністю оновлений пристрій щоб бути впевненим що IT зможе його надійно захистити.\n\nЯкщо ви не оновите пристрій, ви можете втратити доступ до деяких речей, необхідних для виконання повсякденних завдань.\n\nЩоб почати оновлення, просто клацніть кнопку Оновити пристрій та виконайте запропоновані кроки." + "value" : "**Important Notes**" } }, "zh" : { "stringUnit" : { "state" : "translated", + "value" : "**重要信息**" + } + } + } + }, + "**Your device is no longer capable of receving critical security updates**" : { + "comment" : "mainContentHeaderUnsupported", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Your device is no longer capable of receving critical security updates**" + } + } + } + }, + "**Your device will restart during this update**" : { + "comment" : "mainContentHeader", + "extractionState" : "manual", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Din Mac vil genstarte under opdateringen**" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Dein Gerät wird während dieses Updates neu gestartet**" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Your device will restart during this update**" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Su dispositivo se reiniciará durante esta actualización**" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Votre appareil redémarrera pendant cette mise à jour**" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "**आपका उपकरण इस अपडेट के समय पुनः शुरु होगा**" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Il dispositivo si riavvierà durante l'aggiornamento**" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "**デバイスは更新中に再起動します**" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "**업데이트 도중에 귀하의 기기는 재시작 될 것입니다**" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Du vil bli spurt om å starte på nytt underveis i oppdateringen**" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "**De Mac zal herstarten tijdens het updaten**" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Podczas tej aktualizacji Mac uruchomi się ponownie**" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Seu dispositivo irá reiniciar durante essa atualização**" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Ваше устройство перезагрузится во время обновления**" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Din dator kommer att startas om under uppdateringen**" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Ваш пристрій буде перезавантажено під час цього оновлення**" + } + }, + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "**在更新过程中,你的Mac将会重新启动。**" + } + } + } + }, + "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not obtain a replacement device, you will lose access to some items necessary for your day-to-day tasks.\n\nFor more information about this, please click on the **Replace Your Device** button." : { + "comment" : "mainContentTextUnsupported", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not obtain a replacement device, you will lose access to some items necessary for your day-to-day tasks.\n\nFor more information about this, please click on the **Replace Your Device** button." + } + } + } + }, + "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not update your device, you may lose access to some items necessary for your day-to-day tasks.\n\nTo begin the update, simply click on the **Update Device** button and follow the provided steps." : { + "comment" : "mainContentText", + "extractionState" : "manual", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "En fuldt opdateret Mac er påkrævet for at IT afdelingen kan beskytte dine data.\n\nHvis du ikke opdaterer din Mac, kan du risikere at miste adgang til muligheder, som er nødvendige i dagligdagen.\n\nFor at påbegynde opdateringen skal du klikke på \"Opdater Mac\"-knappen og følge instruktionerne på skærmen." + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ein vollständig aktualisiertes Gerät ist erforderlich, um sicherzustellen, dass die IT-Abteilung dein Gerät effektiv schützen kann.\n\nWenn du dein Gerät nicht aktualisierst, verlierst du möglicherweise den Zugriff auf einige Werkzeuge, die du für deine täglichen Aufgaben benötigst.\n\nUm das Update zu starten, klicke auf die Schaltfläche Gerät Aktualisieren und befolge die angegebenen Schritte." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not update your device, you may lose access to some items necessary for your day-to-day tasks.\n\nTo begin the update, simply click on the **Update Device** button and follow the provided steps." + } + }, + "es" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Se requiere un dispositivo completamente actualizado para garantizar que IT pueda proteger su dispositivo con precisión.\n\nSi no actualiza su dispositivo, es posible que pierda el acceso a algunos elementos necesarios para sus tareas diarias.\n\nPara comenzar la actualización, simplemente haga clic en el botón Actualizar dispositivo y siga los pasos proporcionados." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Un système entièrement à jour est nécessaire pour garantir que le service informatique puisse protéger votre appareil efficacement.\n\n Si vous ne mettez pas à jour votre appareil, vous risquez de perdre l'accès à certains outils nécessaires à vos tâches quotidiennes.\n\nPour commencer la mise à jour, cliquez simplement sur le bouton Mettre à jour l'appareil et suivez les étapes fournies." + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "पुरी तरह अपडेटेड उपकरण आवश्यक है IT द्वारा आपके उपकरण को सुरक्षित रखने के लिए \n\n यदि उपकरण को अपडेट नही किया तो आप अपने कुछ मूल्यवान नित्य उपयोगी वस्तुएँ खो सकते हैं जो दैन दिन उपयोग के लिए आवश्यक होते है \n\n अपडेट करने के लिए केवल अपडेट बटन दबाये और निर्देशों का पालन करें।" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "È necessario un dispositivo completamente aggiornato per garantire che l'IT possa proteggere accuratamente il tuo dispositivo.\n\nSe non aggiorni il dispositivo, potresti perdere l'accesso ad alcuni elementi necessari per le tue attività quotidiane.\n\nPer iniziare l'aggiornamento, fai semplicemente clic sul pulsante Aggiorna dispositivo e segui i passaggi forniti." + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ITが正確にあなたのデバイスを保護するためには、デバイスを完全に最新にすることが必要です。\n\nデバイスを更新しない場合、日々のタスクに必要なアイテムへのアクセスができなくなる可能性があります。\n\n更新を開始するにはデバイスの更新ボタンをクリックし、指示されたステップに従ってください。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "IT 팀이 귀하의 기기를 정밀하게 보호하기 위하여 최신 업데이트가 기기에 항시 탑재될 것을 요청드립니다.\n\n귀하께서 기기를 업데이트 하지 않는다면, 일상의 업무에 필요한 아이템들의 접근 권한이 상실될 수 있습니다.\n\n기기를 업데이트 하시려면, 기기 업데이트 버튼을 클릭하시고 제공되는 안내를 따르시면 됩니다." + } + }, + "nb" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Datamaskinen må være oppdatert med de siste sikkerhetsoppdateringene for å være beskyttet.\n\nHvis du ikke oppdaterer datamaskinen, kan det hende at du ikke får tilgang til de nødvendige ressursene.\n\nFor å starte oppdateringen, klikk på Oppdater nå og følg instruksene." + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Een volledig up-to-date Mac is vereist om ervoor te zorgen dat uw Mac goed beschermd blijft.\n\nAls u uw Mac niet bijwerkt kunnen er restricties op de Mac komen.\n\nOm met de update te beginnen, klikt u op de knop Update Mac en volgt u de stappen." + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Wymagane jest uaktualnienie urządzenia, aby mieć pewność, że dział IT może w pełni chronić Twoje urządzenie.\n\nJeśli nie zaktualizujesz urządzenia, możesz utracić dostęp do niektórych elementów niezbędnych do wykonywania codziennych zadań.\n\nAby rozpocząć aktualizację, po prostu kliknij przycisk Uaktualnij system i postępuj zgodnie z podanymi krokami." + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Um dispositivo totalmente atualizado é necessário para garantir que IT possa proteger seu dispositivo com precisão.\n\nSe não atualizar seu dispositivo, é possível que você perca acesso a itens necessários para performar suas tarefas do dia-a-dia.\n\nPara começar a atualização, apenas clique no botão Atualizar Dispositivo e siga as instruções apresentadas." + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Обновления нужны, чтобы IT-команда могла защитить Mac и данные.\n\nЕсли вы не обновите устройство, есть риск потерять доступ к важным для работы сервисам.\n\nЧтобы начать обновление, просто нажмите кнопку установки." + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ett system med de senaste uppdateringarna krävs för att IT ska kunna säkerställa att din dator är skyddad.\n\nOm du inte uppdaterar systemet kommer du kanske inte kunna komma åt nödvändinga resurser.\n\nFör att påbörja uppdateringen, klicka på Uppdatera och följ stegen." + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Потрібен повністю оновлений пристрій щоб бути впевненим що IT зможе його надійно захистити.\n\nЯкщо ви не оновите пристрій, ви можете втратити доступ до деяких речей, необхідних для виконання повсякденних завдань.\n\nЩоб почати оновлення, просто клацніть кнопку Оновити пристрій та виконайте запропоновані кроки." + } + }, + "zh" : { + "stringUnit" : { + "state" : "needs_review", "value" : "更新至最新的软件以确保 IT 可以精准的保护设备安全。\n\n如未及时完成更新,您将会无法访问日常工作所需的网页或程序。\n \n立刻更新,请点击【更新设备】并根据提供的步骤完成更新。" } } } }, "Additional Device Information" : { - "comment" : "// Additional Device Information", + "comment" : "Additional Device Information", "extractionState" : "manual", "localizations" : { "da" : { @@ -327,7 +569,7 @@ } }, "Application terminated" : { - "comment" : "User Notification", + "comment" : "Application terminated", "extractionState" : "manual", "localizations" : { "da" : { @@ -435,7 +677,7 @@ } }, "Architecture:" : { - "comment" : "Architecture", + "comment" : "Architecture:", "extractionState" : "manual", "localizations" : { "da" : { @@ -543,6 +785,7 @@ } }, "Click for additional device information" : { + "comment" : "Click for additional device information", "extractionState" : "manual", "localizations" : { "da" : { @@ -650,6 +893,7 @@ } }, "Click for more information about the security update" : { + "comment" : "Click for more information about the security update", "extractionState" : "manual", "localizations" : { "da" : { @@ -757,7 +1001,7 @@ } }, "Click to close" : { - "comment" : "Help buttons", + "comment" : "Click to close", "extractionState" : "manual", "localizations" : { "da" : { @@ -865,6 +1109,7 @@ } }, "Click to zoom into screenshot" : { + "comment" : "screenShotAltText", "extractionState" : "manual", "localizations" : { "da" : { @@ -972,7 +1217,7 @@ } }, "Current OS Version:" : { - "comment" : "Current OS Version", + "comment" : "Current OS Version:", "extractionState" : "manual", "localizations" : { "da" : { @@ -1080,6 +1325,7 @@ } }, "Custom" : { + "comment" : "customDeferralButtonText", "extractionState" : "manual", "localizations" : { "da" : { @@ -1187,7 +1433,7 @@ } }, "Days Remaining To Update:" : { - "comment" : "Days Remaining To Update", + "comment" : "Days Remaining To Update:", "extractionState" : "manual", "localizations" : { "da" : { @@ -1295,6 +1541,7 @@ } }, "Defer" : { + "comment" : "customDeferralDropdownText", "extractionState" : "manual", "localizations" : { "da" : { @@ -1402,7 +1649,7 @@ } }, "Deferred Count:" : { - "comment" : "Deferred Count", + "comment" : "Deferred Count:", "extractionState" : "manual", "localizations" : { "da" : { @@ -1510,7 +1757,7 @@ } }, "Hours Remaining To Update:" : { - "comment" : "Hours Remaining To Update", + "comment" : "Hours Remaining To Update:", "extractionState" : "manual", "localizations" : { "da" : { @@ -1618,6 +1865,7 @@ } }, "I understand" : { + "comment" : "secondaryQuitButtonText", "extractionState" : "manual", "localizations" : { "da" : { @@ -1724,115 +1972,8 @@ } } }, - "Important Notes" : { - "extractionState" : "manual", - "localizations" : { - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vigtig information" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wichtige Hinweise" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Important Notes" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas importantes" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informations importantes" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "आवश्यक जानकारी" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Note importanti" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "重要" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "중요 사항" - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Viktig informasjon" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Belangrijke informatie" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ważne informacje" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas Importantes" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Важные примечания" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Viktig information" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Important Notes" - } - }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "重要信息" - } - } - } - }, "Language:" : { - "comment" : "Language", + "comment" : "Language:", "extractionState" : "manual", "localizations" : { "da" : { @@ -1940,6 +2081,7 @@ } }, "Later" : { + "comment" : "primaryQuitButtonText", "extractionState" : "manual", "localizations" : { "da" : { @@ -2047,7 +2189,7 @@ } }, "More Info" : { - "comment" : "More Info", + "comment" : "informationButtonText", "extractionState" : "manual", "localizations" : { "da" : { @@ -2155,6 +2297,7 @@ } }, "One Day" : { + "comment" : "oneDayDeferralButtonText", "extractionState" : "manual", "localizations" : { "da" : { @@ -2262,6 +2405,7 @@ } }, "One Hour" : { + "comment" : "oneHourDeferralButtonText", "extractionState" : "manual", "localizations" : { "da" : { @@ -2369,6 +2513,7 @@ } }, "Please update your device to use this application" : { + "comment" : "Please update your device to use this application", "extractionState" : "manual", "localizations" : { "da" : { @@ -2475,8 +2620,32 @@ } } }, + "Please work with your local IT team to obtain a replacement device" : { + "comment" : "mainContentSubHeaderUnsupported", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Please work with your local IT team to obtain a replacement device" + } + } + } + }, + "Replace Your Device" : { + "comment" : "informationButtonTextUnsupported", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Replace Your Device" + } + } + } + }, "Required OS Version:" : { - "comment" : "Required OS Version", + "comment" : "Required OS Version:", "extractionState" : "manual", "localizations" : { "da" : { @@ -2584,7 +2753,7 @@ } }, "Serial Number:" : { - "comment" : "Serial Number", + "comment" : "Serial Number:", "extractionState" : "manual", "localizations" : { "da" : { @@ -2692,7 +2861,7 @@ } }, "Update Device" : { - "comment" : "// Right side of Nudge", + "comment" : "actionButtonText", "extractionState" : "manual", "localizations" : { "da" : { @@ -2800,6 +2969,7 @@ } }, "Updates can take around 30 minutes to complete" : { + "comment" : "mainContentSubHeader", "extractionState" : "manual", "localizations" : { "da" : { @@ -2907,7 +3077,7 @@ } }, "Username:" : { - "comment" : "Username", + "comment" : "Username:", "extractionState" : "manual", "localizations" : { "da" : { @@ -3015,7 +3185,7 @@ } }, "Version:" : { - "comment" : "Nudge Version", + "comment" : "Version:", "extractionState" : "manual", "localizations" : { "da" : { @@ -3123,6 +3293,7 @@ } }, "Your device requires a security update" : { + "comment" : "mainHeader", "extractionState" : "manual", "localizations" : { "da" : { @@ -3230,6 +3401,7 @@ } }, "Your device requires a security update (Demo Mode)" : { + "comment" : "mainHeader (Demo Mode)", "extractionState" : "manual", "localizations" : { "da" : { @@ -3335,113 +3507,6 @@ } } } - }, - "Your device will restart during this update" : { - "extractionState" : "manual", - "localizations" : { - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Din Mac vil genstarte under opdateringen" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dein Gerät wird während dieses Updates neu gestartet" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Your device will restart during this update" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Su dispositivo se reiniciará durante esta actualización" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Votre appareil redémarrera pendant cette mise à jour" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "आपका उपकरण इस अपडेट के समय पुनः शुरु होगा" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Il dispositivo si riavvierà durante l'aggiornamento" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "デバイスは更新中に再起動します" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "업데이트 도중에 귀하의 기기는 재시작 될 것입니다" - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Du vil bli spurt om å starte på nytt underveis i oppdateringen" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "De Mac zal herstarten tijdens het updaten" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Podczas tej aktualizacji Mac uruchomi się ponownie" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seu dispositivo irá reiniciar durante essa atualização" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ваше устройство перезагрузится во время обновления" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Din dator kommer att startas om under uppdateringen" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ваш пристрій буде перезавантажено під час цього оновлення" - } - }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "在更新过程中,你的Mac将会重新启动。" - } - } - } } }, "version" : "1.0" diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 79fc3554..8ebe3ea1 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -471,7 +471,7 @@ struct UserInterfaceVariables { static var mainContentText: String { userInterfaceUpdateElementsProfile?["mainContentText"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentText ?? - "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not update your device, you may lose access to some items necessary for your day-to-day tasks.\n\nTo begin the update, simply click on the Update Device button and follow the provided steps." + "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not update your device, you may lose access to some items necessary for your day-to-day tasks.\n\nTo begin the update, simply click on the **Update Device** button and follow the provided steps." } static var mainContentTextUnsupported: String { From 0ce73f5f03317e4d06db489831f85d30bd36fbf8 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 28 May 2024 10:15:44 -0500 Subject: [PATCH 070/141] google translate as much as I can with what's left --- Localizable.xcstrings | 535 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 508 insertions(+), 27 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index a9b6fef8..a31290c6 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -2,7 +2,104 @@ "sourceLanguage" : "en", "strings" : { "" : { - + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + } + } }, "**A friendly reminder from your local IT team**" : { "comment" : "subHeader / subHeaderUnsupported", @@ -224,11 +321,107 @@ "comment" : "mainContentHeaderUnsupported", "extractionState" : "manual", "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Din enhed er ikke længere i stand til at modtage kritiske sikkerhedsopdateringer**" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Ihr Gerät ist nicht mehr in der Lage, wichtige Sicherheitsupdates zu empfangen**" + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "**Your device is no longer capable of receving critical security updates**" } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Su dispositivo ya no es capaz de recibir actualizaciones de seguridad críticas**" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Votre appareil n'est plus capable de recevoir des mises à jour de sécurité critiques**" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "**आपका डिवाइस अब महत्वपूर्ण सुरक्षा अपडेट प्राप्त करने में सक्षम नहीं है**" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Il tuo dispositivo non è più in grado di ricevere aggiornamenti di sicurezza critici**" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "**お使いのデバイスは重要なセキュリティ アップデートを受信できなくなりました**" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "**귀하의 장치는 더 이상 중요한 보안 업데이트를 받을 수 없습니다**" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Enheten din er ikke lenger i stand til å motta kritiske sikkerhetsoppdateringer**" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Uw apparaat kan geen kritieke beveiligingsupdates meer ontvangen**" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Twoje urządzenie nie może już otrzymywać krytycznych aktualizacji zabezpieczeń**" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Seu dispositivo não é mais capaz de receber atualizações críticas de segurança**" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Ваше устройство больше не может получать критические обновления безопасности.**" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Din enhet kan inte längre ta emot viktiga säkerhetsuppdateringar**" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "**Ваш пристрій більше не може отримувати критичні оновлення безпеки**" + } + }, + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "**您的设备不再能够接收关键安全更新**" + } } } }, @@ -344,11 +537,107 @@ "comment" : "mainContentTextUnsupported", "extractionState" : "manual", "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "En fuldt opdateret enhed er påkrævet for at sikre, at IT kan beskytte din enhed nøjagtigt.\n\nHvis du ikke anskaffer dig en erstatningsenhed, mister du adgangen til nogle elementer, der er nødvendige til dine daglige opgaver.\n\nFor mere information om dette, klik venligst på knappen **Erstat din enhed**." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Um sicherzustellen, dass die IT Ihr Gerät ordnungsgemäß schützen kann, ist ein vollständig aktuelles Gerät erforderlich.\n\nWenn Sie kein Ersatzgerät erhalten, verlieren Sie den Zugriff auf einige Dinge, die Sie für Ihre täglichen Aufgaben benötigen.\n\nFür weitere Informationen hierzu klicken Sie bitte auf die Schaltfläche **Gerät ersetzen**." + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not obtain a replacement device, you will lose access to some items necessary for your day-to-day tasks.\n\nFor more information about this, please click on the **Replace Your Device** button." } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se requiere un dispositivo completamente actualizado para garantizar que TI pueda proteger con precisión su dispositivo.\n\nSi no obtiene un dispositivo de reemplazo, perderá el acceso a algunos elementos necesarios para sus tareas diarias.\n\nPara obtener más información sobre esto, haga clic en el botón **Reemplazar su dispositivo**." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un appareil entièrement à jour est nécessaire pour garantir que le service informatique puisse protéger votre appareil avec précision.\n\nSi vous n'obtenez pas d'appareil de remplacement, vous perdrez l'accès à certains éléments nécessaires à vos tâches quotidiennes.\n\nPour plus d'informations à ce sujet, veuillez cliquer sur le bouton **Remplacer votre appareil**." + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "यह सुनिश्चित करने के लिए कि आईटी आपके डिवाइस की सटीक सुरक्षा कर सके, एक पूरी तरह से अद्यतित डिवाइस की आवश्यकता है।\n\nयदि आपको प्रतिस्थापन उपकरण नहीं मिलता है, तो आप अपने दैनिक कार्यों के लिए आवश्यक कुछ वस्तुओं तक पहुंच खो देंगे।\n\nइसके बारे में अधिक जानकारी के लिए कृपया **अपना डिवाइस बदलें** बटन पर क्लिक करें।" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È necessario un dispositivo completamente aggiornato per garantire che l'IT possa proteggere accuratamente il tuo dispositivo.\n\nSe non ottieni un dispositivo sostitutivo, perderai l'accesso ad alcuni elementi necessari per le tue attività quotidiane.\n\nPer ulteriori informazioni a riguardo, fare clic sul pulsante **Sostituisci il dispositivo**." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "IT 部門がデバイスを正確に保護するには、完全に最新のデバイスが必要です。\n\n交換用デバイスを入手しない場合、日常業務に必要な一部のアイテムにアクセスできなくなります。\n\n詳細については、[**デバイスを交換する**] ボタンをクリックしてください。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "IT가 귀하의 장치를 정확하게 보호하려면 완전히 최신 장치가 필요합니다.\n\n교체 장치를 구입하지 않으면 일상적인 작업에 필요한 일부 항목에 액세스할 수 없게 됩니다.\n\n이에 대한 자세한 내용을 보려면 **장치 교체** 버튼을 클릭하세요." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "En fullstendig oppdatert enhet er nødvendig for å sikre at IT-enheten kan beskytte enheten din nøyaktig.\n\nHvis du ikke skaffer deg en erstatningsenhet, vil du miste tilgangen til enkelte elementer som er nødvendige for dine daglige oppgaver.\n\nFor mer informasjon om dette, klikk på knappen **Erstatt enheten din**." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Een volledig up-to-date apparaat is vereist om ervoor te zorgen dat IT uw apparaat nauwkeurig kan beschermen.\n\nAls u geen vervangend apparaat krijgt, verliest u de toegang tot bepaalde items die nodig zijn voor uw dagelijkse taken.\n\nVoor meer informatie hierover klikt u op de knop **Vervang uw apparaat**." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aby dział IT mógł dokładnie chronić Twoje urządzenie, wymagane jest w pełni aktualne urządzenie.\n\nJeśli nie uzyskasz urządzenia zastępczego, utracisz dostęp do niektórych rzeczy niezbędnych do codziennych zadań.\n\nAby uzyskać więcej informacji na ten temat, kliknij przycisk **Wymień urządzenie**." + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Um dispositivo totalmente atualizado para garantir que a TI possa proteger seu dispositivo com precisão.\n\nSe você não adquirir um dispositivo substituto, perderá o acesso a alguns itens necessários para suas tarefas diárias.\n\nPara obter mais informações sobre isso, clique no botão **Substitua seu dispositivo**." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Требуется полностью обновленное устройство, чтобы ИТ-специалисты могли точно защитить ваше устройство.\n\nЕсли вы не получите устройство на замену, вы потеряете доступ к некоторым элементам, необходимым для выполнения повседневных задач.\n\nДля получения дополнительной информации об этом нажмите кнопку **Заменить устройство**." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "En helt uppdaterad enhet krävs för att säkerställa att IT kan skydda din enhet korrekt.\n\nOm du inte skaffar en ersättningsenhet kommer du att förlora tillgången till vissa artiklar som behövs för dina dagliga uppgifter.\n\nFör mer information om detta, klicka på knappen **Byt ut din enhet**." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Потрібен повністю оновлений пристрій, щоб ІТ-спеціалісти могли точно захистити ваш пристрій.\n\nЯкщо ви не отримаєте пристрій на заміну, ви втратите доступ до деяких предметів, необхідних для виконання повсякденних завдань.\n\nЩоб дізнатися більше про це, натисніть кнопку **Замінити свій пристрій**." + } + }, + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "需要完全更新的设备才能确保 IT 能够准确保护您的设备。\n\n如果您没有获得替换设备,您将无法访问日常任务所需的某些物品。\n\n有关详细信息,请单击\"**更换您的设备**\"按钮。" + } } } }, @@ -358,14 +647,14 @@ "localizations" : { "da" : { "stringUnit" : { - "state" : "needs_review", - "value" : "En fuldt opdateret Mac er påkrævet for at IT afdelingen kan beskytte dine data.\n\nHvis du ikke opdaterer din Mac, kan du risikere at miste adgang til muligheder, som er nødvendige i dagligdagen.\n\nFor at påbegynde opdateringen skal du klikke på \"Opdater Mac\"-knappen og følge instruktionerne på skærmen." + "state" : "translated", + "value" : "En fuldt opdateret Mac er påkrævet for at IT afdelingen kan beskytte dine data.\n\nHvis du ikke opdaterer din Mac, kan du risikere at miste adgang til muligheder, som er nødvendige i dagligdagen.\n\nFor at påbegynde opdateringen skal du klikke på **Opdater Mac**-knappen og følge instruktionerne på skærmen." } }, "de" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Ein vollständig aktualisiertes Gerät ist erforderlich, um sicherzustellen, dass die IT-Abteilung dein Gerät effektiv schützen kann.\n\nWenn du dein Gerät nicht aktualisierst, verlierst du möglicherweise den Zugriff auf einige Werkzeuge, die du für deine täglichen Aufgaben benötigst.\n\nUm das Update zu starten, klicke auf die Schaltfläche Gerät Aktualisieren und befolge die angegebenen Schritte." + "state" : "translated", + "value" : "Ein vollständig aktualisiertes Gerät ist erforderlich, um sicherzustellen, dass die IT-Abteilung dein Gerät effektiv schützen kann.\n\nWenn du dein Gerät nicht aktualisierst, verlierst du möglicherweise den Zugriff auf einige Werkzeuge, die du für deine täglichen Aufgaben benötigst.\n\nUm das Update zu starten, klicke auf die Schaltfläche **Gerät Aktualisieren** und befolge die angegebenen Schritte." } }, "en" : { @@ -376,14 +665,14 @@ }, "es" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Se requiere un dispositivo completamente actualizado para garantizar que IT pueda proteger su dispositivo con precisión.\n\nSi no actualiza su dispositivo, es posible que pierda el acceso a algunos elementos necesarios para sus tareas diarias.\n\nPara comenzar la actualización, simplemente haga clic en el botón Actualizar dispositivo y siga los pasos proporcionados." + "state" : "translated", + "value" : "Se requiere un dispositivo completamente actualizado para garantizar que IT pueda proteger su dispositivo con precisión.\n\nSi no actualiza su dispositivo, es posible que pierda el acceso a algunos elementos necesarios para sus tareas diarias.\n\nPara comenzar la actualización, simplemente haga clic en el botón **Actualizar dispositivo** y siga los pasos proporcionados." } }, "fr" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Un système entièrement à jour est nécessaire pour garantir que le service informatique puisse protéger votre appareil efficacement.\n\n Si vous ne mettez pas à jour votre appareil, vous risquez de perdre l'accès à certains outils nécessaires à vos tâches quotidiennes.\n\nPour commencer la mise à jour, cliquez simplement sur le bouton Mettre à jour l'appareil et suivez les étapes fournies." + "state" : "translated", + "value" : "Un système entièrement à jour est nécessaire pour garantir que le service informatique puisse protéger votre appareil efficacement.\n\n Si vous ne mettez pas à jour votre appareil, vous risquez de perdre l'accès à certains outils nécessaires à vos tâches quotidiennes.\n\nPour commencer la mise à jour, cliquez simplement sur le bouton **Mettre à jour l'appareil** et suivez les étapes fournies." } }, "hi" : { @@ -394,8 +683,8 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", - "value" : "È necessario un dispositivo completamente aggiornato per garantire che l'IT possa proteggere accuratamente il tuo dispositivo.\n\nSe non aggiorni il dispositivo, potresti perdere l'accesso ad alcuni elementi necessari per le tue attività quotidiane.\n\nPer iniziare l'aggiornamento, fai semplicemente clic sul pulsante Aggiorna dispositivo e segui i passaggi forniti." + "state" : "translated", + "value" : "È necessario un dispositivo completamente aggiornato per garantire che l'IT possa proteggere accuratamente il tuo dispositivo.\n\nSe non aggiorni il dispositivo, potresti perdere l'accesso ad alcuni elementi necessari per le tue attività quotidiane.\n\nPer iniziare l'aggiornamento, fai semplicemente clic sul pulsante **Aggiorna dispositivo** e segui i passaggi forniti." } }, "ja" : { @@ -406,32 +695,32 @@ }, "ko" : { "stringUnit" : { - "state" : "needs_review", - "value" : "IT 팀이 귀하의 기기를 정밀하게 보호하기 위하여 최신 업데이트가 기기에 항시 탑재될 것을 요청드립니다.\n\n귀하께서 기기를 업데이트 하지 않는다면, 일상의 업무에 필요한 아이템들의 접근 권한이 상실될 수 있습니다.\n\n기기를 업데이트 하시려면, 기기 업데이트 버튼을 클릭하시고 제공되는 안내를 따르시면 됩니다." + "state" : "translated", + "value" : "IT 팀이 귀하의 기기를 정밀하게 보호하기 위하여 최신 업데이트가 기기에 항시 탑재될 것을 요청드립니다.\n\n귀하께서 기기를 업데이트 하지 않는다면, 일상의 업무에 필요한 아이템들의 접근 권한이 상실될 수 있습니다.\n\n기기를 업데이트 하시려면, **기기 업데이트** 버튼을 클릭하시고 제공되는 안내를 따르시면 됩니다." } }, "nb" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Datamaskinen må være oppdatert med de siste sikkerhetsoppdateringene for å være beskyttet.\n\nHvis du ikke oppdaterer datamaskinen, kan det hende at du ikke får tilgang til de nødvendige ressursene.\n\nFor å starte oppdateringen, klikk på Oppdater nå og følg instruksene." + "state" : "translated", + "value" : "Datamaskinen må være oppdatert med de siste sikkerhetsoppdateringene for å være beskyttet.\n\nHvis du ikke oppdaterer datamaskinen, kan det hende at du ikke får tilgang til de nødvendige ressursene.\n\nFor å starte oppdateringen, klikk på **Oppdater nå** og følg instruksene." } }, "nl" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Een volledig up-to-date Mac is vereist om ervoor te zorgen dat uw Mac goed beschermd blijft.\n\nAls u uw Mac niet bijwerkt kunnen er restricties op de Mac komen.\n\nOm met de update te beginnen, klikt u op de knop Update Mac en volgt u de stappen." + "state" : "translated", + "value" : "Een volledig up-to-date Mac is vereist om ervoor te zorgen dat uw Mac goed beschermd blijft.\n\nAls u uw Mac niet bijwerkt kunnen er restricties op de Mac komen.\n\nOm met de update te beginnen, klikt u op de knop **Update Mac** en volgt u de stappen." } }, "pl" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Wymagane jest uaktualnienie urządzenia, aby mieć pewność, że dział IT może w pełni chronić Twoje urządzenie.\n\nJeśli nie zaktualizujesz urządzenia, możesz utracić dostęp do niektórych elementów niezbędnych do wykonywania codziennych zadań.\n\nAby rozpocząć aktualizację, po prostu kliknij przycisk Uaktualnij system i postępuj zgodnie z podanymi krokami." + "state" : "translated", + "value" : "Wymagane jest uaktualnienie urządzenia, aby mieć pewność, że dział IT może w pełni chronić Twoje urządzenie.\n\nJeśli nie zaktualizujesz urządzenia, możesz utracić dostęp do niektórych elementów niezbędnych do wykonywania codziennych zadań.\n\nAby rozpocząć aktualizację, po prostu kliknij przycisk **Aktualizuj urządzenie** i postępuj zgodnie z podanymi krokami." } }, "pt" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Um dispositivo totalmente atualizado é necessário para garantir que IT possa proteger seu dispositivo com precisão.\n\nSe não atualizar seu dispositivo, é possível que você perca acesso a itens necessários para performar suas tarefas do dia-a-dia.\n\nPara começar a atualização, apenas clique no botão Atualizar Dispositivo e siga as instruções apresentadas." + "state" : "translated", + "value" : "Um dispositivo totalmente atualizado é necessário para garantir que IT possa proteger seu dispositivo com precisão.\n\nSe não atualizar seu dispositivo, é possível que você perca acesso a itens necessários para performar suas tarefas do dia-a-dia.\n\nPara começar a atualização, apenas clique no botão **Atualizar Dispositivo** e siga as instruções apresentadas." } }, "ru" : { @@ -442,20 +731,20 @@ }, "sv" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Ett system med de senaste uppdateringarna krävs för att IT ska kunna säkerställa att din dator är skyddad.\n\nOm du inte uppdaterar systemet kommer du kanske inte kunna komma åt nödvändinga resurser.\n\nFör att påbörja uppdateringen, klicka på Uppdatera och följ stegen." + "state" : "translated", + "value" : "Ett system med de senaste uppdateringarna krävs för att IT ska kunna säkerställa att din dator är skyddad.\n\nOm du inte uppdaterar systemet kommer du kanske inte kunna komma åt nödvändinga resurser.\n\nFör att påbörja uppdateringen, klicka på **Uppdatera** och följ stegen." } }, "uk" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Потрібен повністю оновлений пристрій щоб бути впевненим що IT зможе його надійно захистити.\n\nЯкщо ви не оновите пристрій, ви можете втратити доступ до деяких речей, необхідних для виконання повсякденних завдань.\n\nЩоб почати оновлення, просто клацніть кнопку Оновити пристрій та виконайте запропоновані кроки." + "state" : "translated", + "value" : "Потрібен повністю оновлений пристрій щоб бути впевненим що IT зможе його надійно захистити.\n\nЯкщо ви не оновите пристрій, ви можете втратити доступ до деяких речей, необхідних для виконання повсякденних завдань.\n\nЩоб почати оновлення, просто клацніть кнопку **Оновити пристрій** та виконайте запропоновані кроки." } }, "zh" : { "stringUnit" : { - "state" : "needs_review", - "value" : "更新至最新的软件以确保 IT 可以精准的保护设备安全。\n\n如未及时完成更新,您将会无法访问日常工作所需的网页或程序。\n \n立刻更新,请点击【更新设备】并根据提供的步骤完成更新。" + "state" : "translated", + "value" : "更新至最新的软件以确保 IT 可以精准的保护设备安全。\n\n如未及时完成更新,您将会无法访问日常工作所需的网页或程序。\n \n立刻更新,请点击\"**更新设备**\"并根据提供的步骤完成更新。" } } } @@ -2624,11 +2913,107 @@ "comment" : "mainContentSubHeaderUnsupported", "extractionState" : "manual", "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arbejd med dit lokale it-team for at få en erstatningsenhed" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bitte arbeiten Sie mit Ihrem lokalen IT-Team zusammen, um ein Ersatzgerät zu erhalten" + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "Please work with your local IT team to obtain a replacement device" } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trabaje con su equipo de TI local para obtener un dispositivo de reemplazo." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Veuillez travailler avec votre équipe informatique locale pour obtenir un appareil de remplacement." + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "प्रतिस्थापन उपकरण प्राप्त करने के लिए कृपया अपनी स्थानीय आईटी टीम के साथ काम करें" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Collabora con il team IT locale per ottenere un dispositivo sostitutivo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "地元の IT チームと協力して交換用デバイスを入手してください" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "교체 장치를 얻으려면 현지 IT 팀과 협력하십시오." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Samarbeid med ditt lokale IT-team for å få en erstatningsenhet" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Werk samen met uw lokale IT-team om een vervangend apparaat te verkrijgen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skontaktuj się z lokalnym zespołem IT, aby uzyskać urządzenie zastępcze" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trabalhe com sua equipe de TI local para obter um dispositivo de substituição" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Свяжитесь с местной ИТ-отделом, чтобы получить устройство на замену." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vänligen samarbeta med ditt lokala IT-team för att skaffa en ersättningsenhet" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Зверніться до місцевої ІТ-служби, щоб отримати пристрій на заміну" + } + }, + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "请与您当地的 IT 团队合作获取更换设备" + } } } }, @@ -2636,11 +3021,107 @@ "comment" : "informationButtonTextUnsupported", "extractionState" : "manual", "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Udskift din enhed" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ersetzen Sie Ihr Gerät" + } + }, "en" : { "stringUnit" : { "state" : "translated", "value" : "Replace Your Device" } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reemplace su dispositivo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remplacez votre appareil" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "अपना उपकरण बदलें" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sostituisci il tuo dispositivo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "デバイスを交換してください" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "장치 교체" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bytt ut enheten din" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vervang uw apparaat" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wymień swoje urządzenie" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Substitua seu dispositivo" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замените ваше устройство" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Byt ut din enhet" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замініть свій пристрій" + } + }, + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "更换您的设备" + } } } }, From e28f20160815d1a875f1e03d1d2c557b5812cbac Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 28 May 2024 10:24:58 -0500 Subject: [PATCH 071/141] explicitly log OS versioning errors --- Nudge/Utilities/OSVersion.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Nudge/Utilities/OSVersion.swift b/Nudge/Utilities/OSVersion.swift index fb8fdac9..bb3ea75b 100644 --- a/Nudge/Utilities/OSVersion.swift +++ b/Nudge/Utilities/OSVersion.swift @@ -36,11 +36,15 @@ public struct OSVersion { public init(_ string: String) throws { let parts = string.split(separator: ".", omittingEmptySubsequences: false) guard parts.count == 2 || parts.count == 3 else { - throw ParseError.badFormat(reason: "Input \(string) must have 2 or 3 parts, got \(parts.count).") + let error = "Input \(string) must have 2 or 3 parts, got \(parts.count)." + LogManager.error(error, logger: utilsLog) + throw ParseError.badFormat(reason: error) } guard let major = Int(parts[0]), let minor = Int(parts[1]) else { - throw ParseError.badFormat(reason: "Invalid format for major or minor version in \(string).") + let error = "Invalid format for major or minor version in \(string)." + LogManager.error(error, logger: utilsLog) + throw ParseError.badFormat(reason: error) } let patch = parts.count >= 3 ? Int(parts[2]) ?? 0 : 0 From 92c67f85344be4df002d9ef68b9029cffbe0a320 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 30 May 2024 12:10:19 -0500 Subject: [PATCH 072/141] add custom icon in the application termination notification --- CHANGELOG.md | 8 ++- .../com.github.macadmins.Nudge.tester.json | 11 ++-- .../Preferences/DefaultPreferencesNudge.swift | 20 +++++- Nudge/Preferences/PreferencesStructure.swift | 16 +++-- Nudge/UI/Defaults.swift | 1 + Nudge/UI/Main.swift | 62 ++++++++++++++++++- 6 files changed, 103 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05f134e9..1a12989a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,11 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - Fixed errors when moving to Swift 5.10 ### Added +- A local image path can now be specified for the notification event when Nudge terminates and application + - Please configure the `applicationTerminatedNotificationImagePath` key under `userInterface` + - Due to limitations within Apple's API, a local path is only supported at this time +- An admin can now alter the text when Nudge terminates and application + - Please configure the `applicationTerminatedTitleText` and `applicationTerminatedBodyText` keys under the `updateElements` key in `UserInterface` - Remote URLs can now be used on `iconDarkPath`, `iconLightPath`, `screenShotDarkPath` and `screenShotLightPath` - Please note that these files will be downloaded each time Nudge is ran and there is currently not a way to cache these objects. - If these files fail to download, a default company logo will be shown. @@ -47,8 +52,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - If you are utilizing a custom sofa feed, please configure the `customSOFAFeedURL` key under `optionalFeatures` - "Unsupported device" UI in standard mode that utilizes the SOFA feed - Set the `attemptToCheckForSupportedDevice` key `false` under `optionalFeatures` to disable this feature - - There are new keys to set all of text fields - - `informationButtonTextUnsupported`, `mainContentHeaderUnsupported`, `mainContentNoteUnsupported`, `mainContentSubHeaderUnsupported`, `mainContentTextUnsupported`, `subHeaderUnsupported` + - There are new keys to set all of text fields: `informationButtonTextUnsupported`, `mainContentHeaderUnsupported`, `mainContentNoteUnsupported`, `mainContentSubHeaderUnsupported`, `mainContentTextUnsupported`, `subHeaderUnsupported` under the `updateElements` key in `UserInterface` - `unsupportedURL` and `unsupportedURLs` can change the information button itself, but it will remain in the `osVersionRequirement` key with `unsupportedURLs` and `unsupportedURLs`. - An icon will appear as an overlay on top of the company image to further emphasize the device is no longer supported diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 26200cda..27981914 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -11,17 +11,17 @@ "acceptableScreenSharingUsage": true, "attemptToBlockApplicationLaunches": true, "blockedApplicationBundleIDs": [ - "com.microsoft.VSCode", - "us.zoom.xos" + "com.apple.Safari" ], "disableNudgeForStandardInstalls": true, - "terminateApplicationsOnLaunch": false, - "utilizeSOFAFeed": true + "terminateApplicationsOnLaunch": true, + "utilizeSOFAFeed": false }, "osVersionRequirements": [ { "aboutUpdateURL": "https://apple.com", - "requiredMinimumOSVersion": "latest", + "requiredMinimumOSVersion": "14.6", + "requiredInstallationDate": "2024-01-01T00:00:00Z", "unsupportedURL": "https://google.com", } ], @@ -37,6 +37,7 @@ "iconLightPath": "https://github.com/macadmins/nudge/blob/main/assets/NudgeIcon.png?raw=true", "screenShotDarkPath": "https://github.com/macadmins/nudge/blob/main/assets/standard_mode/demo_dark_1_icon.png?raw=true", "screenShotLightPath": "https://github.com/macadmins/nudge/blob/main/assets/standard_mode/demo_light_1_icon.png?raw=true", + "applicationTerminatedNotificationImagePath": "/Library/Application Support/Nudge/logoLight.png", "simpleMode": false, "updateElements": [ { diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 8ebe3ea1..b1916572 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -377,7 +377,13 @@ struct UserInterfaceVariables { static var userInterfaceJSON: UserInterface? = getUserInterfaceJSON() static var userInterfaceUpdateElementsProfile: [String:AnyObject]? = getUserInterfaceUpdateElementsProfile() static var userInterfaceUpdateElementsJSON: UpdateElement? = getUserInterfaceUpdateElementsJSON() - + + static var applicationTerminatedNotificationImagePath: String { + userInterfaceProfile?["applicationTerminatedNotificationImagePath"] as? String ?? + userInterfaceJSON?.applicationTerminatedNotificationImagePath ?? + "" + } + static var fallbackLanguage: String { userInterfaceProfile?["fallbackLanguage"] as? String ?? userInterfaceJSON?.fallbackLanguage ?? @@ -420,6 +426,18 @@ struct UserInterfaceVariables { "Update Device" } + static var applicationTerminatedTitleText: String { + userInterfaceUpdateElementsProfile?["applicationTerminatedTitleText"] as? String ?? + userInterfaceUpdateElementsJSON?.applicationTerminatedTitleText ?? + "Application terminated" + } + + static var applicationTerminatedBodyText: String { + userInterfaceUpdateElementsProfile?["applicationTerminatedBodyText"] as? String ?? + userInterfaceUpdateElementsJSON?.applicationTerminatedBodyText ?? + "Please update your device to use this application" + } + static var informationButtonText: String { userInterfaceUpdateElementsProfile?["informationButtonText"] as? String ?? userInterfaceUpdateElementsJSON?.informationButtonText ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 5dffecb1..1c772b80 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -400,7 +400,7 @@ extension UserExperience { // MARK: - UserInterface struct UserInterface: Codable { - var actionButtonPath, fallbackLanguage: String? + var actionButtonPath, applicationTerminatedNotificationImagePath, fallbackLanguage: String? var forceFallbackLanguage, forceScreenShotIcon: Bool? var iconDarkPath, iconLightPath, screenShotDarkPath, screenShotLightPath: String? var showActivelyExploitedCVEs, showDeferralCount, simpleMode, singleQuitButton: Bool? @@ -427,6 +427,7 @@ extension UserInterface { func with( actionButtonPath: String? = nil, + applicationTerminatedNotificationImagePath: String? = nil, fallbackLanguage: String? = nil, forceFallbackLanguage: Bool? = nil, forceScreenShotIcon: Bool? = nil, @@ -442,6 +443,7 @@ extension UserInterface { ) -> UserInterface { return UserInterface( actionButtonPath: actionButtonPath ?? self.actionButtonPath, + applicationTerminatedNotificationImagePath: applicationTerminatedNotificationImagePath ?? self.applicationTerminatedNotificationImagePath, fallbackLanguage: fallbackLanguage ?? self.fallbackLanguage, forceFallbackLanguage: forceFallbackLanguage ?? self.forceFallbackLanguage, forceScreenShotIcon: forceScreenShotIcon ?? self.forceScreenShotIcon, @@ -460,14 +462,14 @@ extension UserInterface { // MARK: - UpdateElement struct UpdateElement: Codable { - var language, actionButtonText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, informationButtonTextUnsupported: String? - var mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported: String? - var mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported: String? + var language, actionButtonText, applicationTerminatedTitleText, applicationTerminatedBodyText, customDeferralButtonText, customDeferralDropdownText: String? + var informationButtonText, informationButtonTextUnsupported, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported: String? + var mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported: String? var oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText: String? enum CodingKeys: String, CodingKey { case language = "_language" - case actionButtonText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, informationButtonTextUnsupported, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText + case actionButtonText, applicationTerminatedTitleText, applicationTerminatedBodyText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, informationButtonTextUnsupported, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText } } @@ -492,6 +494,8 @@ extension UpdateElement { func with( language: String? = nil, actionButtonText: String? = nil, + applicationTerminatedTitleText: String? = nil, + applicationTerminatedBodyText: String? = nil, customDeferralButtonText: String? = nil, customDeferralDropdownText: String? = nil, informationButtonText: String? = nil, @@ -517,6 +521,8 @@ extension UpdateElement { return UpdateElement( language: language ?? self.language, actionButtonText: actionButtonText ?? self.actionButtonText, + applicationTerminatedTitleText: applicationTerminatedTitleText ?? self.applicationTerminatedTitleText, + applicationTerminatedBodyText: applicationTerminatedBodyText ?? self.applicationTerminatedBodyText, customDeferralButtonText: customDeferralButtonText ?? self.customDeferralButtonText, customDeferralDropdownText: customDeferralDropdownText ?? self.customDeferralDropdownText, informationButtonText: informationButtonText ?? self.informationButtonText, diff --git a/Nudge/UI/Defaults.swift b/Nudge/UI/Defaults.swift index e4f87795..d43919e2 100644 --- a/Nudge/UI/Defaults.swift +++ b/Nudge/UI/Defaults.swift @@ -76,6 +76,7 @@ class AppState: ObservableObject { @Published var hasLoggedDeferralCountPastThreshold = false @Published var hasLoggedDeferralCountPastThresholdDualQuitButtons = false @Published var hasLoggedRequireDualQuitButtons = false + @Published var hasRenderedApplicationTerminatedNotificationImagePath = false @Published var hoursRemaining = DateManager().getNumberOfHoursRemaining() @Published var lastRefreshTime = DateManager().getFormattedDate() @Published var requireDualQuitButtons = false diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 5442052f..a63caba2 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -369,11 +369,69 @@ class AppDelegate: NSObject, NSApplicationDelegate { private func createNotificationContent(for applicationIdentifier: String) -> UNMutableNotificationContent { let content = UNMutableNotificationContent() - content.title = "Application terminated".localized(desiredLanguage: getDesiredLanguage()) + content.title = UserInterfaceVariables.applicationTerminatedTitleText.localized(desiredLanguage: getDesiredLanguage()) content.subtitle = "(\(applicationIdentifier))" - content.body = "Please update your device to use this application".localized(desiredLanguage: getDesiredLanguage()) + content.title = UserInterfaceVariables.applicationTerminatedBodyText.localized(desiredLanguage: getDesiredLanguage()) content.categoryIdentifier = "alert" content.sound = UNNotificationSound.default + content.attachments = [] + let applicationTerminatedNotificationImagePath = UserInterfaceVariables.applicationTerminatedNotificationImagePath + let tempImagePath = "/var/tmp/nudge-applicationTerminatedNotification.png" + if FileManager.default.fileExists(atPath: applicationTerminatedNotificationImagePath) { + if nudgePrimaryState.hasRenderedApplicationTerminatedNotificationImagePath { + do { + let fileURL = URL(fileURLWithPath: tempImagePath) + let attachment = try UNNotificationAttachment(identifier: "AttachedContent", url: fileURL, options: .none) + content.attachments = [attachment] + } catch let error { + LogManager.error("\(error)", logger: uiLog) + } + } else { + do { + // In order for the attachment to look properly, it has to be resized to a square + guard let sourceImage = NSImage(contentsOfFile: applicationTerminatedNotificationImagePath) else { + throw NSError(domain: "Failed to load image from path: \(applicationTerminatedNotificationImagePath)", code: 0, userInfo: nil) + } + // Find the maximum dimension and create a square based on it + let maxDimension = max(sourceImage.size.width, sourceImage.size.height) + let newSize = CGSize(width: maxDimension, height: maxDimension) + + // Create a new image with a square size, filling with transparent background + let targetImage = NSImage(size: newSize) + targetImage.lockFocus() + let context = NSGraphicsContext.current! + context.imageInterpolation = .high + NSColor.clear.set() + NSBezierPath(rect: NSRect(origin: .zero, size: newSize)).fill() + + // Calculate the origin point to center the source image + let x = (maxDimension - sourceImage.size.width) / 2 + let y = (maxDimension - sourceImage.size.height) / 2 + let targetRect = NSRect(x: x, y: y, width: sourceImage.size.width, height: sourceImage.size.height) + + sourceImage.draw(in: targetRect, from: NSRect(origin: .zero, size: sourceImage.size), operation: .sourceOver, fraction: 1.0) + targetImage.unlockFocus() + + guard let tiffData = targetImage.tiffRepresentation, + let bitmapImage = NSBitmapImageRep(data: tiffData), + let pngData = bitmapImage.representation(using: .png, properties: [:]) else { + throw NSError(domain: "Failed to create or convert image", code: 0, userInfo: nil) + } + + try pngData.write(to: URL(fileURLWithPath: tempImagePath)) + + // Load temporary file + let fileURL = URL(fileURLWithPath: tempImagePath) + let attachment = try UNNotificationAttachment(identifier: "AttachedContent", url: fileURL, options: .none) + content.attachments = [attachment] + nudgePrimaryState.hasRenderedApplicationTerminatedNotificationImagePath = true + } catch let error { + LogManager.error("\(error)", logger: uiLog) + } + } + } else { + print("applicationTerminatedNotificationImagePath does not exist on disk, skipping notification image.") + } return content } From febf07351cca935ffb81c200e27825259d6703c3 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 30 May 2024 16:25:49 -0500 Subject: [PATCH 073/141] fix issue with fallbackLanguage logic --- Nudge/Utilities/Preferences.swift | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Nudge/Utilities/Preferences.swift b/Nudge/Utilities/Preferences.swift index 7bdd5d39..9bdef871 100644 --- a/Nudge/Utilities/Preferences.swift +++ b/Nudge/Utilities/Preferences.swift @@ -10,6 +10,33 @@ import Foundation // Generics func getDesiredLanguage(locale: Locale? = nil) -> String { if UserInterfaceVariables.forceFallbackLanguage { + if Globals.configProfile.isEmpty { + let userInterfaceUpdateElementsJSON: UserInterface? = getUserInterfaceJSON() + if let elements = userInterfaceUpdateElementsJSON?.updateElements { + for element in elements { + if element.language == UIConstants.languageCode { + return UIConstants.languageCode + } + } + } + } else { + do { + // Attempt to decode the plist Data into a dictionary + if let dictionary = try PropertyListSerialization.propertyList(from: Globals.configProfile, options: [], format: nil) as? [String: Any], + let userInterface = dictionary["userInterface"] as? [String: Any] { + guard let elements = userInterface["updateElements"] as? [[String: AnyObject]] else { + return UIConstants.languageCode + } + for element in elements { + if element["_language"] as? String == UIConstants.languageCode { + return UIConstants.languageCode + } + } + } + } catch { + print("Failed to decode plist: \(error)") + } + } return UserInterfaceVariables.fallbackLanguage } From 83356a28f9173775206506fba5ad1d89414eda1d Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 30 May 2024 16:30:25 -0500 Subject: [PATCH 074/141] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a12989a..e4ae2b9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,8 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t ### Fixed - `screenshotDisplay` view had a bug that may result in the screenshot being partially cut off or zoomable +- `fallbackLanguage` would return the wrong language even when specified in the configuration + - Fixes [582](https://github.com/macadmins/nudge/issues/582) - More descriptive logs when loading json/mdm profile keys - Refactor portions of the `softwareupdate` logic to reduce potential errors - Fixed errors when moving to Swift 5.10 From 5091266d83781d3fa2195f33ee29b2209d0dca74 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 31 May 2024 12:18:34 -0500 Subject: [PATCH 075/141] move timerCycle logic to seconds remaining vs hours --- Nudge/UI/Defaults.swift | 1 + Nudge/UI/Main.swift | 1 + Nudge/Utilities/Utils.swift | 18 ++++++++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Nudge/UI/Defaults.swift b/Nudge/UI/Defaults.swift index d43919e2..0dc8e5cf 100644 --- a/Nudge/UI/Defaults.swift +++ b/Nudge/UI/Defaults.swift @@ -78,6 +78,7 @@ class AppState: ObservableObject { @Published var hasLoggedRequireDualQuitButtons = false @Published var hasRenderedApplicationTerminatedNotificationImagePath = false @Published var hoursRemaining = DateManager().getNumberOfHoursRemaining() + @Published var secondsRemaining = DateManager().getNumberOfSecondsRemaining() @Published var lastRefreshTime = DateManager().getFormattedDate() @Published var requireDualQuitButtons = false @Published var requiredMinimumOSVersion = OSVersionRequirementVariables.requiredMinimumOSVersion diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index a63caba2..f6d0088d 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -110,6 +110,7 @@ struct ContentView: View { } appState.daysRemaining = DateManager().getNumberOfDaysBetween() appState.hoursRemaining = DateManager().getNumberOfHoursRemaining() + appState.secondsRemaining = DateManager().getNumberOfSecondsRemaining() } } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 04820447..74380132 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -394,13 +394,13 @@ struct CommandLineUtilities { } struct ConfigurationManager { - private func determineTimerCycle(basedOn hoursRemaining: Int) -> Int { - switch hoursRemaining { + private func determineTimerCycle(basedOn secondsRemaining: Int) -> Int { + switch secondsRemaining { case ...0: return UserExperienceVariables.elapsedRefreshCycle - case ...UserExperienceVariables.imminentWindowTime: + case ...(UserExperienceVariables.imminentWindowTime * 3600): return UserExperienceVariables.imminentRefreshCycle - case ...UserExperienceVariables.approachingWindowTime: + case ...(UserExperienceVariables.approachingWindowTime * 3600): return UserExperienceVariables.approachingRefreshCycle default: return UserExperienceVariables.initialRefreshCycle @@ -461,8 +461,8 @@ struct ConfigurationManager { } func getTimerController() -> Int { - let hoursRemaining = DateManager().getNumberOfHoursRemaining() - let timerCycle = determineTimerCycle(basedOn: hoursRemaining) + let secondsRemaining = DateManager().getNumberOfSecondsRemaining() + let timerCycle = determineTimerCycle(basedOn: secondsRemaining) if timerCycle != nudgePrimaryState.timerCycle { LogManager.info("timerCycle: \(timerCycle)", logger: uiLog) @@ -525,6 +525,12 @@ struct DateManager { return Int(interval.timeIntervalSince(currentDate) / 3600) } + func getNumberOfSecondsRemaining(currentDate: Date = DateManager().getCurrentDate()) -> Int { + guard !CommandLineUtilities().demoModeEnabled() else { return 24 * 3600 } + let interval = CommandLineUtilities().unitTestingEnabled() ? PrefsWrapper.requiredInstallationDate : requiredInstallationDate + return Int(interval.timeIntervalSince(currentDate)) + } + func pastRequiredInstallationDate() -> Bool { let isPast = getCurrentDate() > requiredInstallationDate if !CommandLineUtilities().demoModeEnabled() && !nudgeLogState.hasLoggedPastRequiredInstallationDate { From d77b540ddfb562fcd1c198fd88f4d836275e6047 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 31 May 2024 12:20:32 -0500 Subject: [PATCH 076/141] update changelog for issue 568 --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4ae2b9f..2ec9fe53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,8 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - `screenshotDisplay` view had a bug that may result in the screenshot being partially cut off or zoomable - `fallbackLanguage` would return the wrong language even when specified in the configuration - Fixes [582](https://github.com/macadmins/nudge/issues/582) +- The timer controller logic was utilizing hours remaining vs seconds, which resulted in the `elapsedRefreshCycle` being used at the final hour of the nudge event vs the `imminentRefreshCycle`. This has been corrected to calculate the seconds remaining. + - Fixes [568](https://github.com/macadmins/nudge/issues/568) - More descriptive logs when loading json/mdm profile keys - Refactor portions of the `softwareupdate` logic to reduce potential errors - Fixed errors when moving to Swift 5.10 From 8258ebe997a66b50c03040df6feaaf71317f0d12 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 31 May 2024 16:12:27 -0500 Subject: [PATCH 077/141] optionally show required install date on left side UI --- CHANGELOG.md | 4 + .../com.github.macadmins.Nudge.tester.json | 5 +- Localizable.xcstrings | 108 ++++++++++++++++++ .../Preferences/DefaultPreferencesNudge.swift | 12 ++ Nudge/Preferences/PreferencesStructure.swift | 8 +- Nudge/UI/StandardMode/LeftSide.swift | 6 + Nudge/Utilities/Utils.swift | 6 + 7 files changed, 145 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ec9fe53..d3c93bc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,10 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - There are new keys to set all of text fields: `informationButtonTextUnsupported`, `mainContentHeaderUnsupported`, `mainContentNoteUnsupported`, `mainContentSubHeaderUnsupported`, `mainContentTextUnsupported`, `subHeaderUnsupported` under the `updateElements` key in `UserInterface` - `unsupportedURL` and `unsupportedURLs` can change the information button itself, but it will remain in the `osVersionRequirement` key with `unsupportedURLs` and `unsupportedURLs`. - An icon will appear as an overlay on top of the company image to further emphasize the device is no longer supported +- An admin can now show the `requiredInstallationDate` as a item on the left side of nudge. + - To enable this, please configure the `showRequiredInstallationDate` key under `userInterface` to true + - You can also expirement with the format of this date through the key `requiredInstallationDisplayFormat` under `userInterface` + - Be aware that the format you desire may not look good on the UI. ## [1.1.16] - 2024-03-13 This will be the **final Nudge release** for macOS 11 and potentially other versions of macOS. diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 27981914..a6dfcd32 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -21,7 +21,7 @@ { "aboutUpdateURL": "https://apple.com", "requiredMinimumOSVersion": "14.6", - "requiredInstallationDate": "2024-01-01T00:00:00Z", + "requiredInstallationDate": "2025-01-01T00:00:00Z", "unsupportedURL": "https://google.com", } ], @@ -38,6 +38,7 @@ "screenShotDarkPath": "https://github.com/macadmins/nudge/blob/main/assets/standard_mode/demo_dark_1_icon.png?raw=true", "screenShotLightPath": "https://github.com/macadmins/nudge/blob/main/assets/standard_mode/demo_light_1_icon.png?raw=true", "applicationTerminatedNotificationImagePath": "/Library/Application Support/Nudge/logoLight.png", + "showRequiredInstallationDate": true, "simpleMode": false, "updateElements": [ { @@ -56,7 +57,7 @@ "mainContentText": "mainContentText", "mainContentTextUnsupported1": "mainContentTextUnsupported", "mainHeader": "mainHeader", - "mainHeaderUnsupported1": "mainHeaderUnsupported", + "mainHeaderUnsupported": "mainHeaderUnsupported", "oneDayDeferralButtonText": "oneDayDeferralButtonText", "oneHourDeferralButtonText": "oneHourDeferralButtonText", "primaryQuitButtonText": "primaryQuitButtonText", diff --git a/Localizable.xcstrings b/Localizable.xcstrings index a31290c6..4cc958c3 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -3125,6 +3125,114 @@ } } }, + "Required Date:" : { + "comment" : "Required Date:", + "extractionState" : "manual", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Påkrævet Dato:" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erforderliches Datum:" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Required Date:" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fecha Requerida:" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Date Requise:" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "तारीख चाहिए:" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data Richiesta:" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "必要な日付:" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "필수 날짜:" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Krevd Dato:" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verplichte Datum:" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wymagana Data:" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data Requerida:" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Требуемая дата:" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nödvändiga Datumet:" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Необхідна дата:" + } + }, + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "要求日期:" + } + } + } + }, "Required OS Version:" : { "comment" : "Required OS Version:", "extractionState" : "manual", diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index b1916572..911dd300 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -504,6 +504,12 @@ struct UserInterfaceVariables { "Later" } + static var requiredInstallationDisplayFormat: String { + userInterfaceProfile?["requiredInstallationDisplayFormat"] as? String ?? + userInterfaceJSON?.requiredInstallationDisplayFormat ?? + "MM/dd/yyyy" + } + static var secondaryQuitButtonText: String { userInterfaceUpdateElementsProfile?["secondaryQuitButtonText"] as? String ?? userInterfaceUpdateElementsJSON?.secondaryQuitButtonText ?? @@ -522,6 +528,12 @@ struct UserInterfaceVariables { true } + static var showRequiredInstallationDate: Bool { + userInterfaceProfile?["showRequiredInstallationDate"] as? Bool ?? + userInterfaceJSON?.showRequiredInstallationDate ?? + false + } + static var singleQuitButton: Bool { userInterfaceProfile?["singleQuitButton"] as? Bool ?? userInterfaceJSON?.singleQuitButton ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 1c772b80..35aced37 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -402,8 +402,8 @@ extension UserExperience { struct UserInterface: Codable { var actionButtonPath, applicationTerminatedNotificationImagePath, fallbackLanguage: String? var forceFallbackLanguage, forceScreenShotIcon: Bool? - var iconDarkPath, iconLightPath, screenShotDarkPath, screenShotLightPath: String? - var showActivelyExploitedCVEs, showDeferralCount, simpleMode, singleQuitButton: Bool? + var iconDarkPath, iconLightPath, requiredInstallationDisplayFormat, screenShotDarkPath, screenShotLightPath: String? + var showActivelyExploitedCVEs, showDeferralCount, showRequiredInstallationDate, simpleMode, singleQuitButton: Bool? var updateElements: [UpdateElement]? } @@ -433,10 +433,12 @@ extension UserInterface { forceScreenShotIcon: Bool? = nil, iconDarkPath: String? = nil, iconLightPath: String? = nil, + requiredInstallationDisplayFormat: String? = nil, screenShotDarkPath: String? = nil, screenShotLightPath: String? = nil, showActivelyExploitedCVEs: Bool? = nil, showDeferralCount: Bool? = nil, + showRequiredInstallationDate: Bool? = nil, simpleMode: Bool? = nil, singleQuitButton: Bool? = nil, updateElements: [UpdateElement]? = nil @@ -449,10 +451,12 @@ extension UserInterface { forceScreenShotIcon: forceScreenShotIcon ?? self.forceScreenShotIcon, iconDarkPath: iconDarkPath ?? self.iconDarkPath, iconLightPath: iconLightPath ?? self.iconLightPath, + requiredInstallationDisplayFormat: requiredInstallationDisplayFormat ?? self.requiredInstallationDisplayFormat, screenShotDarkPath: screenShotDarkPath ?? self.screenShotDarkPath, screenShotLightPath: screenShotLightPath ?? self.screenShotLightPath, showActivelyExploitedCVEs: showActivelyExploitedCVEs ?? self.showActivelyExploitedCVEs, showDeferralCount: showDeferralCount ?? self.showDeferralCount, + showRequiredInstallationDate: showRequiredInstallationDate ?? self.showRequiredInstallationDate, simpleMode: simpleMode ?? self.simpleMode, singleQuitButton: singleQuitButton ?? self.singleQuitButton, updateElements: updateElements ?? self.updateElements diff --git a/Nudge/UI/StandardMode/LeftSide.swift b/Nudge/UI/StandardMode/LeftSide.swift index 0d5d858f..feeb799c 100644 --- a/Nudge/UI/StandardMode/LeftSide.swift +++ b/Nudge/UI/StandardMode/LeftSide.swift @@ -37,6 +37,9 @@ struct StandardModeLeftSide: View { private var informationStack: some View { VStack(alignment: .center, spacing: interLineSpacing) { InfoRow(label: "Required OS Version:", value: String(appState.requiredMinimumOSVersion), boldText: true) + if UserInterfaceVariables.showRequiredInstallationDate { + 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) } @@ -82,12 +85,15 @@ struct InfoRow: View { Text(value) .foregroundColor(appState.differentiateWithoutColor ? .accessibleRed : .red) .fontWeight(.bold) + .minimumScaleFactor(0.01) } else { Text(value) .foregroundColor(colorScheme == .light ? .accessibleSecondaryLight : .accessibleSecondaryDark) .fontWeight(boldText ? .bold : .regular) + .minimumScaleFactor(0.01) } } + .lineLimit(1) } } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 74380132..05e7d362 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -488,6 +488,12 @@ struct DateManager { return formatter }() + func coerceDateToString(date: Date, formatterString: String) -> String { + let formatter = DateFormatter() + formatter.dateFormat = formatterString + return formatter.string(from: date) + } + func coerceStringToDate(dateString: String) -> Date { dateFormatterISO8601.date(from: dateString) ?? getCurrentDate() } From 4b1f4dd39733cb5aedc562f1447970f0f9d8c310 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Fri, 31 May 2024 16:26:26 -0500 Subject: [PATCH 078/141] change key name to allow artificial nudge event delays --- CHANGELOG.md | 3 ++- .../Preferences/DefaultPreferencesNudge.swift | 6 +++--- Nudge/Preferences/PreferencesStructure.swift | 6 +++--- Nudge/UI/Main.swift | 6 +++--- Nudge/Utilities/Utils.swift | 19 ++++++++----------- 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3c93bc2..41ba76cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - `nonActivelyExploitedCVEsSLA` under the `osVersionRequirement` key will default to 21 days - `standardInstallationSLA` under the `osVersionRequirement` key will default to 28 days - These dates are calculated against the `ReleaseDate` key in the SOFA feed - - To artificially change the `ReleaseDate` thereby giving your users a default grace period for all SOFA OS updates, please configure the `sofaPeriodLaunchDelay` key under `userExperience` + - To artificially delay the SOFA nudge events, see the details below for `nudgeEventLaunchDelay` - If you'd like to not have nudge events for releases without any known CVEs, please configure the `disableNudgeForStandardInstalls` key under `optionalFeatures` to true ### Fixed @@ -35,6 +35,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - Fixed errors when moving to Swift 5.10 ### Added +- To artificially change the `requredInstallationDate` thereby giving your users a default grace period for all Nudge events updates, please configure the `nudgeEventLaunchDelay` key under `userExperience` - A local image path can now be specified for the notification event when Nudge terminates and application - Please configure the `applicationTerminatedNotificationImagePath` key under `userInterface` - Due to limitations within Apple's API, a local path is only supported at this time diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 911dd300..43a7fd9e 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -364,9 +364,9 @@ struct UserExperienceVariables { false } - static var sofaPeriodLaunchDelay: Int { - userExperienceProfile?["sofaPeriodLaunchDelay"] as? Int ?? - userExperienceJSON?.sofaPeriodLaunchDelay ?? + static var nudgeEventLaunchDelay: Int { + userExperienceProfile?["nudgeEventLaunchDelay"] as? Int ?? + userExperienceJSON?.nudgeEventLaunchDelay ?? 0 } } diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 35aced37..047d6404 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -324,7 +324,7 @@ struct UserExperience: Codable { var noTimers: Bool? var nudgeRefreshCycle: Int? var randomDelay: Bool? - var sofaPeriodLaunchDelay: Int? + var nudgeEventLaunchDelay: Int? } // MARK: UserExperience convenience initializers and mutators @@ -368,7 +368,7 @@ extension UserExperience { noTimers: Bool? = nil, nudgeRefreshCycle: Int? = nil, randomDelay: Bool? = nil, - sofaPeriodLaunchDelay: Int? = nil + nudgeEventLaunchDelay: Int? = nil ) -> UserExperience { return UserExperience( allowGracePeriods: allowGracePeriods ?? self.allowGracePeriods, @@ -393,7 +393,7 @@ extension UserExperience { noTimers: noTimers ?? self.noTimers, nudgeRefreshCycle: nudgeRefreshCycle ?? self.nudgeRefreshCycle, randomDelay: randomDelay ?? self.randomDelay, - sofaPeriodLaunchDelay: sofaPeriodLaunchDelay ?? self.sofaPeriodLaunchDelay + nudgeEventLaunchDelay: nudgeEventLaunchDelay ?? self.nudgeEventLaunchDelay ) } } diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index f6d0088d..c31aef6d 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -264,7 +264,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { handleCommandLineArguments() applyGracePeriodLogic() sofaPreLaunchLogic() - applySOFAPeriodLogic() + applydelayNudgeEventLogic() applyRandomDelayIfNecessary() updateNudgeState() handleSoftwareUpdateRequirements() @@ -340,8 +340,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } - private func applySOFAPeriodLogic() { - _ = AppStateManager().sofaPeriodLogic() + private func applydelayNudgeEventLogic() { + _ = AppStateManager().delayNudgeEventLogic() if nudgePrimaryState.shouldExit { exit(0) } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 05e7d362..59905716 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -176,18 +176,15 @@ struct AppStateManager { return calculateNewRequiredInstallationDateIfNeeded(currentDate: currentDate, gracePeriodPathCreationDate: gracePeriodPathCreationDate) } - func sofaPeriodLogic(currentDate: Date = DateManager().getCurrentDate(), testFileDate: Date? = nil) -> Date { - if OptionalFeatureVariables.utilizeSOFAFeed { - if releaseDate.addingTimeInterval(TimeInterval(UserExperienceVariables.sofaPeriodLaunchDelay * 86400)) > currentDate { - LogManager.info("Device within sofaPeriodLaunchDelay, exiting Nudge", logger: uiLog) - nudgePrimaryState.shouldExit = true - return currentDate - } else { - LogManager.info("Device outside sofaPeriodLaunchDelay", logger: uiLog) - return PrefsWrapper.requiredInstallationDate - } + func delayNudgeEventLogic(currentDate: Date = DateManager().getCurrentDate(), testFileDate: Date? = nil) -> Date { + if releaseDate.addingTimeInterval(TimeInterval(UserExperienceVariables.nudgeEventLaunchDelay * 86400)) > currentDate { + LogManager.info("Device within nudgeEventLaunchDelay, exiting Nudge", logger: uiLog) + nudgePrimaryState.shouldExit = true + return currentDate + } else { + LogManager.info("Device outside nudgeEventLaunchDelay", logger: uiLog) + return PrefsWrapper.requiredInstallationDate } - return PrefsWrapper.requiredInstallationDate } private func isDeferralAllowed(threshold: Int, logMessage: String) -> Bool { From 0add0657aa5dc03125db6834354dfbb82eaefe03 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 4 Jun 2024 14:51:56 -0500 Subject: [PATCH 079/141] fix bug in launch delay logic --- Nudge/Utilities/Utils.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 59905716..3d3d36ff 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -177,6 +177,9 @@ struct AppStateManager { } func delayNudgeEventLogic(currentDate: Date = DateManager().getCurrentDate(), testFileDate: Date? = nil) -> Date { + if UserExperienceVariables.nudgeEventLaunchDelay == 0 { + return PrefsWrapper.requiredInstallationDate + } if releaseDate.addingTimeInterval(TimeInterval(UserExperienceVariables.nudgeEventLaunchDelay * 86400)) > currentDate { LogManager.info("Device within nudgeEventLaunchDelay, exiting Nudge", logger: uiLog) nudgePrimaryState.shouldExit = true From 9138fb8ab8bba46bffe046abe58e73ed574d8fe6 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 6 Jun 2024 10:46:47 -0500 Subject: [PATCH 080/141] add showDaysRemainingToUpdate rename showRequiredInstallationDate to howRequiredDate --- CHANGELOG.md | 4 +++- .../com.github.macadmins.Nudge.tester.json | 2 +- Nudge/Preferences/DefaultPreferencesNudge.swift | 12 +++++++++--- Nudge/Preferences/PreferencesStructure.swift | 8 +++++--- Nudge/UI/StandardMode/LeftSide.swift | 10 ++++++---- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41ba76cd..8021f798 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - These dates are calculated against the `ReleaseDate` key in the SOFA feed - To artificially delay the SOFA nudge events, see the details below for `nudgeEventLaunchDelay` - If you'd like to not have nudge events for releases without any known CVEs, please configure the `disableNudgeForStandardInstalls` key under `optionalFeatures` to true +- You can now disable the `Days Remaining To Update:` item on the left side of the UI. + - Configure the `showDaysRemainingToUpdate` key under `userInterface` to false ### Fixed - `screenshotDisplay` view had a bug that may result in the screenshot being partially cut off or zoomable @@ -61,7 +63,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - `unsupportedURL` and `unsupportedURLs` can change the information button itself, but it will remain in the `osVersionRequirement` key with `unsupportedURLs` and `unsupportedURLs`. - An icon will appear as an overlay on top of the company image to further emphasize the device is no longer supported - An admin can now show the `requiredInstallationDate` as a item on the left side of nudge. - - To enable this, please configure the `showRequiredInstallationDate` key under `userInterface` to true + - To enable this, please configure the `showRequiredDate` key under `userInterface` to true - You can also expirement with the format of this date through the key `requiredInstallationDisplayFormat` under `userInterface` - Be aware that the format you desire may not look good on the UI. diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index a6dfcd32..bbb76397 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -38,7 +38,7 @@ "screenShotDarkPath": "https://github.com/macadmins/nudge/blob/main/assets/standard_mode/demo_dark_1_icon.png?raw=true", "screenShotLightPath": "https://github.com/macadmins/nudge/blob/main/assets/standard_mode/demo_light_1_icon.png?raw=true", "applicationTerminatedNotificationImagePath": "/Library/Application Support/Nudge/logoLight.png", - "showRequiredInstallationDate": true, + "showRequiredDate": true, "simpleMode": false, "updateElements": [ { diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 43a7fd9e..1f143d64 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -528,9 +528,15 @@ struct UserInterfaceVariables { true } - static var showRequiredInstallationDate: Bool { - userInterfaceProfile?["showRequiredInstallationDate"] as? Bool ?? - userInterfaceJSON?.showRequiredInstallationDate ?? + static var showDaysRemainingToUpdate: Bool { + userInterfaceProfile?["showDaysRemainingToUpdate"] as? Bool ?? + userInterfaceJSON?.showDaysRemainingToUpdate ?? + true + } + + static var showRequiredDate: Bool { + userInterfaceProfile?["showRequiredDate"] as? Bool ?? + userInterfaceJSON?.showRequiredDate ?? false } diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 047d6404..1bce436c 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -403,7 +403,7 @@ struct UserInterface: Codable { var actionButtonPath, applicationTerminatedNotificationImagePath, fallbackLanguage: String? var forceFallbackLanguage, forceScreenShotIcon: Bool? var iconDarkPath, iconLightPath, requiredInstallationDisplayFormat, screenShotDarkPath, screenShotLightPath: String? - var showActivelyExploitedCVEs, showDeferralCount, showRequiredInstallationDate, simpleMode, singleQuitButton: Bool? + var showActivelyExploitedCVEs, showDeferralCount, showDaysRemainingToUpdate, showRequiredDate, simpleMode, singleQuitButton: Bool? var updateElements: [UpdateElement]? } @@ -438,7 +438,8 @@ extension UserInterface { screenShotLightPath: String? = nil, showActivelyExploitedCVEs: Bool? = nil, showDeferralCount: Bool? = nil, - showRequiredInstallationDate: Bool? = nil, + showDaysRemainingToUpdate: Bool? = nil, + showRequiredDate: Bool? = nil, simpleMode: Bool? = nil, singleQuitButton: Bool? = nil, updateElements: [UpdateElement]? = nil @@ -456,7 +457,8 @@ extension UserInterface { screenShotLightPath: screenShotLightPath ?? self.screenShotLightPath, showActivelyExploitedCVEs: showActivelyExploitedCVEs ?? self.showActivelyExploitedCVEs, showDeferralCount: showDeferralCount ?? self.showDeferralCount, - showRequiredInstallationDate: showRequiredInstallationDate ?? self.showRequiredInstallationDate, + showDaysRemainingToUpdate: showDaysRemainingToUpdate ?? self.showDaysRemainingToUpdate, + showRequiredDate: showRequiredDate ?? self.showRequiredDate, simpleMode: simpleMode ?? self.simpleMode, singleQuitButton: singleQuitButton ?? self.singleQuitButton, updateElements: updateElements ?? self.updateElements diff --git a/Nudge/UI/StandardMode/LeftSide.swift b/Nudge/UI/StandardMode/LeftSide.swift index feeb799c..3c429933 100644 --- a/Nudge/UI/StandardMode/LeftSide.swift +++ b/Nudge/UI/StandardMode/LeftSide.swift @@ -37,14 +37,16 @@ struct StandardModeLeftSide: View { private var informationStack: some View { VStack(alignment: .center, spacing: interLineSpacing) { InfoRow(label: "Required OS Version:", value: String(appState.requiredMinimumOSVersion), boldText: true) - if UserInterfaceVariables.showRequiredInstallationDate { + if UserInterfaceVariables.showRequiredDate { 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) } InfoRow(label: "Current OS Version:", value: GlobalVariables.currentOSVersion) - remainingTimeRow + if UserInterfaceVariables.showDaysRemainingToUpdate { + remainingTimeRow + } if UserInterfaceVariables.showDeferralCount { InfoRow(label: "Deferred Count:", value: String(appState.userDeferrals)) } @@ -54,7 +56,7 @@ struct StandardModeLeftSide: View { private var remainingTimeRow: some View { Group { - if shouldShowDaysRemaining { + if shouldshowDaysRemainingToUpdate { InfoRow(label: "Days Remaining To Update:", value: String(appState.daysRemaining), isHighlighted: 0 > appState.daysRemaining ? true : false) } else { InfoRow(label: "Hours Remaining To Update:", value: String(appState.hoursRemaining), isHighlighted: true) @@ -62,7 +64,7 @@ struct StandardModeLeftSide: View { } } - private var shouldShowDaysRemaining: Bool { + private var shouldshowDaysRemainingToUpdate: Bool { ((appState.daysRemaining > 0 || 0 > appState.hoursRemaining) && !CommandLineUtilities().demoModeEnabled()) || CommandLineUtilities().demoModeEnabled() } } From bfbbe7fd5c388ef224f8d2107c925cd53e527f69 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 6 Jun 2024 11:19:30 -0500 Subject: [PATCH 081/141] update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8021f798..130f0c88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - `activelyExploitedCVEsInstallationSLA` under the `osVersionRequirement` key will default to 14 days - `nonActivelyExploitedCVEsSLA` under the `osVersionRequirement` key will default to 21 days - `standardInstallationSLA` under the `osVersionRequirement` key will default to 28 days - - These dates are calculated against the `ReleaseDate` key in the SOFA feed + - These dates are calculated against the `ReleaseDate` key in the SOFA feed, which is UTC formatted. Local timezones will **not be supported** with the automatic sofa feed unless you use a custom feed and change this value yourself, following ISO-8601 date formats - To artificially delay the SOFA nudge events, see the details below for `nudgeEventLaunchDelay` - If you'd like to not have nudge events for releases without any known CVEs, please configure the `disableNudgeForStandardInstalls` key under `optionalFeatures` to true - You can now disable the `Days Remaining To Update:` item on the left side of the UI. @@ -54,7 +54,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - Utilizing Apple's markdown features, you can now utilize, bold, italic, underline, subscript and url links directly into any of the text fields - [SOFA](https://github.com/macadmins/sofa) feed support - Set the `utilizeSOFAFeed` key `true` under `optionalFeatures` to enable this feature - - Nudge will by default check the feed every 24 hours. + - Nudge will by default check the feed every 24 hours and save a cache file under `~/Library/Application Support/com.github.macadmins.Nudge/sofa-macos_data_feed.json` - In order to change this, please configure the `refreshSOFAFeedTime` key under `optionalFeatures` in seconds - If you are utilizing a custom sofa feed, please configure the `customSOFAFeedURL` key under `optionalFeatures` - "Unsupported device" UI in standard mode that utilizes the SOFA feed From 3bafde231f527ad32d0ed0486ff960e41ab9c861 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 13 Jun 2024 12:29:10 -0500 Subject: [PATCH 082/141] add some sequoia info --- Example Assets/com.github.macadmins.Nudge.tester.json | 2 +- Nudge/Preferences/DefaultPreferencesNudge.swift | 2 ++ Nudge/Utilities/Utils.swift | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index bbb76397..6e005741 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -20,7 +20,7 @@ "osVersionRequirements": [ { "aboutUpdateURL": "https://apple.com", - "requiredMinimumOSVersion": "14.6", + "requiredMinimumOSVersion": "15.99", "requiredInstallationDate": "2025-01-01T00:00:00Z", "unsupportedURL": "https://google.com", } diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 1f143d64..fdfc7950 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -597,6 +597,7 @@ let builtInAcceptableApplicationBundleIDs = [ "com.apple.InstallAssistant.macOSMonterey", "com.apple.InstallAssistant.macOSVentura", "com.apple.InstallAssistant.macOSSonoma", + "com.apple.InstallAssistant.macOSSequoia", "com.apple.loginwindow", "com.apple.MobileAsset.MacSoftwareUpdate", "com.apple.ScreenSaver.Engine", @@ -609,6 +610,7 @@ let builtInAcceptableApplicationBundleIDs = [ "com.apple.InstallAssistant.macOSMonterey", "com.apple.InstallAssistant.macOSVentura", "com.apple.InstallAssistant.macOSSonoma", + "com.apple.InstallAssistant.macOSSequoia", "com.apple.loginwindow", "com.apple.MobileAsset.MacSoftwareUpdate", "com.apple.ScreenSaver.Engine", diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 3d3d36ff..8b335b85 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -976,6 +976,8 @@ struct NetworkFileManager { return "/Applications/Install macOS Ventura.app" case 14: return "/Applications/Install macOS Sonoma.app" + case 15: + return "/Applications/Install macOS Sequoia.app" default: return "/System/Library/CoreServices/Software Update.app" } From 6fa91df41b72afd73b709b50e222a0462a08db26 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 17 Jun 2024 12:06:37 -0500 Subject: [PATCH 083/141] add honorFocusModes key and logic --- .../com.github.macadmins.Nudge.tester.json | 1 + Nudge/Info.plist | 2 ++ Nudge/Nudge.entitlements | 4 ++-- Nudge/Preferences/DefaultPreferencesNudge.swift | 6 ++++++ Nudge/Preferences/PreferencesStructure.swift | 4 +++- Nudge/Utilities/Utils.swift | 17 +++++++++++++++++ 6 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 6e005741..823d5ccf 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -14,6 +14,7 @@ "com.apple.Safari" ], "disableNudgeForStandardInstalls": true, + "honorFocusModes": true, "terminateApplicationsOnLaunch": true, "utilizeSOFAFeed": false }, diff --git a/Nudge/Info.plist b/Nudge/Info.plist index 9eee977e..8ae12fc5 100644 --- a/Nudge/Info.plist +++ b/Nudge/Info.plist @@ -24,5 +24,7 @@ $(MACOSX_DEPLOYMENT_TARGET) LSUIElement + NSFocusStatusUsageDescription + Obtains Focus status to determine if the user is in a Focus mode and honor its value. diff --git a/Nudge/Nudge.entitlements b/Nudge/Nudge.entitlements index e71e2ff7..92fa7c9b 100644 --- a/Nudge/Nudge.entitlements +++ b/Nudge/Nudge.entitlements @@ -2,11 +2,11 @@ - com.apple.security.get-task-allow - com.apple.security.app-sandbox com.apple.security.files.user-selected.read-write + com.apple.security.get-task-allow + diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index fdfc7950..89030b8a 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -155,6 +155,12 @@ struct OptionalFeatureVariables { true } + static var honorFocusModes: Bool { + optionalFeaturesProfile?["honorFocusModes"] as? Bool ?? + optionalFeaturesJSON?.honorFocusModes ?? + false + } + static var refreshSOFAFeedTime: Int { optionalFeaturesProfile?["refreshSOFAFeedTime"] as? Int ?? optionalFeaturesJSON?.refreshSOFAFeedTime ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 1bce436c..f1b14978 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -54,7 +54,7 @@ struct OptionalFeatures: Codable { var acceptableAssertionUsage, acceptableCameraUsage, acceptableScreenSharingUsage, aggressiveUserExperience, aggressiveUserFullScreenExperience, asynchronousSoftwareUpdate, attemptToBlockApplicationLaunches, attemptToCheckForSupportedDevice, attemptToFetchMajorUpgrade: Bool? var blockedApplicationBundleIDs: [String]? var customSOFAFeedURL: String? - var disableNudgeForStandardInstalls, disableSoftwareUpdateWorkflow, enforceMinorUpdates: Bool? + var disableNudgeForStandardInstalls, disableSoftwareUpdateWorkflow, enforceMinorUpdates, honorFocusModes: Bool? var refreshSOFAFeedTime: Int? var terminateApplicationsOnLaunch, utilizeSOFAFeed: Bool? } @@ -94,6 +94,7 @@ extension OptionalFeatures { disableNudgeForStandardInstalls: Bool? = nil, disableSoftwareUpdateWorkflow: Bool? = nil, enforceMinorUpdates: Bool? = nil, + honorFocusModes: Bool? = nil, refreshSOFAFeedTime: Int? = nil, terminateApplicationsOnLaunch: Bool? = nil, utilizeSOFAFeed: Bool? = nil @@ -115,6 +116,7 @@ extension OptionalFeatures { disableNudgeForStandardInstalls: disableNudgeForStandardInstalls ?? self.disableNudgeForStandardInstalls, disableSoftwareUpdateWorkflow: disableSoftwareUpdateWorkflow ?? self.disableSoftwareUpdateWorkflow, enforceMinorUpdates: enforceMinorUpdates ?? self.enforceMinorUpdates, + honorFocusModes: honorFocusModes ?? self.honorFocusModes, refreshSOFAFeedTime: refreshSOFAFeedTime ?? self.refreshSOFAFeedTime, terminateApplicationsOnLaunch: terminateApplicationsOnLaunch ?? self.terminateApplicationsOnLaunch, utilizeSOFAFeed: utilizeSOFAFeed ?? self.utilizeSOFAFeed diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 8b335b85..2bec5077 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -8,6 +8,7 @@ import AppKit import CoreMediaIO import Foundation +import Intents import IOKit #if canImport(ServiceManagement) import ServiceManagement @@ -15,8 +16,24 @@ import ServiceManagement import SwiftUI import SystemConfiguration + struct AppStateManager { func activateNudge() { + if OptionalFeatureVariables.honorFocusModes { + LogManager.info("honorFocusModes is configured - checking focus status", logger: utilsLog) + + // Request the current focus status + INFocusStatusCenter.default.requestAuthorization { status in + if status == .authorized { + if INFocusStatusCenter.default.focusStatus.isFocused == true { + LogManager.info("Device has focus modes set - bypassing activation event", logger: utilsLog) + return + } + } else { + LogManager.info("Focus status authorization not granted", logger: utilsLog) + } + } + } LogManager.info("Activating Nudge", logger: utilsLog) nudgePrimaryState.lastRefreshTime = DateManager().getCurrentDate() guard let mainWindow = NSApp.windows.first else { return } From fe28eda2608d2c212220422652a4cae0b69590c2 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 17 Jun 2024 12:20:21 -0500 Subject: [PATCH 084/141] disable honorFocusModes for now --- Nudge/Info.plist | 2 -- Nudge/Utilities/Utils.swift | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Nudge/Info.plist b/Nudge/Info.plist index 8ae12fc5..9eee977e 100644 --- a/Nudge/Info.plist +++ b/Nudge/Info.plist @@ -24,7 +24,5 @@ $(MACOSX_DEPLOYMENT_TARGET) LSUIElement - NSFocusStatusUsageDescription - Obtains Focus status to determine if the user is in a Focus mode and honor its value. diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 2bec5077..f942428b 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -20,9 +20,12 @@ import SystemConfiguration struct AppStateManager { func activateNudge() { if OptionalFeatureVariables.honorFocusModes { + LogManager.info("honorFocusModes is configured - but this feature is not being actively developed at this time", logger: utilsLog) + return LogManager.info("honorFocusModes is configured - checking focus status", logger: utilsLog) // Request the current focus status + // TODO: This will break Nudge unless you have NSFocusStatusUsageDescription in the Info.plist INFocusStatusCenter.default.requestAuthorization { status in if status == .authorized { if INFocusStatusCenter.default.focusStatus.isFocused == true { From 856db9284baab8a27fcee5d8d81756728cc53a1d Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 17 Jun 2024 13:16:35 -0500 Subject: [PATCH 085/141] try a different but less reliable method --- Nudge/Utilities/Utils.swift | 48 ++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index f942428b..8a04ccfb 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -16,25 +16,13 @@ import ServiceManagement import SwiftUI import SystemConfiguration - struct AppStateManager { func activateNudge() { if OptionalFeatureVariables.honorFocusModes { - LogManager.info("honorFocusModes is configured - but this feature is not being actively developed at this time", logger: utilsLog) - return - LogManager.info("honorFocusModes is configured - checking focus status", logger: utilsLog) - - // Request the current focus status - // TODO: This will break Nudge unless you have NSFocusStatusUsageDescription in the Info.plist - INFocusStatusCenter.default.requestAuthorization { status in - if status == .authorized { - if INFocusStatusCenter.default.focusStatus.isFocused == true { - LogManager.info("Device has focus modes set - bypassing activation event", logger: utilsLog) - return - } - } else { - LogManager.info("Focus status authorization not granted", logger: utilsLog) - } + LogManager.info("honorFocusModes is configured - checking focus status. Warning: This feature may be unstable.", logger: utilsLog) + if isFocusModeEnabled() { + LogManager.info("Device has focus modes set - bypassing activation event", logger: utilsLog) + return } } LogManager.info("Activating Nudge", logger: utilsLog) @@ -222,6 +210,34 @@ struct AppStateManager { return isAllowed } + func isFocusModeEnabled() -> Bool { + let appID = "com.apple.controlcenter" as CFString + let key = "NSStatusItem Visible FocusModes" as CFString + let userName = kCFPreferencesCurrentUser + let hostName = kCFPreferencesAnyHost + + if let value = CFPreferencesCopyAppValue(key, appID) as? Bool { + return value + } else { + print("Key '\(key)' not found in preferences") + return false + } + + // + // // Request the current focus status + // // TODO: This will break Nudge unless you have NSFocusStatusUsageDescription in the Info.plist + // INFocusStatusCenter.default.requestAuthorization { status in + // if status == .authorized { + // if INFocusStatusCenter.default.focusStatus.isFocused == true { + // LogManager.info("Device has focus modes set - bypassing activation event", logger: utilsLog) + // return + // } + // } else { + // LogManager.info("Focus status authorization not granted", logger: utilsLog) + // } + // } + } + private func logOnce(_ message: String, state: inout Bool) { if !state { LogManager.info("\(message)", logger: uiLog) From 8707bd564efa2aedfad629ec832c39fa75ac0eed Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 17 Jun 2024 15:11:48 -0500 Subject: [PATCH 086/141] fix local and utc time --- Nudge/Preferences/PreferencesStructure.swift | 38 +++++++++++++++++--- Nudge/Utilities/Utils.swift | 12 ++++++- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index f1b14978..0aad29d4 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -18,8 +18,23 @@ struct NudgePreferences: Codable { extension NudgePreferences { init(data: Data) throws { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 // Use ISO 8601 date format - self = try decoder.decode(NudgePreferences.self, from: data) + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" + // First attempt with ISO 8601 date format + do { + decoder.dateDecodingStrategy = .iso8601 + self = try decoder.decode(NudgePreferences.self, from: data) + return + } catch { + } + + // Second attempt with custom date format + do { + decoder.dateDecodingStrategy = .formatted(dateFormatter) + self = try decoder.decode(NudgePreferences.self, from: data) + return + } catch { + } } init(_ json: String, using encoding: String.Encoding = .utf8) throws { @@ -185,8 +200,23 @@ extension OSVersionRequirement { init(data: Data) throws { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 // Use ISO 8601 date format - self = try decoder.decode(OSVersionRequirement.self, from: data) + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" + // First attempt with ISO 8601 date format + do { + decoder.dateDecodingStrategy = .iso8601 + self = try decoder.decode(OSVersionRequirement.self, from: data) + return + } catch { + } + + // Second attempt with custom date format + do { + decoder.dateDecodingStrategy = .formatted(dateFormatter) + self = try decoder.decode(OSVersionRequirement.self, from: data) + return + } catch { + } } init(_ json: String, using encoding: String.Encoding = .utf8) throws { diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 8a04ccfb..2c27f748 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -518,6 +518,12 @@ struct DateManager { return formatter }() + let dateFormatterLocalTime: DateFormatter = { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" + return formatter + }() + private let dateFormatterCurrent: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z" @@ -531,7 +537,11 @@ struct DateManager { } func coerceStringToDate(dateString: String) -> Date { - dateFormatterISO8601.date(from: dateString) ?? getCurrentDate() + if dateString.contains("Z") { + dateFormatterISO8601.date(from: dateString) ?? getCurrentDate() + } else { + dateFormatterLocalTime.date(from: dateString) ?? getCurrentDate() + } } func getCurrentDate() -> Date { From b8d81e222e08f19bd7043989d671b2f8360baa9b Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 17 Jun 2024 15:16:24 -0500 Subject: [PATCH 087/141] update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 130f0c88..4bb9fa1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - Now built on Swift 5.10, Xcode 15.4 and macOS 14 - New Xcode Scheme `-bundle-mode-profile` to test profile logic - `-bundle-mode` has been renamed to `-bundle-mode-json` +- You can now pass two formats of **strings** to `requiredInstallationDate` + - `2025-01-01T00:00:00Z` for UTC + - `2025-01-01T00:00:00` for local time + - If you are using a MDM profile and passing the original `Date` key, you must change to utilizing `String` as Apple requires ISO8601 formatted dates - You can now pass the strings `latest`, `latest-supported` and `latest-minor` in the `requiredMinimumOSVersion` key - `latest`: always force latest release and if the machine can't this version, show the new "unsupported device" user interface - `latest-supported`: always get the latest version sofa shows that is supported by this device From 840e781df6806e1516a75f80096b32b1fe5f002c Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 17 Jun 2024 16:06:17 -0500 Subject: [PATCH 088/141] fix non gregorian requiredInstallationDate --- Nudge/Utilities/Utils.swift | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 2c27f748..1f8d81b0 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -524,12 +524,6 @@ struct DateManager { return formatter }() - private let dateFormatterCurrent: DateFormatter = { - let formatter = DateFormatter() - formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z" - return formatter - }() - func coerceDateToString(date: Date, formatterString: String) -> String { let formatter = DateFormatter() formatter.dateFormat = formatterString @@ -544,6 +538,20 @@ struct DateManager { } } + func convertToUserCalendar(date: Date) -> Date { + let userCalendar = Calendar.current + + // Get date components in the user's calendar + let components = userCalendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date) + + // Create a new Date object in the user's calendar + if let userCalendarDate = userCalendar.date(from: components) { + return userCalendarDate + } else { + return date + } + } + func getCurrentDate() -> Date { switch Calendar.current.identifier { case .buddhist, .japanese, .gregorian, .coptic, .ethiopicAmeteMihret, .hebrew, .iso8601, .indian, .islamic, .islamicCivil, .islamicTabular, .islamicUmmAlQura, .persian: @@ -556,10 +564,10 @@ struct DateManager { func getFormattedDate(date: Date? = nil) -> Date { let initialDate = dateFormatterISO8601.date(from: dateFormatterISO8601.string(from: date ?? Date())) ?? Date() switch Calendar.current.identifier { - case .gregorian, .buddhist, .iso8601, .japanese: + case .gregorian: return initialDate default: - return dateFormatterCurrent.date(from: dateFormatterISO8601.string(from: initialDate)) ?? Date() + return convertToUserCalendar(date: initialDate) } } From 175549c475606cd72bc0a052688f2bd1e4c3c85f Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 17 Jun 2024 16:08:27 -0500 Subject: [PATCH 089/141] update changelog for non gregorian calendars --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bb9fa1d..f7ec8482 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - More descriptive logs when loading json/mdm profile keys - Refactor portions of the `softwareupdate` logic to reduce potential errors - Fixed errors when moving to Swift 5.10 +- Fixed wrong `requiredInstallationDate` calculations when using [Non-Gregorian calendars](https://github.com/macadmins/nudge/issues/509) ### Added - To artificially change the `requredInstallationDate` thereby giving your users a default grace period for all Nudge events updates, please configure the `nudgeEventLaunchDelay` key under `userExperience` From b473b1fc298f8d2efe598ab6979406cdbf18972b Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 26 Jun 2024 11:34:11 -0500 Subject: [PATCH 090/141] move to multiple hardware checks --- .../com.github.macadmins.Nudge.tester.json | 3 +- Nudge/UI/Defaults.swift | 2 +- Nudge/UI/Main.swift | 8 ++++-- Nudge/Utilities/Utils.swift | 28 +++++++------------ 4 files changed, 17 insertions(+), 24 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 823d5ccf..8a258cc3 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -15,8 +15,7 @@ ], "disableNudgeForStandardInstalls": true, "honorFocusModes": true, - "terminateApplicationsOnLaunch": true, - "utilizeSOFAFeed": false + "terminateApplicationsOnLaunch": true }, "osVersionRequirements": [ { diff --git a/Nudge/UI/Defaults.swift b/Nudge/UI/Defaults.swift index 0dc8e5cf..bcf3cdc6 100644 --- a/Nudge/UI/Defaults.swift +++ b/Nudge/UI/Defaults.swift @@ -29,7 +29,7 @@ struct Globals { // Device Properties static let gdmfAssets = NetworkFileManager().getGDMFAssets() static let sofaAssets = NetworkFileManager().getSOFAAssets() - static let hardwareModelID = DeviceManager().getHardwareModelID() + static let hardwareModelIDs = DeviceManager().getHardwareModelIDs() } struct Intervals { diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index c31aef6d..716386e3 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -192,7 +192,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { } else if PrefsWrapper.requiredMinimumOSVersion == "latest-supported" { if OptionalFeatureVariables.attemptToCheckForSupportedDevice { selectedOS = osVersion.securityReleases.first - if !selectedOS!.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) { + if !selectedOS!.supportedDevices.contains(where: { supportedDevice in Globals.hardwareModelIDs.contains { $0.uppercased() == supportedDevice.uppercased() } }) { continue } } else { @@ -238,8 +238,10 @@ class AppDelegate: NSObject, NSApplicationDelegate { LogManager.notice("SOFA CVEs: \(selectedOS!.cves)", logger: sofaLog) if OptionalFeatureVariables.attemptToCheckForSupportedDevice { - LogManager.notice("Assessed Model ID: \(Globals.hardwareModelID)", logger: sofaLog) - let deviceMatchFound = selectedOS!.supportedDevices.contains(where: { $0.uppercased() == Globals.hardwareModelID.uppercased() }) + LogManager.notice("Assessed Model IDs: \(Globals.hardwareModelIDs)", logger: sofaLog) + let deviceMatchFound = selectedOS!.supportedDevices.contains { supportedDevice in + Globals.hardwareModelIDs.contains { $0.uppercased() == supportedDevice.uppercased() } + } LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 1f8d81b0..13a1c726 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -648,25 +648,17 @@ struct DeviceManager { getSysctlValue(for: "hw.model") ?? "" } - func getHardwareModelID() -> String { - var hardwareModelID = "" - if DeviceManager().getCPUTypeString() == "Apple Silicon" { - // There is no local bridge - hardwareModelID = getIORegInfo(serviceTarget: "target-sub-type") ?? "Unknown" - } else { - // Attempt localbridge for T2, if it fails, it's likely a T1 or lower - let bridgeID = getBridgeModelID() - let boardID = getIORegInfo(serviceTarget: "board-id") - if bridgeID.isEmpty { - // Fallback to boardID for T1 - hardwareModelID = boardID ?? "Unknown" - } else { - // T2 uses bridge ID for it's update brain via gdmf - hardwareModelID = bridgeID - } - } + func getHardwareModelIDs() -> [String] { + let boardID = getIORegInfo(serviceTarget: "board-id") ?? "Unknown" + let bridgeID = getBridgeModelID() + let hardwareModelID = getIORegInfo(serviceTarget: "target-sub-type") ?? "Unknown" + + LogManager.debug("Hardware Board ID: \(boardID)", logger: utilsLog) + LogManager.debug("Hardware Bridge ID: \(bridgeID)", logger: utilsLog) LogManager.debug("Hardware Model ID: \(hardwareModelID)", logger: utilsLog) - return hardwareModelID.trimmingCharacters(in: .whitespacesAndNewlines) + + + return [boardID.trimmingCharacters(in: .whitespacesAndNewlines), bridgeID.trimmingCharacters(in: .whitespacesAndNewlines), hardwareModelID.trimmingCharacters(in: .whitespacesAndNewlines)] } func getHardwareUUID() -> String { From 3cf7b62e07ad85ade2fe0cf83a4273223830d118 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 26 Jun 2024 11:34:55 -0500 Subject: [PATCH 091/141] utilizeSOFAFeed is not opt-out --- Nudge/Preferences/DefaultPreferencesNudge.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 89030b8a..41f6abea 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -176,7 +176,7 @@ struct OptionalFeatureVariables { static var utilizeSOFAFeed: Bool { optionalFeaturesProfile?["utilizeSOFAFeed"] as? Bool ?? optionalFeaturesJSON?.utilizeSOFAFeed ?? - false + true } } From b27875e937067c53a6c446460f91b1928231bc91 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 26 Jun 2024 11:36:23 -0500 Subject: [PATCH 092/141] changelog utilizeSOFAFeed per opt-out --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7ec8482..91439a55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - `latest`: always force latest release and if the machine can't this version, show the new "unsupported device" user interface - `latest-supported`: always get the latest version sofa shows that is supported by this device - `latest-minor`: stay in the current major release and get the latest minor updates available - - This requires utilizing the SOFA feed features to properly work + - This requires utilizing the SOFA feed features to properly work, which is opt-out by default - Nudge will then utilize two date integers to automatically calculate the `requiredInstallationDate` - `activelyExploitedCVEsInstallationSLA` under the `osVersionRequirement` key will default to 14 days - `nonActivelyExploitedCVEsSLA` under the `osVersionRequirement` key will default to 21 days @@ -58,7 +58,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - Basic SwiftUI support for Markdown text options - Utilizing Apple's markdown features, you can now utilize, bold, italic, underline, subscript and url links directly into any of the text fields - [SOFA](https://github.com/macadmins/sofa) feed support - - Set the `utilizeSOFAFeed` key `true` under `optionalFeatures` to enable this feature + - Set the `utilizeSOFAFeed` key `false` under `optionalFeatures` to disable this feature - Nudge will by default check the feed every 24 hours and save a cache file under `~/Library/Application Support/com.github.macadmins.Nudge/sofa-macos_data_feed.json` - In order to change this, please configure the `refreshSOFAFeedTime` key under `optionalFeatures` in seconds - If you are utilizing a custom sofa feed, please configure the `customSOFAFeedURL` key under `optionalFeatures` From 98e177ae7eb6afeb8cea75aa7c78817dcf9ae5d1 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 26 Jun 2024 15:24:40 -0500 Subject: [PATCH 093/141] fix typos --- CHANGELOG.md | 2 +- Schema/jamf/com.github.macadmins.Nudge.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91439a55..6bbc3947 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -265,7 +265,7 @@ Almost all of these changes were sent by others. Thank you for continuing to sup - `attemptToBlockApplicationLaunches` - When enabled, Nudge will attempt to block application launches after the required installation date. This key must be used in conjunction with `blockedApplicationBundleIDs`. - `blockedApplicationBundleIDs` - - The application Bundle ID which Nudge disallows from lauching after the required installation date. You can specify one or more Bundle ID. + - The application Bundle ID which Nudge disallows from launching after the required installation date. You can specify one or more Bundle ID. - `terminateApplicationsOnLaunch` - When enabled, Nudge will terminate the applications listed in blockedApplicationBundleIDs upon initial launch. diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index c5096efe..58437e20 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -171,7 +171,7 @@ ] }, "blockedApplicationBundleIDs": { - "description": "The application Bundle ID which Nudge disallows from lauching after the required installation date. (You can specify one or more Bundle ID.)", + "description": "The application Bundle ID which Nudge disallows from launching after the required installation date. (You can specify one or more Bundle ID.)", "anyOf": [ { "title": "Not Configured", From bb6dee953e59f7d30730b00b7e457d7614ea21f0 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 26 Jun 2024 15:56:55 -0500 Subject: [PATCH 094/141] add honorCycleTimersOnExit support --- CHANGELOG.md | 3 +++ Nudge/Preferences/DefaultPreferencesNudge.swift | 6 ++++++ Nudge/Preferences/PreferencesStructure.swift | 4 +++- Nudge/UI/Common/QuitButtons.swift | 6 +++++- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bbc3947..91ec325f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,9 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - To enable this, please configure the `showRequiredDate` key under `userInterface` to true - You can also expirement with the format of this date through the key `requiredInstallationDisplayFormat` under `userInterface` - Be aware that the format you desire may not look good on the UI. +- Nudge can now honor the current cycle timers when user's press the `Quit` button. + - Set the `honorCycleTimersOnExit` key to `true` under `optionalFeatures` to enable this feature + - [Issue 548](https://github.com/macadmins/nudge/issues/548) ## [1.1.16] - 2024-03-13 This will be the **final Nudge release** for macOS 11 and potentially other versions of macOS. diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 41f6abea..5c90a97c 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -161,6 +161,12 @@ struct OptionalFeatureVariables { false } + static var honorCycleTimersOnExit: Bool { + optionalFeaturesProfile?["honorCycleTimersOnExit"] as? Bool ?? + optionalFeaturesJSON?.honorCycleTimersOnExit ?? + false + } + static var refreshSOFAFeedTime: Int { optionalFeaturesProfile?["refreshSOFAFeedTime"] as? Int ?? optionalFeaturesJSON?.refreshSOFAFeedTime ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 0aad29d4..e94218a6 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -69,7 +69,7 @@ struct OptionalFeatures: Codable { var acceptableAssertionUsage, acceptableCameraUsage, acceptableScreenSharingUsage, aggressiveUserExperience, aggressiveUserFullScreenExperience, asynchronousSoftwareUpdate, attemptToBlockApplicationLaunches, attemptToCheckForSupportedDevice, attemptToFetchMajorUpgrade: Bool? var blockedApplicationBundleIDs: [String]? var customSOFAFeedURL: String? - var disableNudgeForStandardInstalls, disableSoftwareUpdateWorkflow, enforceMinorUpdates, honorFocusModes: Bool? + var disableNudgeForStandardInstalls, disableSoftwareUpdateWorkflow, enforceMinorUpdates, honorFocusModes, honorCycleTimersOnExit: Bool? var refreshSOFAFeedTime: Int? var terminateApplicationsOnLaunch, utilizeSOFAFeed: Bool? } @@ -110,6 +110,7 @@ extension OptionalFeatures { disableSoftwareUpdateWorkflow: Bool? = nil, enforceMinorUpdates: Bool? = nil, honorFocusModes: Bool? = nil, + honorCycleTimersOnExit: Bool? = nil, refreshSOFAFeedTime: Int? = nil, terminateApplicationsOnLaunch: Bool? = nil, utilizeSOFAFeed: Bool? = nil @@ -132,6 +133,7 @@ extension OptionalFeatures { disableSoftwareUpdateWorkflow: disableSoftwareUpdateWorkflow ?? self.disableSoftwareUpdateWorkflow, enforceMinorUpdates: enforceMinorUpdates ?? self.enforceMinorUpdates, honorFocusModes: honorFocusModes ?? self.honorFocusModes, + honorCycleTimersOnExit: honorCycleTimersOnExit ?? self.honorCycleTimersOnExit, refreshSOFAFeedTime: refreshSOFAFeedTime ?? self.refreshSOFAFeedTime, terminateApplicationsOnLaunch: terminateApplicationsOnLaunch ?? self.terminateApplicationsOnLaunch, utilizeSOFAFeed: utilizeSOFAFeed ?? self.utilizeSOFAFeed diff --git a/Nudge/UI/Common/QuitButtons.swift b/Nudge/UI/Common/QuitButtons.swift index 4c200d7a..357d5f13 100644 --- a/Nudge/UI/Common/QuitButtons.swift +++ b/Nudge/UI/Common/QuitButtons.swift @@ -106,7 +106,11 @@ struct QuitButtons: View { private func standardDeferralAction() { appState.nudgeEventDate = DateManager().getCurrentDate() - UIUtilities().setDeferralTime(deferralTime: appState.nudgeEventDate) + if OptionalFeatureVariables.honorCycleTimersOnExit { + UIUtilities().setDeferralTime(deferralTime: appState.nudgeEventDate.addingTimeInterval(TimeInterval(nudgePrimaryState.timerCycle))) + } else { + UIUtilities().setDeferralTime(deferralTime: appState.nudgeEventDate) + } updateDeferralUI() } From 75870f19bea124743734a386306c44235277606c Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 26 Jun 2024 15:57:04 -0500 Subject: [PATCH 095/141] fix some localization issues --- Nudge/UI/Common/QuitButtons.swift | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Nudge/UI/Common/QuitButtons.swift b/Nudge/UI/Common/QuitButtons.swift index 357d5f13..006628c9 100644 --- a/Nudge/UI/Common/QuitButtons.swift +++ b/Nudge/UI/Common/QuitButtons.swift @@ -59,13 +59,13 @@ struct QuitButtons: View { private var deferralOptions: some View { Group { if UserExperienceVariables.allowLaterDeferralButton { - deferralButton(title: UserInterfaceVariables.primaryQuitButtonText, action: standardDeferralAction) + deferralButton(title: UserInterfaceVariables.primaryQuitButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)), action: standardDeferralAction) } if AppStateManager().allow1HourDeferral() { - deferralButton(title: UserInterfaceVariables.oneHourDeferralButtonText, action: { deferAction(by: Intervals.hourTimeInterval) }) + deferralButton(title: UserInterfaceVariables.oneHourDeferralButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)), action: { deferAction(by: Intervals.hourTimeInterval) }) } if AppStateManager().allow24HourDeferral() { - deferralButton(title: UserInterfaceVariables.oneDayDeferralButtonText, action: { deferAction(by: Intervals.dayTimeInterval) }) + deferralButton(title: UserInterfaceVariables.oneDayDeferralButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)), action: { deferAction(by: Intervals.dayTimeInterval) }) } if AppStateManager().allowCustomDeferral() { customDeferralButton @@ -115,9 +115,7 @@ struct QuitButtons: View { } private var standardQuitButton: some View { - Button(action: UIUtilities().userInitiatedExit) { - Text(UserInterfaceVariables.primaryQuitButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) - } + deferralButton(title: UserInterfaceVariables.primaryQuitButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)), action: standardDeferralAction) } private func updateDeferralUI() { From d0f002185c78962b75230234a140f08443c19a5c Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 1 Jul 2024 15:29:25 -0500 Subject: [PATCH 096/141] add additional support for not exiting when you can't fetch the upgrade --- Nudge/UI/Main.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 716386e3..d1d01796 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -500,9 +500,13 @@ class AppDelegate: NSObject, NSApplicationDelegate { private func handleAttemptToFetchMajorUpgrade() { if GlobalVariables.fetchMajorUpgradeSuccessful == false && !majorUpgradeAppPathExists && !majorUpgradeBackupAppPathExists { - LogManager.error("Unable to fetch major upgrade and application missing, exiting Nudge", logger: uiLog) - nudgePrimaryState.shouldExit = true - exit(1) + if VersionManager.versionGreaterThan(currentVersion: GlobalVariables.currentOSVersion, newVersion: "12.3") { + LogManager.info("Unable to fetch major upgrade and application missing, but macOS 12.3 and higher support delta major upgrades. Using new logic.", logger: uiLog) + } else { + LogManager.error("Unable to fetch major upgrade and application missing, exiting Nudge", logger: uiLog) + nudgePrimaryState.shouldExit = true + exit(1) + } } } From 54ee10e3887c7fb19c0bff1c16a6b2e108014911 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 1 Jul 2024 15:33:47 -0500 Subject: [PATCH 097/141] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91ec325f..13497ea8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,6 +74,8 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - Nudge can now honor the current cycle timers when user's press the `Quit` button. - Set the `honorCycleTimersOnExit` key to `true` under `optionalFeatures` to enable this feature - [Issue 548](https://github.com/macadmins/nudge/issues/548) +- When the device is running macOS 12.3 or higher, Nudge uses the delta logic for macOS Upgrades + - [Issue 417](https://github.com/macadmins/nudge/issues/417) ## [1.1.16] - 2024-03-13 This will be the **final Nudge release** for macOS 11 and potentially other versions of macOS. From 921a087d5b55431449c0a1d515e7bc7dac1811af Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 1 Jul 2024 16:41:54 -0500 Subject: [PATCH 098/141] return gestalt information --- Nudge/Utilities/Utils.swift | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 13a1c726..7617871d 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -652,13 +652,14 @@ struct DeviceManager { let boardID = getIORegInfo(serviceTarget: "board-id") ?? "Unknown" let bridgeID = getBridgeModelID() let hardwareModelID = getIORegInfo(serviceTarget: "target-sub-type") ?? "Unknown" + let gestaltModelStringID = getKeyResultFromGestalt("HWModelStr") LogManager.debug("Hardware Board ID: \(boardID)", logger: utilsLog) LogManager.debug("Hardware Bridge ID: \(bridgeID)", logger: utilsLog) LogManager.debug("Hardware Model ID: \(hardwareModelID)", logger: utilsLog) + LogManager.debug("Gestalt Hardware Model ID: \(gestaltModelStringID)", logger: utilsLog) - - return [boardID.trimmingCharacters(in: .whitespacesAndNewlines), bridgeID.trimmingCharacters(in: .whitespacesAndNewlines), hardwareModelID.trimmingCharacters(in: .whitespacesAndNewlines)] + return [boardID.trimmingCharacters(in: .whitespacesAndNewlines), bridgeID.trimmingCharacters(in: .whitespacesAndNewlines), hardwareModelID.trimmingCharacters(in: .whitespacesAndNewlines), gestaltModelStringID.trimmingCharacters(in: .whitespacesAndNewlines)] } func getHardwareUUID() -> String { @@ -706,6 +707,29 @@ struct DeviceManager { } } + func getKeyResultFromGestalt(_ keyname: String) -> String { + let handle = dlopen("/usr/lib/libMobileGestalt.dylib", RTLD_NOW) + guard handle != nil else { + return "Unknown" + } + defer { + dlclose(handle) + } + + let symbol = dlsym(handle, "MGGetStringAnswer") + guard symbol != nil else { + return "Unknown" + } + + let function = unsafeBitCast(symbol, to: (@convention(c) (String) -> String?).self) + + guard let result = function(keyname) else { + return "Unknown" + } + + return result + } + func getPatchOSVersion() -> Int { let PatchOSVersion = ProcessInfo().operatingSystemVersion.patchVersion LogManager.info("Patch OS Version: \(PatchOSVersion)", logger: utilsLog) From 45362aef7a58dafb24374ceb3e1d29b87237d48f Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 2 Jul 2024 10:23:31 -0500 Subject: [PATCH 099/141] add logic for acceptableUpdatePreparingUsage --- CHANGELOG.md | 4 + .../Preferences/DefaultPreferencesNudge.swift | 6 ++ Nudge/Preferences/PreferencesStructure.swift | 4 +- Nudge/Utilities/UILogic.swift | 96 +++++++++++++++++++ 4 files changed, 109 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13497ea8..66826ad2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -76,6 +76,10 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - [Issue 548](https://github.com/macadmins/nudge/issues/548) - When the device is running macOS 12.3 or higher, Nudge uses the delta logic for macOS Upgrades - [Issue 417](https://github.com/macadmins/nudge/issues/417) +- Nudge can now bypass activations and re-activations when a macOS update is `Downloading`, `Preparing` or `Staged` for installation. + - To enable this, please configure the `acceptableUpdatePreparingUsage` key under `optionalFeatures` to true + - Be aware that the current logic used for this **cannot differentiate** when an update has completed preparing and is in the `Staged` phase, waiting for a user to reboot. This is due to an Apple process staying in memory. This will result in a reduction in Nudge re-activations + - Issue [555](https://github.com/macadmins/nudge/issues/555) ## [1.1.16] - 2024-03-13 This will be the **final Nudge release** for macOS 11 and potentially other versions of macOS. diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 5c90a97c..870cfb6b 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -82,6 +82,12 @@ struct OptionalFeatureVariables { optionalFeaturesJSON?.acceptableCameraUsage ?? false } + + static var acceptableUpdatePreparingUsage: Bool { + optionalFeaturesProfile?["acceptableUpdatePreparingUsage"] as? Bool ?? + optionalFeaturesJSON?.acceptableUpdatePreparingUsage ?? + false + } static var acceptableScreenSharingUsage: Bool { optionalFeaturesProfile?["acceptableScreenSharingUsage"] as? Bool ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index e94218a6..c564e58e 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -66,7 +66,7 @@ extension NudgePreferences { // MARK: - OptionalFeatures struct OptionalFeatures: Codable { var acceptableApplicationBundleIDs, acceptableAssertionApplicationNames: [String]? - var acceptableAssertionUsage, acceptableCameraUsage, acceptableScreenSharingUsage, aggressiveUserExperience, aggressiveUserFullScreenExperience, asynchronousSoftwareUpdate, attemptToBlockApplicationLaunches, attemptToCheckForSupportedDevice, attemptToFetchMajorUpgrade: Bool? + var acceptableAssertionUsage, acceptableCameraUsage, acceptableUpdatePreparingUsage, acceptableScreenSharingUsage, aggressiveUserExperience, aggressiveUserFullScreenExperience, asynchronousSoftwareUpdate, attemptToBlockApplicationLaunches, attemptToCheckForSupportedDevice, attemptToFetchMajorUpgrade: Bool? var blockedApplicationBundleIDs: [String]? var customSOFAFeedURL: String? var disableNudgeForStandardInstalls, disableSoftwareUpdateWorkflow, enforceMinorUpdates, honorFocusModes, honorCycleTimersOnExit: Bool? @@ -97,6 +97,7 @@ extension OptionalFeatures { acceptableAssertionApplicationNames: [String]? = nil, acceptableAssertionUsage: Bool? = nil, acceptableCameraUsage: Bool? = nil, + acceptableUpdatePreparingUsage: Bool? = nil, acceptableScreenSharingUsage: Bool? = nil, aggressiveUserExperience: Bool? = nil, aggressiveUserFullScreenExperience: Bool? = nil, @@ -120,6 +121,7 @@ extension OptionalFeatures { acceptableAssertionApplicationNames: acceptableAssertionApplicationNames ?? self.acceptableAssertionApplicationNames, acceptableAssertionUsage: acceptableAssertionUsage ?? self.acceptableAssertionUsage, acceptableCameraUsage: acceptableCameraUsage ?? self.acceptableCameraUsage, + acceptableUpdatePreparingUsage: acceptableUpdatePreparingUsage ?? self.acceptableUpdatePreparingUsage, acceptableScreenSharingUsage: acceptableScreenSharingUsage ?? self.acceptableScreenSharingUsage, aggressiveUserExperience: aggressiveUserExperience ?? self.aggressiveUserExperience, aggressiveUserFullScreenExperience: aggressiveUserFullScreenExperience ?? self.aggressiveUserFullScreenExperience, diff --git a/Nudge/Utilities/UILogic.swift b/Nudge/Utilities/UILogic.swift index 8414b272..cd2e2d9b 100644 --- a/Nudge/Utilities/UILogic.swift +++ b/Nudge/Utilities/UILogic.swift @@ -6,10 +6,17 @@ // import AppKit +import Darwin import Foundation import IOKit.pwr_mgt // Asertions import SwiftUI +struct ProcessInfoStruct { + var pid: Int32 + var command: String + var arguments: [String] +} + func initialLaunchLogic() { guard !CommandLineUtilities().unitTestingEnabled() else { LogManager.debug("App being ran in test mode", logger: uiLog) @@ -177,6 +184,88 @@ private func logDeferralStates() { LoggerUtilities().logUserDeferrals() } +func getAllProcesses() -> [ProcessInfoStruct] { + var processes = [ProcessInfoStruct]() + + // Get the number of processes + var mib: [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_ALL] + var size = 0 + sysctl(&mib, u_int(mib.count), nil, &size, nil, 0) + + let processCount = size / MemoryLayout.size + var processList = [kinfo_proc](repeating: kinfo_proc(), count: processCount) + + // Get the list of processes + sysctl(&mib, u_int(mib.count), &processList, &size, nil, 0) + + // Extract process info + for process in processList { + let command = withUnsafePointer(to: process.kp_proc.p_comm) { + $0.withMemoryRebound(to: CChar.self, capacity: Int(MAXCOMLEN)) { + String(cString: $0) + } + } + let pid = process.kp_proc.p_pid + let arguments = getArgumentsForPID(pid: pid) + processes.append(ProcessInfoStruct(pid: pid, command: command, arguments: arguments)) + } + + return processes +} + +func getArgumentsForPID(pid: Int32) -> [String] { + var args = [String]() + + var mib: [Int32] = [CTL_KERN, KERN_PROCARGS2, pid] + var size = 0 + sysctl(&mib, u_int(mib.count), nil, &size, nil, 0) + + var buffer = [CChar](repeating: 0, count: size) + sysctl(&mib, u_int(mib.count), &buffer, &size, nil, 0) + + // Convert buffer to a string with proper bounds checking + let bufferString = String(bytesNoCopy: &buffer, length: size, encoding: .ascii, freeWhenDone: false) + + // Split the string into arguments + if let bufferString = bufferString { + args = bufferString.split(separator: "\0").map { String($0) } + } + + // Drop the first element which is the full path to the executable + if !args.isEmpty { + args.removeFirst() + } + + return args +} + +func isAnyProcessRunning(commandsWithArgs: [(commandPattern: String, arguments: [String]?)]) -> Bool { + let processes = getAllProcesses() + for (commandPattern, arguments) in commandsWithArgs { + let matchingProcesses = processes.filter { process in + fnmatch(commandPattern, process.command, 0) == 0 && + (arguments == nil || arguments!.allSatisfy { arg in + process.arguments.contains(where: { $0.contains(arg) }) + }) + } + if !matchingProcesses.isEmpty { + return true + } + } + return false +} + +func isDownloadingOrPreparingSoftwareUpdate() -> Bool { + let commandsWithArgs: [(commandPattern: String, arguments: [String]?)] = [ + ("softwareupdated", ["/System/Library/PrivateFrameworks/MobileSoftwareUpdate.framework/Support/softwareupdated"]), // When downloading a minor update, this process is running. + ("installcoordinationd", ["/System/Library/PrivateFrameworks/InstallCoordination.framework/Support/installcoordinationd"]), // When preparing a minor update, this process is running. Unfortunately, after preparing the update, this process appears to stay running. + ("softwareupdate", ["/usr/bin/softwareupdate", "--fetch-full-installer"]), // When downloading a major upgrade via SoftwareUpdate prefpane, it triggers a --fetch-full-installer run. Nudge also performs this method. + ("osinstallersetupd" ,["/Applications/*Install macOS *.app/Contents/Frameworks/OSInstallerSetup.framework/Resources/osinstallersetupd"]), // When installing a major upgrade, this process is running. + // /System/Library/PrivateFrameworks/PackageKit.framework/Resources/installd||system_installd - system_installd may be interesting, but I think installd is being used for any package + ] + return isAnyProcessRunning(commandsWithArgs: commandsWithArgs) +} + func needToActivateNudge() -> Bool { if NSApplication.shared.isActive && nudgeLogState.afterFirstLaunch { LogManager.notice("Nudge is currently the frontmostApplication", logger: uiLog) @@ -265,6 +354,7 @@ private func shouldBailOutEarly() -> Bool { /// 6. Acceptable Assertions are on /// 7. Acceptable Apps are in front /// 8. Refresh Timer hasn't been met + /// 9. macOS Updates are downloading or preparing for installation let frontmostApplication = NSWorkspace.shared.frontmostApplication let pastRequiredInstallationDate = DateManager().pastRequiredInstallationDate() @@ -313,6 +403,12 @@ private func shouldBailOutEarly() -> Bool { if isRefreshTimerPassedThreshold() { return true } + + // Check if downloading or preparing updates + if OptionalFeatureVariables.acceptableUpdatePreparingUsage && isDownloadingOrPreparingSoftwareUpdate() { + LogManager.info("Ignoring Nudge activation - macOS is currently downloading or preparing an update", logger: uiLog) + return true + } return false } From fcf7b180f41ea90a20d29fb75c875abb496f3ba2 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 2 Jul 2024 10:25:51 -0500 Subject: [PATCH 100/141] add another issue --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66826ad2..3eca0cd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,7 +79,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - Nudge can now bypass activations and re-activations when a macOS update is `Downloading`, `Preparing` or `Staged` for installation. - To enable this, please configure the `acceptableUpdatePreparingUsage` key under `optionalFeatures` to true - Be aware that the current logic used for this **cannot differentiate** when an update has completed preparing and is in the `Staged` phase, waiting for a user to reboot. This is due to an Apple process staying in memory. This will result in a reduction in Nudge re-activations - - Issue [555](https://github.com/macadmins/nudge/issues/555) + - Issue [555](https://github.com/macadmins/nudge/issues/555) and [571](https://github.com/macadmins/nudge/issues/571) ## [1.1.16] - 2024-03-13 This will be the **final Nudge release** for macOS 11 and potentially other versions of macOS. From d904dff5540ec21307340d8e22bb77e44a91b0d0 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 2 Jul 2024 10:42:20 -0500 Subject: [PATCH 101/141] fix ui issue with requiredinstalldate under hour and no quit button set --- CHANGELOG.md | 2 ++ Nudge/UI/Common/QuitButtons.swift | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3eca0cd7..e79716b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,8 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - Refactor portions of the `softwareupdate` logic to reduce potential errors - Fixed errors when moving to Swift 5.10 - Fixed wrong `requiredInstallationDate` calculations when using [Non-Gregorian calendars](https://github.com/macadmins/nudge/issues/509) +- Fixed UI logic when requiredInstallationDate is under an hour and `allowLaterDeferralButton` is set to false + - Issue [475](https://github.com/macadmins/nudge/issues/475) ### Added - To artificially change the `requredInstallationDate` thereby giving your users a default grace period for all Nudge events updates, please configure the `nudgeEventLaunchDelay` key under `userExperience` diff --git a/Nudge/UI/Common/QuitButtons.swift b/Nudge/UI/Common/QuitButtons.swift index 006628c9..336b950c 100644 --- a/Nudge/UI/Common/QuitButtons.swift +++ b/Nudge/UI/Common/QuitButtons.swift @@ -14,8 +14,15 @@ struct QuitButtons: View { var body: some View { HStack { if shouldShowSecondaryQuitButton { - secondaryQuitButton - .frame(maxWidth:215, maxHeight: 30) + if UserExperienceVariables.allowLaterDeferralButton { + secondaryQuitButton + .frame(maxWidth:215, maxHeight: 30) + } else { + if appState.secondsRemaining > 3600 { + secondaryQuitButton + .frame(maxWidth:215, maxHeight: 30) + } + } Spacer() } if shouldShowPrimaryQuitButton { @@ -76,7 +83,13 @@ struct QuitButtons: View { private var primaryQuitButton: some View { Group { if UserExperienceVariables.allowUserQuitDeferrals { - deferralMenu + if UserExperienceVariables.allowLaterDeferralButton { + deferralMenu + } else { + if appState.secondsRemaining > 3600 { + deferralMenu + } + } } else { standardQuitButton } From 6e8c7fe73cda9e34c36e8a622103cd384c9b8b56 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 2 Jul 2024 12:14:26 -0500 Subject: [PATCH 102/141] add optional features to jamf json --- Schema/jamf/com.github.macadmins.Nudge.json | 107 ++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index 58437e20..9fbef56a 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -86,6 +86,20 @@ } ] }, + "acceptableUpdatePreparingUsage": { + "description": "When enabled, Nudge will not activate or re-activate when an update is being downloaded, prepared or staged. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": false, + "type": "boolean" + } + ] + }, "acceptableScreenSharingUsage": { "description": "When enabled, Nudge will not activate or re-activate when screen sharing is active.", "anyOf": [ @@ -156,6 +170,20 @@ } ] }, + "attemptToCheckForSupportedDevice": { + "description": "When disabled, Nudge will no longer compare the current device against the SOFA feed for the required update. If the device cannot install this update, Nudge will not present the Unsupported UI (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "boolean", + "default": true + } + ] + }, "attemptToFetchMajorUpgrade": { "description": "When a major upgrade is required, Nudge will attempt to download it through the softwareupdate binary. (Note: This key is only used with Nudge v1.1 and will not be honored in v1.0.)", "anyOf": [ @@ -192,6 +220,24 @@ } ] }, + "customSOFAFeedURL": { + "description": "A url path to use a custom SOFA feed. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "https://sofa.macadmins.io/v1/macos_data_feed.json" + } + } + } + ] + }, "disableSoftwareUpdateWorkflow": { "description": "When disableSoftwareUpdateWorkflow is true, Nudge will not attempt to run the softwareupdate process. Defaults to false.", "anyOf": [ @@ -220,6 +266,53 @@ } ] }, + "honorFocusModes": { + "description": "When enabled, Nudge will not activate or re-activate when a user is in DoNotDisturb/Focus status. This feature is expiremental and may not work in all user settings. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "boolean", + "default": false + } + ] + }, + "honorCycleTimersOnExit": { + "description": "When enabled, Nudge will honor the current cycle timers when user's press the `Quit` button. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "boolean", + "default": false + } + ] + }, + "refreshSOFAFeedTime": { + "description": "The maximum age the cached SOFA feed file can be on disk. When this file age expires, Nudge will re-assess the SOFA feed for updates. Please be mindful of changing this value as there is an associated cost for maintaining the SOFA service. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": 86400, + "type": "integer", + "options": { + "inputAttributes": { + "placeholder": "86400" + } + } + } + ] + }, "terminateApplicationsOnLaunch": { "description": "When enabled, Nudge will terminate the applications listed in blockedApplicationBundleIDs upon initial launch.", "anyOf": [ @@ -233,6 +326,20 @@ "default": false } ] + }, + "utilizeSOFAFeed": { + "description": "When enabled, Nudge will utilize the SOFA feed url for update data. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "boolean", + "default": false + } + ] } } } From 4ff5ebf7fdafaa3ad726c72970a722ea9ee86dcb Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 2 Jul 2024 12:14:44 -0500 Subject: [PATCH 103/141] add expiremental feature to changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e79716b5..d83cb431 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -82,6 +82,9 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - To enable this, please configure the `acceptableUpdatePreparingUsage` key under `optionalFeatures` to true - Be aware that the current logic used for this **cannot differentiate** when an update has completed preparing and is in the `Staged` phase, waiting for a user to reboot. This is due to an Apple process staying in memory. This will result in a reduction in Nudge re-activations - Issue [555](https://github.com/macadmins/nudge/issues/555) and [571](https://github.com/macadmins/nudge/issues/571) +- Nudge can now attempt to honor DoNotDisturb/Focus times + - To enable this, please configure the `honorFocusModes` key in `optionalFeatures` to true + - This is an **expiremental feature** and may not work due to significant changes that Apple has designed for detecting these events. ## [1.1.16] - 2024-03-13 This will be the **final Nudge release** for macOS 11 and potentially other versions of macOS. From 044e2a03762d1f9fd0c41859a6881f29af6f04d8 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 2 Jul 2024 12:23:44 -0500 Subject: [PATCH 104/141] osVersionRequirements jamf json --- Schema/jamf/com.github.macadmins.Nudge.json | 133 ++++++++++++++++++-- 1 file changed, 121 insertions(+), 12 deletions(-) diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index 9fbef56a..182dbf3c 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -452,6 +452,25 @@ } ] }, + "activelyExploitedCVEsInstallationSLA": { + "description": "When an update is under active exploit, this is the amount of days a user has to install the update. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": 14, + "type": "integer", + "options": { + "inputAttributes": { + "placeholder": "14" + } + } + } + ] + }, "majorUpgradeAppPath": { "description": "The app path for a major upgrade. (Note: Requires Nudge v1.0.1 or higher.)", "anyOf": [ @@ -470,6 +489,25 @@ } ] }, + "nonActivelyExploitedCVEsSLA": { + "description": "When an update is not under active exploit but contains CVEs, this is the amount of days a user has to install the update. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": 21, + "type": "integer", + "options": { + "inputAttributes": { + "placeholder": "21" + } + } + } + ] + }, "requiredInstallationDate": { "description": "The required installation date for Nudge to enforce the required operating system version. You must follow a standard date string as YYYY-MM-DDTHH:MM:SSZ - Example: 2021-09-15T00:00:00Z", "anyOf": [ @@ -506,8 +544,8 @@ } ] }, - "targetedOSVersions": { - "description": "The versions of macOS that require a security update. You can specify single version or multiple versions. This key is only used with Nudge v1.0 and will not be honored in v1.1.", + "standardInstallationSLA": { + "description": "When an update has no known CVEs, this is the amount of days a user has to install the update. (Note: This key is only used with Nudge v2.0 and higher)", "anyOf": [ { "title": "Not Configured", @@ -515,21 +553,18 @@ }, { "title": "Configured", - "type": "array", - "items": { - "options": { - "inputAttributes": { - "placeholder": "11.5.1" - } - }, - "type": "string", - "title": "targetedOSVersion" + "default": 28, + "type": "integer", + "options": { + "inputAttributes": { + "placeholder": "28" + } } } ] }, "targetedOSVersionsRule": { - "description": "The OS string rule for targeting Nudge events. You can target with \"default\", the full OS version (example: \"11.5.1\"). or the major OS version (example: \"11\"). This key is only used with Nudge v1.1 and will not be honored in v1.0.", + "description": "The OS string rule for targeting Nudge events. You can target with \"default\", the full OS version (example: \"11.5.1\"). or the major OS version (example: \"11\"). (Note: This key is only used with Nudge v1.1 and higher)", "anyOf": [ { "type": "null", @@ -545,6 +580,80 @@ } } ] + }, + "unsupportedURL": { + "description": "A single URL, enabling the More Info button URL path when using the unsupported UI. While this accepts a string, it must be a valid URL (http://, https://, file://). Note: If this value is passed with aboutUpdateURLs, the aboutUpdateURLs key will be ignored. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "https://github.com/macadmins/nudge" + } + } + } + ] + }, + "unsupportedURLs": { + "description": "The unsupportedURL - per country localization.", + "title": "aboutUpdateURLs", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "type": "array", + "items": { + "title": "unsupportedURL - Dictionary", + "type": "object", + "properties": { + "_language": { + "description": "The targeted language locale for the user interface. Note: For a list of locales, please run the following command in Terminal: /usr/bin/locale -a", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "EX: en" + } + } + } + ] + }, + "unsupportedURL": { + "description": "A single URL, enabling the More Info button URL path when using the unsupported UI. While this accepts a string, it must be a valid URL (http://, https://, file://). Note: If this value is passed with aboutUpdateURLs, the aboutUpdateURLs key will be ignored. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "https://github.com/macadmins/nudge" + } + } + } + ] + } + } + } + } + ] } } } From fbd39fe4bc35fe1b7f6e0687ed43899f5ae04bb1 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 2 Jul 2024 12:28:17 -0500 Subject: [PATCH 105/141] sort keys --- Nudge/Preferences/DefaultPreferencesNudge.swift | 12 ++++++------ Nudge/Preferences/PreferencesStructure.swift | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 870cfb6b..86155642 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -370,6 +370,12 @@ struct UserExperienceVariables { false } + static var nudgeEventLaunchDelay: Int { + userExperienceProfile?["nudgeEventLaunchDelay"] as? Int ?? + userExperienceJSON?.nudgeEventLaunchDelay ?? + 0 + } + static var nudgeRefreshCycle: Int { userExperienceProfile?["nudgeRefreshCycle"] as? Int ?? userExperienceJSON?.nudgeRefreshCycle ?? @@ -381,12 +387,6 @@ struct UserExperienceVariables { userExperienceJSON?.randomDelay ?? false } - - static var nudgeEventLaunchDelay: Int { - userExperienceProfile?["nudgeEventLaunchDelay"] as? Int ?? - userExperienceJSON?.nudgeEventLaunchDelay ?? - 0 - } } // User Interface diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index c564e58e..3df47e4d 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -358,9 +358,9 @@ struct UserExperience: Codable { var loadLaunchAgent: Bool? var maxRandomDelayInSeconds: Int? var noTimers: Bool? + var nudgeEventLaunchDelay: Int? var nudgeRefreshCycle: Int? var randomDelay: Bool? - var nudgeEventLaunchDelay: Int? } // MARK: UserExperience convenience initializers and mutators @@ -402,9 +402,9 @@ extension UserExperience { loadLaunchAgent: Bool? = nil, maxRandomDelayInSeconds: Int? = nil, noTimers: Bool? = nil, + nudgeEventLaunchDelay: Int? = nil, nudgeRefreshCycle: Int? = nil, - randomDelay: Bool? = nil, - nudgeEventLaunchDelay: Int? = nil + randomDelay: Bool? = nil ) -> UserExperience { return UserExperience( allowGracePeriods: allowGracePeriods ?? self.allowGracePeriods, @@ -427,9 +427,9 @@ extension UserExperience { loadLaunchAgent: loadLaunchAgent ?? self.loadLaunchAgent, maxRandomDelayInSeconds: maxRandomDelayInSeconds ?? self.maxRandomDelayInSeconds, noTimers: noTimers ?? self.noTimers, + nudgeEventLaunchDelay: nudgeEventLaunchDelay ?? self.nudgeEventLaunchDelay, nudgeRefreshCycle: nudgeRefreshCycle ?? self.nudgeRefreshCycle, - randomDelay: randomDelay ?? self.randomDelay, - nudgeEventLaunchDelay: nudgeEventLaunchDelay ?? self.nudgeEventLaunchDelay + randomDelay: randomDelay ?? self.randomDelay ) } } From 20c5a49e71ec4ab4262817541148d6c4fe92cf8e Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 2 Jul 2024 12:28:33 -0500 Subject: [PATCH 106/141] userExperience jamf json --- Schema/jamf/com.github.macadmins.Nudge.json | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index 182dbf3c..3ff2ef93 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -700,6 +700,20 @@ } ] }, + "allowMovableWindow": { + "description": "Allows the user to move the Nudge window. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": false, + "type": "boolean" + } + ] + }, "allowUserQuitDeferrals": { "description": "Allows the user to specify when they will next be prompted by Nudge. (Set to `False` to maintain v1.0.0 behavior.) When using this feature, Nudge will no longer adhere to your LaunchAgent logic as the user is specifying their own execution time for the next Nudge event.(See: `~/Library/Preferences/com.github.macadmins.Nudge.plist`.)", "anyOf": [ @@ -1012,6 +1026,25 @@ } ] }, + "nudgeEventLaunchDelay": { + "description": "When a new update is posted to the SOFA feed, this can artificially delay the SOFA nudge events by x amount of days. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": 0, + "type": "integer", + "options": { + "inputAttributes": { + "placeholder": "0" + } + } + } + ] + }, "nudgeRefreshCycle": { "description": "The amount of time in seconds Nudge will use as its core timer to refresh all the core code paths. Note: While you can lower this setting, it could make Nudge too aggressive. Be mindful of decreasing this value.", "anyOf": [ From 9a3da3c200fa1be8214f752f5cc7ca356b0a2a4d Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 2 Jul 2024 12:59:23 -0500 Subject: [PATCH 107/141] sort more keys --- .../Preferences/DefaultPreferencesNudge.swift | 141 +++++++++--------- Nudge/Preferences/PreferencesStructure.swift | 12 +- 2 files changed, 76 insertions(+), 77 deletions(-) diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 86155642..3e284af8 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -396,11 +396,41 @@ struct UserInterfaceVariables { static var userInterfaceUpdateElementsProfile: [String:AnyObject]? = getUserInterfaceUpdateElementsProfile() static var userInterfaceUpdateElementsJSON: UpdateElement? = getUserInterfaceUpdateElementsJSON() + static var actionButtonText: String { + userInterfaceUpdateElementsProfile?["actionButtonText"] as? String ?? + userInterfaceUpdateElementsJSON?.actionButtonText ?? + "Update Device" + } + static var applicationTerminatedNotificationImagePath: String { userInterfaceProfile?["applicationTerminatedNotificationImagePath"] as? String ?? userInterfaceJSON?.applicationTerminatedNotificationImagePath ?? "" } + + static var applicationTerminatedTitleText: String { + userInterfaceUpdateElementsProfile?["applicationTerminatedTitleText"] as? String ?? + userInterfaceUpdateElementsJSON?.applicationTerminatedTitleText ?? + "Application terminated" + } + + static var applicationTerminatedBodyText: String { + userInterfaceUpdateElementsProfile?["applicationTerminatedBodyText"] as? String ?? + userInterfaceUpdateElementsJSON?.applicationTerminatedBodyText ?? + "Please update your device to use this application" + } + + static var customDeferralButtonText: String { + userInterfaceUpdateElementsProfile?["customDeferralButtonText"] as? String ?? + userInterfaceUpdateElementsJSON?.customDeferralButtonText ?? + "Custom" + } + + static var customDeferralDropdownText: String { + userInterfaceUpdateElementsProfile?["customDeferralDropdownText"] as? String ?? + userInterfaceUpdateElementsJSON?.customDeferralDropdownText ?? + "Defer" + } static var fallbackLanguage: String { userInterfaceProfile?["fallbackLanguage"] as? String ?? @@ -426,108 +456,108 @@ struct UserInterfaceVariables { "" } - static var screenShotDarkPath: String { - userInterfaceProfile?["screenShotDarkPath"] as? String ?? - userInterfaceJSON?.screenShotDarkPath ?? - "" - } - - static var screenShotLightPath: String { - userInterfaceProfile?["screenShotLightPath"] as? String ?? - userInterfaceJSON?.screenShotLightPath ?? - "" - } - - static var actionButtonText: String { - userInterfaceUpdateElementsProfile?["actionButtonText"] as? String ?? - userInterfaceUpdateElementsJSON?.actionButtonText ?? - "Update Device" - } - - static var applicationTerminatedTitleText: String { - userInterfaceUpdateElementsProfile?["applicationTerminatedTitleText"] as? String ?? - userInterfaceUpdateElementsJSON?.applicationTerminatedTitleText ?? - "Application terminated" - } - - static var applicationTerminatedBodyText: String { - userInterfaceUpdateElementsProfile?["applicationTerminatedBodyText"] as? String ?? - userInterfaceUpdateElementsJSON?.applicationTerminatedBodyText ?? - "Please update your device to use this application" - } - static var informationButtonText: String { userInterfaceUpdateElementsProfile?["informationButtonText"] as? String ?? userInterfaceUpdateElementsJSON?.informationButtonText ?? "More Info" } - + static var informationButtonTextUnsupported: String { userInterfaceUpdateElementsProfile?["informationButtonTextUnsupported"] as? String ?? userInterfaceUpdateElementsJSON?.informationButtonTextUnsupported ?? "Replace Your Device" } - + static var mainContentHeader: String { userInterfaceUpdateElementsProfile?["mainContentHeader"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentHeader ?? "**Your device will restart during this update**" } - + static var mainContentHeaderUnsupported: String { userInterfaceUpdateElementsProfile?["mainContentHeaderUnsupported"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentHeaderUnsupported ?? "**Your device is no longer capable of receving critical security updates**" } - + static var mainContentNote: String { userInterfaceUpdateElementsProfile?["mainContentNote"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentNote ?? "**Important Notes**" } - + static var mainContentNoteUnsupported: String { userInterfaceUpdateElementsProfile?["mainContentNoteUnsupported"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentNoteUnsupported ?? "**Important Notes**" } - + static var mainContentSubHeader: String { userInterfaceUpdateElementsProfile?["mainContentSubHeader"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentSubHeader ?? "Updates can take around 30 minutes to complete" } - + static var mainContentSubHeaderUnsupported: String { userInterfaceUpdateElementsProfile?["mainContentSubHeaderUnsupported"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentSubHeaderUnsupported ?? "Please work with your local IT team to obtain a replacement device" } - + static var mainContentText: String { userInterfaceUpdateElementsProfile?["mainContentText"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentText ?? "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not update your device, you may lose access to some items necessary for your day-to-day tasks.\n\nTo begin the update, simply click on the **Update Device** button and follow the provided steps." } - + static var mainContentTextUnsupported: String { userInterfaceUpdateElementsProfile?["mainContentTextUnsupported"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentTextUnsupported ?? "A fully up-to-date device is required to ensure that IT can accurately protect your device.\n\nIf you do not obtain a replacement device, you will lose access to some items necessary for your day-to-day tasks.\n\nFor more information about this, please click on the **Replace Your Device** button." } + static var oneDayDeferralButtonText: String { + userInterfaceUpdateElementsProfile?["oneDayDeferralButtonText"] as? String ?? + userInterfaceUpdateElementsJSON?.oneDayDeferralButtonText ?? + "One Day" + } + + static var oneHourDeferralButtonText: String { + userInterfaceUpdateElementsProfile?["oneHourDeferralButtonText"] as? String ?? + userInterfaceUpdateElementsJSON?.oneHourDeferralButtonText ?? + "One Hour" + } + static var primaryQuitButtonText: String { userInterfaceUpdateElementsProfile?["primaryQuitButtonText"] as? String ?? userInterfaceUpdateElementsJSON?.primaryQuitButtonText ?? "Later" } - + static var requiredInstallationDisplayFormat: String { userInterfaceProfile?["requiredInstallationDisplayFormat"] as? String ?? userInterfaceJSON?.requiredInstallationDisplayFormat ?? "MM/dd/yyyy" } + static var screenShotAltText: String { + userInterfaceUpdateElementsProfile?["screenShotAltText"] as? String ?? + userInterfaceUpdateElementsJSON?.screenShotAltText ?? + "Click to zoom into screenshot" + } + + static var screenShotDarkPath: String { + userInterfaceProfile?["screenShotDarkPath"] as? String ?? + userInterfaceJSON?.screenShotDarkPath ?? + "" + } + + static var screenShotLightPath: String { + userInterfaceProfile?["screenShotLightPath"] as? String ?? + userInterfaceJSON?.screenShotLightPath ?? + "" + } + static var secondaryQuitButtonText: String { userInterfaceUpdateElementsProfile?["secondaryQuitButtonText"] as? String ?? userInterfaceUpdateElementsJSON?.secondaryQuitButtonText ?? @@ -575,37 +605,6 @@ struct UserInterfaceVariables { userInterfaceUpdateElementsJSON?.subHeaderUnsupported ?? "**A friendly reminder from your local IT team**" } - - - static var customDeferralDropdownText: String { - userInterfaceUpdateElementsProfile?["customDeferralDropdownText"] as? String ?? - userInterfaceUpdateElementsJSON?.customDeferralDropdownText ?? - "Defer" - } - - static var customDeferralButtonText: String { - userInterfaceUpdateElementsProfile?["customDeferralButtonText"] as? String ?? - userInterfaceUpdateElementsJSON?.customDeferralButtonText ?? - "Custom" - } - - static var oneDayDeferralButtonText: String { - userInterfaceUpdateElementsProfile?["oneDayDeferralButtonText"] as? String ?? - userInterfaceUpdateElementsJSON?.oneDayDeferralButtonText ?? - "One Day" - } - - static var oneHourDeferralButtonText: String { - userInterfaceUpdateElementsProfile?["oneHourDeferralButtonText"] as? String ?? - userInterfaceUpdateElementsJSON?.oneHourDeferralButtonText ?? - "One Hour" - } - - static var screenShotAltText: String { - userInterfaceUpdateElementsProfile?["screenShotAltText"] as? String ?? - userInterfaceUpdateElementsJSON?.screenShotAltText ?? - "Click to zoom into screenshot" - } } // Other important defaults diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 3df47e4d..9abf263a 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -507,11 +507,11 @@ struct UpdateElement: Codable { var language, actionButtonText, applicationTerminatedTitleText, applicationTerminatedBodyText, customDeferralButtonText, customDeferralDropdownText: String? var informationButtonText, informationButtonTextUnsupported, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported: String? var mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported: String? - var oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText: String? + var oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, screenShotAltText, secondaryQuitButtonText, subHeader, subHeaderUnsupported: String? enum CodingKeys: String, CodingKey { case language = "_language" - case actionButtonText, applicationTerminatedTitleText, applicationTerminatedBodyText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, informationButtonTextUnsupported, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, secondaryQuitButtonText, subHeader, subHeaderUnsupported, screenShotAltText + case actionButtonText, applicationTerminatedTitleText, applicationTerminatedBodyText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, informationButtonTextUnsupported, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, screenShotAltText, secondaryQuitButtonText, subHeader, subHeaderUnsupported } } @@ -555,10 +555,10 @@ extension UpdateElement { oneDayDeferralButtonText: String? = nil, oneHourDeferralButtonText: String? = nil, primaryQuitButtonText: String? = nil, + screenShotAltText: String? = nil, secondaryQuitButtonText: String? = nil, subHeader: String? = nil, - subHeaderUnsupported: String? = nil, - screenShotAltText: String? = nil + subHeaderUnsupported: String? = nil ) -> UpdateElement { return UpdateElement( language: language ?? self.language, @@ -582,10 +582,10 @@ extension UpdateElement { oneDayDeferralButtonText: oneDayDeferralButtonText ?? self.oneDayDeferralButtonText, oneHourDeferralButtonText: oneHourDeferralButtonText ?? self.oneHourDeferralButtonText, primaryQuitButtonText: primaryQuitButtonText ?? self.primaryQuitButtonText, + screenShotAltText: screenShotAltText ?? self.screenShotAltText, secondaryQuitButtonText: secondaryQuitButtonText ?? self.secondaryQuitButtonText, subHeader: subHeader ?? self.subHeader, - subHeaderUnsupported: subHeaderUnsupported ?? self.subHeaderUnsupported, - screenShotAltText: screenShotAltText ?? self.screenShotAltText + subHeaderUnsupported: subHeaderUnsupported ?? self.subHeaderUnsupported ) } } From d7fe24fe4b84df5aac305f0b965a7ee37862db3a Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 2 Jul 2024 12:59:40 -0500 Subject: [PATCH 108/141] userInterface keys jamf json --- Schema/jamf/com.github.macadmins.Nudge.json | 280 +++++++++++++++++++- 1 file changed, 269 insertions(+), 11 deletions(-) diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index 3ff2ef93..aa443390 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -1117,6 +1117,24 @@ } ] }, + "applicationTerminatedNotificationImagePath": { + "description": "A local image path for the notification event when Nudge terminates and application. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "/Library/Application Support/Nudge/LogoLight.png" + } + } + } + ] + }, "fallbackLanguage": { "description": "The language to revert to if no localizations are available for the device's current language.", "anyOf": [ @@ -1200,6 +1218,24 @@ } ] }, + "requiredInstallationDisplayFormat": { + "description": "When utilizing showRequiredDate, set a custom display format. Be aware that the format you desire may not look good on the UI. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "MM/dd/yyyy" + } + } + } + ] + }, "screenShotDarkPath": { "description": "A path to a local jpg, png, icns that contains the screen shot for dark mode. This will replace the Big Sur logo on the lower right side of Nudge.", "anyOf": [ @@ -1236,6 +1272,20 @@ } ] }, + "showActivelyExploitedCVEs": { + "description": "When disabled, Nudge will not show the Actively Exploited CVEs in the left sidebar. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": true, + "type": "boolean" + } + ] + }, "showDeferralCount": { "description": "Enables or disables the deferral count of the current Nudge event.", "anyOf": [ @@ -1250,6 +1300,34 @@ } ] }, + "showDaysRemainingToUpdate": { + "description": "When disabled, Nudge will not show the `Days Remaining To Update:` item on the left side of the UI. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": true, + "type": "boolean" + } + ] + }, + "showRequiredDate": { + "description": "When enabled, Nudge will also show the requiredInstallationDate as string formatted date. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": false, + "type": "boolean" + } + ] + }, "simpleMode": { "description": "Enables Nudge to launch in the simplified user experience.", "anyOf": [ @@ -1329,6 +1407,42 @@ } ] }, + "applicationTerminatedTitleText": { + "description": "Modifies the terminated application notification title. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "Application terminated" + } + } + } + ] + }, + "applicationTerminatedBodyText": { + "description": "Modifies the terminated application notification body. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "Please update your device to use this application" + } + } + } + ] + }, "customDeferralButtonText": { "description": "Modifies the customDeferralButtonText, also known as the \"Custom\" button.", "anyOf": [ @@ -1383,8 +1497,8 @@ } ] }, - "oneDayDeferralButtonText": { - "description": "Modifies the oneDayDeferralButtonText, also known as the \"One Day\" button.", + "informationButtonTextUnsupported": { + "description": "Modifies the informationButton, also known as the \"More Info\" button when using the Unsupported UI. (Note: This key is only used with Nudge v2.0 and higher)", "anyOf": [ { "type": "null", @@ -1395,14 +1509,14 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "One Day" + "placeholder": "Replace Your Device" } } } ] }, - "oneHourDeferralButtonText": { - "description": "Modifies the oneHourDeferralButtonText, also known as the \"One Hour\" button.", + "mainContentHeader": { + "description": "Modifies the mainContentHeader. This is the \"Your device will restart during this update\" text.", "anyOf": [ { "type": "null", @@ -1413,14 +1527,14 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "One Hour" + "placeholder": "**Your device will restart during this update**" } } } ] }, - "mainContentHeader": { - "description": "Modifies the mainContentHeader. This is the \"Your device will restart during this update\" text.", + "mainContentHeaderUnsupported": { + "description": "Modifies the mainContentHeader. This is the \"Your device is no longer capable of receving critical security updates\" text when using the Unsupported UI. (Note: This key is only used with Nudge v2.0 and higher)", "anyOf": [ { "type": "null", @@ -1431,7 +1545,7 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "Your device will restart during this update" + "placeholder": "**Your device is no longer capable of receving critical security updates**" } } } @@ -1449,7 +1563,25 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "Important Notes" + "placeholder": "**Important Notes**" + } + } + } + ] + }, + "mainContentNoteUnsupported": { + "description": "Modifies the mainContentNote. This is the \"Important Notes\" text when using the Unsupported UI. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "**Important Notes**" } } } @@ -1473,6 +1605,24 @@ } ] }, + "mainContentSubHeaderUnsupported": { + "description": "Modifies the mainContentSubHeader. This is the \"Please work with your local IT team to obtain a replacement device\" text when using the Unsupported UI. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "Please work with your local IT team to obtain a replacement device" + } + } + } + ] + }, "mainContentText": { "description": "Modifies the `mainContentText`. This is the \"A fully up-to-date device is required to ensure that IT can your accurately protect your device.\" text. (See the Wiki for information on adding line breaks.)", "anyOf": [ @@ -1491,6 +1641,24 @@ } ] }, + "mainContentTextUnsupported": { + "description": "Modifies the `mainContentText`. This is the \"A fully up-to-date device is required to ensure that IT can your accurately protect your device.\" text when using the Unsupported UI. See the Wiki for information on adding line breaks. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "A fully up-to-date device …" + } + } + } + ] + }, "mainHeader": { "description": "Modifies the `mainHeader`. This is the \"Your device requires a security update\" text.", "anyOf": [ @@ -1509,6 +1677,60 @@ } ] }, + "mainHeaderUnsupported": { + "description": "Modifies the `mainHeader`. This is the \"Your device requires a security update\" text when using the Unsupported UI. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "Your device requires a security update" + } + } + } + ] + }, + "oneDayDeferralButtonText": { + "description": "Modifies the oneDayDeferralButtonText, also known as the \"One Day\" button.", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "One Day" + } + } + } + ] + }, + "oneHourDeferralButtonText": { + "description": "Modifies the oneHourDeferralButtonText, also known as the \"One Hour\" button.", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "One Hour" + } + } + } + ] + }, "primaryQuitButtonText": { "description": "Modifies the `primaryQuitButton`, also known as the \"Later\" button.", "anyOf": [ @@ -1527,6 +1749,24 @@ } ] }, + "screenShotAltText": { + "description": "Modifies the accessible hover over on screen shots.", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "Click to zoom into screenshot" + } + } + } + ] + }, "secondaryQuitButtonText": { "description": "Modifies the `secondaryQuitButton`, also known as the \"I understand\" button.", "anyOf": [ @@ -1557,7 +1797,25 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "A friendly reminder from your local IT team" + "placeholder": "**A friendly reminder from your local IT team**" + } + } + } + ] + }, + "subHeaderUnsupported": { + "description": "Modifies the `subHeader`. This is the \"A friendly reminder from your local IT team\" text when using the Unsupported UI. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "type": "null", + "title": "Not Configured" + }, + { + "title": "Configured", + "type": "string", + "options": { + "inputAttributes": { + "placeholder": "**A friendly reminder from your local IT team**" } } } From 0fb6fbe52b3613daff79c86e6f5c3a3c8abc11e6 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 2 Jul 2024 13:34:50 -0500 Subject: [PATCH 109/141] attempt to check for MDM profile changes --- CHANGELOG.md | 2 ++ Nudge/UI/Defaults.swift | 2 +- Nudge/UI/Main.swift | 10 ++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d83cb431..0be267d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -85,6 +85,8 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - Nudge can now attempt to honor DoNotDisturb/Focus times - To enable this, please configure the `honorFocusModes` key in `optionalFeatures` to true - This is an **expiremental feature** and may not work due to significant changes that Apple has designed for detecting these events. +- Nudge now attempts to reload the preferences if MDM profile is updated + - Issue [370](https://github.com/macadmins/nudge/issues/370) ## [1.1.16] - 2024-03-13 This will be the **final Nudge release** for macOS 11 and potentially other versions of macOS. diff --git a/Nudge/UI/Defaults.swift b/Nudge/UI/Defaults.swift index bcf3cdc6..7f750d07 100644 --- a/Nudge/UI/Defaults.swift +++ b/Nudge/UI/Defaults.swift @@ -23,7 +23,7 @@ struct Globals { static let snc = NSWorkspace.shared.notificationCenter // Preferences static let configJSON = ConfigurationManager().getConfigurationAsJSON() - static let configProfile = ConfigurationManager().getConfigurationAsProfile() + static var configProfile = ConfigurationManager().getConfigurationAsProfile() static let nudgeDefaults = UserDefaults.standard static let nudgeJSONPreferences = NetworkFileManager().getNudgeJSONPreferences() // Device Properties diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index d1d01796..6596f8db 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -606,6 +606,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { setupScreenChangeObservers() setupScreenLockObservers() setupWorkspaceNotificationCenterObservers() + setupUserDefaultsObservers() } private func setupNotificationCenterObservers() { @@ -619,6 +620,15 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } + private func setupUserDefaultsObservers() { + Globals.nc.addObserver( + forName: UserDefaults.didChangeNotification, + object: nil, + queue: .main) { [weak self] _ in + Globals.configProfile = ConfigurationManager().getConfigurationAsProfile() + } + } + private func setupScreenChangeObservers() { Globals.nc.addObserver( self, From 539ff5f41038d8dde3f32f33a2034670472a69ba Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 2 Jul 2024 14:57:12 -0500 Subject: [PATCH 110/141] fix typo --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0be267d1..dc34b2d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -85,7 +85,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - Nudge can now attempt to honor DoNotDisturb/Focus times - To enable this, please configure the `honorFocusModes` key in `optionalFeatures` to true - This is an **expiremental feature** and may not work due to significant changes that Apple has designed for detecting these events. -- Nudge now attempts to reload the preferences if MDM profile is updated +- Nudge now attempts to reload the preferences if the MDM profile is updated - Issue [370](https://github.com/macadmins/nudge/issues/370) ## [1.1.16] - 2024-03-13 From 2ec3b7152b7fd92281a74f16baef0eb2188b0eae Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 10 Jul 2024 11:31:31 -0500 Subject: [PATCH 111/141] handle sofa feed failing when there is no internet --- Nudge/UI/Main.swift | 4 ++-- Nudge/Utilities/Utils.swift | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 6596f8db..37311cad 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -174,8 +174,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { func sofaPreLaunchLogic() { // TODO: Add more logging to "unsupported devices" UI. - // TODO: Add localization for "unsupported devices" text fields - // TODO: Get someone to update JAMF JSON schema for all the new keys and wiki if OptionalFeatureVariables.utilizeSOFAFeed { var selectedOS: OSInformation? var foundMatch = false @@ -254,6 +252,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } else { LogManager.error("Could not fetch SOFA feed", logger: sofaLog) + nudgePrimaryState.shouldExit = true + exit(1) } } } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 7617871d..7713088b 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -1004,7 +1004,7 @@ struct NetworkFileManager { if let url = URL(string: OptionalFeatureVariables.customSOFAFeedURL) { let sofaData = SOFA().URLSync(url: url) - if (sofaData.error == nil) { + if (sofaData.responseCode != nil) { if sofaData.responseCode == 304 && sofaJSONExists { LogManager.info("Utilizing previously cached SOFA json due to Etag not changing", logger: sofaLog) do { @@ -1030,7 +1030,11 @@ struct NetworkFileManager { } } } else { - LogManager.error("Failed to fetch sofa JSON: \(sofaData.error!.localizedDescription)", logger: sofaLog) + if sofaData.responseCode == nil { + LogManager.error("Failed to fetch sofa JSON: Device likely has no network connectivity.", logger: sofaLog) + } else { + LogManager.error("Failed to fetch sofa JSON: \(sofaData.error!.localizedDescription)", logger: sofaLog) + } } } else { LogManager.error("Failed to decode sofa JSON URL string", logger: sofaLog) From e32887fb02678488b380eafabf6386ddec16944c Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 10 Jul 2024 11:47:54 -0500 Subject: [PATCH 112/141] add more logic for when json is 0bytes and fails to decode --- Nudge/Utilities/Utils.swift | 39 ++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 7713088b..c5d09738 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -973,7 +973,21 @@ struct NetworkFileManager { let appDirectory = appSupportDirectory.appendingPathComponent(Globals.bundleID) let sofaFile = "sofa-macos_data_feed.json" let sofaPath = appDirectory.appendingPathComponent(sofaFile) - let sofaJSONExists = fileManager.fileExists(atPath: sofaPath.path) + let sofaJSON0Bytes = isFileEmpty(atPath: sofaPath.path) + var sofaJSONExists = fileManager.fileExists(atPath: sofaPath.path) + + // Force delete if bad + if sofaJSONExists { + if sofaJSON0Bytes { + do { + try fileManager.removeItem(atPath: sofaPath.path) + sofaJSONExists = false + } catch { + print("Error deleting file: \(error.localizedDescription)") + } + } + } + if sofaJSONExists { let sofaPathCreationDate = AppStateManager().getModifiedDateForPath(sofaPath.path, testFileDate: nil) // Use Cache as it is within time inverval @@ -984,7 +998,7 @@ struct NetworkFileManager { let assetInfo = try MacOSDataFeed(data: sofaData) return assetInfo } catch { - LogManager.error("Failed to decode local sofa JSON: \(error.localizedDescription)", logger: sofaLog) + LogManager.error("Failed to decode previously cached local sofa JSON: \(error.localizedDescription)", logger: sofaLog) LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) return nil } @@ -1012,7 +1026,7 @@ struct NetworkFileManager { let assetInfo = try MacOSDataFeed(data: sofaData) return assetInfo } catch { - LogManager.error("Failed to decode local sofa JSON: \(error.localizedDescription)", logger: sofaLog) + LogManager.error("Failed to decode previously cached (Etag) local sofa JSON: \(error.localizedDescription)", logger: sofaLog) LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) return nil } @@ -1024,6 +1038,12 @@ struct NetworkFileManager { let assetInfo = try MacOSDataFeed(data: sofaData.data!) return assetInfo } catch { + do { + try fileManager.removeItem(atPath: sofaPath.path) + sofaJSONExists = false + } catch { + print("Error deleting file: \(error.localizedDescription)") + } LogManager.error("Failed to decode sofa JSON: \(error.localizedDescription)", logger: sofaLog) LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) return nil @@ -1086,6 +1106,19 @@ struct NetworkFileManager { LogManager.error("Could not find or decode JSON configuration", logger: prefsJSONLog) return nil } + + func isFileEmpty(atPath path: String) -> Bool { + let fileManager = FileManager.default + do { + let attributes = try fileManager.attributesOfItem(atPath: path) + if let fileSize = attributes[.size] as? NSNumber { + return fileSize.intValue == 0 + } + } catch { + print("Error getting file attributes: \(error.localizedDescription)") + } + return false + } } struct SubProcessUtilities { From 219784870e5ccea1061ae7d37f6dce476bf7476c Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 10 Jul 2024 11:48:20 -0500 Subject: [PATCH 113/141] bump to test sofa feed on 14.5 --- Example Assets/com.github.macadmins.Nudge.tester.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 8a258cc3..23bb133c 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -20,9 +20,9 @@ "osVersionRequirements": [ { "aboutUpdateURL": "https://apple.com", - "requiredMinimumOSVersion": "15.99", - "requiredInstallationDate": "2025-01-01T00:00:00Z", + "requiredMinimumOSVersion": "latest", "unsupportedURL": "https://google.com", + "nonActivelyExploitedCVEsSLA": 60 } ], "userExperience": { From 94749b5485e826e83fe4bcd720e96351256506fd Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 10 Jul 2024 11:49:10 -0500 Subject: [PATCH 114/141] add manual tester 14.4.1 --- Nudge/Preferences/DefaultPreferencesNudge.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 3e284af8..8a59e17a 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -9,7 +9,7 @@ import Foundation // Global Variables struct GlobalVariables { - static let currentOSVersion = OSVersion(ProcessInfo().operatingSystemVersion).description + static let currentOSVersion = OSVersion(ProcessInfo().operatingSystemVersion).description // "14.4.1" static var fetchMajorUpgradeSuccessful = false } From 03a32406380cfb87ddf5aa55ce786781a6273e37 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 10 Jul 2024 15:09:37 -0500 Subject: [PATCH 115/141] create escape hatch for replacing device logic --- CHANGELOG.md | 2 +- .../com.github.macadmins.Nudge.tester.json | 7 ++- .../com.github.macadmins.Nudge.tester.plist | 4 +- .../Preferences/DefaultPreferencesNudge.swift | 12 ++--- Nudge/Preferences/PreferencesStructure.swift | 10 ++-- Nudge/UI/Common/InformationButton.swift | 46 ++++++++++--------- Nudge/UI/SimpleMode/SimpleMode.swift | 20 ++++---- Nudge/UI/StandardMode/RightSide.swift | 2 + Nudge/Utilities/Utils.swift | 8 ++-- Schema/jamf/com.github.macadmins.Nudge.json | 36 +++++++-------- 10 files changed, 74 insertions(+), 73 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc34b2d8..0167dc45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -66,7 +66,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - If you are utilizing a custom sofa feed, please configure the `customSOFAFeedURL` key under `optionalFeatures` - "Unsupported device" UI in standard mode that utilizes the SOFA feed - Set the `attemptToCheckForSupportedDevice` key `false` under `optionalFeatures` to disable this feature - - There are new keys to set all of text fields: `informationButtonTextUnsupported`, `mainContentHeaderUnsupported`, `mainContentNoteUnsupported`, `mainContentSubHeaderUnsupported`, `mainContentTextUnsupported`, `subHeaderUnsupported` under the `updateElements` key in `UserInterface` + - There are new keys to set all of text fields: `actionButtonTextUnsupported`, `mainContentHeaderUnsupported`, `mainContentNoteUnsupported`, `mainContentSubHeaderUnsupported`, `mainContentTextUnsupported`, `subHeaderUnsupported` under the `updateElements` key in `UserInterface` - `unsupportedURL` and `unsupportedURLs` can change the information button itself, but it will remain in the `osVersionRequirement` key with `unsupportedURLs` and `unsupportedURLs`. - An icon will appear as an overlay on top of the company image to further emphasize the device is no longer supported - An admin can now show the `requiredInstallationDate` as a item on the left side of nudge. diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index 23bb133c..ca700057 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -21,8 +21,7 @@ { "aboutUpdateURL": "https://apple.com", "requiredMinimumOSVersion": "latest", - "unsupportedURL": "https://google.com", - "nonActivelyExploitedCVEsSLA": 60 + "unsupportedURL": "https://google.com" } ], "userExperience": { @@ -44,12 +43,12 @@ { "_language": "en", "actionButtonText": "actionButtonText", + "actionButtonTextUnsupported": "actionButtonTextUnsupported", "customDeferralButtonText": "customDeferralButtonText", "customDeferralDropdownText": "customDeferralDropdownText", "informationButtonText": "informationButtonText", - "informationButtonTextUnsupported1": "informationButtonTextUnsupported", "mainContentHeader": "mainContentHeader", - "mainContentHeaderUnsupported1": "mainContentHeaderUnsupported", + "mainContentHeaderUnsupported": "mainContentHeaderUnsupported", "mainContentNote": "mainContentNote", "mainContentNoteUnsupported1": "mainContentNoteUnsupported", "mainContentSubHeader": "mainContentSubHeader", diff --git a/Example Assets/com.github.macadmins.Nudge.tester.plist b/Example Assets/com.github.macadmins.Nudge.tester.plist index 9654d0a5..01368c3b 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.plist +++ b/Example Assets/com.github.macadmins.Nudge.tester.plist @@ -78,8 +78,8 @@ customDeferralDropdownText informationButtonText informationButtonText - informationButtonTextUnsupported1 - informationButtonTextUnsupported + actionButtonTextUnsupported + actionButtonTextUnsupported mainContentHeader mainContentHeader mainContentHeaderUnsupported1 diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 8a59e17a..65798feb 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -401,6 +401,12 @@ struct UserInterfaceVariables { userInterfaceUpdateElementsJSON?.actionButtonText ?? "Update Device" } + + static var actionButtonTextUnsupported: String { + userInterfaceUpdateElementsProfile?["actionButtonTextUnsupported"] as? String ?? + userInterfaceUpdateElementsJSON?.actionButtonTextUnsupported ?? + "Replace Your Device" + } static var applicationTerminatedNotificationImagePath: String { userInterfaceProfile?["applicationTerminatedNotificationImagePath"] as? String ?? @@ -462,12 +468,6 @@ struct UserInterfaceVariables { "More Info" } - static var informationButtonTextUnsupported: String { - userInterfaceUpdateElementsProfile?["informationButtonTextUnsupported"] as? String ?? - userInterfaceUpdateElementsJSON?.informationButtonTextUnsupported ?? - "Replace Your Device" - } - static var mainContentHeader: String { userInterfaceUpdateElementsProfile?["mainContentHeader"] as? String ?? userInterfaceUpdateElementsJSON?.mainContentHeader ?? diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index 9abf263a..bac9c632 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -504,14 +504,14 @@ extension UserInterface { // MARK: - UpdateElement struct UpdateElement: Codable { - var language, actionButtonText, applicationTerminatedTitleText, applicationTerminatedBodyText, customDeferralButtonText, customDeferralDropdownText: String? - var informationButtonText, informationButtonTextUnsupported, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported: String? + var language, actionButtonText, actionButtonTextUnsupported, 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, applicationTerminatedTitleText, applicationTerminatedBodyText, customDeferralButtonText, customDeferralDropdownText, informationButtonText, informationButtonTextUnsupported, mainContentHeader, mainContentHeaderUnsupported, mainContentNote, mainContentNoteUnsupported, mainContentSubHeader, mainContentSubHeaderUnsupported, mainContentText, mainContentTextUnsupported, mainHeader, mainHeaderUnsupported, oneDayDeferralButtonText, oneHourDeferralButtonText, primaryQuitButtonText, screenShotAltText, secondaryQuitButtonText, subHeader, subHeaderUnsupported + 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 } } @@ -536,12 +536,12 @@ extension UpdateElement { func with( language: String? = nil, actionButtonText: String? = nil, + actionButtonTextUnsupported: String? = nil, applicationTerminatedTitleText: String? = nil, applicationTerminatedBodyText: String? = nil, customDeferralButtonText: String? = nil, customDeferralDropdownText: String? = nil, informationButtonText: String? = nil, - informationButtonTextUnsupported: String? = nil, mainContentHeader: String? = nil, mainContentHeaderUnsupported: String? = nil, mainContentNote: String? = nil, @@ -563,12 +563,12 @@ extension UpdateElement { return UpdateElement( language: language ?? self.language, actionButtonText: actionButtonText ?? self.actionButtonText, + actionButtonTextUnsupported: actionButtonTextUnsupported ?? self.actionButtonTextUnsupported, applicationTerminatedTitleText: applicationTerminatedTitleText ?? self.applicationTerminatedTitleText, applicationTerminatedBodyText: applicationTerminatedBodyText ?? self.applicationTerminatedBodyText, customDeferralButtonText: customDeferralButtonText ?? self.customDeferralButtonText, customDeferralDropdownText: customDeferralDropdownText ?? self.customDeferralDropdownText, informationButtonText: informationButtonText ?? self.informationButtonText, - informationButtonTextUnsupported: informationButtonTextUnsupported ?? self.informationButtonTextUnsupported, mainContentHeader: mainContentHeader ?? self.mainContentHeader, mainContentHeaderUnsupported: mainContentHeaderUnsupported ?? self.mainContentHeaderUnsupported, mainContentNote: mainContentNote ?? self.mainContentNote, diff --git a/Nudge/UI/Common/InformationButton.swift b/Nudge/UI/Common/InformationButton.swift index 04e7763d..80dd4ea6 100644 --- a/Nudge/UI/Common/InformationButton.swift +++ b/Nudge/UI/Common/InformationButton.swift @@ -19,31 +19,17 @@ struct InformationButton: View { } private var informationButton: some View { - if appState.deviceSupportedByOSVersion { - guard OSVersionRequirementVariables.aboutUpdateURL != "" else { return AnyView(EmptyView()) } + guard OSVersionRequirementVariables.aboutUpdateURL != "" else { return AnyView(EmptyView()) } - return AnyView( - Button(action: UIUtilities().openMoreInfo) { - Text(.init(UserInterfaceVariables.informationButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) - .foregroundColor(dynamicTextColor) - } - .buttonStyle(.plain) - .help("Click for more information about the security update".localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) - .onHoverEffect() - ) - } else { - guard OSVersionRequirementVariables.unsupportedURL != "" else { return AnyView(EmptyView()) } - - return AnyView( - Button(action: UIUtilities().openMoreInfoUnsupported) { - Text(.init(UserInterfaceVariables.informationButtonTextUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) - .foregroundColor(dynamicTextColor) - } + return AnyView( + Button(action: UIUtilities().openMoreInfo) { + Text(.init(UserInterfaceVariables.informationButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) + .foregroundColor(dynamicTextColor) + } .buttonStyle(.plain) - .help("Click for more information about replacing your device".localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + .help("Click for more information about the security update.".localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) .onHoverEffect() - ) - } + ) } private var dynamicTextColor: Color { @@ -51,6 +37,22 @@ struct InformationButton: View { } } +// Technically not information button as this is using the actionButtonTextUnsupported +struct InformationButtonAsAction: View { + @EnvironmentObject var appState: AppState + @Environment(\.colorScheme) var colorScheme + + var body: some View { + Button(action: { + UIUtilities().openMoreInfo() + UIUtilities().postUpdateDeviceActions(userClicked: true, unSupportedUI: true) + }) { + Text(.init(UserInterfaceVariables.actionButtonTextUnsupported.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) + } + .help("Click for more information about replacing your device.".localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + } +} + #if DEBUG #Preview { ForEach(["en", "es"], id: \.self) { id in diff --git a/Nudge/UI/SimpleMode/SimpleMode.swift b/Nudge/UI/SimpleMode/SimpleMode.swift index 5ef26dce..26cadae0 100644 --- a/Nudge/UI/SimpleMode/SimpleMode.swift +++ b/Nudge/UI/SimpleMode/SimpleMode.swift @@ -41,7 +41,15 @@ struct SimpleMode: View { Spacer() if appState.deviceSupportedByOSVersion { - updateButton + Button(action: { + UIUtilities().updateDevice() + }) { + Text(UserInterfaceVariables.actionButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) + .frame(minWidth: 120) + } + .keyboardShortcut(.defaultAction) + } else { + InformationButtonAsAction() } Spacer() } @@ -78,16 +86,6 @@ struct SimpleMode: View { } } - private var updateButton: some View { - Button(action: { - UIUtilities().updateDevice() - }) { - Text(UserInterfaceVariables.actionButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale))) - .frame(minWidth: 120) - } - .keyboardShortcut(.defaultAction) - } - private var bottomButtons: some View { HStack { InformationButton() diff --git a/Nudge/UI/StandardMode/RightSide.swift b/Nudge/UI/StandardMode/RightSide.swift index 5ff5966a..00c31283 100644 --- a/Nudge/UI/StandardMode/RightSide.swift +++ b/Nudge/UI/StandardMode/RightSide.swift @@ -82,6 +82,8 @@ struct StandardModeRightSide: View { Text(.init(UserInterfaceVariables.actionButtonText.localized(desiredLanguage: getDesiredLanguage(locale: appState.locale)))) } .keyboardShortcut(.defaultAction) + } else { + InformationButtonAsAction() } } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index c5d09738..8b453ad3 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -1302,9 +1302,9 @@ struct UIUtilities { NSWorkspace.shared.open(url) } - private func postUpdateDeviceActions(userClicked: Bool) { + func postUpdateDeviceActions(userClicked: Bool, unSupportedUI: Bool) { if userClicked { - LogManager.notice("User clicked updateDevice", logger: uiLog) + LogManager.notice(unSupportedUI ? "User clicked updateDevice" : "User clicked updateDevice via Unsupported UI", logger: uiLog) // Remove forced blur and reset window level if !nudgePrimaryState.backgroundBlur.isEmpty { nudgePrimaryState.backgroundBlur.forEach { blurWindowController in @@ -1315,7 +1315,7 @@ struct UIUtilities { NSApp.windows.first?.level = .normal } } else { - LogManager.notice("Synthetically clicked updateDevice due to allowedDeferral count", logger: uiLog) + LogManager.notice(unSupportedUI ? "Synthetically clicked updateDevice due to allowedDeferral count" : "Synthetically clicked updateDevice via Unsupported UI due to allowedDeferral count", logger: uiLog) } } @@ -1356,7 +1356,7 @@ struct UIUtilities { } } - postUpdateDeviceActions(userClicked: userClicked) + postUpdateDeviceActions(userClicked: userClicked, unSupportedUI: false) } func userInitiatedExit() { diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index aa443390..ecb961f0 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -1407,8 +1407,8 @@ } ] }, - "applicationTerminatedTitleText": { - "description": "Modifies the terminated application notification title. (Note: This key is only used with Nudge v2.0 and higher)", + "actionButtonTextUnsupported": { + "description": "Modifies the primaryQuitButton, also known as the \"Update Device\" button when using the Unsupported UI. (Note: This key is only used with Nudge v2.0 and higher)", "anyOf": [ { "type": "null", @@ -1419,14 +1419,14 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "Application terminated" + "placeholder": "Replace Your Device" } } } ] }, - "applicationTerminatedBodyText": { - "description": "Modifies the terminated application notification body. (Note: This key is only used with Nudge v2.0 and higher)", + "applicationTerminatedTitleText": { + "description": "Modifies the terminated application notification title. (Note: This key is only used with Nudge v2.0 and higher)", "anyOf": [ { "type": "null", @@ -1437,14 +1437,14 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "Please update your device to use this application" + "placeholder": "Application terminated" } } } ] }, - "customDeferralButtonText": { - "description": "Modifies the customDeferralButtonText, also known as the \"Custom\" button.", + "applicationTerminatedBodyText": { + "description": "Modifies the terminated application notification body. (Note: This key is only used with Nudge v2.0 and higher)", "anyOf": [ { "type": "null", @@ -1455,14 +1455,14 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "Custom" + "placeholder": "Please update your device to use this application" } } } ] }, - "customDeferralDropdownText": { - "description": "customDeferralDropdownText, also known as the \"Defer\" button.", + "customDeferralButtonText": { + "description": "Modifies the customDeferralButtonText, also known as the \"Custom\" button.", "anyOf": [ { "type": "null", @@ -1473,14 +1473,14 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "Defer" + "placeholder": "Custom" } } } ] }, - "informationButtonText": { - "description": "Modifies the informationButton, also known as the \"More Info\" button.", + "customDeferralDropdownText": { + "description": "customDeferralDropdownText, also known as the \"Defer\" button.", "anyOf": [ { "type": "null", @@ -1491,14 +1491,14 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "More Info" + "placeholder": "Defer" } } } ] }, - "informationButtonTextUnsupported": { - "description": "Modifies the informationButton, also known as the \"More Info\" button when using the Unsupported UI. (Note: This key is only used with Nudge v2.0 and higher)", + "informationButtonText": { + "description": "Modifies the informationButton, also known as the \"More Info\" button.", "anyOf": [ { "type": "null", @@ -1509,7 +1509,7 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "Replace Your Device" + "placeholder": "More Info" } } } From 64b3a7e1b44bcac5d34498d8a7ed6e14e7056279 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 10 Jul 2024 15:10:28 -0500 Subject: [PATCH 116/141] add a false to remember where the test is --- Nudge/UI/Main.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 37311cad..848176b9 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -241,7 +241,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { Globals.hardwareModelIDs.contains { $0.uppercased() == supportedDevice.uppercased() } } LogManager.notice("Assessed Model ID found in SOFA Entry: \(deviceMatchFound)", logger: sofaLog) - nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound + nudgePrimaryState.deviceSupportedByOSVersion = deviceMatchFound // false } foundMatch = true break From 81594c8b8e28b4fe4e52711f6dcd6b50e8ed300c Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 10 Jul 2024 15:45:24 -0500 Subject: [PATCH 117/141] add another potential update assertion for macOS 15 --- Example Assets/com.github.macadmins.Nudge.tester.json | 6 ++++-- Nudge/Utilities/UILogic.swift | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index ca700057..cf6a71cb 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -6,7 +6,8 @@ "Google Chrome", "Safari" ], - "acceptableAssertionUsage": true, + "acceptableAssertionUsage": false, + "acceptableUpdatePreparingUsage": true, "acceptableCameraUsage": true, "acceptableScreenSharingUsage": true, "attemptToBlockApplicationLaunches": true, @@ -20,7 +21,8 @@ "osVersionRequirements": [ { "aboutUpdateURL": "https://apple.com", - "requiredMinimumOSVersion": "latest", + "requiredMinimumOSVersion": "15.99", + "requiredInstallationDate": "2025-01-01T00:00:00", "unsupportedURL": "https://google.com" } ], diff --git a/Nudge/Utilities/UILogic.swift b/Nudge/Utilities/UILogic.swift index cd2e2d9b..94c028e1 100644 --- a/Nudge/Utilities/UILogic.swift +++ b/Nudge/Utilities/UILogic.swift @@ -260,7 +260,8 @@ func isDownloadingOrPreparingSoftwareUpdate() -> Bool { ("softwareupdated", ["/System/Library/PrivateFrameworks/MobileSoftwareUpdate.framework/Support/softwareupdated"]), // When downloading a minor update, this process is running. ("installcoordinationd", ["/System/Library/PrivateFrameworks/InstallCoordination.framework/Support/installcoordinationd"]), // When preparing a minor update, this process is running. Unfortunately, after preparing the update, this process appears to stay running. ("softwareupdate", ["/usr/bin/softwareupdate", "--fetch-full-installer"]), // When downloading a major upgrade via SoftwareUpdate prefpane, it triggers a --fetch-full-installer run. Nudge also performs this method. - ("osinstallersetupd" ,["/Applications/*Install macOS *.app/Contents/Frameworks/OSInstallerSetup.framework/Resources/osinstallersetupd"]), // When installing a major upgrade, this process is running. + ("osinstallersetupd", ["/Applications/*Install macOS *.app/Contents/Frameworks/OSInstallerSetup.framework/Resources/osinstallersetupd"]), // When installing a major upgrade, this process is running. + ("installerauthage", ["/System/Library/PrivateFrameworks/IASUtilities.framework/Versions/A/Resources/installerauthagent", "/System/Library/PrivateFrameworks/IASUtilities.framework/Versions/A/Resources/installerauthagent"]), // Possibly on macOS 15, this is running when preparing an update. // /System/Library/PrivateFrameworks/PackageKit.framework/Resources/installd||system_installd - system_installd may be interesting, but I think installd is being used for any package ] return isAnyProcessRunning(commandsWithArgs: commandsWithArgs) From 16f4090c762cd02fe0f72bf664c9b61d32ad3c13 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 10 Jul 2024 16:15:48 -0500 Subject: [PATCH 118/141] grab full path of the process and compare to relative path --- Nudge/Utilities/UILogic.swift | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Nudge/Utilities/UILogic.swift b/Nudge/Utilities/UILogic.swift index 94c028e1..b9531658 100644 --- a/Nudge/Utilities/UILogic.swift +++ b/Nudge/Utilities/UILogic.swift @@ -200,12 +200,17 @@ func getAllProcesses() -> [ProcessInfoStruct] { // Extract process info for process in processList { - let command = withUnsafePointer(to: process.kp_proc.p_comm) { + let pid = process.kp_proc.p_pid + + // Get full command path + var pathBuffer = [CChar](repeating: 0, count: Int(PATH_MAX)) + let result = proc_pidpath(pid, &pathBuffer, UInt32(PATH_MAX)) + let command = result > 0 ? String(cString: pathBuffer) : withUnsafePointer(to: process.kp_proc.p_comm) { $0.withMemoryRebound(to: CChar.self, capacity: Int(MAXCOMLEN)) { String(cString: $0) } } - let pid = process.kp_proc.p_pid + let arguments = getArgumentsForPID(pid: pid) processes.append(ProcessInfoStruct(pid: pid, command: command, arguments: arguments)) } @@ -239,11 +244,12 @@ func getArgumentsForPID(pid: Int32) -> [String] { return args } -func isAnyProcessRunning(commandsWithArgs: [(commandPattern: String, arguments: [String]?)]) -> Bool { +func isAnyProcessRunning(commandsWithArgs: [(processRelativeName: String, arguments: [String]?)]) -> Bool { let processes = getAllProcesses() - for (commandPattern, arguments) in commandsWithArgs { + for (processRelativeName, arguments) in commandsWithArgs { let matchingProcesses = processes.filter { process in - fnmatch(commandPattern, process.command, 0) == 0 && + // Check if the command pattern is a substring of the full command path + process.command.lowercased().contains(processRelativeName.lowercased()) && (arguments == nil || arguments!.allSatisfy { arg in process.arguments.contains(where: { $0.contains(arg) }) }) @@ -256,12 +262,13 @@ func isAnyProcessRunning(commandsWithArgs: [(commandPattern: String, arguments: } func isDownloadingOrPreparingSoftwareUpdate() -> Bool { - let commandsWithArgs: [(commandPattern: String, arguments: [String]?)] = [ + let commandsWithArgs: [(processRelativeName: String, arguments: [String]?)] = [ ("softwareupdated", ["/System/Library/PrivateFrameworks/MobileSoftwareUpdate.framework/Support/softwareupdated"]), // When downloading a minor update, this process is running. ("installcoordinationd", ["/System/Library/PrivateFrameworks/InstallCoordination.framework/Support/installcoordinationd"]), // When preparing a minor update, this process is running. Unfortunately, after preparing the update, this process appears to stay running. ("softwareupdate", ["/usr/bin/softwareupdate", "--fetch-full-installer"]), // When downloading a major upgrade via SoftwareUpdate prefpane, it triggers a --fetch-full-installer run. Nudge also performs this method. + ("softwareupdate", ["/usr/sbin/softwareupdate", "--fetch-full-installer"]), // When downloading a major upgrade via softwareupdate cli, it triggers a --fetch-full-installer run. Nudge also performs this method. ("osinstallersetupd", ["/Applications/*Install macOS *.app/Contents/Frameworks/OSInstallerSetup.framework/Resources/osinstallersetupd"]), // When installing a major upgrade, this process is running. - ("installerauthage", ["/System/Library/PrivateFrameworks/IASUtilities.framework/Versions/A/Resources/installerauthagent", "/System/Library/PrivateFrameworks/IASUtilities.framework/Versions/A/Resources/installerauthagent"]), // Possibly on macOS 15, this is running when preparing an update. + ("installerauthagent", ["/System/Library/PrivateFrameworks/IASUtilities.framework/Versions/A/Resources/installerauthagent", "/System/Library/PrivateFrameworks/IASUtilities.framework/Versions/A/Resources/installerauthagent"]), // Possibly on macOS 15, this is running when preparing an update. // /System/Library/PrivateFrameworks/PackageKit.framework/Resources/installd||system_installd - system_installd may be interesting, but I think installd is being used for any package ] return isAnyProcessRunning(commandsWithArgs: commandsWithArgs) From 93ce34ab1b307c5266f6ea8a4a80756fefe452f1 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 10 Jul 2024 17:04:47 -0500 Subject: [PATCH 119/141] add major and minor SLAs for sofa --- CHANGELOG.md | 9 ++- .../Preferences/DefaultPreferencesNudge.swift | 36 +++++++--- Nudge/Preferences/PreferencesStructure.swift | 36 ++++++---- Nudge/UI/Main.swift | 26 ++++--- Schema/jamf/com.github.macadmins.Nudge.json | 69 +++++++++++++++++-- 5 files changed, 136 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0167dc45..4b7265ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,9 +21,12 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - `latest-minor`: stay in the current major release and get the latest minor updates available - This requires utilizing the SOFA feed features to properly work, which is opt-out by default - Nudge will then utilize two date integers to automatically calculate the `requiredInstallationDate` - - `activelyExploitedCVEsInstallationSLA` under the `osVersionRequirement` key will default to 14 days - - `nonActivelyExploitedCVEsSLA` under the `osVersionRequirement` key will default to 21 days - - `standardInstallationSLA` under the `osVersionRequirement` key will default to 28 days + - `activelyExploitedCVEsMajorUpgradeSLA` under the `osVersionRequirement` key will default to 14 days + - `activelyExploitedCVEsMinorUpdateSLA` under the `osVersionRequirement` key will default to 14 days + - `nonActivelyExploitedCVEsMajorUpgradeSLA` under the `osVersionRequirement` key will default to 21 days + - `nonActivelyExploitedCVEsMinorUpdateSLA` under the `osVersionRequirement` key will default to 21 days + - `standardMajorUpgradeSLA` under the `osVersionRequirement` key will default to 28 days + - `standardMinorUpdateSLA` under the `osVersionRequirement` key will default to 28 days - These dates are calculated against the `ReleaseDate` key in the SOFA feed, which is UTC formatted. Local timezones will **not be supported** with the automatic sofa feed unless you use a custom feed and change this value yourself, following ISO-8601 date formats - To artificially delay the SOFA nudge events, see the details below for `nudgeEventLaunchDelay` - If you'd like to not have nudge events for releases without any known CVEs, please configure the `disableNudgeForStandardInstalls` key under `optionalFeatures` to true diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 65798feb..d04b10ac 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -207,9 +207,15 @@ struct OSVersionRequirementVariables { "" } - static var activelyExploitedCVEsInstallationSLA: Int { - osVersionRequirementsProfile?.activelyExploitedCVEsInstallationSLA ?? - osVersionRequirementsJSON?.activelyExploitedCVEsInstallationSLA ?? + static var activelyExploitedCVEsMajorUpgradeSLA: Int { + osVersionRequirementsProfile?.activelyExploitedCVEsMajorUpgradeSLA ?? + osVersionRequirementsJSON?.activelyExploitedCVEsMajorUpgradeSLA ?? + 14 + } + + static var activelyExploitedCVEsMinorUpdateSLA: Int { + osVersionRequirementsProfile?.activelyExploitedCVEsMinorUpdateSLA ?? + osVersionRequirementsJSON?.activelyExploitedCVEsMinorUpdateSLA ?? 14 } @@ -219,9 +225,15 @@ struct OSVersionRequirementVariables { "" } - static var nonActivelyExploitedCVEsSLA: Int { - osVersionRequirementsProfile?.nonActivelyExploitedCVEsSLA ?? - osVersionRequirementsJSON?.nonActivelyExploitedCVEsSLA ?? + static var nonActivelyExploitedCVEsMajorUpgradeSLA: Int { + osVersionRequirementsProfile?.nonActivelyExploitedCVEsMajorUpgradeSLA ?? + osVersionRequirementsJSON?.nonActivelyExploitedCVEsMajorUpgradeSLA ?? + 21 + } + + static var nonActivelyExploitedCVEsMinorUpdateSLA: Int { + osVersionRequirementsProfile?.nonActivelyExploitedCVEsMinorUpdateSLA ?? + osVersionRequirementsJSON?.nonActivelyExploitedCVEsMinorUpdateSLA ?? 21 } @@ -233,9 +245,15 @@ struct OSVersionRequirementVariables { } } - static var standardInstallationSLA: Int { - osVersionRequirementsProfile?.standardInstallationSLA ?? - osVersionRequirementsJSON?.standardInstallationSLA ?? + static var standardMajorUpgradeSLA: Int { + osVersionRequirementsProfile?.standardMajorUpgradeSLA ?? + osVersionRequirementsJSON?.standardMajorUpgradeSLA ?? + 28 + } + + static var standardMinorUpdateSLA: Int { + osVersionRequirementsProfile?.standardMinorUpdateSLA ?? + osVersionRequirementsJSON?.standardMinorUpdateSLA ?? 28 } diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index bac9c632..bacfe162 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -148,12 +148,15 @@ struct OSVersionRequirement: Codable { var aboutUpdateURL: String? var aboutUpdateURLs: [AboutUpdateURL]? var actionButtonPath: String? - var activelyExploitedCVEsInstallationSLA: Int? + var activelyExploitedCVEsMajorUpgradeSLA: Int? + var activelyExploitedCVEsMinorUpdateSLA: Int? var majorUpgradeAppPath: String? - var nonActivelyExploitedCVEsSLA: Int? + var nonActivelyExploitedCVEsMajorUpgradeSLA: Int? + var nonActivelyExploitedCVEsMinorUpdateSLA: Int? var requiredInstallationDate: Date? var requiredMinimumOSVersion: String? - var standardInstallationSLA: Int? + var standardMajorUpgradeSLA: Int? + var standardMinorUpdateSLA: Int? var targetedOSVersionsRule: String? var unsupportedURL: String? var unsupportedURLs: [UnsupportedURL]? @@ -164,11 +167,14 @@ extension OSVersionRequirement { init(fromDictionary: [String: AnyObject]) { self.aboutUpdateURL = fromDictionary["aboutUpdateURL"] as? String self.actionButtonPath = fromDictionary["actionButtonPath"] as? String - self.activelyExploitedCVEsInstallationSLA = fromDictionary["activelyExploitedCVEsInstallationSLA"] as? Int + self.activelyExploitedCVEsMajorUpgradeSLA = fromDictionary["activelyExploitedCVEsMajorUpgradeSLA"] as? Int + self.activelyExploitedCVEsMinorUpdateSLA = fromDictionary["activelyExploitedCVEsMinorUpdateSLA"] as? Int self.majorUpgradeAppPath = fromDictionary["majorUpgradeAppPath"] as? String - self.nonActivelyExploitedCVEsSLA = fromDictionary["nonActivelyExploitedCVEsSLA"] as? Int + self.nonActivelyExploitedCVEsMajorUpgradeSLA = fromDictionary["nonActivelyExploitedCVEsMajorUpgradeSLA"] as? Int + self.nonActivelyExploitedCVEsMinorUpdateSLA = fromDictionary["nonActivelyExploitedCVEsMinorUpdateSLA"] as? Int self.requiredMinimumOSVersion = fromDictionary["requiredMinimumOSVersion"] as? String - self.standardInstallationSLA = fromDictionary["standardInstallationSLA"] as? Int + self.standardMajorUpgradeSLA = fromDictionary["standardMajorUpgradeSLA"] as? Int + self.standardMinorUpdateSLA = fromDictionary["standardMinorUpdateSLA"] as? Int self.targetedOSVersionsRule = fromDictionary["targetedOSVersionsRule"] as? String self.unsupportedURL = fromDictionary["unsupportedURL"] as? String @@ -239,12 +245,15 @@ extension OSVersionRequirement { aboutUpdateURL: String? = nil, aboutUpdateURLs: [AboutUpdateURL]? = nil, actionButtonPath: String? = nil, - activelyExploitedCVEsInstallationSLA: Int? = nil, + activelyExploitedCVEsMajorUpgradeSLA: Int? = nil, + activelyExploitedCVEsMinorUpdateSLA: Int? = nil, majorUpgradeAppPath: String? = nil, - nonActivelyExploitedCVEsSLA: Int? = nil, + nonActivelyExploitedCVEsMajorUpgradeSLA: Int? = nil, + nonActivelyExploitedCVEsMinorUpdateSLA: Int? = nil, requiredInstallationDate: Date? = nil, requiredMinimumOSVersion: String? = nil, - standardInstallationSLA: Int? = nil, + standardMajorUpgradeSLA: Int? = nil, + standardMinorUpdateSLA: Int? = nil, targetedOSVersionsRule: String? = nil, unsupportedURL: String? = nil, unsupportedURLs: [UnsupportedURL]? = nil @@ -253,12 +262,15 @@ extension OSVersionRequirement { aboutUpdateURL: aboutUpdateURL ?? self.aboutUpdateURL, aboutUpdateURLs: aboutUpdateURLs ?? self.aboutUpdateURLs, actionButtonPath: actionButtonPath ?? self.actionButtonPath, - activelyExploitedCVEsInstallationSLA: activelyExploitedCVEsInstallationSLA ?? self.activelyExploitedCVEsInstallationSLA, + activelyExploitedCVEsMajorUpgradeSLA: activelyExploitedCVEsMajorUpgradeSLA ?? self.activelyExploitedCVEsMajorUpgradeSLA, + activelyExploitedCVEsMinorUpdateSLA: activelyExploitedCVEsMinorUpdateSLA ?? self.activelyExploitedCVEsMinorUpdateSLA, majorUpgradeAppPath: majorUpgradeAppPath ?? self.majorUpgradeAppPath, - nonActivelyExploitedCVEsSLA: nonActivelyExploitedCVEsSLA ?? self.nonActivelyExploitedCVEsSLA, + nonActivelyExploitedCVEsMajorUpgradeSLA: nonActivelyExploitedCVEsMajorUpgradeSLA ?? self.nonActivelyExploitedCVEsMajorUpgradeSLA, + nonActivelyExploitedCVEsMinorUpdateSLA: nonActivelyExploitedCVEsMinorUpdateSLA ?? self.nonActivelyExploitedCVEsMinorUpdateSLA, requiredInstallationDate: requiredInstallationDate ?? self.requiredInstallationDate, requiredMinimumOSVersion: requiredMinimumOSVersion ?? self.requiredMinimumOSVersion, - standardInstallationSLA: standardInstallationSLA ?? self.standardInstallationSLA, + standardMajorUpgradeSLA: standardMajorUpgradeSLA ?? self.standardMajorUpgradeSLA, + standardMinorUpdateSLA: standardMinorUpdateSLA ?? self.standardMinorUpdateSLA, targetedOSVersionsRule: targetedOSVersionsRule ?? self.targetedOSVersionsRule, unsupportedURL: unsupportedURL ?? self.unsupportedURL, unsupportedURLs: unsupportedURLs ?? self.unsupportedURLs diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 848176b9..4c704f41 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -207,15 +207,21 @@ class AppDelegate: NSObject, NSApplicationDelegate { let activelyExploitedCVEs = selectedOS!.activelyExploitedCVEs.count > 0 let presentCVEs = selectedOS!.cves.count > 0 let slaExtension: TimeInterval - switch (activelyExploitedCVEs, presentCVEs) { - case (false, true): - slaExtension = TimeInterval(OSVersionRequirementVariables.nonActivelyExploitedCVEsSLA * 86400) - case (true, true): - slaExtension = TimeInterval(OSVersionRequirementVariables.activelyExploitedCVEsInstallationSLA * 86400) - case (false, false): - slaExtension = TimeInterval(OSVersionRequirementVariables.standardInstallationSLA * 86400) - default: - slaExtension = TimeInterval(OSVersionRequirementVariables.standardInstallationSLA * 86400) + switch (activelyExploitedCVEs, presentCVEs, AppStateManager().requireMajorUpgrade()) { + case (false, true, true): + slaExtension = TimeInterval(OSVersionRequirementVariables.nonActivelyExploitedCVEsMajorUpgradeSLA * 86400) + case (false, true, false): + slaExtension = TimeInterval(OSVersionRequirementVariables.nonActivelyExploitedCVEsMinorUpdateSLA * 86400) + case (true, true, true): + slaExtension = TimeInterval(OSVersionRequirementVariables.activelyExploitedCVEsMajorUpgradeSLA * 86400) + case (true, true, false): + slaExtension = TimeInterval(OSVersionRequirementVariables.activelyExploitedCVEsMinorUpdateSLA * 86400) + case (false, false, true): + slaExtension = TimeInterval(OSVersionRequirementVariables.standardMajorUpgradeSLA * 86400) + case (false, false, false): + slaExtension = TimeInterval(OSVersionRequirementVariables.standardMinorUpdateSLA * 86400) + default: // If we get here, something is wrong, use 90 days as a safety + slaExtension = TimeInterval(90 * 86400) } if OptionalFeatureVariables.disableNudgeForStandardInstalls && !presentCVEs { @@ -228,7 +234,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { nudgePrimaryState.requiredMinimumOSVersion = osVersion.latest.productVersion nudgePrimaryState.activelyExploitedCVEs = activelyExploitedCVEs releaseDate = selectedOS!.releaseDate ?? Date() - requiredInstallationDate = selectedOS!.releaseDate?.addingTimeInterval(slaExtension) ?? DateManager().getCurrentDate().addingTimeInterval(TimeInterval(OSVersionRequirementVariables.standardInstallationSLA * 86400)) + requiredInstallationDate = selectedOS!.releaseDate?.addingTimeInterval(slaExtension) ?? DateManager().getCurrentDate().addingTimeInterval(TimeInterval(90 * 86400)) LogManager.notice("Extending requiredInstallationDate to \(requiredInstallationDate)", logger: sofaLog) LogManager.notice("SOFA Matched OS Version: \(selectedOS!.productVersion)", logger: sofaLog) diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index ecb961f0..2639be7e 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -452,8 +452,27 @@ } ] }, - "activelyExploitedCVEsInstallationSLA": { - "description": "When an update is under active exploit, this is the amount of days a user has to install the update. (Note: This key is only used with Nudge v2.0 and higher)", + "activelyExploitedCVEsMajorUpgradeSLA": { + "description": "When a major upgrade is under active exploit, this is the amount of days a user has to install the update. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": 14, + "type": "integer", + "options": { + "inputAttributes": { + "placeholder": "14" + } + } + } + ] + }, + "activelyExploitedCVEsMinorUpdateSLA": { + "description": "When a minor update is under active exploit, this is the amount of days a user has to install the update. (Note: This key is only used with Nudge v2.0 and higher)", "anyOf": [ { "title": "Not Configured", @@ -489,8 +508,27 @@ } ] }, - "nonActivelyExploitedCVEsSLA": { - "description": "When an update is not under active exploit but contains CVEs, this is the amount of days a user has to install the update. (Note: This key is only used with Nudge v2.0 and higher)", + "nonActivelyExploitedCVEsMajorUpgradeSLA": { + "description": "When a major upgrade is not under active exploit but contains CVEs, this is the amount of days a user has to install the update. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": 21, + "type": "integer", + "options": { + "inputAttributes": { + "placeholder": "21" + } + } + } + ] + }, + "nonActivelyExploitedCVEsMinorUpdateSLA": { + "description": "When a minor update is not under active exploit but contains CVEs, this is the amount of days a user has to install the update. (Note: This key is only used with Nudge v2.0 and higher)", "anyOf": [ { "title": "Not Configured", @@ -544,8 +582,27 @@ } ] }, - "standardInstallationSLA": { - "description": "When an update has no known CVEs, this is the amount of days a user has to install the update. (Note: This key is only used with Nudge v2.0 and higher)", + "standardMajorUpgradeSLA": { + "description": "When a major upgrade has no known CVEs, this is the amount of days a user has to install the update. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": 28, + "type": "integer", + "options": { + "inputAttributes": { + "placeholder": "28" + } + } + } + ] + }, + "standardMinorupdateSLA": { + "description": "When a minor update has no known CVEs, this is the amount of days a user has to install the update. (Note: This key is only used with Nudge v2.0 and higher)", "anyOf": [ { "title": "Not Configured", From 29ce1c6b299437c36c3625cde2a44060f1570825 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 10 Jul 2024 20:15:46 -0500 Subject: [PATCH 120/141] add changelog into the project so I can modify within xcode --- Nudge.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Nudge.xcodeproj/project.pbxproj b/Nudge.xcodeproj/project.pbxproj index c51b9710..ece1e934 100644 --- a/Nudge.xcodeproj/project.pbxproj +++ b/Nudge.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 5836861C25DAD01C0004514C /* SoftwareUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5836861B25DAD01C0004514C /* SoftwareUpdate.swift */; }; 6316F0E72832CA0700E1354D /* Schema in Resources */ = {isa = PBXBuildFile; fileRef = 6316F0E62832CA0700E1354D /* Schema */; }; 631A6D762BF2654000DC1EF3 /* sofa.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631A6D752BF2654000DC1EF3 /* sofa.swift */; }; + 633C4C712C3F6465005720F0 /* CHANGELOG.md in Resources */ = {isa = PBXBuildFile; fileRef = 633C4C702C3F6465005720F0 /* CHANGELOG.md */; }; 6347351D2B45DC2400C3401D /* CloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6347351C2B45DC2400C3401D /* CloseButton.swift */; }; 634CE1092BB47480002C26C4 /* gdmf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634CE1082BB47480002C26C4 /* gdmf.swift */; }; 634CE10A2BB47480002C26C4 /* gdmf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634CE1082BB47480002C26C4 /* gdmf.swift */; }; @@ -96,6 +97,7 @@ 5836861B25DAD01C0004514C /* SoftwareUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoftwareUpdate.swift; sourceTree = ""; }; 6316F0E62832CA0700E1354D /* Schema */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Schema; sourceTree = ""; }; 631A6D752BF2654000DC1EF3 /* sofa.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = sofa.swift; sourceTree = ""; }; + 633C4C702C3F6465005720F0 /* CHANGELOG.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = SOURCE_ROOT; }; 6347351C2B45DC2400C3401D /* CloseButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseButton.swift; sourceTree = ""; }; 634CE1082BB47480002C26C4 /* gdmf.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = gdmf.swift; sourceTree = ""; }; 636B9C0126CACCAB0007BE3B /* DeferView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeferView.swift; sourceTree = ""; }; @@ -252,6 +254,7 @@ 63D7D0D625C9E9A400236281 = { isa = PBXGroup; children = ( + 633C4C702C3F6465005720F0 /* CHANGELOG.md */, 031B0F2125D8AE3200E68A28 /* Example Assets */, 6316F0E62832CA0700E1354D /* Schema */, 637CEBC02A30C9E700EFA3E9 /* Localizable.xcstrings */, @@ -474,6 +477,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 633C4C712C3F6465005720F0 /* CHANGELOG.md in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; From ba316452b4ee1a7d9de3bf7dcb974ee234d31025 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 10 Jul 2024 20:16:11 -0500 Subject: [PATCH 121/141] nudgeEventLaunchDelay is now nudgeMajorUpgradeEventLaunchDelay and nudgeMinorUpdateEventLaunchDelay --- CHANGELOG.md | 4 ++-- .../Preferences/DefaultPreferencesNudge.swift | 12 +++++++--- Nudge/Preferences/PreferencesStructure.swift | 9 +++++--- Nudge/Utilities/Utils.swift | 14 +++++++---- Schema/jamf/com.github.macadmins.Nudge.json | 23 +++++++++++++++++-- 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b7265ab..58321686 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - `standardMajorUpgradeSLA` under the `osVersionRequirement` key will default to 28 days - `standardMinorUpdateSLA` under the `osVersionRequirement` key will default to 28 days - These dates are calculated against the `ReleaseDate` key in the SOFA feed, which is UTC formatted. Local timezones will **not be supported** with the automatic sofa feed unless you use a custom feed and change this value yourself, following ISO-8601 date formats - - To artificially delay the SOFA nudge events, see the details below for `nudgeEventLaunchDelay` + - To artificially delay the SOFA nudge events, see the details below for `nudgeMajorUpgradeEventLaunchDelay` and `nudgeMinorUpdateEventLaunchDelay` - If you'd like to not have nudge events for releases without any known CVEs, please configure the `disableNudgeForStandardInstalls` key under `optionalFeatures` to true - You can now disable the `Days Remaining To Update:` item on the left side of the UI. - Configure the `showDaysRemainingToUpdate` key under `userInterface` to false @@ -47,7 +47,7 @@ Requires macOS 12.0 and higher. Further releases and feature requests may make t - Issue [475](https://github.com/macadmins/nudge/issues/475) ### Added -- To artificially change the `requredInstallationDate` thereby giving your users a default grace period for all Nudge events updates, please configure the `nudgeEventLaunchDelay` key under `userExperience` +- To artificially change the `requredInstallationDate` thereby giving your users a default grace period for all Nudge events updates, please configure the `nudgeMajorUpgradeEventLaunchDelay` and `nudgeMinorUpdateEventLaunchDelay` keys under `userExperience` in amount of days. - A local image path can now be specified for the notification event when Nudge terminates and application - Please configure the `applicationTerminatedNotificationImagePath` key under `userInterface` - Due to limitations within Apple's API, a local path is only supported at this time diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index d04b10ac..049196f8 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -388,9 +388,15 @@ struct UserExperienceVariables { false } - static var nudgeEventLaunchDelay: Int { - userExperienceProfile?["nudgeEventLaunchDelay"] as? Int ?? - userExperienceJSON?.nudgeEventLaunchDelay ?? + static var nudgeMinorUpdateEventLaunchDelay: Int { + userExperienceProfile?["nudgeMinorUpdateEventLaunchDelay"] as? Int ?? + userExperienceJSON?.nudgeMinorUpdateEventLaunchDelay ?? + 0 + } + + static var nudgeMajorUpgradeEventLaunchDelay: Int { + userExperienceProfile?["nudgeMajorUpgradeEventLaunchDelay"] as? Int ?? + userExperienceJSON?.nudgeMajorUpgradeEventLaunchDelay ?? 0 } diff --git a/Nudge/Preferences/PreferencesStructure.swift b/Nudge/Preferences/PreferencesStructure.swift index bacfe162..085b6e8b 100644 --- a/Nudge/Preferences/PreferencesStructure.swift +++ b/Nudge/Preferences/PreferencesStructure.swift @@ -370,7 +370,8 @@ struct UserExperience: Codable { var loadLaunchAgent: Bool? var maxRandomDelayInSeconds: Int? var noTimers: Bool? - var nudgeEventLaunchDelay: Int? + var nudgeMajorUpgradeEventLaunchDelay: Int? + var nudgeMinorUpdateEventLaunchDelay: Int? var nudgeRefreshCycle: Int? var randomDelay: Bool? } @@ -414,7 +415,8 @@ extension UserExperience { loadLaunchAgent: Bool? = nil, maxRandomDelayInSeconds: Int? = nil, noTimers: Bool? = nil, - nudgeEventLaunchDelay: Int? = nil, + nudgeMajorUpgradeEventLaunchDelay: Int? = nil, + nudgeMinorUpdateEventLaunchDelay: Int? = nil, nudgeRefreshCycle: Int? = nil, randomDelay: Bool? = nil ) -> UserExperience { @@ -439,7 +441,8 @@ extension UserExperience { loadLaunchAgent: loadLaunchAgent ?? self.loadLaunchAgent, maxRandomDelayInSeconds: maxRandomDelayInSeconds ?? self.maxRandomDelayInSeconds, noTimers: noTimers ?? self.noTimers, - nudgeEventLaunchDelay: nudgeEventLaunchDelay ?? self.nudgeEventLaunchDelay, + nudgeMajorUpgradeEventLaunchDelay: nudgeMajorUpgradeEventLaunchDelay ?? self.nudgeMajorUpgradeEventLaunchDelay, + nudgeMinorUpdateEventLaunchDelay: nudgeMinorUpdateEventLaunchDelay ?? self.nudgeMinorUpdateEventLaunchDelay, nudgeRefreshCycle: nudgeRefreshCycle ?? self.nudgeRefreshCycle, randomDelay: randomDelay ?? self.randomDelay ) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 8b453ad3..6f24756b 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -185,15 +185,21 @@ struct AppStateManager { } func delayNudgeEventLogic(currentDate: Date = DateManager().getCurrentDate(), testFileDate: Date? = nil) -> Date { - if UserExperienceVariables.nudgeEventLaunchDelay == 0 { + let isMajorUpgradeRequired = AppStateManager().requireMajorUpgrade() + let launchDelay = isMajorUpgradeRequired ? UserExperienceVariables.nudgeMajorUpgradeEventLaunchDelay : UserExperienceVariables.nudgeMinorUpdateEventLaunchDelay + + if launchDelay == 0 { return PrefsWrapper.requiredInstallationDate } - if releaseDate.addingTimeInterval(TimeInterval(UserExperienceVariables.nudgeEventLaunchDelay * 86400)) > currentDate { - LogManager.info("Device within nudgeEventLaunchDelay, exiting Nudge", logger: uiLog) + + if releaseDate.addingTimeInterval(TimeInterval(launchDelay * 86400)) > currentDate { + let eventType = isMajorUpgradeRequired ? "nudgeMajorUpgradeEventLaunchDelay" : "nudgeMinorUpdateEventLaunchDelay" + LogManager.info("Device within \(eventType)", logger: uiLog) nudgePrimaryState.shouldExit = true return currentDate } else { - LogManager.info("Device outside nudgeEventLaunchDelay", logger: uiLog) + let eventType = isMajorUpgradeRequired ? "nudgeMajorUpgradeEventLaunchDelay" : "nudgeMinorUpdateEventLaunchDelay" + LogManager.info("Device outside \(eventType)", logger: uiLog) return PrefsWrapper.requiredInstallationDate } } diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index 2639be7e..9f718656 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -1083,8 +1083,27 @@ } ] }, - "nudgeEventLaunchDelay": { - "description": "When a new update is posted to the SOFA feed, this can artificially delay the SOFA nudge events by x amount of days. (Note: This key is only used with Nudge v2.0 and higher)", + "nudgeMajorUpgradeEventLaunchDelay": { + "description": "When a new major upgrade is posted to the SOFA feed, this can artificially delay the SOFA nudge events by x amount of days. (Note: This key is only used with Nudge v2.0 and higher)", + "anyOf": [ + { + "title": "Not Configured", + "type": "null" + }, + { + "title": "Configured", + "default": 0, + "type": "integer", + "options": { + "inputAttributes": { + "placeholder": "0" + } + } + } + ] + }, + "nudgeMinorUpdateEventLaunchDelay": { + "description": "When a new minor update is posted to the SOFA feed, this can artificially delay the SOFA nudge events by x amount of days. (Note: This key is only used with Nudge v2.0 and higher)", "anyOf": [ { "title": "Not Configured", From 9871cd25b23c6ae20590c06515a0efcfda42a207 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 11 Jul 2024 09:53:50 -0500 Subject: [PATCH 122/141] add compression to potentially reduce SOFA bw --- Nudge/3rd Party Assets/sofa.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift index cee37fde..5e1bf548 100644 --- a/Nudge/3rd Party Assets/sofa.swift +++ b/Nudge/3rd Party Assets/sofa.swift @@ -232,6 +232,7 @@ class SOFA: NSObject, URLSessionDelegate { request.addValue("\(Globals.bundleID)/\(VersionManager.getNudgeVersion())", forHTTPHeaderField: "User-Agent") request.setValue(lastEtag, forHTTPHeaderField: "If-None-Match") // TODO: I'm saving the Etag and sending it, but due to forcing this into a syncronous call, it is always returning a 200 code. When using this in an asycronous method, it eventually returns the 304 response. I'm not sure how to fix this bug. + request.addValue("gzip, deflate, br", forHTTPHeaderField: "Accept-Encoding") // Force compression for JSON var attempts = 0 var responseData: Data? From 5f7e24c9208d57e924806e83c775b4d8d201056c Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 11 Jul 2024 22:03:22 -0500 Subject: [PATCH 123/141] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58321686..a97e9642 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [2.0.0] - 2024-05-21 +## [2.0.0] - 2024-07-17 Requires macOS 12.0 and higher. Further releases and feature requests may make this macOS 13 and higher depending on code complexity. ### Changed From 3bf57e6aa93c245169a64dc67d57b0bcbeb1220c Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Thu, 11 Jul 2024 22:04:12 -0500 Subject: [PATCH 124/141] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a97e9642..0a89a490 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [2.0.0] - 2024-07-17 -Requires macOS 12.0 and higher. Further releases and feature requests may make this macOS 13 and higher depending on code complexity. +Requires macOS 12.0 and higher. ### Changed - Now built on Swift 5.10, Xcode 15.4 and macOS 14 From 43e62e043ad0d17ff1245fe09f4424b9f0628340 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 15 Jul 2024 08:58:40 -0500 Subject: [PATCH 125/141] add breaking change notes --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a89a490..3257de97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [2.0.0] - 2024-07-17 Requires macOS 12.0 and higher. +### Breaking Changes +- Due to implementing markdown support, many of the elements within Nudge may no longer be in **bold** if you customize them. + - To work around this please add `**` elements to these customizations + - For example: The `mainContentNote` value of `Important Notes` would become `**Important Notes**` + ### Changed - Now built on Swift 5.10, Xcode 15.4 and macOS 14 - New Xcode Scheme `-bundle-mode-profile` to test profile logic From 6101b301bffb8bd50a8422e58cae033b1e9fa9bd Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 15 Jul 2024 09:02:47 -0500 Subject: [PATCH 126/141] add another note about sofa feed --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3257de97..f1754ca9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Requires macOS 12.0 and higher. - Due to implementing markdown support, many of the elements within Nudge may no longer be in **bold** if you customize them. - To work around this please add `**` elements to these customizations - For example: The `mainContentNote` value of `Important Notes` would become `**Important Notes**` +- The SOFA feed is **opt-out**, which included the new `Unsupported UI`. If you do not want the Unsupported UI features, you will need to actively opt-out of these options. ### Changed - Now built on Swift 5.10, Xcode 15.4 and macOS 14 From 11b6adfd0dd0a343ed18c4527d13ddd5fc3f52e0 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 15 Jul 2024 09:18:27 -0500 Subject: [PATCH 127/141] retry when json is malformed --- Nudge/Utilities/Utils.swift | 44 ++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 6f24756b..5e04fc38 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -996,7 +996,7 @@ struct NetworkFileManager { if sofaJSONExists { let sofaPathCreationDate = AppStateManager().getModifiedDateForPath(sofaPath.path, testFileDate: nil) - // Use Cache as it is within time inverval + // Use Cache as it is within time interval if TimeInterval(OptionalFeatureVariables.refreshSOFAFeedTime) >= Date().timeIntervalSince(sofaPathCreationDate!) { LogManager.info("Utilizing previously cached SOFA json", logger: sofaLog) do { @@ -1006,7 +1006,8 @@ struct NetworkFileManager { } catch { LogManager.error("Failed to decode previously cached local sofa JSON: \(error.localizedDescription)", logger: sofaLog) LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) - return nil + // Attempt to redownload and reprocess the file + return redownloadAndReprocessSOFA(url: URL(string: OptionalFeatureVariables.customSOFAFeedURL)!) } } else { LogManager.info("Previously cached SOFA json has expired", logger: sofaLog) @@ -1024,8 +1025,8 @@ struct NetworkFileManager { if let url = URL(string: OptionalFeatureVariables.customSOFAFeedURL) { let sofaData = SOFA().URLSync(url: url) - if (sofaData.responseCode != nil) { - if sofaData.responseCode == 304 && sofaJSONExists { + if let responseCode = sofaData.responseCode { + if responseCode == 304 && sofaJSONExists { LogManager.info("Utilizing previously cached SOFA json due to Etag not changing", logger: sofaLog) do { let sofaData = try Data(contentsOf: sofaPath) @@ -1034,7 +1035,8 @@ struct NetworkFileManager { } catch { LogManager.error("Failed to decode previously cached (Etag) local sofa JSON: \(error.localizedDescription)", logger: sofaLog) LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) - return nil + // Attempt to redownload and reprocess the file + return redownloadAndReprocessSOFA(url: url) } } else { do { @@ -1052,7 +1054,8 @@ struct NetworkFileManager { } LogManager.error("Failed to decode sofa JSON: \(error.localizedDescription)", logger: sofaLog) LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) - return nil + // Attempt to redownload and reprocess the file + return redownloadAndReprocessSOFA(url: url) } } } else { @@ -1125,6 +1128,35 @@ struct NetworkFileManager { } return false } + + func redownloadAndReprocessSOFA(url: URL) -> MacOSDataFeed? { + let sofaData = SOFA().URLSync(url: url) + if let responseCode = sofaData.responseCode, responseCode == 200 { + let fileManager = FileManager.default + let appSupportDirectory = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! + let appDirectory = appSupportDirectory.appendingPathComponent(Globals.bundleID) + let sofaFile = "sofa-macos_data_feed.json" + let sofaPath = appDirectory.appendingPathComponent(sofaFile) + + do { + if fileManager.fileExists(atPath: appDirectory.path) { + try sofaData.data!.write(to: sofaPath) + } + let assetInfo = try MacOSDataFeed(data: sofaData.data!) + return assetInfo + } catch { + LogManager.error("Failed to decode sofa JSON after redownload: \(error.localizedDescription)", logger: sofaLog) + LogManager.error("Failed to decode sofa JSON after redownload: \(error)", logger: sofaLog) + } + } else { + if sofaData.responseCode == nil { + LogManager.error("Failed to fetch sofa JSON: Device likely has no network connectivity.", logger: sofaLog) + } else { + LogManager.error("Failed to fetch sofa JSON: \(sofaData.error!.localizedDescription)", logger: sofaLog) + } + } + return nil + } } struct SubProcessUtilities { From fee26760c818418fa4343640125e24cee4f584ad Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 15 Jul 2024 13:43:02 -0500 Subject: [PATCH 128/141] preparing adds - move to globs and capture username of process now also true support for macOS 15 --- Nudge/Utilities/UILogic.swift | 72 +++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/Nudge/Utilities/UILogic.swift b/Nudge/Utilities/UILogic.swift index b9531658..312655a4 100644 --- a/Nudge/Utilities/UILogic.swift +++ b/Nudge/Utilities/UILogic.swift @@ -12,9 +12,10 @@ import IOKit.pwr_mgt // Asertions import SwiftUI struct ProcessInfoStruct { - var pid: Int32 - var command: String - var arguments: [String] + let pid: Int32 + let command: String + let arguments: [String] + let username: String } func initialLaunchLogic() { @@ -186,22 +187,22 @@ private func logDeferralStates() { func getAllProcesses() -> [ProcessInfoStruct] { var processes = [ProcessInfoStruct]() - + // Get the number of processes var mib: [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_ALL] var size = 0 sysctl(&mib, u_int(mib.count), nil, &size, nil, 0) - + let processCount = size / MemoryLayout.size var processList = [kinfo_proc](repeating: kinfo_proc(), count: processCount) - + // Get the list of processes sysctl(&mib, u_int(mib.count), &processList, &size, nil, 0) - + // Extract process info for process in processList { let pid = process.kp_proc.p_pid - + // Get full command path var pathBuffer = [CChar](repeating: 0, count: Int(PATH_MAX)) let result = proc_pidpath(pid, &pathBuffer, UInt32(PATH_MAX)) @@ -210,11 +211,13 @@ func getAllProcesses() -> [ProcessInfoStruct] { String(cString: $0) } } - + let arguments = getArgumentsForPID(pid: pid) - processes.append(ProcessInfoStruct(pid: pid, command: command, arguments: arguments)) + let username = getUsernameForPID(pid: pid) + + processes.append(ProcessInfoStruct(pid: pid, command: command, arguments: arguments, username: username)) } - + return processes } @@ -244,15 +247,36 @@ func getArgumentsForPID(pid: Int32) -> [String] { return args } -func isAnyProcessRunning(commandsWithArgs: [(processRelativeName: String, arguments: [String]?)]) -> Bool { +func getUsernameForPID(pid: Int32) -> String { + var uid: uid_t = 0 + var mib: [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, pid] + var kp = kinfo_proc() + var size = MemoryLayout.size + + sysctl(&mib, u_int(mib.count), &kp, &size, nil, 0) + + uid = kp.kp_eproc.e_ucred.cr_uid + var pwd = passwd() + var pwdPtr: UnsafeMutablePointer? = nil + getpwuid_r(uid, &pwd, nil, 0, &pwdPtr) + + if let pwdPtr = pwdPtr { + return String(cString: pwdPtr.pointee.pw_name) + } else { + return "unknown" + } +} + + +func isAnyProcessRunning(commandsWithArgs: [(commandPattern: String, arguments: [String]?, username: String?)]) -> Bool { let processes = getAllProcesses() - for (processRelativeName, arguments) in commandsWithArgs { + for (commandPattern, arguments, username) in commandsWithArgs { let matchingProcesses = processes.filter { process in - // Check if the command pattern is a substring of the full command path - process.command.lowercased().contains(processRelativeName.lowercased()) && + fnmatch(commandPattern, process.command, FNM_CASEFOLD) == 0 && (arguments == nil || arguments!.allSatisfy { arg in process.arguments.contains(where: { $0.contains(arg) }) - }) + }) && + (username == nil || process.username == username) } if !matchingProcesses.isEmpty { return true @@ -262,14 +286,14 @@ func isAnyProcessRunning(commandsWithArgs: [(processRelativeName: String, argume } func isDownloadingOrPreparingSoftwareUpdate() -> Bool { - let commandsWithArgs: [(processRelativeName: String, arguments: [String]?)] = [ - ("softwareupdated", ["/System/Library/PrivateFrameworks/MobileSoftwareUpdate.framework/Support/softwareupdated"]), // When downloading a minor update, this process is running. - ("installcoordinationd", ["/System/Library/PrivateFrameworks/InstallCoordination.framework/Support/installcoordinationd"]), // When preparing a minor update, this process is running. Unfortunately, after preparing the update, this process appears to stay running. - ("softwareupdate", ["/usr/bin/softwareupdate", "--fetch-full-installer"]), // When downloading a major upgrade via SoftwareUpdate prefpane, it triggers a --fetch-full-installer run. Nudge also performs this method. - ("softwareupdate", ["/usr/sbin/softwareupdate", "--fetch-full-installer"]), // When downloading a major upgrade via softwareupdate cli, it triggers a --fetch-full-installer run. Nudge also performs this method. - ("osinstallersetupd", ["/Applications/*Install macOS *.app/Contents/Frameworks/OSInstallerSetup.framework/Resources/osinstallersetupd"]), // When installing a major upgrade, this process is running. - ("installerauthagent", ["/System/Library/PrivateFrameworks/IASUtilities.framework/Versions/A/Resources/installerauthagent", "/System/Library/PrivateFrameworks/IASUtilities.framework/Versions/A/Resources/installerauthagent"]), // Possibly on macOS 15, this is running when preparing an update. - // /System/Library/PrivateFrameworks/PackageKit.framework/Resources/installd||system_installd - system_installd may be interesting, but I think installd is being used for any package + let commandsWithArgs: [(commandPattern: String, arguments: [String]?, username: String?)] = [ + ("*softwareupdated", ["/System/Library/PrivateFrameworks/MobileSoftwareUpdate.framework/Support/softwareupdated"], nil), // When downloading a minor update, this process is running. + ("*installcoordinationd", ["/System/Library/PrivateFrameworks/InstallCoordination.framework/Support/installcoordinationd"], nil), // When preparing a minor update, this process is running. Unfortunately, after preparing the update, this process appears to stay running. + ("*softwareupdate", ["/usr/bin/softwareupdate", "--fetch-full-installer"], nil), // When downloading a major upgrade via SoftwareUpdate prefpane, it triggers a --fetch-full-installer run. Nudge also performs this method. + ("*softwareupdate", ["/usr/sbin/softwareupdate", "--fetch-full-installer"], nil), // When downloading a major upgrade via softwareupdate cli, it triggers a --fetch-full-installer run. Nudge also performs this method. + ("*osinstallersetupd", ["/Applications/*Install macOS *.app/Contents/Frameworks/OSInstallerSetup.framework/Resources/osinstallersetupd"], nil), // When installing a major upgrade, this process is running. + ("*com.apple.MobileSoftwareUpdate.UpdateBrainService", [], nil), // On macOS 15, this process is running when preparing an update. + ("*com.apple.StreamingUnzipService.privileged", nil, "_nsurlsessiond"), // When preparing an update on macOS 15, this process is running to extract the OS update for preparation. ] return isAnyProcessRunning(commandsWithArgs: commandsWithArgs) } From 0fd3b7ea16be50ffe219b0c48f4386fafe1cd6b9 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 15 Jul 2024 17:21:44 -0500 Subject: [PATCH 129/141] acceptableUpdatePreparingUsage is now opt-out Logic is tested on macOS 12.0.1 to 12.7.5 update and macOS 15 Beta 3 to macOS 15 Public Beta. All logic works correctly. --- CHANGELOG.md | 5 +++-- .../com.github.macadmins.Nudge.tester.json | 1 - .../Preferences/DefaultPreferencesNudge.swift | 2 +- Nudge/Utilities/UILogic.swift | 22 ++++++++++++++----- Schema/jamf/com.github.macadmins.Nudge.json | 2 +- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1754ca9..9a973ef2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Requires macOS 12.0 and higher. ### Breaking Changes +- **macOS 11 is now unsupported** + - Please use Nudge 1.x releases for macOS 11 - Due to implementing markdown support, many of the elements within Nudge may no longer be in **bold** if you customize them. - To work around this please add `**` elements to these customizations - For example: The `mainContentNote` value of `Important Notes` would become `**Important Notes**` @@ -88,8 +90,7 @@ Requires macOS 12.0 and higher. - When the device is running macOS 12.3 or higher, Nudge uses the delta logic for macOS Upgrades - [Issue 417](https://github.com/macadmins/nudge/issues/417) - Nudge can now bypass activations and re-activations when a macOS update is `Downloading`, `Preparing` or `Staged` for installation. - - To enable this, please configure the `acceptableUpdatePreparingUsage` key under `optionalFeatures` to true - - Be aware that the current logic used for this **cannot differentiate** when an update has completed preparing and is in the `Staged` phase, waiting for a user to reboot. This is due to an Apple process staying in memory. This will result in a reduction in Nudge re-activations + - To disable this, please configure the `acceptableUpdatePreparingUsage` key under `optionalFeatures` to false - Issue [555](https://github.com/macadmins/nudge/issues/555) and [571](https://github.com/macadmins/nudge/issues/571) - Nudge can now attempt to honor DoNotDisturb/Focus times - To enable this, please configure the `honorFocusModes` key in `optionalFeatures` to true diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index cf6a71cb..f4b8a199 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -7,7 +7,6 @@ "Safari" ], "acceptableAssertionUsage": false, - "acceptableUpdatePreparingUsage": true, "acceptableCameraUsage": true, "acceptableScreenSharingUsage": true, "attemptToBlockApplicationLaunches": true, diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index 049196f8..abb8721a 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -86,7 +86,7 @@ struct OptionalFeatureVariables { static var acceptableUpdatePreparingUsage: Bool { optionalFeaturesProfile?["acceptableUpdatePreparingUsage"] as? Bool ?? optionalFeaturesJSON?.acceptableUpdatePreparingUsage ?? - false + true } static var acceptableScreenSharingUsage: Bool { diff --git a/Nudge/Utilities/UILogic.swift b/Nudge/Utilities/UILogic.swift index 312655a4..c06255d6 100644 --- a/Nudge/Utilities/UILogic.swift +++ b/Nudge/Utilities/UILogic.swift @@ -267,7 +267,6 @@ func getUsernameForPID(pid: Int32) -> String { } } - func isAnyProcessRunning(commandsWithArgs: [(commandPattern: String, arguments: [String]?, username: String?)]) -> Bool { let processes = getAllProcesses() for (commandPattern, arguments, username) in commandsWithArgs { @@ -287,15 +286,26 @@ func isAnyProcessRunning(commandsWithArgs: [(commandPattern: String, arguments: func isDownloadingOrPreparingSoftwareUpdate() -> Bool { let commandsWithArgs: [(commandPattern: String, arguments: [String]?, username: String?)] = [ + ("*com.apple.StreamingUnzipService", nil, "_nsurlsessiond"), // When downloading a minor update on macOS 12, this process is running to extract the OS update for preparation. + ("*com.apple.StreamingUnzipService.privileged", nil, "_nsurlsessiond"), // When downloading a minor update on macOS 15, this process is running to extract the OS update for preparation. ("*softwareupdated", ["/System/Library/PrivateFrameworks/MobileSoftwareUpdate.framework/Support/softwareupdated"], nil), // When downloading a minor update, this process is running. - ("*installcoordinationd", ["/System/Library/PrivateFrameworks/InstallCoordination.framework/Support/installcoordinationd"], nil), // When preparing a minor update, this process is running. Unfortunately, after preparing the update, this process appears to stay running. ("*softwareupdate", ["/usr/bin/softwareupdate", "--fetch-full-installer"], nil), // When downloading a major upgrade via SoftwareUpdate prefpane, it triggers a --fetch-full-installer run. Nudge also performs this method. ("*softwareupdate", ["/usr/sbin/softwareupdate", "--fetch-full-installer"], nil), // When downloading a major upgrade via softwareupdate cli, it triggers a --fetch-full-installer run. Nudge also performs this method. - ("*osinstallersetupd", ["/Applications/*Install macOS *.app/Contents/Frameworks/OSInstallerSetup.framework/Resources/osinstallersetupd"], nil), // When installing a major upgrade, this process is running. - ("*com.apple.MobileSoftwareUpdate.UpdateBrainService", [], nil), // On macOS 15, this process is running when preparing an update. - ("*com.apple.StreamingUnzipService.privileged", nil, "_nsurlsessiond"), // When preparing an update on macOS 15, this process is running to extract the OS update for preparation. + ("*com.apple.MobileSoftwareUpdate.UpdateBrainService", [], nil), // When preparing a minor update on macOS 12-15, this process is running when preparing an update. This is the same process for Intel and Apple Silicon devices. ] - return isAnyProcessRunning(commandsWithArgs: commandsWithArgs) + return isAnyProcessRunning(commandsWithArgs: commandsWithArgs) && !isSnapshotPresent(snapshotName: "com.apple.os.update-MSUPrepareUpdate") +} + +func isSnapshotPresent(snapshotName: String) -> Bool { + let subProcessUtilities = SubProcessUtilities() + let result = subProcessUtilities.runProcess(launchPath: "/usr/sbin/diskutil", arguments: ["apfs", "listSnapshots", "/"]) + + if result.exitCode != 0 { + print("Error: \(result.error)") + return false + } + + return result.output.contains(snapshotName) } func needToActivateNudge() -> Bool { diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index 9f718656..c92da84c 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -95,7 +95,7 @@ }, { "title": "Configured", - "default": false, + "default": true, "type": "boolean" } ] From 6ebb5922b67cb8f15fd530c5eb9d75465dda57e4 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 15 Jul 2024 18:49:25 -0500 Subject: [PATCH 130/141] moved to gzipped data feed by default --- Nudge/Preferences/DefaultPreferencesNudge.swift | 2 +- Schema/jamf/com.github.macadmins.Nudge.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index abb8721a..dd11fae4 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -140,7 +140,7 @@ struct OptionalFeatureVariables { static var customSOFAFeedURL: String { optionalFeaturesProfile?["customSOFAFeedURL"] as? String ?? optionalFeaturesJSON?.customSOFAFeedURL ?? - "https://sofa.macadmins.io/v1/macos_data_feed.json" + "https://sofafeed.macadmins.io/macos_data_feed.json" } static var disableSoftwareUpdateWorkflow: Bool { diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index c92da84c..e3a14f74 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -232,7 +232,7 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "https://sofa.macadmins.io/v1/macos_data_feed.json" + "placeholder": "https://sofafeed.macadmins.io/macos_data_feed.json" } } } From a6f4acc159625a61551ea7ddc13250319646418b Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 15 Jul 2024 19:47:39 -0500 Subject: [PATCH 131/141] add safety if we cannot save sofa json --- Nudge/Utilities/Utils.swift | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 5e04fc38..248ed800 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -1040,11 +1040,16 @@ struct NetworkFileManager { } } else { do { - if fileManager.fileExists(atPath: appDirectory.path) { - try sofaData.data!.write(to: sofaPath) + if let data = sofaData.data { + if fileManager.fileExists(atPath: appDirectory.path) { + try data.write(to: sofaPath) + } + let assetInfo = try MacOSDataFeed(data: data) + return assetInfo + } else { + LogManager.error("Failed to fetch sofa JSON: No data received.", logger: sofaLog) + return redownloadAndReprocessSOFA(url: url) } - let assetInfo = try MacOSDataFeed(data: sofaData.data!) - return assetInfo } catch { do { try fileManager.removeItem(atPath: sofaPath.path) @@ -1139,11 +1144,16 @@ struct NetworkFileManager { let sofaPath = appDirectory.appendingPathComponent(sofaFile) do { - if fileManager.fileExists(atPath: appDirectory.path) { - try sofaData.data!.write(to: sofaPath) + if let data = sofaData.data { + if fileManager.fileExists(atPath: appDirectory.path) { + try data.write(to: sofaPath) + } + let assetInfo = try MacOSDataFeed(data: data) + return assetInfo + } else { + LogManager.error("Failed to fetch sofa JSON: No data received.", logger: sofaLog) + return redownloadAndReprocessSOFA(url: url) } - let assetInfo = try MacOSDataFeed(data: sofaData.data!) - return assetInfo } catch { LogManager.error("Failed to decode sofa JSON after redownload: \(error.localizedDescription)", logger: sofaLog) LogManager.error("Failed to decode sofa JSON after redownload: \(error)", logger: sofaLog) @@ -1152,7 +1162,7 @@ struct NetworkFileManager { if sofaData.responseCode == nil { LogManager.error("Failed to fetch sofa JSON: Device likely has no network connectivity.", logger: sofaLog) } else { - LogManager.error("Failed to fetch sofa JSON: \(sofaData.error!.localizedDescription)", logger: sofaLog) + LogManager.error("Failed to fetch sofa JSON: \(sofaData.error?.localizedDescription ?? "Unknown error")", logger: sofaLog) } } return nil From f938ea1d45d7977cdf678bb653ba7608fc5d7f60 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 15 Jul 2024 19:48:23 -0500 Subject: [PATCH 132/141] move logic for etag later in the processing path --- Nudge/3rd Party Assets/sofa.swift | 7 ++++--- Nudge/Utilities/Utils.swift | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift index 5e1bf548..584fc0e5 100644 --- a/Nudge/3rd Party Assets/sofa.swift +++ b/Nudge/3rd Party Assets/sofa.swift @@ -222,7 +222,7 @@ extension MacOSDataFeed { } class SOFA: NSObject, URLSessionDelegate { - func URLSync(url: URL, maxRetries: Int = 3) -> (data: Data?, response: URLResponse?, error: Error?, responseCode: Int?) { + func URLSync(url: URL, maxRetries: Int = 3) -> (data: Data?, response: URLResponse?, error: Error?, responseCode: Int?, eTag: String?) { let semaphore = DispatchSemaphore(value: 0) let lastEtag = Globals.nudgeDefaults.string(forKey: "LastEtag") ?? "" var request = URLRequest(url: url) @@ -239,6 +239,7 @@ class SOFA: NSObject, URLSessionDelegate { var response: URLResponse? var responseError: Error? var responseCode: Int? + var eTag: String? var successfulQuery = false // Retry loop @@ -254,7 +255,7 @@ class SOFA: NSObject, URLSessionDelegate { responseCode = httpResponse.statusCode if responseCode == 200 { if let etag = httpResponse.allHeaderFields["Etag"] as? String { - Globals.nudgeDefaults.set(etag, forKey: "LastEtag") + eTag = etag } successfulQuery = true } else if responseCode == 304 { @@ -282,6 +283,6 @@ class SOFA: NSObject, URLSessionDelegate { } } - return (responseData, response, responseError, responseCode) + return (responseData, response, responseError, responseCode, eTag) } } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 248ed800..3a74ba90 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -1045,6 +1045,7 @@ struct NetworkFileManager { try data.write(to: sofaPath) } let assetInfo = try MacOSDataFeed(data: data) + Globals.nudgeDefaults.set(sofaData.eTag, forKey: "LastEtag") return assetInfo } else { LogManager.error("Failed to fetch sofa JSON: No data received.", logger: sofaLog) From b8a73e2562502d5287e81be149f9b3a11df556b6 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 15 Jul 2024 19:48:38 -0500 Subject: [PATCH 133/141] add gzip decompression logic --- Nudge/3rd Party Assets/sofa.swift | 59 +++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift index 584fc0e5..7c0953bf 100644 --- a/Nudge/3rd Party Assets/sofa.swift +++ b/Nudge/3rd Party Assets/sofa.swift @@ -222,6 +222,39 @@ extension MacOSDataFeed { } class SOFA: NSObject, URLSessionDelegate { + func decompressGzip(data: Data) -> Data? { + let tempDir = FileManager.default.temporaryDirectory + let compressedFileURL = tempDir.appendingPathComponent(UUID().uuidString) + let decompressedFileURL = tempDir.appendingPathComponent(UUID().uuidString) + + do { + // Write compressed data to a temporary file + try data.write(to: compressedFileURL) + + // Use gzip to decompress the file + let result = SubProcessUtilities().runProcess(launchPath: "/usr/bin/gzip", arguments: ["--decompress", "--to-stdout", compressedFileURL.path]) + + // Clean up temporary files + try FileManager.default.removeItem(at: compressedFileURL) + + if result.exitCode != 0 { + LogManager.error("gzip failed with status \(result.exitCode): \(result.error)", logger: utilsLog) + return nil + } + + // Convert the output string back to Data + guard let decompressedData = result.output.data(using: .utf8) else { + LogManager.error("Failed to convert decompressed output to Data", logger: utilsLog) + return nil + } + + return decompressedData + } catch { + LogManager.error("Failed to decompress gzip data using command: \(error.localizedDescription)", logger: utilsLog) + return nil + } + } + func URLSync(url: URL, maxRetries: Int = 3) -> (data: Data?, response: URLResponse?, error: Error?, responseCode: Int?, eTag: String?) { let semaphore = DispatchSemaphore(value: 0) let lastEtag = Globals.nudgeDefaults.string(forKey: "LastEtag") ?? "" @@ -245,9 +278,10 @@ class SOFA: NSObject, URLSessionDelegate { // Retry loop while attempts < maxRetries { attempts += 1 - let task = session.dataTask(with: request) { data, resp, error in + let task = session.dataTask(with: request) { [weak self] data, resp, error in + guard let self = self else { return } // To handle self being nil guard let httpResponse = resp as? HTTPURLResponse else { - print("Error receiving response: \(error?.localizedDescription ?? "No error information")") + LogManager.error("Error receiving response: \(error?.localizedDescription ?? "No error information")", logger: utilsLog) semaphore.signal() return } @@ -258,11 +292,30 @@ class SOFA: NSObject, URLSessionDelegate { eTag = etag } successfulQuery = true + + if let encoding = httpResponse.allHeaderFields["Content-Encoding"] as? String { + LogManager.debug("Content-Encoding: \(encoding)", logger: utilsLog) + + if encoding == "gzip", let compressedData = data { + responseData = self.decompressGzip(data: compressedData) + + if responseData == nil { + LogManager.error("Failed to decompress gzip data", logger: utilsLog) + responseData = data // Fall back to using the original data + } else { + LogManager.debug("Successfully decompressed gzip data", logger: utilsLog) + } + } else { + responseData = data + } + } else { + responseData = data + } + } else if responseCode == 304 { successfulQuery = true } - responseData = data response = resp responseError = error semaphore.signal() From ac94ef8ef292f962a14829f6d603edb4cacc7739 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Mon, 15 Jul 2024 21:24:17 -0500 Subject: [PATCH 134/141] add v1 to api call --- Nudge/Preferences/DefaultPreferencesNudge.swift | 2 +- Schema/jamf/com.github.macadmins.Nudge.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Nudge/Preferences/DefaultPreferencesNudge.swift b/Nudge/Preferences/DefaultPreferencesNudge.swift index dd11fae4..f013ec68 100644 --- a/Nudge/Preferences/DefaultPreferencesNudge.swift +++ b/Nudge/Preferences/DefaultPreferencesNudge.swift @@ -140,7 +140,7 @@ struct OptionalFeatureVariables { static var customSOFAFeedURL: String { optionalFeaturesProfile?["customSOFAFeedURL"] as? String ?? optionalFeaturesJSON?.customSOFAFeedURL ?? - "https://sofafeed.macadmins.io/macos_data_feed.json" + "https://sofafeed.macadmins.io/v1/macos_data_feed.json" } static var disableSoftwareUpdateWorkflow: Bool { diff --git a/Schema/jamf/com.github.macadmins.Nudge.json b/Schema/jamf/com.github.macadmins.Nudge.json index e3a14f74..358d5eb6 100644 --- a/Schema/jamf/com.github.macadmins.Nudge.json +++ b/Schema/jamf/com.github.macadmins.Nudge.json @@ -232,7 +232,7 @@ "type": "string", "options": { "inputAttributes": { - "placeholder": "https://sofafeed.macadmins.io/macos_data_feed.json" + "placeholder": "https://sofafeed.macadmins.io/v1/macos_data_feed.json" } } } From d1dcb150d89e24655c6b9853f0aa9f5efeae82b1 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 16 Jul 2024 09:28:35 -0500 Subject: [PATCH 135/141] move 0byte check to reduce erroneous log errors --- Nudge/Utilities/Utils.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 3a74ba90..93d2d0b4 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -979,12 +979,11 @@ struct NetworkFileManager { let appDirectory = appSupportDirectory.appendingPathComponent(Globals.bundleID) let sofaFile = "sofa-macos_data_feed.json" let sofaPath = appDirectory.appendingPathComponent(sofaFile) - let sofaJSON0Bytes = isFileEmpty(atPath: sofaPath.path) var sofaJSONExists = fileManager.fileExists(atPath: sofaPath.path) // Force delete if bad if sofaJSONExists { - if sofaJSON0Bytes { + if isFileEmpty(atPath: sofaPath.path) { do { try fileManager.removeItem(atPath: sofaPath.path) sofaJSONExists = false From a6f01773fda60bba8b4e5e1b591acbfd9f559dfe Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 16 Jul 2024 09:28:57 -0500 Subject: [PATCH 136/141] customfeedurl to test json to use both sofa feeds --- Example Assets/com.github.macadmins.Nudge.tester.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Example Assets/com.github.macadmins.Nudge.tester.json b/Example Assets/com.github.macadmins.Nudge.tester.json index f4b8a199..e075c85a 100644 --- a/Example Assets/com.github.macadmins.Nudge.tester.json +++ b/Example Assets/com.github.macadmins.Nudge.tester.json @@ -10,6 +10,8 @@ "acceptableCameraUsage": true, "acceptableScreenSharingUsage": true, "attemptToBlockApplicationLaunches": true, + "customSOFAFeedURL": "https://sofafeed.macadmins.io/v1/macos_data_feed.json", + "_customSOFAFeedURL": "https://sofa.macadmins.io/v1/macos_data_feed.json", "blockedApplicationBundleIDs": [ "com.apple.Safari" ], From 325e9f71d1a65bd7ffa7f8209d8aa2e11a9e6d52 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 16 Jul 2024 09:29:50 -0500 Subject: [PATCH 137/141] gzip deflate is not needed and add timeout logic sometimes the sofa feed hangs. It could be my device, but this will ensure after 10 seconds, we retry. --- Nudge/3rd Party Assets/sofa.swift | 69 +++++++------------------------ 1 file changed, 16 insertions(+), 53 deletions(-) diff --git a/Nudge/3rd Party Assets/sofa.swift b/Nudge/3rd Party Assets/sofa.swift index 7c0953bf..6d8f3919 100644 --- a/Nudge/3rd Party Assets/sofa.swift +++ b/Nudge/3rd Party Assets/sofa.swift @@ -222,39 +222,6 @@ extension MacOSDataFeed { } class SOFA: NSObject, URLSessionDelegate { - func decompressGzip(data: Data) -> Data? { - let tempDir = FileManager.default.temporaryDirectory - let compressedFileURL = tempDir.appendingPathComponent(UUID().uuidString) - let decompressedFileURL = tempDir.appendingPathComponent(UUID().uuidString) - - do { - // Write compressed data to a temporary file - try data.write(to: compressedFileURL) - - // Use gzip to decompress the file - let result = SubProcessUtilities().runProcess(launchPath: "/usr/bin/gzip", arguments: ["--decompress", "--to-stdout", compressedFileURL.path]) - - // Clean up temporary files - try FileManager.default.removeItem(at: compressedFileURL) - - if result.exitCode != 0 { - LogManager.error("gzip failed with status \(result.exitCode): \(result.error)", logger: utilsLog) - return nil - } - - // Convert the output string back to Data - guard let decompressedData = result.output.data(using: .utf8) else { - LogManager.error("Failed to convert decompressed output to Data", logger: utilsLog) - return nil - } - - return decompressedData - } catch { - LogManager.error("Failed to decompress gzip data using command: \(error.localizedDescription)", logger: utilsLog) - return nil - } - } - func URLSync(url: URL, maxRetries: Int = 3) -> (data: Data?, response: URLResponse?, error: Error?, responseCode: Int?, eTag: String?) { let semaphore = DispatchSemaphore(value: 0) let lastEtag = Globals.nudgeDefaults.string(forKey: "LastEtag") ?? "" @@ -262,12 +229,13 @@ class SOFA: NSObject, URLSessionDelegate { let config = URLSessionConfiguration.default config.requestCachePolicy = .useProtocolCachePolicy let session = URLSession(configuration: config, delegate: self, delegateQueue: nil) + request.addValue("\(Globals.bundleID)/\(VersionManager.getNudgeVersion())", forHTTPHeaderField: "User-Agent") request.setValue(lastEtag, forHTTPHeaderField: "If-None-Match") // TODO: I'm saving the Etag and sending it, but due to forcing this into a syncronous call, it is always returning a 200 code. When using this in an asycronous method, it eventually returns the 304 response. I'm not sure how to fix this bug. request.addValue("gzip, deflate, br", forHTTPHeaderField: "Accept-Encoding") // Force compression for JSON - var attempts = 0 + var attempts = 0 var responseData: Data? var response: URLResponse? var responseError: Error? @@ -278,8 +246,7 @@ class SOFA: NSObject, URLSessionDelegate { // Retry loop while attempts < maxRetries { attempts += 1 - let task = session.dataTask(with: request) { [weak self] data, resp, error in - guard let self = self else { return } // To handle self being nil + let task = session.dataTask(with: request) { data, resp, error in guard let httpResponse = resp as? HTTPURLResponse else { LogManager.error("Error receiving response: \(error?.localizedDescription ?? "No error information")", logger: utilsLog) semaphore.signal() @@ -287,6 +254,9 @@ class SOFA: NSObject, URLSessionDelegate { } responseCode = httpResponse.statusCode + response = resp + responseError = error + if responseCode == 200 { if let etag = httpResponse.allHeaderFields["Etag"] as? String { eTag = etag @@ -295,33 +265,26 @@ class SOFA: NSObject, URLSessionDelegate { if let encoding = httpResponse.allHeaderFields["Content-Encoding"] as? String { LogManager.debug("Content-Encoding: \(encoding)", logger: utilsLog) - - if encoding == "gzip", let compressedData = data { - responseData = self.decompressGzip(data: compressedData) - - if responseData == nil { - LogManager.error("Failed to decompress gzip data", logger: utilsLog) - responseData = data // Fall back to using the original data - } else { - LogManager.debug("Successfully decompressed gzip data", logger: utilsLog) - } - } else { - responseData = data - } - } else { - responseData = data } + responseData = data + } else if responseCode == 304 { successfulQuery = true } - response = resp - responseError = error semaphore.signal() } + + let timeout = DispatchWorkItem { + task.cancel() + semaphore.signal() + } + + DispatchQueue.global().asyncAfter(deadline: .now() + 10, execute: timeout) task.resume() semaphore.wait() + timeout.cancel() if successfulQuery { break From b8255f7d7e44bce5e7c16bd75095adbb2a3a5c99 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 16 Jul 2024 09:36:31 -0500 Subject: [PATCH 138/141] bump release date 07-19 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a973ef2..3d4ee793 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [2.0.0] - 2024-07-17 +## [2.0.0] - 2024-07-19 Requires macOS 12.0 and higher. ### Breaking Changes From bb0fa25acf25e5b24bf77e1af051d3e8a26ef74b Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 16 Jul 2024 17:32:55 -0500 Subject: [PATCH 139/141] remove bad log event when using latest* values --- Nudge/Utilities/Utils.swift | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 93d2d0b4..3b9c3d6b 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -1433,8 +1433,19 @@ struct VersionManager { } static func getMajorRequiredNudgeOSVersion() -> Int { - guard let majorVersion = Int(nudgePrimaryState.requiredMinimumOSVersion.split(separator: ".").first ?? "") else { - LogManager.error("Invalid format for requiredMinimumOSVersion - value is \(nudgePrimaryState.requiredMinimumOSVersion)", logger: utilsLog) + let requiredVersion = nudgePrimaryState.requiredMinimumOSVersion + + // Handle new string values directly + switch requiredVersion { + case "latest", "latest-minor", "latest-supported": + return 0 + default: + break + } + + // Existing logic for version numbers + guard let majorVersion = Int(requiredVersion.split(separator: ".").first ?? "") else { + LogManager.error("Invalid format for requiredMinimumOSVersion - value is \(requiredVersion)", logger: utilsLog) return 0 } logOSVersion(majorVersion, for: "Major required OS version") From bb0f9e0baf684e58cb445b4a3766ee39d48a09f0 Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Tue, 16 Jul 2024 17:33:14 -0500 Subject: [PATCH 140/141] get rid of all prints and log properly --- Nudge/UI/Main.swift | 10 +++++----- Nudge/Utilities/Preferences.swift | 12 ++++++------ Nudge/Utilities/UILogic.swift | 2 +- Nudge/Utilities/Utils.swift | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Nudge/UI/Main.swift b/Nudge/UI/Main.swift index 4c704f41..a64ec104 100644 --- a/Nudge/UI/Main.swift +++ b/Nudge/UI/Main.swift @@ -439,7 +439,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } } else { - print("applicationTerminatedNotificationImagePath does not exist on disk, skipping notification image.") + LogManager.error("applicationTerminatedNotificationImagePath does not exist on disk, skipping notification image.", logger: uiLog) } return content } @@ -621,7 +621,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { object: NSApplication.shared, queue: .main) { _ in if UserExperienceVariables.allowMovableWindow { return } - print("Window object frame moved - Notification Center") + LogManager.debug("Window object frame moved - Notification Center", logger: utilsLog) UIUtilities().centerNudge() } } @@ -732,17 +732,17 @@ class AppDelegate: NSObject, NSApplicationDelegate { class WindowDelegate: NSObject, NSWindowDelegate { func windowDidMove(_ notification: Notification) { if UserExperienceVariables.allowMovableWindow { return } - print("Window attempted to move - Window Delegate") + LogManager.debug("Window attempted to move - Window Delegate", logger: utilsLog) UIUtilities().centerNudge() } func windowDidChangeScreen(_ notification: Notification) { if UserExperienceVariables.allowMovableWindow { return } - print("Window moved screens - Window Delegate") + LogManager.debug("Window moved screens - Window Delegate", logger: utilsLog) UIUtilities().centerNudge() } func windowDidChangeScreenProfile(_ notification: Notification) { if UserExperienceVariables.allowMovableWindow { return } - print("Display has changed profiles - Window Delegate") + LogManager.debug("Display has changed profiles - Window Delegate", logger: utilsLog) UIUtilities().centerNudge() } } diff --git a/Nudge/Utilities/Preferences.swift b/Nudge/Utilities/Preferences.swift index 9bdef871..fdbd1288 100644 --- a/Nudge/Utilities/Preferences.swift +++ b/Nudge/Utilities/Preferences.swift @@ -34,7 +34,7 @@ func getDesiredLanguage(locale: Locale? = nil) -> String { } } } catch { - print("Failed to decode plist: \(error)") + LogManager.error("Failed to decode plist: \(error)", logger: prefsProfileLog) } } return UserInterfaceVariables.fallbackLanguage @@ -81,7 +81,7 @@ func getOptionalFeaturesProfile() -> [String: Any]? { return nil } } catch { - print("Failed to decode plist: \(error)") + LogManager.error("Failed to decode plist: \(error)", logger: prefsProfileLog) return nil } } @@ -150,7 +150,7 @@ func getOSVersionRequirementsProfile() -> OSVersionRequirement? { return nil } } catch { - print("Failed to decode plist: \(error)") + LogManager.error("Failed to decode plist: \(error)", logger: prefsProfileLog) return nil } } @@ -240,7 +240,7 @@ func getUserExperienceProfile() -> [String: Any]? { return nil } } catch { - print("Failed to decode plist: \(error)") + LogManager.error("Failed to decode plist: \(error)", logger: prefsProfileLog) return nil } } @@ -288,7 +288,7 @@ func getUserInterfaceProfile() -> [String: Any]? { return nil } } catch { - print("Failed to decode plist: \(error)") + LogManager.error("Failed to decode plist: \(error)", logger: prefsProfileLog) return nil } } @@ -332,7 +332,7 @@ func getUserInterfaceUpdateElementsProfile() -> [String: AnyObject]? { return nil } } catch { - print("Failed to decode plist: \(error)") + LogManager.error("Failed to decode plist: \(error)", logger: prefsProfileLog) return nil } } diff --git a/Nudge/Utilities/UILogic.swift b/Nudge/Utilities/UILogic.swift index c06255d6..d84dd827 100644 --- a/Nudge/Utilities/UILogic.swift +++ b/Nudge/Utilities/UILogic.swift @@ -301,7 +301,7 @@ func isSnapshotPresent(snapshotName: String) -> Bool { let result = subProcessUtilities.runProcess(launchPath: "/usr/sbin/diskutil", arguments: ["apfs", "listSnapshots", "/"]) if result.exitCode != 0 { - print("Error: \(result.error)") + LogManager.error("Error: \(result.error)", logger: utilsLog) return false } diff --git a/Nudge/Utilities/Utils.swift b/Nudge/Utilities/Utils.swift index 3b9c3d6b..c9f0fac7 100644 --- a/Nudge/Utilities/Utils.swift +++ b/Nudge/Utilities/Utils.swift @@ -225,7 +225,7 @@ struct AppStateManager { if let value = CFPreferencesCopyAppValue(key, appID) as? Bool { return value } else { - print("Key '\(key)' not found in preferences") + LogManager.info("Key '\(key)' not found in preferences", logger: uiLog) return false } @@ -988,7 +988,7 @@ struct NetworkFileManager { try fileManager.removeItem(atPath: sofaPath.path) sofaJSONExists = false } catch { - print("Error deleting file: \(error.localizedDescription)") + LogManager.error("Error deleting file: \(error.localizedDescription)", logger: sofaLog) } } } @@ -1055,7 +1055,7 @@ struct NetworkFileManager { try fileManager.removeItem(atPath: sofaPath.path) sofaJSONExists = false } catch { - print("Error deleting file: \(error.localizedDescription)") + LogManager.error("Error deleting file: \(error.localizedDescription)", logger: sofaLog) } LogManager.error("Failed to decode sofa JSON: \(error.localizedDescription)", logger: sofaLog) LogManager.error("Failed to decode sofa JSON: \(error)", logger: sofaLog) @@ -1129,7 +1129,7 @@ struct NetworkFileManager { return fileSize.intValue == 0 } } catch { - print("Error getting file attributes: \(error.localizedDescription)") + LogManager.error("Error getting file attributes: \(error.localizedDescription)", logger: prefsJSONLog) } return false } From 2cba17605d28d4f1eef573f6f13bb6ec7aaa945b Mon Sep 17 00:00:00 2001 From: Erik Gomez Date: Wed, 17 Jul 2024 22:33:55 -0500 Subject: [PATCH 141/141] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d4ee793..5f7b157d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [2.0.0] - 2024-07-19 +## [2.0.0] - 2024-07-18 Requires macOS 12.0 and higher. ### Breaking Changes