v2.0.3-rc (#32)
	
		
			
	
		
	
	
		
	
		
			Some checks reported errors
		
		
	
	
		
			
				
	
				BlockStorage/repertory/pipeline/head Something is wrong with the build of this commit
				
			
		
		
	
	
				
					
				
			
		
			Some checks reported errors
		
		
	
	BlockStorage/repertory/pipeline/head Something is wrong with the build of this commit
				
			# Changelog ## v2.0.3-rc ### Issues * \#28 \[bug\] Address slow directory responses in S3 mounts for deeply nested directories * \#29 \[bug\] S3 error responses are not being logged * \#30 \[bug\] Sia provider error responses are not logged * \#31 \[bug\] S3 provider should limit max key size to 1024 ### Changes from v2.0.2-rc * Always use direct for read-only providers * Fixed externally removed files not being processed during cleanup * Fixed http headers not being added for requests * Fixed incorrect `stat` values for remote mounts * Fixed invalid directory nullptr error on remote mounts * Fixed memory leak in event system * Refactored application shutdown * Refactored event system * Updated build system to Alpine 3.21.0 * Updated build system to MinGW-w64 12.0.0 * Updated copyright to 2018-2025 Reviewed-on: #32
This commit is contained in:
		| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||
|   Copyright <2018-2025> <scott.e.graves@protonmail.com> | ||||
|  | ||||
|   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|   of this software and associated documentation files (the "Software"), to deal | ||||
| @@ -23,31 +23,166 @@ | ||||
|  | ||||
| #include "utils/file_enc_file.hpp" | ||||
|  | ||||
| #include "utils/common.hpp" | ||||
| #include "utils/encrypting_reader.hpp" | ||||
| #include "utils/encryption.hpp" | ||||
|  | ||||
| namespace repertory::utils::file { | ||||
| auto enc_file::attach_file(fs_file_t file) -> fs_file_t {} | ||||
| auto enc_file::attach_file(fs_file_t file) -> fs_file_t { | ||||
|   return fs_file_t{ | ||||
|       new enc_file(std::move(file)), | ||||
|   }; | ||||
| } | ||||
|  | ||||
| enc_file::enc_file(fs_file_t file) : file_(std::move(file)) {} | ||||
|  | ||||
| void enc_file::close() {} | ||||
| void enc_file::close() { file_->close(); } | ||||
|  | ||||
| auto enc_file::copy_to(std::string_view new_path, | ||||
|                        bool overwrite) const -> bool {} | ||||
| auto enc_file::copy_to(std::string_view new_path, bool overwrite) const | ||||
|     -> bool { | ||||
|   return file_->copy_to(new_path, overwrite); | ||||
| } | ||||
|  | ||||
| void enc_file::flush() const {} | ||||
| void enc_file::flush() const { return file_->flush(); } | ||||
|  | ||||
| auto enc_file::move_to(std::string_view path) -> bool {} | ||||
| auto enc_file::move_to(std::string_view path) -> bool { | ||||
|   return file_->move_to(path); | ||||
| } | ||||
|  | ||||
| auto enc_file::read(unsigned char *data, std::size_t to_read, | ||||
|                     std::uint64_t offset, std::size_t *total_read) -> bool {} | ||||
|                     std::uint64_t offset, std::size_t *total_read) -> bool { | ||||
|   if (total_read != nullptr) { | ||||
|     *total_read = 0U; | ||||
|   } | ||||
|  | ||||
| auto enc_file::remove() -> bool {} | ||||
|   auto file_size{size()}; | ||||
|   if (not file_size.has_value()) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
| auto enc_file::truncate(std::size_t size) -> bool {} | ||||
|   to_read = utils::calculate_read_size(file_size.value(), to_read, offset); | ||||
|   if (to_read == 0U) { | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   std::size_t bytes_read{}; | ||||
|   auto ret{ | ||||
|       utils::encryption::read_encrypted_range( | ||||
|           {offset, offset + to_read - 1U}, | ||||
|           utils::encryption::generate_key<utils::encryption::hash_256_t>( | ||||
|               encryption_token_), | ||||
|           [&](auto &&ct_buffer, auto &&start_offset, | ||||
|               auto &&end_offset) -> bool { | ||||
|             ct_buffer.resize(end_offset - start_offset + 1U); | ||||
|             return file_->read(ct_buffer, start_offset); | ||||
|           }, | ||||
|           file_size.value(), data, to_read, bytes_read), | ||||
|   }; | ||||
|   if (ret && total_read != nullptr) { | ||||
|     *total_read = bytes_read; | ||||
|   } | ||||
|  | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| auto enc_file::remove() -> bool { return file_->remove(); } | ||||
|  | ||||
| auto enc_file::truncate(std::size_t size) -> bool { | ||||
|   if (size == 0U) { | ||||
|     return file_->truncate(size); | ||||
|   } | ||||
|  | ||||
|   auto file_size{this->size()}; | ||||
|   if (not file_size.has_value()) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   if (size == file_size.value()) { | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   auto chunks{ | ||||
|       size / utils::encryption::encrypting_reader::get_data_chunk_size(), | ||||
|   }; | ||||
|   auto real_size{ | ||||
|       (chunks * utils::encryption::encrypting_reader::get_data_chunk_size()) + | ||||
|           (chunks * utils::encryption::encrypting_reader::get_header_size()), | ||||
|   }; | ||||
|   auto remain{ | ||||
|       size % utils::encryption::encrypting_reader::get_data_chunk_size(), | ||||
|   }; | ||||
|   if (remain > 0U) { | ||||
|     real_size += | ||||
|         (remain + utils::encryption::encrypting_reader::get_header_size()); | ||||
|   } | ||||
|  | ||||
|   if (size < file_size.value()) { | ||||
|     if (remain == 0U) { | ||||
|       return file_->truncate(real_size); | ||||
|     } | ||||
|  | ||||
|     auto begin_chunk{ | ||||
|         size / utils::encryption::encrypting_reader::get_data_chunk_size(), | ||||
|     }; | ||||
|  | ||||
|     auto offset{ | ||||
|         begin_chunk * | ||||
|             utils::encryption::encrypting_reader::get_data_chunk_size(), | ||||
|     }; | ||||
|  | ||||
|     std::size_t total_read{}; | ||||
|     data_buffer data( | ||||
|         utils::encryption::encrypting_reader::get_data_chunk_size()); | ||||
|     if (not i_file::read(data, offset, &total_read)) { | ||||
|       return false; | ||||
|     } | ||||
|     data.resize(remain); | ||||
|  | ||||
|     if (not file_->truncate(real_size)) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     return i_file::write(data, offset); | ||||
|   } | ||||
|  | ||||
|   auto begin_chunk{ | ||||
|       file_size.value() / | ||||
|           utils::encryption::encrypting_reader::get_data_chunk_size(), | ||||
|   }; | ||||
|   auto end_chunk{ | ||||
|       utils::divide_with_ceiling( | ||||
|           file_size.value(), | ||||
|           utils::encryption::encrypting_reader::get_data_chunk_size()), | ||||
|   }; | ||||
|  | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| auto enc_file::write(const unsigned char *data, std::size_t to_write, | ||||
|                      std::size_t offset, std::size_t *total_written) -> bool {} | ||||
|                      std::size_t offset, std::size_t *total_written) -> bool { | ||||
|   auto file_size{size()}; | ||||
|   if (not file_size.has_value()) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
| auto enc_file::size() const -> std::optional<std::uint64_t> {} | ||||
|   if ((offset + to_write) > file_size.value()) { | ||||
|     if (not truncate((offset + to_write) - file_size.value())) { | ||||
|       return false; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| auto enc_file::size() const -> std::optional<std::uint64_t> { | ||||
|   auto file_size = file_->size(); | ||||
|   if (not file_size.has_value()) { | ||||
|     return std::nullopt; | ||||
|   } | ||||
|  | ||||
|   return utils::encryption::encrypting_reader::calculate_decrypted_size( | ||||
|       file_size.value()); | ||||
| } | ||||
| } // namespace repertory::utils::file | ||||
|  | ||||
| #endif // defined(PROJECT_ENABLE_LIBSODIUM) && defined(PROJECT_ENABLE_BOOST) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user