SecureEventInputSputnik // Handle screen-saver and lock-screen.
This commit is contained in:
parent
0742af02a9
commit
7339d6e6e6
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
import AppKit
|
import AppKit
|
||||||
import IOKit
|
import IOKit
|
||||||
|
import Quartz
|
||||||
|
|
||||||
public enum SecureEventInputSputnik {
|
public enum SecureEventInputSputnik {
|
||||||
public static func getIORegListResults() -> String? {
|
public static func getIORegListResults() -> String? {
|
||||||
|
@ -40,6 +41,7 @@ public enum SecureEventInputSputnik {
|
||||||
/// Note that you cannot terminate a process if your app is Sandboxed.
|
/// Note that you cannot terminate a process if your app is Sandboxed.
|
||||||
/// - Returns: Matched results as a dictionary in `[Int32: NSRunningApplication]` format. The keys are PIDs.
|
/// - Returns: Matched results as a dictionary in `[Int32: NSRunningApplication]` format. The keys are PIDs.
|
||||||
/// - Remark: The`"com.apple.SecurityAgent"` won't be included in the result since it is a system process.
|
/// - Remark: The`"com.apple.SecurityAgent"` won't be included in the result since it is a system process.
|
||||||
|
/// Also, "com.apple.loginwindow" should be excluded as long as the system screen saver engine is running.
|
||||||
public static func getRunningSecureInputApps(abusersOnly: Bool = false) -> [Int32: NSRunningApplication] {
|
public static func getRunningSecureInputApps(abusersOnly: Bool = false) -> [Int32: NSRunningApplication] {
|
||||||
var result = [Int32: NSRunningApplication]()
|
var result = [Int32: NSRunningApplication]()
|
||||||
guard let rawData = getIORegListResults() else { return result }
|
guard let rawData = getIORegListResults() else { return result }
|
||||||
|
@ -48,6 +50,7 @@ public enum SecureEventInputSputnik {
|
||||||
guard let filteredNumStr = Int32(currentLine.filter("0123456789".contains)) else { return }
|
guard let filteredNumStr = Int32(currentLine.filter("0123456789".contains)) else { return }
|
||||||
guard let matchedApp = NSRunningApplication(processIdentifier: filteredNumStr) else { return }
|
guard let matchedApp = NSRunningApplication(processIdentifier: filteredNumStr) else { return }
|
||||||
guard matchedApp.bundleIdentifier != "com.apple.SecurityAgent" else { return }
|
guard matchedApp.bundleIdentifier != "com.apple.SecurityAgent" else { return }
|
||||||
|
guard !(matchedApp.isLoginWindowWithLockedScreenOrScreenSaver) else { return }
|
||||||
if abusersOnly {
|
if abusersOnly {
|
||||||
guard !matchedApp.isActive else { return }
|
guard !matchedApp.isActive else { return }
|
||||||
}
|
}
|
||||||
|
@ -56,3 +59,19 @@ public enum SecureEventInputSputnik {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension NSRunningApplication {
|
||||||
|
public var isLoginWindowWithLockedScreenOrScreenSaver: Bool {
|
||||||
|
guard bundleIdentifier == "com.apple.loginwindow" else { return false }
|
||||||
|
return Self.isScreenSaverEngineRunning || Self.isDesktopLocked
|
||||||
|
}
|
||||||
|
|
||||||
|
private static var isScreenSaverEngineRunning: Bool {
|
||||||
|
!NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.ScreenSaver.Engine").isEmpty
|
||||||
|
}
|
||||||
|
|
||||||
|
private static var isDesktopLocked: Bool {
|
||||||
|
guard let x = CGSessionCopyCurrentDictionary() as? [String: Any] else { return false }
|
||||||
|
return x.keys.contains("CGSSessionScreenIsLocked")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue