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