diff --git a/repertory/librepertory/include/providers/base_provider.hpp b/repertory/librepertory/include/providers/base_provider.hpp index d82f36a7..c389ade3 100644 --- a/repertory/librepertory/include/providers/base_provider.hpp +++ b/repertory/librepertory/include/providers/base_provider.hpp @@ -110,10 +110,6 @@ protected: [[nodiscard]] auto get_db() const -> const i_meta_db & { return *db3_; } - [[nodiscard]] virtual auto - get_directory_item_impl(const std::string &api_path, bool directory, - directory_item &item) const -> api_error; - [[nodiscard]] virtual auto get_directory_items_impl(const std::string &api_path, directory_item_list &list) const -> api_error = 0; diff --git a/repertory/librepertory/include/types/repertory.hpp b/repertory/librepertory/include/types/repertory.hpp index a09472dd..5572d97f 100644 --- a/repertory/librepertory/include/types/repertory.hpp +++ b/repertory/librepertory/include/types/repertory.hpp @@ -23,6 +23,7 @@ #define REPERTORY_INCLUDE_TYPES_REPERTORY_HPP_ #include "utils/atomic.hpp" +#include "utils/encryption.hpp" namespace repertory { inline constexpr auto default_api_password_size{48U}; @@ -271,11 +272,13 @@ struct directory_item final { struct encrypt_config final { std::string encryption_token; + utils::encryption::kdf_config kdf_cfg; std::string path; auto operator==(const encrypt_config &cfg) const noexcept -> bool { if (&cfg != this) { - return encryption_token == cfg.encryption_token && path == cfg.path; + return encryption_token == cfg.encryption_token && + kdf_cfg == cfg.kdf_cfg && path == cfg.path; } return true; @@ -393,15 +396,15 @@ inline constexpr auto JSON_API_PARENT{"ApiParent"}; inline constexpr auto JSON_API_PASSWORD{"ApiPassword"}; inline constexpr auto JSON_API_PATH{"ApiPath"}; inline constexpr auto JSON_API_PORT{"ApiPort"}; -inline constexpr auto JSON_AUTO_START{"AutoStart"}; inline constexpr auto JSON_API_USER{"ApiUser"}; +inline constexpr auto JSON_AUTO_START{"AutoStart"}; inline constexpr auto JSON_BUCKET{"Bucket"}; inline constexpr auto JSON_CLIENT_POOL_SIZE{"ClientPoolSize"}; inline constexpr auto JSON_DATABASE_TYPE{"DatabaseType"}; inline constexpr auto JSON_DIRECTORY{"Directory"}; inline constexpr auto JSON_DOWNLOAD_TIMEOUT_SECS{"DownloadTimeoutSeconds"}; -inline constexpr auto JSON_ENABLE_DRIVE_EVENTS{"EnableDriveEvents"}; inline constexpr auto JSON_ENABLE_DOWNLOAD_TIMEOUT{"EnableDownloadTimeout"}; +inline constexpr auto JSON_ENABLE_DRIVE_EVENTS{"EnableDriveEvents"}; inline constexpr auto JSON_ENABLE_MOUNT_MANAGER{"EnableMountManager"}; inline constexpr auto JSON_ENABLE_REMOTE_MOUNT{"Enable"}; inline constexpr auto JSON_ENCRYPTION_TOKEN{"EncryptionToken"}; @@ -412,6 +415,7 @@ inline constexpr auto JSON_EVICTION_USE_ACCESS_TIME{"EvictionUseAccessedTime"}; inline constexpr auto JSON_HIGH_FREQ_INTERVAL_SECS{"HighFreqIntervalSeconds"}; inline constexpr auto JSON_HOST_CONFIG{"HostConfig"}; inline constexpr auto JSON_HOST_NAME_OR_IP{"HostNameOrIp"}; +inline constexpr auto JSON_KDF_CONFIG{"KDFConfig"}; inline constexpr auto JSON_LOW_FREQ_INTERVAL_SECS{"LowFreqIntervalSeconds"}; inline constexpr auto JSON_MAX_CACHE_SIZE_BYTES{"MaxCacheSizeBytes"}; inline constexpr auto JSON_MAX_CONNECTIONS{"MaxConnections"}; @@ -464,12 +468,32 @@ template <> struct adl_serializer { template <> struct adl_serializer { static void to_json(json &data, const repertory::encrypt_config &value) { data[repertory::JSON_ENCRYPTION_TOKEN] = value.encryption_token; + data[repertory::JSON_KDF_CONFIG] = + repertory::utils::collection::to_hex_string(value.kdf_cfg.to_header()); data[repertory::JSON_PATH] = value.path; } static void from_json(const json &data, repertory::encrypt_config &value) { + REPERTORY_USES_FUNCTION_NAME(); data.at(repertory::JSON_ENCRYPTION_TOKEN).get_to(value.encryption_token); data.at(repertory::JSON_PATH).get_to(value.path); + + auto kdf_str = data.at(repertory::JSON_KDF_CONFIG).get(); + if (kdf_str.empty()) { + return; + } + + repertory::data_buffer buffer; + if (not repertory::utils::collection::from_hex_string(kdf_str, buffer)) { + throw repertory::utils::error::create_exception( + function_name, {"failed to convert kdf config hex string to buffer"}); + } + + if (not repertory::utils::encryption::kdf_config::from_header( + buffer, value.kdf_cfg)) { + throw repertory::utils::error::create_exception( + function_name, {"failed to parse kdf header"}); + } } }; diff --git a/repertory/librepertory/src/providers/base_provider.cpp b/repertory/librepertory/src/providers/base_provider.cpp index 9ab0d556..6a9f4f2e 100644 --- a/repertory/librepertory/src/providers/base_provider.cpp +++ b/repertory/librepertory/src/providers/base_provider.cpp @@ -275,33 +275,6 @@ auto base_provider::get_api_path_from_source(const std::string &source_path, return db3_->get_api_path(source_path, api_path); } -auto base_provider::get_directory_item_impl(const std::string &api_path, - bool directory, - directory_item &item) const - -> api_error { - filesystem_item fsi{}; - auto ret = get_filesystem_item(api_path, directory, fsi); - if (ret != api_error::success) { - return ret; - } - - api_meta_map meta; - ret = get_item_meta(api_path, meta); - if (ret != api_error::success) { - return ret; - } - - item = { - .api_path = fsi.api_path, - .api_parent = fsi.api_parent, - .directory = fsi.directory, - .size = fsi.size, - .meta = meta, - }; - - return ret; -} - auto base_provider::get_directory_item(const std::string &api_path, directory_item &item) const -> api_error { @@ -314,10 +287,30 @@ auto base_provider::get_directory_item(const std::string &api_path, return ret; } - return get_directory_item_impl(api_path, directory, item); + filesystem_item fsi{}; + ret = get_filesystem_item(api_path, directory, fsi); + if (ret != api_error::success) { + return ret; + } + + api_meta_map meta; + ret = get_item_meta(api_path, meta); + if (ret != api_error::success) { + return ret; + } + + item = { + .api_path = fsi.api_path, + .api_parent = fsi.api_parent, + .directory = fsi.directory, + .size = fsi.size, + .meta = meta, + }; + + return ret; } catch (const std::exception &e) { utils::error::raise_api_path_error(function_name, api_path, e, - "failed to get directory items"); + "failed to get directory item"); } return api_error::error;