1package gokeepasslib 2 3import ( 4 w "github.com/tobischo/gokeepasslib/v3/wrappers" 5) 6 7// MemProtection is a structure containing settings for MemoryProtection 8type MemProtection struct { 9 ProtectTitle w.BoolWrapper `xml:"ProtectTitle"` 10 ProtectUserName w.BoolWrapper `xml:"ProtectUserName"` 11 ProtectPassword w.BoolWrapper `xml:"ProtectPassword"` 12 ProtectURL w.BoolWrapper `xml:"ProtectURL"` 13 ProtectNotes w.BoolWrapper `xml:"ProtectNotes"` 14} 15 16type MetaDataOption func(*MetaData) 17 18func WithMetaDataFormattedTime(formatted bool) MetaDataOption { 19 return func(md *MetaData) { 20 md.MasterKeyChanged.Formatted = formatted 21 } 22} 23 24// NewMetaData creates a MetaData struct with some defaults set 25func NewMetaData(options ...MetaDataOption) *MetaData { 26 now := w.Now() 27 28 md := &MetaData{ 29 SettingsChanged: &now, 30 MasterKeyChanged: &now, 31 MasterKeyChangeRec: -1, 32 MasterKeyChangeForce: -1, 33 HistoryMaxItems: 10, 34 HistoryMaxSize: 6291456, // 6 MB 35 MaintenanceHistoryDays: 365, 36 } 37 38 for _, option := range options { 39 option(md) 40 } 41 42 return md 43} 44 45// MetaData is the structure for the metadata headers at the top of kdbx files, 46// it contains things like the name of the database 47type MetaData struct { 48 Generator string `xml:"Generator"` 49 SettingsChanged *w.TimeWrapper `xml:"SettingsChanged"` 50 HeaderHash string `xml:"HeaderHash,omitempty"` 51 DatabaseName string `xml:"DatabaseName"` 52 DatabaseNameChanged *w.TimeWrapper `xml:"DatabaseNameChanged"` 53 DatabaseDescription string `xml:"DatabaseDescription"` 54 DatabaseDescriptionChanged *w.TimeWrapper `xml:"DatabaseDescriptionChanged"` 55 DefaultUserName string `xml:"DefaultUserName"` 56 DefaultUserNameChanged *w.TimeWrapper `xml:"DefaultUserNameChanged"` 57 MaintenanceHistoryDays int64 `xml:"MaintenanceHistoryDays"` 58 Color string `xml:"Color"` 59 MasterKeyChanged *w.TimeWrapper `xml:"MasterKeyChanged"` 60 MasterKeyChangeRec int64 `xml:"MasterKeyChangeRec"` 61 MasterKeyChangeForce int64 `xml:"MasterKeyChangeForce"` 62 MemoryProtection MemProtection `xml:"MemoryProtection"` 63 RecycleBinEnabled w.BoolWrapper `xml:"RecycleBinEnabled"` 64 RecycleBinUUID UUID `xml:"RecycleBinUUID"` 65 RecycleBinChanged *w.TimeWrapper `xml:"RecycleBinChanged"` 66 EntryTemplatesGroup string `xml:"EntryTemplatesGroup"` 67 EntryTemplatesGroupChanged *w.TimeWrapper `xml:"EntryTemplatesGroupChanged"` 68 HistoryMaxItems int64 `xml:"HistoryMaxItems"` 69 HistoryMaxSize int64 `xml:"HistoryMaxSize"` 70 LastSelectedGroup string `xml:"LastSelectedGroup"` 71 LastTopVisibleGroup string `xml:"LastTopVisibleGroup"` 72 Binaries Binaries `xml:"Binaries>Binary,omitempty"` 73 CustomData []CustomData `xml:"CustomData>Item"` 74} 75 76func (md *MetaData) setKdbxFormatVersion(version formatVersion) { 77 if md.SettingsChanged != nil { 78 md.SettingsChanged.Formatted = !isKdbx4(version) 79 } 80 if md.DatabaseNameChanged != nil { 81 md.DatabaseNameChanged.Formatted = !isKdbx4(version) 82 } 83 if md.DatabaseDescriptionChanged != nil { 84 md.DatabaseDescriptionChanged.Formatted = !isKdbx4(version) 85 } 86 if md.DefaultUserNameChanged != nil { 87 md.DefaultUserNameChanged.Formatted = !isKdbx4(version) 88 } 89 if md.MasterKeyChanged != nil { 90 md.MasterKeyChanged.Formatted = !isKdbx4(version) 91 } 92 if md.RecycleBinChanged != nil { 93 md.RecycleBinChanged.Formatted = !isKdbx4(version) 94 } 95 if md.EntryTemplatesGroupChanged != nil { 96 md.EntryTemplatesGroupChanged.Formatted = !isKdbx4(version) 97 } 98} 99