#pragma once #include "common.h" #include #include #include #include constexpr u16 VERSION = 1; constexpr u64 AFTER_HEADER_OFFSET = 68; struct FileHeader { u64 offset; bool deleted; u64 name_ciphertext_size; std::string name; u64 content_ciphertext_size; u64 content_offset; }; class Vault { public: explicit Vault(std::string path, const std::string &password); static void create(const std::string &path, const std::string &password); std::string read_file(const std::string &name); void create_file(const std::string &name, const std::string &content); void delete_file(const std::string &name); void update_file(const std::string &name, const std::string &content); const std::string &path() const { return m_path; } const std::unordered_map &file_map() const { return m_file_map; } private: std::string m_path; std::fstream m_file; Botan::secure_vector m_key; std::unordered_map m_file_map; void build_file_map(); std::optional read_file_header(); };