Structure
This commit is contained in:
parent
d0ab8b44b5
commit
de2082f70e
|
@ -0,0 +1,5 @@
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
public protocol Secret: Identifiable, Hashable {
|
||||||
|
var id: String { get }
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
import Foundation
|
||||||
|
import Combine
|
||||||
|
|
||||||
|
public protocol SecretStore: ObservableObject {
|
||||||
|
|
||||||
|
associatedtype SecretType: Secret
|
||||||
|
var secrets: [SecretType] { get }
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
public enum SecureEnclave {}
|
|
@ -0,0 +1,12 @@
|
||||||
|
import Foundation
|
||||||
|
import Combine
|
||||||
|
|
||||||
|
extension SecureEnclave {
|
||||||
|
|
||||||
|
public struct Secret: SecretKit.Secret {
|
||||||
|
|
||||||
|
public let id: String
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
import Foundation
|
||||||
|
import Security
|
||||||
|
|
||||||
|
extension SecureEnclave {
|
||||||
|
|
||||||
|
public class Store: SecretStore {
|
||||||
|
|
||||||
|
@Published public fileprivate(set) var secrets: [Secret] = []
|
||||||
|
|
||||||
|
public init() {
|
||||||
|
loadSecrets()
|
||||||
|
}
|
||||||
|
|
||||||
|
fileprivate func loadSecrets() {
|
||||||
|
let secret = Secret(id: "Test")
|
||||||
|
secrets.append(secret)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -18,6 +18,12 @@
|
||||||
50617DBA23FCE4AB0099B055 /* SecretKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 50617DAA23FCE4AB0099B055 /* SecretKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
50617DBA23FCE4AB0099B055 /* SecretKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 50617DAA23FCE4AB0099B055 /* SecretKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
50617DBD23FCE4AB0099B055 /* SecretKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50617DA823FCE4AB0099B055 /* SecretKit.framework */; };
|
50617DBD23FCE4AB0099B055 /* SecretKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50617DA823FCE4AB0099B055 /* SecretKit.framework */; };
|
||||||
50617DBE23FCE4AB0099B055 /* SecretKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 50617DA823FCE4AB0099B055 /* SecretKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
50617DBE23FCE4AB0099B055 /* SecretKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 50617DA823FCE4AB0099B055 /* SecretKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
|
50617DC723FCE4EA0099B055 /* SecretStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617DC623FCE4EA0099B055 /* SecretStore.swift */; };
|
||||||
|
50617DC923FCE50E0099B055 /* SecureEnclaveStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617DC823FCE50E0099B055 /* SecureEnclaveStore.swift */; };
|
||||||
|
50617DCB23FCECA10099B055 /* Secret.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617DCA23FCECA10099B055 /* Secret.swift */; };
|
||||||
|
50617DCE23FCECFA0099B055 /* SecureEnclaveSecret.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617DCD23FCECFA0099B055 /* SecureEnclaveSecret.swift */; };
|
||||||
|
50617DD023FCED2C0099B055 /* SecureEnclave.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617DCF23FCED2C0099B055 /* SecureEnclave.swift */; };
|
||||||
|
50617DD223FCEFA90099B055 /* PreviewStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617DD123FCEFA90099B055 /* PreviewStore.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
@ -83,6 +89,12 @@
|
||||||
50617DB023FCE4AB0099B055 /* SecretKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SecretKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
50617DB023FCE4AB0099B055 /* SecretKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SecretKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
50617DB723FCE4AB0099B055 /* SecretKitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretKitTests.swift; sourceTree = "<group>"; };
|
50617DB723FCE4AB0099B055 /* SecretKitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretKitTests.swift; sourceTree = "<group>"; };
|
||||||
50617DB923FCE4AB0099B055 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
50617DB923FCE4AB0099B055 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
50617DC623FCE4EA0099B055 /* SecretStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretStore.swift; sourceTree = "<group>"; };
|
||||||
|
50617DC823FCE50E0099B055 /* SecureEnclaveStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureEnclaveStore.swift; sourceTree = "<group>"; };
|
||||||
|
50617DCA23FCECA10099B055 /* Secret.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Secret.swift; sourceTree = "<group>"; };
|
||||||
|
50617DCD23FCECFA0099B055 /* SecureEnclaveSecret.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureEnclaveSecret.swift; sourceTree = "<group>"; };
|
||||||
|
50617DCF23FCED2C0099B055 /* SecureEnclave.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureEnclave.swift; sourceTree = "<group>"; };
|
||||||
|
50617DD123FCEFA90099B055 /* PreviewStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewStore.swift; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
@ -159,6 +171,7 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
50617D8923FCE48E0099B055 /* Preview Assets.xcassets */,
|
50617D8923FCE48E0099B055 /* Preview Assets.xcassets */,
|
||||||
|
50617DD123FCEFA90099B055 /* PreviewStore.swift */,
|
||||||
);
|
);
|
||||||
path = "Preview Content";
|
path = "Preview Content";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -176,6 +189,9 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
50617DAA23FCE4AB0099B055 /* SecretKit.h */,
|
50617DAA23FCE4AB0099B055 /* SecretKit.h */,
|
||||||
|
50617DCA23FCECA10099B055 /* Secret.swift */,
|
||||||
|
50617DC623FCE4EA0099B055 /* SecretStore.swift */,
|
||||||
|
50617DCC23FCECEE0099B055 /* SecureEnclave */,
|
||||||
50617DAB23FCE4AB0099B055 /* Info.plist */,
|
50617DAB23FCE4AB0099B055 /* Info.plist */,
|
||||||
);
|
);
|
||||||
path = SecretKit;
|
path = SecretKit;
|
||||||
|
@ -190,6 +206,16 @@
|
||||||
path = SecretKitTests;
|
path = SecretKitTests;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
50617DCC23FCECEE0099B055 /* SecureEnclave */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
50617DCF23FCED2C0099B055 /* SecureEnclave.swift */,
|
||||||
|
50617DCD23FCECFA0099B055 /* SecureEnclaveSecret.swift */,
|
||||||
|
50617DC823FCE50E0099B055 /* SecureEnclaveStore.swift */,
|
||||||
|
);
|
||||||
|
path = SecureEnclave;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXHeadersBuildPhase section */
|
/* Begin PBXHeadersBuildPhase section */
|
||||||
|
@ -297,6 +323,7 @@
|
||||||
};
|
};
|
||||||
50617DA723FCE4AB0099B055 = {
|
50617DA723FCE4AB0099B055 = {
|
||||||
CreatedOnToolsVersion = 11.3;
|
CreatedOnToolsVersion = 11.3;
|
||||||
|
LastSwiftMigration = 1130;
|
||||||
};
|
};
|
||||||
50617DAF23FCE4AB0099B055 = {
|
50617DAF23FCE4AB0099B055 = {
|
||||||
CreatedOnToolsVersion = 11.3;
|
CreatedOnToolsVersion = 11.3;
|
||||||
|
@ -365,6 +392,7 @@
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
50617D8523FCE48E0099B055 /* ContentView.swift in Sources */,
|
50617D8523FCE48E0099B055 /* ContentView.swift in Sources */,
|
||||||
|
50617DD223FCEFA90099B055 /* PreviewStore.swift in Sources */,
|
||||||
50617D8323FCE48E0099B055 /* AppDelegate.swift in Sources */,
|
50617D8323FCE48E0099B055 /* AppDelegate.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
@ -381,6 +409,11 @@
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
50617DC723FCE4EA0099B055 /* SecretStore.swift in Sources */,
|
||||||
|
50617DCB23FCECA10099B055 /* Secret.swift in Sources */,
|
||||||
|
50617DC923FCE50E0099B055 /* SecureEnclaveStore.swift in Sources */,
|
||||||
|
50617DCE23FCECFA0099B055 /* SecureEnclaveSecret.swift in Sources */,
|
||||||
|
50617DD023FCED2C0099B055 /* SecureEnclave.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -545,6 +578,7 @@
|
||||||
50617D9E23FCE48E0099B055 /* Debug */ = {
|
50617D9E23FCE48E0099B055 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CODE_SIGN_ENTITLEMENTS = Secretive/Secretive.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Secretive/Secretive.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
@ -568,6 +602,7 @@
|
||||||
50617D9F23FCE48E0099B055 /* Release */ = {
|
50617D9F23FCE48E0099B055 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CODE_SIGN_ENTITLEMENTS = Secretive/Secretive.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Secretive/Secretive.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
@ -635,6 +670,7 @@
|
||||||
50617DC023FCE4AB0099B055 /* Debug */ = {
|
50617DC023FCE4AB0099B055 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
@ -653,6 +689,7 @@
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.maxgoedjen.SecretKit;
|
PRODUCT_BUNDLE_IDENTIFIER = com.maxgoedjen.SecretKit;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
VERSION_INFO_PREFIX = "";
|
VERSION_INFO_PREFIX = "";
|
||||||
|
@ -662,6 +699,7 @@
|
||||||
50617DC123FCE4AB0099B055 /* Release */ = {
|
50617DC123FCE4AB0099B055 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
|
|
@ -1,13 +1,6 @@
|
||||||
//
|
|
||||||
// AppDelegate.swift
|
|
||||||
// Secretive
|
|
||||||
//
|
|
||||||
// Created by Max Goedjen on 2/18/20.
|
|
||||||
// Copyright © 2020 Max Goedjen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Cocoa
|
import Cocoa
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
import SecretKit
|
||||||
|
|
||||||
@NSApplicationMain
|
@NSApplicationMain
|
||||||
class AppDelegate: NSObject, NSApplicationDelegate {
|
class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
|
@ -16,10 +9,11 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
|
|
||||||
|
|
||||||
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
||||||
// Create the SwiftUI view that provides the window contents.
|
|
||||||
let contentView = ContentView()
|
|
||||||
|
|
||||||
// Create the window and set the content view.
|
let secureEnclave = SecureEnclave.Store()
|
||||||
|
let contentView = ContentView(store: secureEnclave)
|
||||||
|
|
||||||
|
// Create the window and set the content view.
|
||||||
window = NSWindow(
|
window = NSWindow(
|
||||||
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
|
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
|
||||||
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
|
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
|
||||||
|
|
|
@ -7,17 +7,33 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
import SecretKit
|
||||||
|
|
||||||
|
struct ContentView<StoreType: SecretStore>: View {
|
||||||
|
|
||||||
|
@ObservedObject var store: StoreType
|
||||||
|
|
||||||
|
@State var pk: String = ""
|
||||||
|
|
||||||
struct ContentView: View {
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Text("Hello, World!")
|
HSplitView {
|
||||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
List {
|
||||||
|
ForEach(store.secrets) { secret in
|
||||||
|
Text(secret.id)
|
||||||
|
}
|
||||||
|
}.listStyle(SidebarListStyle())
|
||||||
|
Form {
|
||||||
|
Text("Public Key")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct ContentView_Previews: PreviewProvider {
|
struct ContentView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
ContentView()
|
ContentView(store: Preview.Store(numberOfRandomSecrets: 10))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
import Foundation
|
||||||
|
import SecretKit
|
||||||
|
|
||||||
|
enum Preview {}
|
||||||
|
|
||||||
|
extension Preview {
|
||||||
|
|
||||||
|
struct Secret: SecretKit.Secret {
|
||||||
|
|
||||||
|
let id = UUID().uuidString
|
||||||
|
var name: String {
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extension Preview {
|
||||||
|
|
||||||
|
class Store: SecretStore, ObservableObject {
|
||||||
|
|
||||||
|
@Published var secrets: [Secret] = []
|
||||||
|
|
||||||
|
init(secrets: [Secret]) {
|
||||||
|
self.secrets.append(contentsOf: secrets)
|
||||||
|
}
|
||||||
|
|
||||||
|
init(numberOfRandomSecrets: Int) {
|
||||||
|
let new = (0...numberOfRandomSecrets).map { _ in Secret() }
|
||||||
|
self.secrets.append(contentsOf: new)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue