secretive/SecretAgent/Notifier.swift

56 lines
2.0 KiB
Swift
Raw Normal View History

2020-03-04 07:14:38 +00:00
import Foundation
import SecretKit
import SecretAgentKit
2020-03-04 07:14:38 +00:00
import UserNotifications
2020-03-22 00:52:51 +00:00
import AppKit
2020-03-04 07:14:38 +00:00
class Notifier {
func prompt() {
let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.requestAuthorization(options: .alert) { _, _ in
}
}
2020-03-17 07:56:55 +00:00
func notify(accessTo secret: AnySecret, by provenance: SigningRequestProvenance) {
2020-03-04 07:14:38 +00:00
let notificationCenter = UNUserNotificationCenter.current()
let notificationContent = UNMutableNotificationContent()
2020-03-22 00:52:51 +00:00
notificationContent.title = "Signed Request from \(provenance.origin.name)"
notificationContent.subtitle = secret.name
if let iconURL = iconURL(for: provenance), let attachment = try? UNNotificationAttachment(identifier: "icon", url: iconURL, options: nil) {
notificationContent.attachments = [attachment]
}
2020-03-04 07:14:38 +00:00
let request = UNNotificationRequest(identifier: UUID().uuidString, content: notificationContent, trigger: nil)
notificationCenter.add(request, withCompletionHandler: nil)
}
}
2020-03-22 00:52:51 +00:00
extension Notifier {
func iconURL(for provenance: SigningRequestProvenance) -> URL? {
do {
if let app = NSRunningApplication(processIdentifier: provenance.origin.pid), let icon = app.icon?.tiffRepresentation {
let temporaryURL = URL(fileURLWithPath: (NSTemporaryDirectory() as NSString).appendingPathComponent("\(UUID().uuidString).png"))
let bitmap = NSBitmapImageRep(data: icon)
try bitmap?.representation(using: .png, properties: [:])?.write(to: temporaryURL)
return temporaryURL
}
} catch {
}
return nil
}
}
extension Notifier: SigningWitness {
2020-03-19 03:04:24 +00:00
func speakNowOrForeverHoldYourPeace(forAccessTo secret: AnySecret, by provenance: SigningRequestProvenance) throws {
}
2020-03-17 07:56:55 +00:00
func witness(accessTo secret: AnySecret, by provenance: SigningRequestProvenance) throws {
notify(accessTo: secret, by: provenance)
}
}