diff --git a/Secretive.xcodeproj/project.pbxproj b/Secretive.xcodeproj/project.pbxproj index 495d669..35e10cf 100644 --- a/Secretive.xcodeproj/project.pbxproj +++ b/Secretive.xcodeproj/project.pbxproj @@ -27,7 +27,7 @@ 50617DD023FCED2C0099B055 /* SecureEnclave.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617DCF23FCED2C0099B055 /* SecureEnclave.swift */; }; 50617DD223FCEFA90099B055 /* PreviewStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617DD123FCEFA90099B055 /* PreviewStore.swift */; }; 506AB87E2412334700335D91 /* SecretAgent.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 50A3B78A24026B7500D209EA /* SecretAgent.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 5099A02423FD2AAA0062B6F2 /* CreateSecureEnclaveSecretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5099A02323FD2AAA0062B6F2 /* CreateSecureEnclaveSecretView.swift */; }; + 5099A02423FD2AAA0062B6F2 /* CreateSecretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5099A02323FD2AAA0062B6F2 /* CreateSecretView.swift */; }; 5099A02723FE34FA0062B6F2 /* SmartCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5099A02623FE34FA0062B6F2 /* SmartCard.swift */; }; 5099A02923FE35240062B6F2 /* SmartCardStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5099A02823FE35240062B6F2 /* SmartCardStore.swift */; }; 5099A02B23FE352C0062B6F2 /* SmartCardSecret.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5099A02A23FE352C0062B6F2 /* SmartCardSecret.swift */; }; @@ -45,6 +45,7 @@ 50A5C18D240E4B4B00E2996C /* SecretAgentKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5099A06C240242BA0062B6F2 /* SecretAgentKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 50A5C18F240E4B4C00E2996C /* SecretKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50617DA823FCE4AB0099B055 /* SecretKit.framework */; }; 50A5C190240E4B4C00E2996C /* SecretKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 50617DA823FCE4AB0099B055 /* SecretKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 50B8550D24138C4F009958AC /* DeleteSecretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B8550C24138C4F009958AC /* DeleteSecretView.swift */; }; 50C385A3240789E600AF2719 /* OpenSSHReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C385A2240789E600AF2719 /* OpenSSHReader.swift */; }; 50C385A52407A76D00AF2719 /* SecretDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C385A42407A76D00AF2719 /* SecretDetailView.swift */; }; 50C385A9240B636500AF2719 /* SetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C385A8240B636500AF2719 /* SetupView.swift */; }; @@ -171,7 +172,7 @@ 50617DCD23FCECFA0099B055 /* SecureEnclaveSecret.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureEnclaveSecret.swift; sourceTree = ""; }; 50617DCF23FCED2C0099B055 /* SecureEnclave.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureEnclave.swift; sourceTree = ""; }; 50617DD123FCEFA90099B055 /* PreviewStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewStore.swift; sourceTree = ""; }; - 5099A02323FD2AAA0062B6F2 /* CreateSecureEnclaveSecretView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateSecureEnclaveSecretView.swift; sourceTree = ""; }; + 5099A02323FD2AAA0062B6F2 /* CreateSecretView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateSecretView.swift; sourceTree = ""; }; 5099A02623FE34FA0062B6F2 /* SmartCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartCard.swift; sourceTree = ""; }; 5099A02823FE35240062B6F2 /* SmartCardStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartCardStore.swift; sourceTree = ""; }; 5099A02A23FE352C0062B6F2 /* SmartCardSecret.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartCardSecret.swift; sourceTree = ""; }; @@ -191,6 +192,7 @@ 50A3B79924026B7600D209EA /* SecretAgent.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SecretAgent.entitlements; sourceTree = ""; }; 50A3B79D24026B9900D209EA /* SocketController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketController.swift; sourceTree = ""; }; 50A3B79F24026B9900D209EA /* Agent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Agent.swift; sourceTree = ""; }; + 50B8550C24138C4F009958AC /* DeleteSecretView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeleteSecretView.swift; sourceTree = ""; }; 50C385A2240789E600AF2719 /* OpenSSHReader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSSHReader.swift; path = SecretAgentKit/OpenSSHReader.swift; sourceTree = SOURCE_ROOT; }; 50C385A42407A76D00AF2719 /* SecretDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretDetailView.swift; sourceTree = ""; }; 50C385A8240B636500AF2719 /* SetupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetupView.swift; sourceTree = ""; }; @@ -289,7 +291,8 @@ 50617D8223FCE48E0099B055 /* AppDelegate.swift */, 50617D8423FCE48E0099B055 /* ContentView.swift */, 50C385A42407A76D00AF2719 /* SecretDetailView.swift */, - 5099A02323FD2AAA0062B6F2 /* CreateSecureEnclaveSecretView.swift */, + 5099A02323FD2AAA0062B6F2 /* CreateSecretView.swift */, + 50B8550C24138C4F009958AC /* DeleteSecretView.swift */, 50C385A8240B636500AF2719 /* SetupView.swift */, 50617D8623FCE48E0099B055 /* Assets.xcassets */, 50617D8B23FCE48E0099B055 /* Main.storyboard */, @@ -703,7 +706,8 @@ 50617D8523FCE48E0099B055 /* ContentView.swift in Sources */, 50617DD223FCEFA90099B055 /* PreviewStore.swift in Sources */, 50C385A52407A76D00AF2719 /* SecretDetailView.swift in Sources */, - 5099A02423FD2AAA0062B6F2 /* CreateSecureEnclaveSecretView.swift in Sources */, + 5099A02423FD2AAA0062B6F2 /* CreateSecretView.swift in Sources */, + 50B8550D24138C4F009958AC /* DeleteSecretView.swift in Sources */, 50617D8323FCE48E0099B055 /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Secretive/AppDelegate.swift b/Secretive/AppDelegate.swift index 0627632..746dd9d 100644 --- a/Secretive/AppDelegate.swift +++ b/Secretive/AppDelegate.swift @@ -33,7 +33,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { @IBAction func add(sender: AnyObject?) { var addWindow: NSWindow! - let addView = CreateSecureEnclaveSecretView(store: secureEnclave) { + let addView = CreateSecretView(store: secureEnclave) { self.window.endSheet(addWindow) } addWindow = NSWindow( diff --git a/Secretive/ContentView.swift b/Secretive/ContentView.swift index 3ecdbed..f4e8c6f 100644 --- a/Secretive/ContentView.swift +++ b/Secretive/ContentView.swift @@ -1,11 +1,14 @@ import SwiftUI import SecretKit -struct ContentView: View { - - @ObservedObject var store: StoreType - @State var active: StoreType.SecretType? - +struct ContentView: View { + + @ObservedObject var store: SecureEnclave.Store + @State var active: SecureEnclave.Secret? + + @State var showingDeletion = false + @State var deletingSecret: SecureEnclave.Secret? + var body: some View { NavigationView { List { @@ -27,15 +30,20 @@ struct ContentView: View { .frame(minWidth: 100, idealWidth: 240) } .navigationViewStyle(DoubleColumnNavigationViewStyle()) - + .sheet(isPresented: $showingDeletion) { + DeleteSecretView(secret: self.deletingSecret!, store: self.store) { + self.showingDeletion = false + } + } + } - - - func delete(secret: StoreType.SecretType) { - // TODO: Add "type the name of the key to delete" dialogue - try! store.delete(secret: secret) + + + func delete(secret: SecureEnclave.Secret) { + deletingSecret = secret + showingDeletion = true } - + } // //struct ContentView_Previews: PreviewProvider { diff --git a/Secretive/CreateSecureEnclaveSecretView.swift b/Secretive/CreateSecretView.swift similarity index 97% rename from Secretive/CreateSecureEnclaveSecretView.swift rename to Secretive/CreateSecretView.swift index fc627ad..e9cdb6a 100644 --- a/Secretive/CreateSecureEnclaveSecretView.swift +++ b/Secretive/CreateSecretView.swift @@ -1,7 +1,7 @@ import SwiftUI import SecretKit -struct CreateSecureEnclaveSecretView: View { +struct CreateSecretView: View { @ObservedObject var store: SecureEnclave.Store diff --git a/Secretive/DeleteSecretView.swift b/Secretive/DeleteSecretView.swift new file mode 100644 index 0000000..6004096 --- /dev/null +++ b/Secretive/DeleteSecretView.swift @@ -0,0 +1,58 @@ +import SwiftUI +import SecretKit + +struct DeleteSecretView: View { + + let secret: SecureEnclave.Secret + @ObservedObject var store: SecureEnclave.Store + + @State var confirm = "" + + fileprivate var dismissalBlock: () -> () + + init(secret: SecureEnclave.Secret, store: SecureEnclave.Store, dismissalBlock: @escaping () -> ()) { + self.secret = secret + self.store = store + self.dismissalBlock = dismissalBlock + } + + var body: some View { + VStack { + HStack { + Image(nsImage: NSApp.applicationIconImage) + .resizable() + .frame(width: 64, height: 64) + .padding() + VStack { + HStack { + Text("Delete \(secret.name)?").bold() + Spacer() + } + HStack { + Text("If you delete \(secret.name), you will not be able to recover it. Type \"\(secret.name)\" to confirm.") + Spacer() + } + HStack { + Text("Confirm Name:") + TextField(secret.name, text: $confirm) + } + } + .onExitCommand(perform: dismissalBlock) + } + HStack { + Spacer() + Button(action: delete) { + Text("Delete") + }.disabled(confirm != secret.name) + Button(action: dismissalBlock) { + Text("Don't Delete") + } + } + }.padding() + } + + func delete() { + try! store.delete(secret: secret) + dismissalBlock() + } +}