Show notification with OTP after providing password through extension (#509)

* Allow to do something with a password after providing it in the extension
* Make fields non-nil
* Show OTP in notification after providing a password through extension
This commit is contained in:
Danny Mösch 2021-09-20 09:50:05 +02:00 committed by GitHub
parent 5057528ad9
commit 763cddf540
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 67 additions and 69 deletions

View file

@ -11,22 +11,17 @@ import passKit
import UIKit
class CredentialProvider {
weak var extensionContext: NSExtensionContext?
weak var viewController: UIViewController?
private let viewController: UIViewController
private let extensionContext: NSExtensionContext
private let afterDecryption: (Password) -> Void
init(viewController: UIViewController, extensionContext: NSExtensionContext) {
init(viewController: UIViewController, extensionContext: NSExtensionContext, afterDecryption: @escaping (Password) -> Void) {
self.viewController = viewController
self.extensionContext = extensionContext
self.afterDecryption = afterDecryption
}
func provideCredentialsFindLogin(with passwordPath: String) {
guard let viewController = viewController else {
return
}
guard let extensionContext = extensionContext else {
return
}
decryptPassword(in: viewController, with: passwordPath) { password in
let extensionItem = NSExtensionItem()
var returnDictionary = [
@ -37,30 +32,25 @@ class CredentialProvider {
returnDictionary[PassExtensionKey.totpKey] = totpPassword
}
extensionItem.attachments = [NSItemProvider(item: returnDictionary as NSSecureCoding, typeIdentifier: String(kUTTypePropertyList))]
extensionContext.completeRequest(returningItems: [extensionItem])
self.extensionContext.completeRequest(returningItems: [extensionItem])
self.afterDecryption(password)
}
}
func provideCredentialsBrowser(with passwordPath: String) {
guard let viewController = viewController else {
return
}
guard let extensionContext = extensionContext else {
return
}
decryptPassword(in: viewController, with: passwordPath) { password in
Utils.copyToPasteboard(textToCopy: password.password)
// return a dictionary for JavaScript for best-effor fill in
let extensionItem = NSExtensionItem()
let returnDictionary = [
NSExtensionJavaScriptFinalizeArgumentKey: [
"username": password.getUsernameForCompletion(),
"password": password.password,
PassExtensionKey.usernameKey: password.getUsernameForCompletion(),
PassExtensionKey.passwordKey: password.password,
],
]
extensionItem.attachments = [NSItemProvider(item: returnDictionary as NSSecureCoding, typeIdentifier: String(kUTTypePropertyList))]
extensionContext.completeRequest(returningItems: [extensionItem])
self.extensionContext.completeRequest(returningItems: [extensionItem])
self.afterDecryption(password)
}
}
}