68 using BinaryPool = std::unordered_map<std::string, std::shared_ptr<Binary>>;
70 using IconPool = std::unordered_map<std::string, std::weak_ptr<Icon>>;
72 using GroupPool = std::unordered_map<std::string, std::shared_ptr<Group>>;
76 bool kdbx4()
const {
return kdbx4_; }
80 bool kdbx41()
const {
return kdbx41_; }
97 std::array<uint8_t, 32>&
header_hash() {
return header_hash_; }
98 const std::array<uint8_t, 32>& header_hash()
const {
return header_hash_; }
118 void PrintXml(pugi::xml_document& doc);
122 BinaryPool binary_pool_;
124 GroupPool group_pool_;
125 std::array<uint8_t, 32> header_hash_ = {{0}};
127 detail::ResourceLimits resource_limits_ = {};
130 uint64_t groups_seen_ = 0;
133 uint64_t entries_seen_ = 0;
136 uint64_t history_items_seen_ = 0;
139 bool kdbx41_ =
false;
142 std::shared_ptr<Group> GetGroup(
const std::string& uuid_str);
145 std::time_t ParseDateTime(
const char* text)
const;
148 std::string WriteDateTime(std::time_t time)
const;
151 static int64_t NeverSeconds();
154 protect<secure_string> ParseProtectedString(
const pugi::xml_node& node,
const char* name,
155 RandomObfuscator& obfuscator)
const;
158 static void WriteProtectedString(pugi::xml_node& node,
const protect<secure_string>& str,
159 RandomObfuscator& obfuscator);
162 std::shared_ptr<Metadata> ParseMeta(
const pugi::xml_node& meta_node,
163 RandomObfuscator& obfuscator);
166 void WriteMeta(pugi::xml_node& meta_node, RandomObfuscator& obfuscator,
167 const std::shared_ptr<Metadata>& meta);
176 std::shared_ptr<Entry> ParseEntry(
const pugi::xml_node& entry_node,
177 std::array<uint8_t, 16>& entry_uuid,
178 RandomObfuscator& obfuscator);
181 void WriteEntry(pugi::xml_node& entry_node, RandomObfuscator& obfuscator,
182 const std::shared_ptr<Entry>& entry);
191 std::shared_ptr<Group> ParseGroup(
const pugi::xml_node& group_node, RandomObfuscator& obfuscator,
195 void WriteGroup(pugi::xml_node& group_node, RandomObfuscator& obfuscator,
196 const std::shared_ptr<Group>& group);