SecureEventInputSputnik // New method for checking a locked desktop.
This commit is contained in:
parent
cfe8f8759c
commit
95f0ff5fd8
|
@ -9,10 +9,16 @@
|
||||||
/// A Swift script to check whether a non-system process is abusing the SecureEventInput.
|
/// A Swift script to check whether a non-system process is abusing the SecureEventInput.
|
||||||
|
|
||||||
import AppKit
|
import AppKit
|
||||||
|
import Combine
|
||||||
import IOKit
|
import IOKit
|
||||||
import Quartz
|
|
||||||
|
|
||||||
public enum SecureEventInputSputnik {
|
public class SecureEventInputSputnik {
|
||||||
|
public let shared = SecureEventInputSputnik()
|
||||||
|
|
||||||
|
public init() {
|
||||||
|
oobe()
|
||||||
|
}
|
||||||
|
|
||||||
public static func getIORegListResults() -> String? {
|
public static func getIORegListResults() -> String? {
|
||||||
var resultDictionaryCF: Unmanaged<CFMutableDictionary>?
|
var resultDictionaryCF: Unmanaged<CFMutableDictionary>?
|
||||||
/// Regarding the parameter in IORegistryGetRootEntry:
|
/// Regarding the parameter in IORegistryGetRootEntry:
|
||||||
|
@ -60,8 +66,8 @@ public enum SecureEventInputSputnik {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension NSRunningApplication {
|
public extension NSRunningApplication {
|
||||||
public var isLoginWindowWithLockedScreenOrScreenSaver: Bool {
|
var isLoginWindowWithLockedScreenOrScreenSaver: Bool {
|
||||||
guard bundleIdentifier == "com.apple.loginwindow" else { return false }
|
guard bundleIdentifier == "com.apple.loginwindow" else { return false }
|
||||||
return Self.isScreenSaverEngineRunning || Self.isDesktopLocked
|
return Self.isScreenSaverEngineRunning || Self.isDesktopLocked
|
||||||
}
|
}
|
||||||
|
@ -70,8 +76,36 @@ extension NSRunningApplication {
|
||||||
!NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.ScreenSaver.Engine").isEmpty
|
!NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.ScreenSaver.Engine").isEmpty
|
||||||
}
|
}
|
||||||
|
|
||||||
private static var isDesktopLocked: Bool {
|
fileprivate(set) static var isDesktopLocked: Bool = false
|
||||||
guard let x = CGSessionCopyCurrentDictionary() as? [String: Any] else { return false }
|
}
|
||||||
return x.keys.contains("CGSSessionScreenIsLocked")
|
|
||||||
|
extension SecureEventInputSputnik {
|
||||||
|
private static var combinePoolCocoa = [any NSObjectProtocol]()
|
||||||
|
|
||||||
|
@available(macOS 10.15, *)
|
||||||
|
private static var combinePool = Set<AnyCancellable>()
|
||||||
|
|
||||||
|
func oobe() {
|
||||||
|
if #available(macOS 10.15, *) {
|
||||||
|
DistributedNotificationCenter.default()
|
||||||
|
.publisher(for: .init(rawValue: "com.apple.screenIsLocked"))
|
||||||
|
.sink { _ in NSRunningApplication.isDesktopLocked = true }
|
||||||
|
.store(in: &Self.combinePool)
|
||||||
|
DistributedNotificationCenter.default()
|
||||||
|
.publisher(for: .init(rawValue: "com.apple.screenIsUnlocked"))
|
||||||
|
.sink { _ in NSRunningApplication.isDesktopLocked = false }
|
||||||
|
.store(in: &Self.combinePool)
|
||||||
|
} else {
|
||||||
|
let lockObserver = DistributedNotificationCenter.default()
|
||||||
|
.addObserver(forName: .init("com.apple.screenIsLocked"), object: nil, queue: .main) { _ in
|
||||||
|
NSRunningApplication.isDesktopLocked = true
|
||||||
|
}
|
||||||
|
let unlockObserver = DistributedNotificationCenter.default()
|
||||||
|
.addObserver(forName: .init("com.apple.screenIsUnlocked"), object: nil, queue: .main) { _ in
|
||||||
|
NSRunningApplication.isDesktopLocked = false
|
||||||
|
}
|
||||||
|
Self.combinePoolCocoa.append(lockObserver)
|
||||||
|
Self.combinePoolCocoa.append(unlockObserver)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue