- Custom copper AccentColor and warm VaultBackground color assets (light/dark), applied to both the main app and the AutoFill extension (which needed its own copy of the asset catalog plus ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME and an explicit .tint() modifier, since extensions don't pick up the app-wide accent color the same way a full SwiftUI App/Scene does). - GroupFilterView no longer uses DisclosureGroup for subgroups -- the whole tree renders always-expanded (indented per depth) so active filters are visible at a glance instead of requiring tap-to-expand. - Added a placeholder app icon (padlock glyph, light/dark/tinted variants plus macOS sizes) -- previously the icon slot existed but had no actual images, which blocks App Store/TestFlight archive validation. - Added ITSAppUsesNonExemptEncryption = NO (standard encryption only, via KeePassKit) to skip the export-compliance prompt on each upload. - Renamed the app from MyPass to KeeVault throughout: Xcode project/targets/ schemes, the MyPassCore package (now KeeVaultCore) and every import site, folder and file names, bundle identifiers (org.antiloop222.keevault) and their App Group/Keychain-group entitlements, and remaining UI/string references -- MyPass was already taken as an App Store app name.
58 lines
1.8 KiB
Swift
58 lines
1.8 KiB
Swift
import Foundation
|
|
|
|
public struct Entry: Identifiable, Equatable, Hashable {
|
|
public var id: UUID
|
|
public var title: String
|
|
public var username: String
|
|
public var password: ProtectedString
|
|
public var url: String
|
|
public var notes: String
|
|
public var customFields: [CustomField]
|
|
public var attachments: [Attachment]
|
|
public var totp: TOTPConfig?
|
|
public var tags: [String]
|
|
public var iconIndex: Int
|
|
public var expiryDate: Date?
|
|
public var creationDate: Date
|
|
public var modificationDate: Date
|
|
public var history: [Entry]
|
|
|
|
public init(
|
|
id: UUID = UUID(),
|
|
title: String = "",
|
|
username: String = "",
|
|
password: ProtectedString = ProtectedString("", isProtected: true),
|
|
url: String = "",
|
|
notes: String = "",
|
|
customFields: [CustomField] = [],
|
|
attachments: [Attachment] = [],
|
|
totp: TOTPConfig? = nil,
|
|
tags: [String] = [],
|
|
iconIndex: Int = 0,
|
|
expiryDate: Date? = nil,
|
|
creationDate: Date = Date(),
|
|
modificationDate: Date = Date(),
|
|
history: [Entry] = []
|
|
) {
|
|
self.id = id
|
|
self.title = title
|
|
self.username = username
|
|
self.password = password
|
|
self.url = url
|
|
self.notes = notes
|
|
self.customFields = customFields
|
|
self.attachments = attachments
|
|
self.totp = totp
|
|
self.tags = tags
|
|
self.iconIndex = iconIndex
|
|
self.expiryDate = expiryDate
|
|
self.creationDate = creationDate
|
|
self.modificationDate = modificationDate
|
|
self.history = history
|
|
}
|
|
|
|
// Hashable by ID so SwiftUI List(selection:) works without requiring all fields to be Hashable.
|
|
public func hash(into hasher: inout Hasher) { hasher.combine(id) }
|
|
public static func == (lhs: Entry, rhs: Entry) -> Bool { lhs.id == rhs.id }
|
|
}
|