[bug] Windows-to-Linux remote mount is allowing directory rename when directory is not empty #47
Some checks reported errors
BlockStorage/repertory/pipeline/head Something is wrong with the build of this commit

This commit is contained in:
Scott E. Graves 2025-04-16 09:18:40 -05:00
parent ebb620fdb2
commit 711e3f73cf
2 changed files with 31 additions and 10 deletions

View File

@ -93,6 +93,7 @@ auto remote_server::populate_file_info(const std::string &api_path,
: std::to_string(FILE_ATTRIBUTE_ARCHIVE);
drive_.set_item_meta(api_path, META_ATTRIBUTES, meta_attributes);
}
auto attributes = utils::string::to_uint32(meta_attributes);
auto file_size = directory ? 0U : drive_.get_file_size(api_path);
populate_file_info(api_path, file_size, attributes, file_info);
@ -1739,22 +1740,41 @@ auto remote_server::update_to_windows_format(const std::string &root_api_path,
item[JSON_META][META_MODIFIED] = std::to_string(
utils::string::to_uint64(empty_as_zero(item[JSON_META][META_MODIFIED])));
auto update_meta{false};
if (item[JSON_META][META_WRITTEN].empty() ||
(item[JSON_META][META_WRITTEN].get<std::string>() == "0") ||
(item[JSON_META][META_WRITTEN].get<std::string>() ==
std::to_string(utils::time::WIN32_TIME_CONVERSION))) {
drive_.set_item_meta(api_path, META_WRITTEN,
item[JSON_META][META_MODIFIED].get<std::string>());
item[JSON_META][META_WRITTEN] = item[JSON_META][META_MODIFIED];
item[JSON_META][META_WRITTEN] =
item[JSON_META][META_MODIFIED].get<std::string>();
update_meta = true;
}
if (item[JSON_META][META_ATTRIBUTES].empty()) {
item[JSON_META][META_ATTRIBUTES] =
item[JSON_DIRECTORY].get<bool>()
? std::to_string(FILE_ATTRIBUTE_DIRECTORY)
: std::to_string(FILE_ATTRIBUTE_ARCHIVE);
drive_.set_item_meta(api_path, META_ATTRIBUTES,
item[JSON_META][META_ATTRIBUTES].get<std::string>());
item[JSON_META][META_ATTRIBUTES] = "0";
}
auto attributes = utils::string::to_uint32(
item[JSON_META][META_ATTRIBUTES].get<std::string>);
if (item[JSON_DIRECTORY].get<bool>()) {
if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) {
attributes |= FILE_ATTRIBUTE_DIRECTORY;
attributes &= (~FILE_ATTRIBUTE_ARCHIVE);
item[JSON_META][META_ATTRIBUTES] = std::to_string(attributes);
update_meta = true;
}
} else if ((attributes & FILE_ATTRIBUTE_DIRECTORY) ==
FILE_ATTRIBUTE_DIRECTORY ||
attributes == 0U) {
attributes |= FILE_ATTRIBUTE_ARCHIVE;
attributes &= (~FILE_ATTRIBUTE_DIRECTORY);
item[JSON_META][META_ATTRIBUTES] = std::to_string(attributes);
drive_.set_item_meta(api_path, item[JSON_META]);
update_meta = true;
}
if (update_meta) {
drive_.set_item_meta(api_path, item[JSON_META]);
}
return item;

View File

@ -86,7 +86,8 @@ auto traverse_directory(
struct dirent *de{nullptr};
while (res && (de = readdir(root)) && !is_stop_requested()) {
repertory::utils::error::handle_debug(
function_name, fmt::format("item|{}|type|{}", de->d_name, de->d_type));
function_name,
fmt::format("item|{}|type|{}|{}", de->d_name, de->d_type, DT_DIR));
if (de->d_type == DT_DIR) {
if ((std::string_view(de->d_name) == ".") ||
(std::string_view(de->d_name) == "..")) {