diff --git a/Docs/Preferences.png b/Docs/Preferences.png index 66718c5..0458034 100644 Binary files a/Docs/Preferences.png and b/Docs/Preferences.png differ diff --git a/NuwaClient/Base.lproj/Main.storyboard b/NuwaClient/Base.lproj/Main.storyboard index f81f4f0..df03560 100644 --- a/NuwaClient/Base.lproj/Main.storyboard +++ b/NuwaClient/Base.lproj/Main.storyboard @@ -932,10 +932,10 @@ - + - + @@ -948,14 +948,14 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + - - - - + + + + - - - + + + - - - + + + @@ -1146,7 +1244,7 @@ DQ - + diff --git a/NuwaClient/KextManager.swift b/NuwaClient/KextManager.swift index c55df3e..4e99542 100644 --- a/NuwaClient/KextManager.swift +++ b/NuwaClient/KextManager.swift @@ -17,6 +17,7 @@ class KextManager { var connection: io_connect_t = 0 var isConnected: Bool = false var nuwaLog = NuwaLog() + var auditSwitch = (UserDefaults.standard.integer(forKey: UserAuditSwitch) != 0) var delegate: NuwaEventProcessProtocol? private func processConnectionRequest(iterator: io_iterator_t) { @@ -149,7 +150,13 @@ extension KextManager { return } } - delegate?.processAuthEvent(nuwaEvent) + + if auditSwitch { + delegate?.processAuthEvent(nuwaEvent) + } + else { + _ = replyAuthEvent(eventID: nuwaEvent.eventID, isAllowed: true) + } } func processNotifyEvent(_ event: inout NuwaKextEvent) { @@ -270,6 +277,11 @@ extension KextManager: NuwaEventProviderProtocol { return true } + func setAuditSwitch(status: Bool) -> Bool { + auditSwitch = status + return true + } + func replyAuthEvent(eventID: UInt64, isAllowed: Bool) -> Bool { guard eventID != 0 else { Logger(.Warning, "Invalid ID for auth event.") diff --git a/NuwaClient/SextManager.swift b/NuwaClient/SextManager.swift index 9bf1246..4e97dbb 100644 --- a/NuwaClient/SextManager.swift +++ b/NuwaClient/SextManager.swift @@ -11,6 +11,7 @@ class SextManager { private var sextProxy: SextXPCProtocol? static let shared = SextManager() var nuwaLog = NuwaLog() + var auditSwitch = (UserDefaults.standard.integer(forKey: UserAuditSwitch) != 0) var delegate: NuwaEventProcessProtocol? } @@ -50,7 +51,12 @@ extension SextManager: ManagerXPCProtocol { return } - delegate?.processAuthEvent(event) + if auditSwitch { + delegate?.processAuthEvent(event) + } + else { + _ = replyAuthEvent(eventID: event.eventID, isAllowed: true) + } } } @@ -100,6 +106,11 @@ extension SextManager: NuwaEventProviderProtocol { return true } + func setAuditSwitch(status: Bool) -> Bool { + auditSwitch = status + return true + } + func replyAuthEvent(eventID: UInt64, isAllowed: Bool) -> Bool { if eventID == 0 { return false diff --git a/NuwaClient/ViewManager/PrefsViewController.swift b/NuwaClient/ViewManager/PrefsViewController.swift index e312f94..f1ca9c4 100644 --- a/NuwaClient/ViewManager/PrefsViewController.swift +++ b/NuwaClient/ViewManager/PrefsViewController.swift @@ -14,6 +14,8 @@ class PrefsViewController: NSViewController { case MuteProcess } + @IBOutlet weak var logLevelButton: NSPopUpButton! + @IBOutlet weak var auditSwitchButton: NSPopUpButton! @IBOutlet weak var upRadioButton: NSButton! @IBOutlet weak var downRadioButton: NSButton! @IBOutlet weak var pathView: NSTextView! @@ -21,6 +23,8 @@ class PrefsViewController: NSViewController { @IBOutlet weak var networkCheckButton: NSButton! @IBOutlet weak var processCheckButton: NSButton! + private var nuwaLog = NuwaLog() + private var auditSwitch = true private var isUpButtonChoosed = true private var muteChoice = MuteChoice.FilterFile private var muteType = NuwaMuteType.FilterFileByFilePath @@ -40,6 +44,10 @@ class PrefsViewController: NSViewController { else { eventProvider = KextManager.shared } + auditSwitch = (UserDefaults.standard.integer(forKey: UserAuditSwitch) != 0) + + logLevelButton.selectItem(withTag: Int(nuwaLog.logLevel)) + auditSwitchButton.selectItem(withTag: (auditSwitch ? 1 : 0)) } private func updateCheckButton(choice: MuteChoice) { @@ -89,7 +97,6 @@ class PrefsViewController: NSViewController { muteChoice = .FilterFile updateCheckButton(choice: muteChoice) upButtonClicked(upRadioButton) - Logger(.Info, "fileButtonClicked") } @IBAction func networkButtonClicked(_ sender: NSButton) { @@ -99,7 +106,6 @@ class PrefsViewController: NSViewController { networkCheckButton.isHidden = false updateCheckButton(choice: muteChoice) upButtonClicked(upRadioButton) - Logger(.Info, "networkButtonClicked") } @IBAction func processButtonClicked(_ sender: NSButton) { @@ -131,6 +137,8 @@ class PrefsViewController: NSViewController { @IBAction func updateButtonClicked(_ sender: NSButton) { let inputs = pathView.string.components(separatedBy: "\n") + let level = logLevelButton.selectedItem!.tag + let status = auditSwitchButton.selectedItem!.tag > 0 switch muteType { case .FilterFileByFilePath, .FilterFileByProcPath: @@ -146,6 +154,13 @@ class PrefsViewController: NSViewController { _ = eventProvider!.udpateMuteList(list: inputs, type: muteType) } + if level != nuwaLog.logLevel { + _ = eventProvider!.setLogLevel(level: UInt8(level)) + } + if status != auditSwitch { + _ = eventProvider!.setAuditSwitch(status: status) + } + view.window?.close() } } diff --git a/NuwaStone.xcodeproj/project.pbxproj b/NuwaStone.xcodeproj/project.pbxproj index e0e2212..909b1b6 100644 --- a/NuwaStone.xcodeproj/project.pbxproj +++ b/NuwaStone.xcodeproj/project.pbxproj @@ -741,7 +741,7 @@ "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 11.0; - MARKETING_VERSION = 1.2; + MARKETING_VERSION = 1.3; PRODUCT_BUNDLE_IDENTIFIER = com.nuwastone.service.eps; PRODUCT_NAME = "$(inherited)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -773,7 +773,7 @@ "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 11.0; - MARKETING_VERSION = 1.2; + MARKETING_VERSION = 1.3; PRODUCT_BUNDLE_IDENTIFIER = com.nuwastone.service.eps; PRODUCT_NAME = "$(inherited)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -799,6 +799,7 @@ ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = NuwaService/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NuwaService; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_KEY_NSMainStoryboardFile = Main; INFOPLIST_KEY_NSPrincipalClass = NSApplication; @@ -807,7 +808,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; - MARKETING_VERSION = 1.2; + MARKETING_VERSION = 1.3; PRODUCT_BUNDLE_IDENTIFIER = com.nuwastone.service; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -832,6 +833,7 @@ ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = NuwaService/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NuwaService; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_KEY_NSMainStoryboardFile = Main; INFOPLIST_KEY_NSPrincipalClass = NSApplication; @@ -840,7 +842,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; - MARKETING_VERSION = 1.2; + MARKETING_VERSION = 1.3; PRODUCT_BUNDLE_IDENTIFIER = com.nuwastone.service; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -981,6 +983,7 @@ ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = NuwaClient/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NuwaClient; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_KEY_NSMainStoryboardFile = Main; INFOPLIST_KEY_NSPrincipalClass = NSApplication; @@ -989,7 +992,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; - MARKETING_VERSION = 1.2; + MARKETING_VERSION = 1.3; PRODUCT_BUNDLE_IDENTIFIER = com.nuwastone.client; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1015,6 +1018,7 @@ ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = NuwaClient/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NuwaClient; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_KEY_NSMainStoryboardFile = Main; INFOPLIST_KEY_NSPrincipalClass = NSApplication; @@ -1023,7 +1027,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.13; - MARKETING_VERSION = 1.2; + MARKETING_VERSION = 1.3; PRODUCT_BUNDLE_IDENTIFIER = com.nuwastone.client; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1047,7 +1051,7 @@ INFOPLIST_FILE = NuwaKext/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; MACOSX_DEPLOYMENT_TARGET = 10.13; - MARKETING_VERSION = 1.2; + MARKETING_VERSION = 1.3; MODULE_NAME = com.nuwastone.service; MODULE_START = 0; MODULE_STOP = 0; @@ -1076,7 +1080,7 @@ INFOPLIST_FILE = NuwaKext/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; MACOSX_DEPLOYMENT_TARGET = 10.13; - MARKETING_VERSION = 1.2; + MARKETING_VERSION = 1.3; MODULE_NAME = com.nuwastone.service; MODULE_START = 0; MODULE_STOP = 0; diff --git a/NuwaUtils/NuwaCommon.swift b/NuwaUtils/NuwaCommon.swift index 34fd183..7b2b726 100644 --- a/NuwaUtils/NuwaCommon.swift +++ b/NuwaUtils/NuwaCommon.swift @@ -19,6 +19,7 @@ let KextService = "DriverService" let MachServiceKey = "MachServiceName" let UserLogLevel = "Log Level" +let UserAuditSwitch = "Audit Switch" let UserAllowExecList = "Allow Exec List" let UserDenyExecList = "Deny Exec List" let UserMuteFileByFile = "File Paths for Filtering File" diff --git a/NuwaUtils/NuwaEvent.swift b/NuwaUtils/NuwaEvent.swift index b8f0bc2..eac7309 100644 --- a/NuwaUtils/NuwaEvent.swift +++ b/NuwaUtils/NuwaEvent.swift @@ -46,6 +46,7 @@ protocol NuwaEventProviderProtocol { func startProvider() -> Bool func stopProvider() -> Bool func setLogLevel(level: UInt8) -> Bool + func setAuditSwitch(status: Bool) -> Bool func replyAuthEvent(eventID: UInt64, isAllowed: Bool) -> Bool func udpateMuteList(list: [String], type: NuwaMuteType) -> Bool } diff --git a/README.md b/README.md index 38f7d5b..7d29706 100644 --- a/README.md +++ b/README.md @@ -43,8 +43,8 @@ NuwaStone wont't let unsigned app run without your authorization, but the app wi

-Select 'Preferences' from the status bar menu of **NuwaClient** application to check or update user preferences. -It supports filtering as below +Select 'Preferences' or 'Settings' from the status bar menu of **NuwaClient** application to check or update user preferences. +It supports setting the log level, opening/closing audit switch, and filtering events as below - Mute file events by file paths or process paths - Mute network events by process paths or remote ip addresses