diff --git a/SupportCompanion/Preferences.swift b/SupportCompanion/Preferences.swift index 575a3af..3ecb20b 100644 --- a/SupportCompanion/Preferences.swift +++ b/SupportCompanion/Preferences.swift @@ -16,59 +16,61 @@ class Preferences: ObservableObject { case generic = "LastGenericNotificationTime" case appUpdate = "LastAppUpdateNotificationTime" } - + // MARK: - Notifications - + @AppStorage(NotificationType.softwareUpdate.rawValue) var lastSoftwareUpdateNotificationTime: String = "" - + @AppStorage(NotificationType.rebootReminder.rawValue) var lastRebootReminderNotificationTime: String = "" - + @AppStorage(NotificationType.generic.rawValue) var lastGenericNotificationTime: String = "" - + @AppStorage(NotificationType.appUpdate.rawValue) var lastAppUpdateNotificationTime: String = "" - + @AppStorage("NotificationTitle") var notificationTitle: String = "Support Companion" - + @AppStorage("NotificationInterval") var notificationInterval: Int = 4 - + @AppStorage("NotifcationImage") var notificationImage: String = "" - + @AppStorage("SoftwareUpdateNotificationButtonText") var softwareUpdateNotificationButtonText: String = Constants.Notifications.SoftwareUpdate.UpdateNotificationButtonText - + @AppStorage("SoftwareUpdateNotificationCommand") var softwareUpdateNotificationCommand: String = "open \(Constants.Panels.softwareUpdates)" - + @AppStorage("SoftwareUpdateNotificationMessage") var softwareUpdateNotificationMessage: String = Constants.Notifications.SoftwareUpdate.UpdateNotificationMessage - + @AppStorage("AppUpdateNotificationMessage") var appUpdateNotificationMessage: String = Constants.Notifications.AppUpdate.UpdateNotificationMessage - + @AppStorage("AppUpdateNotificationButtonText") var appUpdateNotificationButtonText: String = Constants.Notifications.AppUpdate.UpdateNotificationButtonText - + @AppStorage("AppUpdateNotificationCommand") var appUpdateNotificationCommand: String = "" @AppStorage("RebootReminderDays") var rebootReminderDays: Int = 0 - + // MARK: - branding - + @AppStorage("BrandName") var brandName: String = "Support Companion" - + @AppStorage("BrandLogo") var brandLogo: String = "" - + @AppStorage("BrandLogoLight") var brandLogoLight: String = "" - + @AppStorage("AccentColor") var accentColor: String? - + // MARK: - Menu - + @AppStorage("MenuShowIdentity") var menuShowIdentity: Bool = true @AppStorage("MenuShowApps") var menuShowApps: Bool = true @AppStorage("MenuShowSelfService") var menuShowSelfService: Bool = true + @AppStorage("CompanyPortalUrl") var companyPortalUrl: String = "" + @AppStorage("MenuShowCompanyPortal") var menuShowCompanyPortal: Bool = true - + @AppStorage("MenuShowKnowledgeBase") var menuShowKnowledgeBase: Bool = true - + @AppStorage("KnowledgeBaseUrl") var knowledgeBaseUrl: String = "" @AppStorage("ShowLogoInTrayMenu") var showLogoInTrayMenu: Bool = true @@ -78,9 +80,9 @@ class Preferences: ObservableObject { @AppStorage("MarkdownMenuLabel") var markdownMenuLabel: String = "" @AppStorage("MarkdownMenuIcon") var markdownMenuIcon: String = "" - + @AppStorage("CustomCardsMenuLabel") var customCardsMenuLabel: String = "" - + @AppStorage("CustomCardsMenuIcon") var customCardsMenuIcon: String = "" @AppStorage("TrayMenuBrandingIcon") var trayMenuBrandingIcon: String = "" @@ -88,42 +90,42 @@ class Preferences: ObservableObject { @AppStorage("TrayMenuShowIcon") var trayMenuShowIcon: Bool = true // MARK: - Actions - + @AppStorage("SupportPageUrl") var supportPageURL: String = "" - + @AppStorage("ChangePasswordMode") var changePasswordMode: String = "" - + @AppStorage("ChangePasswordUrl") var changePasswordUrl: String = "" - + @AppStorage("Mode") var mode: String = "" - + @Published var actions: [Action] = [] - + @Published var hiddenActions: [String] = UserDefaults.standard.array(forKey: "HiddenActions") as? [String] ?? [] - + @Published var logFolders: [String] = UserDefaults.standard.array(forKey: "LogFolders") as? [String] ?? [] @Published var excludedLogFolders: [String] = UserDefaults.standard.array(forKey: "ExcludedLogFolders") as? [String] ?? [] @AppStorage("RequirePrivilegedActionAuthentication") var requirePrivilegedActionAuthentication: Bool = true - + // MARK: - Desktop Info - + @AppStorage("DesktopInfoBackgroundOpacity") var desktopInfoBackgroundOpacity: Double = 0.001 - + @AppStorage("DesktopInfoBackgroundFrosted") var desktopInfoBackgroundFrosted: Bool = false - + @AppStorage("DesktopInfoWindowPosition") var desktopInfoWindowPosition: String = "LowerRight" @Published var currentWindowPosition: String = "LowerRight" - + @AppStorage("ShowDesktopInfo") var showDesktopInfo: Bool = false - + @AppStorage("DesktopInfoFontSize") var desktopInfoFontSize: Int = 14 - + @AppStorage("DesktopInfoLevel") var desktopInfoLevel: Int = 4 - + @Published var desktopInfoHideItems: [String] = UserDefaults.standard.array(forKey: "DesktopInfoHideItems") as? [String] ?? [] - + // MARK: - Home @AppStorage("CustomCardPath") var customCardPath: String = "" { @@ -147,18 +149,18 @@ class Preferences: ObservableObject { @Published var customCardPathPublished: String = "" @Published var hiddenCards: [String] = UserDefaults.standard.array(forKey: "HiddenCards") as? [String] ?? [] - + private var cancellable: AnyCancellable? - + private var cancellables = Set() // Watcher for ~/Library/Preferences to detect external defaults writes private var prefsDirSource: DispatchSourceFileSystemObject? private var prefsDirFD: Int32 = -1 // MARK: - Support info - + @AppStorage("SupportEmail") var supportEmail: String = "" - + @AppStorage("SupportPhone") var supportPhone: String = "" // MARK: - Elevate privileges @@ -187,7 +189,7 @@ class Preferences: ObservableObject { @AppStorage("DebugLogging") var debugLogging: Bool = false var mdm: String = "Unknown" - + init() { ensureDefaultsInitialized() startWatchingCustomCardPath() @@ -307,18 +309,46 @@ class Preferences: ObservableObject { let selfServiceExists = fileManager.fileExists(atPath: Constants.AppPaths.selfService) let mscExists = fileManager.fileExists(atPath: Constants.AppPaths.MSC) let mdmUrl = await getMDMUrl() - - if mdmUrl != "Unknown" { - Logger.shared.logDebug("MDM URL detected: \(mdmUrl)") - if mdmUrl.contains("i.manage.microsoft.com") { - Logger.shared.logDebug("MDM URL contains i.manage.microsoft.com, setting mdm to Intune.") - mdm = "Intune" - } else if mdmUrl.contains("jamf") { - Logger.shared.logDebug("MDM URL contains jamf, setting mdm to Jamf.") - mdm = "Jamf" - } - } - + + if mdmUrl != "Unknown" { + Logger.shared.logDebug("MDM URL detected: \(mdmUrl)") + + // Try to parse the URL and inspect the host + if let url = URL(string: mdmUrl), + let host = url.host?.lowercased() { + + // Detect Intune via manage.microsoft.* host + let pattern = #"(^|\.)manage\.microsoft\.[a-z0-9-]{2,63}$"# + if let regex = try? NSRegularExpression(pattern: pattern, options: []) { + let range = NSRange(host.startIndex..