refactor
This commit is contained in:
		| @@ -57,14 +57,13 @@ private: | ||||
|   bool use_s3_path_style_{false}; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] static auto construct_url(CURL *curl, | ||||
|                                           const std::string &relative_path, | ||||
|                                           const host_config &cfg) | ||||
|       -> std::string; | ||||
|   [[nodiscard]] static auto | ||||
|   construct_url(CURL *curl, const std::string &relative_path, | ||||
|                 const host_config &cfg) -> std::string; | ||||
|  | ||||
|   [[nodiscard]] static auto create_host_config(const s3_config &cfg, | ||||
|                                                bool use_s3_path_style) | ||||
|       -> host_config; | ||||
|   [[nodiscard]] static auto | ||||
|   create_host_config(const s3_config &cfg, | ||||
|                      bool use_s3_path_style) -> host_config; | ||||
|  | ||||
|   [[nodiscard]] static auto url_encode(CURL *curl, const std::string &data, | ||||
|                                        bool allow_slash) -> std::string; | ||||
| @@ -72,8 +71,8 @@ public: | ||||
|   template <typename request_type> | ||||
|   [[nodiscard]] static auto | ||||
|   make_encrypted_request(const host_config &cfg, const request_type &request, | ||||
|                          long &response_code, stop_type &stop_requested) | ||||
|       -> bool { | ||||
|                          long &response_code, | ||||
|                          stop_type &stop_requested) -> bool { | ||||
|     response_code = 0; | ||||
|  | ||||
|     if (not request.decryption_token.has_value() || | ||||
| @@ -94,7 +93,7 @@ public: | ||||
|         utils::encryption::generate_key(request.decryption_token.value()); | ||||
|     const auto result = utils::encryption::read_encrypted_range( | ||||
|         request.range.value(), key, | ||||
|         [&](std::vector<char> &ct, std::uint64_t start_offset, | ||||
|         [&](data_buffer &ct, std::uint64_t start_offset, | ||||
|             std::uint64_t end_offset) -> api_error { | ||||
|           auto encrypted_request = request; | ||||
|           encrypted_request.decryption_token = std::nullopt; | ||||
| @@ -212,30 +211,26 @@ public: | ||||
| public: | ||||
|   void enable_s3_path_style(bool enable) override; | ||||
|  | ||||
|   [[nodiscard]] auto make_request(const curl::requests::http_delete &del, | ||||
|                                   long &response_code, | ||||
|                                   stop_type &stop_requested) const | ||||
|       -> bool override; | ||||
|   [[nodiscard]] auto | ||||
|   make_request(const curl::requests::http_delete &del, long &response_code, | ||||
|                stop_type &stop_requested) const -> bool override; | ||||
|  | ||||
|   [[nodiscard]] auto make_request(const curl::requests::http_get &get, | ||||
|                                   long &response_code, | ||||
|                                   stop_type &stop_requested) const | ||||
|       -> bool override; | ||||
|   [[nodiscard]] auto | ||||
|   make_request(const curl::requests::http_get &get, long &response_code, | ||||
|                stop_type &stop_requested) const -> bool override; | ||||
|  | ||||
|   [[nodiscard]] auto make_request(const curl::requests::http_head &head, | ||||
|                                   long &response_code, | ||||
|                                   stop_type &stop_requested) const | ||||
|       -> bool override; | ||||
|   [[nodiscard]] auto | ||||
|   make_request(const curl::requests::http_head &head, long &response_code, | ||||
|                stop_type &stop_requested) const -> bool override; | ||||
|  | ||||
|   [[nodiscard]] auto make_request(const curl::requests::http_post &post_file, | ||||
|                                   long &response_code, | ||||
|                                   stop_type &stop_requested) const | ||||
|       -> bool override; | ||||
|   [[nodiscard]] auto | ||||
|   make_request(const curl::requests::http_post &post_file, long &response_code, | ||||
|                stop_type &stop_requested) const -> bool override; | ||||
|  | ||||
|   [[nodiscard]] auto make_request(const curl::requests::http_put_file &put_file, | ||||
|                                   long &response_code, | ||||
|                                   stop_type &stop_requested) const | ||||
|       -> bool override; | ||||
|   [[nodiscard]] auto | ||||
|   make_request(const curl::requests::http_put_file &put_file, | ||||
|                long &response_code, | ||||
|                stop_type &stop_requested) const -> bool override; | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
|   | ||||
| @@ -41,8 +41,9 @@ inline const auto read_file_data = static_cast<read_callback>( | ||||
|     [](char *buffer, size_t size, size_t nitems, void *instream) -> size_t { | ||||
|       auto *read_info = reinterpret_cast<read_file_info *>(instream); | ||||
|       std::size_t bytes_read{}; | ||||
|       auto ret = read_info->nf->read_bytes(buffer, size * nitems, | ||||
|                                            read_info->offset, bytes_read); | ||||
|       auto ret = read_info->nf->read_bytes( | ||||
|           reinterpret_cast<unsigned char *>(buffer), size * nitems, | ||||
|           read_info->offset, bytes_read); | ||||
|       if (ret) { | ||||
|         read_info->offset += bytes_read; | ||||
|       } | ||||
| @@ -73,9 +74,8 @@ struct http_request_base { | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_path() const -> std::string { return path; } | ||||
|  | ||||
|   [[nodiscard]] virtual auto set_method(CURL *curl, | ||||
|                                         stop_type &stop_requested) const | ||||
|       -> bool = 0; | ||||
|   [[nodiscard]] virtual auto | ||||
|   set_method(CURL *curl, stop_type &stop_requested) const -> bool = 0; | ||||
| }; | ||||
| } // namespace repertory::curl::requests | ||||
|  | ||||
|   | ||||
| @@ -56,18 +56,18 @@ private: | ||||
|   std::size_t decode_offset_ = 0U; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] static auto decode_json(packet &response, json &json_data) | ||||
|       -> int; | ||||
|   [[nodiscard]] static auto decode_json(packet &response, | ||||
|                                         json &json_data) -> int; | ||||
|  | ||||
| public: | ||||
|   void clear(); | ||||
|  | ||||
|   [[nodiscard]] auto current_pointer() -> char * { | ||||
|   [[nodiscard]] auto current_pointer() -> unsigned char * { | ||||
|     return (decode_offset_ < buffer_.size()) ? &buffer_[decode_offset_] | ||||
|                                              : nullptr; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto current_pointer() const -> const char * { | ||||
|   [[nodiscard]] auto current_pointer() const -> const unsigned char * { | ||||
|     return (decode_offset_ < buffer_.size()) ? &buffer_[decode_offset_] | ||||
|                                              : nullptr; | ||||
|   } | ||||
| @@ -110,19 +110,19 @@ public: | ||||
|  | ||||
|   [[nodiscard]] auto decode(remote::file_info &val) -> error_type; | ||||
|  | ||||
|   [[nodiscard]] auto decrypt(const std::string &token) -> error_type; | ||||
|   [[nodiscard]] auto decrypt(std::string_view token) -> error_type; | ||||
|  | ||||
|   void encode(const void *buffer, std::size_t size, bool should_reserve = true); | ||||
|  | ||||
|   void encode(const char *str) { | ||||
|     encode(std::string(str == nullptr ? "" : str)); | ||||
|     encode(std::string{str == nullptr ? "" : str}); | ||||
|   } | ||||
|  | ||||
|   void encode(const std::string &str); | ||||
|   void encode(std::string_view str); | ||||
|  | ||||
|   void encode(const wchar_t *str); | ||||
|  | ||||
|   void encode(const std::wstring &str); | ||||
|   void encode(std::wstring_view str); | ||||
|  | ||||
|   void encode(void *ptr) { | ||||
|     encode(static_cast<std::uint64_t>(reinterpret_cast<std::uintptr_t>(ptr))); | ||||
| @@ -161,9 +161,9 @@ public: | ||||
|   void encode_top(const void *buffer, std::size_t size, | ||||
|                   bool should_reserve = true); | ||||
|  | ||||
|   void encode_top(const std::string &str); | ||||
|   void encode_top(std::string_view str); | ||||
|  | ||||
|   void encode_top(const std::wstring &str); | ||||
|   void encode_top(std::wstring_view str); | ||||
|  | ||||
|   void encode_top(void *ptr) { | ||||
|     encode_top( | ||||
| @@ -200,7 +200,7 @@ public: | ||||
|  | ||||
|   void encode_top(remote::file_info val); | ||||
|  | ||||
|   void encrypt(const std::string &token); | ||||
|   void encrypt(std::string_view token); | ||||
|  | ||||
|   [[nodiscard]] auto get_size() const -> std::uint32_t { | ||||
|     return static_cast<std::uint32_t>(buffer_.size()); | ||||
| @@ -217,11 +217,12 @@ public: | ||||
|  | ||||
|   auto operator=(packet &&pkt) noexcept -> packet &; | ||||
|  | ||||
|   [[nodiscard]] auto operator[](std::size_t index) -> char & { | ||||
|   [[nodiscard]] auto operator[](std::size_t index) -> unsigned char & { | ||||
|     return buffer_[index]; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto operator[](std::size_t index) const -> const char & { | ||||
|   [[nodiscard]] auto operator[](std::size_t index) const -> const | ||||
|       unsigned char & { | ||||
|     return buffer_.at(index); | ||||
|   } | ||||
| }; | ||||
|   | ||||
| @@ -1243,8 +1243,9 @@ public: | ||||
|              remote::file_handle handle{}; | ||||
|              DECODE_OR_RETURN(request, handle); | ||||
|  | ||||
|              ret = this->fuse_write(path.data(), buffer.data(), write_size, | ||||
|                                     write_offset, handle); | ||||
|              ret = this->fuse_write( | ||||
|                  path.data(), reinterpret_cast<const char *>(buffer.data()), | ||||
|                  write_size, write_offset, handle); | ||||
|            } | ||||
|            return ret; | ||||
|          }}); | ||||
| @@ -1268,7 +1269,7 @@ public: | ||||
|            data_buffer buffer(write_size); | ||||
|            if ((ret = request->decode(buffer.data(), buffer.size())) == 0) { | ||||
|              buffer = macaron::Base64::Decode( | ||||
|                  std::string(buffer.begin(), buffer.end())); | ||||
|                  std::string{buffer.begin(), buffer.end()}); | ||||
|              write_size = buffer.size(); | ||||
|  | ||||
|              remote::file_offset write_offset{}; | ||||
| @@ -1277,8 +1278,9 @@ public: | ||||
|              remote::file_handle handle{}; | ||||
|              DECODE_OR_RETURN(request, handle); | ||||
|  | ||||
|              ret = this->fuse_write(path.data(), buffer.data(), write_size, | ||||
|                                     write_offset, handle); | ||||
|              ret = this->fuse_write(path.data(), | ||||
|                                     reinterpret_cast<char *>(buffer.data()), | ||||
|                                     write_size, write_offset, handle); | ||||
|            } | ||||
|            return ret; | ||||
|          }}); | ||||
|   | ||||
| @@ -274,7 +274,7 @@ struct s3_config { | ||||
|   std::string bucket; | ||||
|   std::uint16_t cache_timeout_secs{60U}; | ||||
|   std::string encryption_token; | ||||
|   std::string region = "any"; | ||||
|   std::string region{"any"}; | ||||
|   std::string secret_key; | ||||
|   std::uint32_t timeout_ms{60000U}; | ||||
|   std::string url; | ||||
| @@ -282,7 +282,12 @@ struct s3_config { | ||||
|   bool use_region_in_url{false}; | ||||
| }; | ||||
|  | ||||
| using data_buffer = std::vector<char>; | ||||
| using data_buffer = std::vector<unsigned char>; | ||||
| using key_type = std::array<unsigned char, 32U>; | ||||
| using mutex_lock = std::lock_guard<std::mutex>; | ||||
| using recur_mutex_lock = std::lock_guard<std::recursive_mutex>; | ||||
| using unique_mutex_lock = std::unique_lock<std::mutex>; | ||||
| using unique_recur_mutex_lock = std::unique_lock<std::recursive_mutex>; | ||||
|  | ||||
| using api_file_list = std::vector<api_file>; | ||||
| using api_file_provider_callback = std::function<void(api_file &)>; | ||||
| @@ -292,11 +297,7 @@ using http_headers = std::unordered_map<std::string, std::string>; | ||||
| using http_parameters = std::unordered_map<std::string, std::string>; | ||||
| using http_ranges = std::vector<http_range>; | ||||
| using meta_provider_callback = std::function<void(directory_item &)>; | ||||
| using mutex_lock = std::lock_guard<std::mutex>; | ||||
| using query_parameters = std::map<std::string, std::string>; | ||||
| using recur_mutex_lock = std::lock_guard<std::recursive_mutex>; | ||||
| using unique_mutex_lock = std::unique_lock<std::mutex>; | ||||
| using unique_recur_mutex_lock = std::unique_lock<std::recursive_mutex>; | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // INCLUDE_TYPES_REPERTORY_HPP_ | ||||
|   | ||||
| @@ -38,43 +38,45 @@ | ||||
| #pragma GCC diagnostic ignored "-Wuseless-cast" | ||||
| #endif | ||||
|  | ||||
| #include <array> | ||||
| #include <string> | ||||
| #include <vector> | ||||
|  | ||||
| namespace macaron::Base64 { | ||||
| static std::string Encode(const char *data, const size_t &len) { | ||||
|   static constexpr char sEncodingTable[] = { | ||||
| static std::string Encode(const unsigned char *data, std::size_t len) { | ||||
|   static constexpr std::array<unsigned char, 64U> sEncodingTable{ | ||||
|       'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', | ||||
|       'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', | ||||
|       'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', | ||||
|       'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', | ||||
|       '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; | ||||
|       '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', | ||||
|   }; | ||||
|  | ||||
|   size_t in_len = len; | ||||
|   auto in_len{len}; | ||||
|   std::string ret; | ||||
|   if (in_len > 0) { | ||||
|     size_t out_len = 4 * ((in_len + 2) / 3); | ||||
|     std::size_t out_len{4U * ((in_len + 2U) / 3U)}; | ||||
|     ret = std::string(out_len, '\0'); | ||||
|     size_t i; | ||||
|     char *p = const_cast<char *>(ret.c_str()); | ||||
|     std::size_t i; | ||||
|     auto *p = reinterpret_cast<unsigned char *>(ret.data()); | ||||
|  | ||||
|     for (i = 0; i < in_len - 2; i += 3) { | ||||
|       *p++ = sEncodingTable[(data[i] >> 2) & 0x3F]; | ||||
|       *p++ = sEncodingTable[((data[i] & 0x3) << 4) | | ||||
|                             ((int)(data[i + 1] & 0xF0) >> 4)]; | ||||
|     for (i = 0U; i < in_len - 2U; i += 3U) { | ||||
|       *p++ = sEncodingTable[(data[i] >> 2U) & 0x3F]; | ||||
|       *p++ = sEncodingTable[((data[i] & 0x3) << 4U) | | ||||
|                             ((int)(data[i + 1U] & 0xF0) >> 4U)]; | ||||
|       *p++ = sEncodingTable[((data[i + 1] & 0xF) << 2) | | ||||
|                             ((int)(data[i + 2] & 0xC0) >> 6)]; | ||||
|       *p++ = sEncodingTable[data[i + 2] & 0x3F]; | ||||
|                             ((int)(data[i + 2U] & 0xC0) >> 6U)]; | ||||
|       *p++ = sEncodingTable[data[i + 2U] & 0x3F]; | ||||
|     } | ||||
|     if (i < in_len) { | ||||
|       *p++ = sEncodingTable[(data[i] >> 2) & 0x3F]; | ||||
|       if (i == (in_len - 1)) { | ||||
|         *p++ = sEncodingTable[((data[i] & 0x3) << 4)]; | ||||
|       *p++ = sEncodingTable[(data[i] >> 2U) & 0x3F]; | ||||
|       if (i == (in_len - 1U)) { | ||||
|         *p++ = sEncodingTable[((data[i] & 0x3) << 4U)]; | ||||
|         *p++ = '='; | ||||
|       } else { | ||||
|         *p++ = sEncodingTable[((data[i] & 0x3) << 4) | | ||||
|                               ((int)(data[i + 1] & 0xF0) >> 4)]; | ||||
|         *p++ = sEncodingTable[((data[i + 1] & 0xF) << 2)]; | ||||
|         *p++ = sEncodingTable[((data[i] & 0x3) << 4U) | | ||||
|                               ((int)(data[i + 1U] & 0xF0) >> 4U)]; | ||||
|         *p++ = sEncodingTable[((data[i + 1U] & 0xF) << 2U)]; | ||||
|       } | ||||
|       *p++ = '='; | ||||
|     } | ||||
| @@ -83,12 +85,14 @@ static std::string Encode(const char *data, const size_t &len) { | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| [[maybe_unused]] static std::string Encode(const std::string &data) { | ||||
|   return Encode(&data[0], data.size()); | ||||
| [[maybe_unused]] static std::string Encode(std::string_view data) { | ||||
|   return Encode(reinterpret_cast<const unsigned char *>(data.data()), | ||||
|                 data.size()); | ||||
| } | ||||
|  | ||||
| [[maybe_unused]] static std::vector<char> Decode(const std::string &input) { | ||||
|   static constexpr unsigned char kDecodingTable[] = { | ||||
| [[maybe_unused]] static std::vector<unsigned char> | ||||
| Decode(std::string_view input) { | ||||
|   static constexpr std::array<unsigned char, 256> kDecodingTable{ | ||||
|       64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, | ||||
|       64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, | ||||
|       64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, 52, 53, 54, 55, 56, 57, | ||||
| @@ -103,45 +107,49 @@ static std::string Encode(const char *data, const size_t &len) { | ||||
|       64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, | ||||
|       64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, | ||||
|       64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, | ||||
|       64, 64, 64, 64}; | ||||
|       64, 64, 64, 64, | ||||
|   }; | ||||
|  | ||||
|   std::vector<char> out; | ||||
|   std::vector<unsigned char> out; | ||||
|   if (not input.empty()) { | ||||
|     size_t in_len = input.size(); | ||||
|     if (in_len % 4 != 0) | ||||
|     auto in_len{input.size()}; | ||||
|     if (in_len % 4U != 0U) { | ||||
|       throw std::runtime_error("Input data size is not a multiple of 4"); | ||||
|     } | ||||
|  | ||||
|     size_t out_len = in_len / 4 * 3; | ||||
|     if (input[in_len - 1] == '=') | ||||
|     std::size_t out_len{in_len / 4U * 3U}; | ||||
|     if (input[in_len - 1U] == '=') { | ||||
|       out_len--; | ||||
|     if (input[in_len - 2] == '=') | ||||
|     } | ||||
|     if (input[in_len - 2U] == '=') { | ||||
|       out_len--; | ||||
|     } | ||||
|  | ||||
|     out.resize(out_len); | ||||
|  | ||||
|     for (size_t i = 0, j = 0; i < in_len;) { | ||||
|       uint32_t a = input[i] == '=' | ||||
|                        ? 0 & i++ | ||||
|                        : kDecodingTable[static_cast<int>(input[i++])]; | ||||
|       uint32_t b = input[i] == '=' | ||||
|                        ? 0 & i++ | ||||
|                        : kDecodingTable[static_cast<int>(input[i++])]; | ||||
|       uint32_t c = input[i] == '=' | ||||
|                        ? 0 & i++ | ||||
|                        : kDecodingTable[static_cast<int>(input[i++])]; | ||||
|       uint32_t d = input[i] == '=' | ||||
|                        ? 0 & i++ | ||||
|                        : kDecodingTable[static_cast<int>(input[i++])]; | ||||
|     for (std::size_t i = 0U, j = 0U; i < in_len;) { | ||||
|       std::uint32_t a = input[i] == '=' | ||||
|                             ? 0U & i++ | ||||
|                             : kDecodingTable[static_cast<int>(input[i++])]; | ||||
|       std::uint32_t b = input[i] == '=' | ||||
|                             ? 0U & i++ | ||||
|                             : kDecodingTable[static_cast<int>(input[i++])]; | ||||
|       std::uint32_t c = input[i] == '=' | ||||
|                             ? 0U & i++ | ||||
|                             : kDecodingTable[static_cast<int>(input[i++])]; | ||||
|       std::uint32_t d = input[i] == '=' | ||||
|                             ? 0U & i++ | ||||
|                             : kDecodingTable[static_cast<int>(input[i++])]; | ||||
|  | ||||
|       uint32_t triple = | ||||
|           (a << 3 * 6) + (b << 2 * 6) + (c << 1 * 6) + (d << 0 * 6); | ||||
|       std::uint32_t triple = | ||||
|           (a << 3U * 6U) + (b << 2U * 6U) + (c << 1U * 6U) + (d << 0U * 6U); | ||||
|  | ||||
|       if (j < out_len) | ||||
|         out[j++] = (triple >> 2 * 8) & 0xFF; | ||||
|         out[j++] = (triple >> 2U * 8U) & 0xFF; | ||||
|       if (j < out_len) | ||||
|         out[j++] = (triple >> 1 * 8) & 0xFF; | ||||
|         out[j++] = (triple >> 1U * 8U) & 0xFF; | ||||
|       if (j < out_len) | ||||
|         out[j++] = (triple >> 0 * 8) & 0xFF; | ||||
|         out[j++] = (triple >> 0U * 8U) & 0xFF; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -26,23 +26,20 @@ | ||||
| #include "utils/file_utils.hpp" | ||||
|  | ||||
| namespace repertory::utils::encryption { | ||||
| using key_type = std::array<unsigned char, 32U>; | ||||
|  | ||||
| class encrypting_reader final { | ||||
| public: | ||||
|   encrypting_reader(const std::string &file_name, | ||||
|                     const std::string &source_path, stop_type &stop_requested, | ||||
|                     const std::string &token, | ||||
|                     std::optional<std::string> relative_parent_path, | ||||
|   encrypting_reader(std::string_view file_name, std::string_view source_path, | ||||
|                     stop_type &stop_requested, std::string_view token, | ||||
|                     std::optional<std::string_view> relative_parent_path, | ||||
|                     std::size_t error_return = 0U); | ||||
|  | ||||
|   encrypting_reader(const std::string &encrypted_file_path, | ||||
|                     const std::string &source_path, stop_type &stop_requested, | ||||
|                     const std::string &token, std::size_t error_return = 0U); | ||||
|   encrypting_reader(std::string_view encrypted_file_path, | ||||
|                     std::string_view source_path, stop_type &stop_requested, | ||||
|                     std::string_view token, std::size_t error_return = 0U); | ||||
|  | ||||
|   encrypting_reader( | ||||
|       const std::string &encrypted_file_path, const std::string &source_path, | ||||
|       stop_type &stop_requested, const std::string &token, | ||||
|       std::string_view encrypted_file_path, std::string_view source_path, | ||||
|       stop_type &stop_requested, std::string_view token, | ||||
|       std::vector<std::array<unsigned char, | ||||
|                              crypto_aead_xchacha20poly1305_IETF_NPUBBYTES>> | ||||
|           iv_list, | ||||
| @@ -61,9 +58,9 @@ public: | ||||
|   using streambuf = std::basic_streambuf<char, std::char_traits<char>>; | ||||
|  | ||||
| private: | ||||
|   const key_type key_; | ||||
|   key_type key_; | ||||
|   stop_type &stop_requested_; | ||||
|   const size_t error_return_; | ||||
|   size_t error_return_; | ||||
|   std::unordered_map<std::size_t, data_buffer> chunk_buffers_; | ||||
|   std::string encrypted_file_name_; | ||||
|   std::string encrypted_file_path_; | ||||
| @@ -85,16 +82,16 @@ private: | ||||
|   auto reader_function(char *buffer, size_t size, size_t nitems) -> size_t; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] static auto calculate_decrypted_size(std::uint64_t total_size) | ||||
|       -> std::uint64_t; | ||||
|   [[nodiscard]] static auto | ||||
|   calculate_decrypted_size(std::uint64_t total_size) -> std::uint64_t; | ||||
|  | ||||
|   [[nodiscard]] static auto | ||||
|   calculate_encrypted_size(const std::string &source_path) -> std::uint64_t; | ||||
|   calculate_encrypted_size(std::string_view source_path) -> std::uint64_t; | ||||
|  | ||||
|   [[nodiscard]] auto create_iostream() const -> std::shared_ptr<iostream>; | ||||
|  | ||||
|   [[nodiscard]] static constexpr auto get_encrypted_chunk_size() | ||||
|       -> std::size_t { | ||||
|   [[nodiscard]] static constexpr auto | ||||
|   get_encrypted_chunk_size() -> std::size_t { | ||||
|     return encrypted_chunk_size_; | ||||
|   } | ||||
|  | ||||
| @@ -118,8 +115,9 @@ public: | ||||
|     return header_size_; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_iv_list() -> std::vector< | ||||
|       std::array<unsigned char, crypto_aead_xchacha20poly1305_IETF_NPUBBYTES>> { | ||||
|   [[nodiscard]] auto get_iv_list() | ||||
|       -> std::vector<std::array<unsigned char, | ||||
|                                 crypto_aead_xchacha20poly1305_IETF_NPUBBYTES>> { | ||||
|     return iv_list_; | ||||
|   } | ||||
|  | ||||
| @@ -132,8 +130,8 @@ public: | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] static auto reader_function(char *buffer, size_t size, | ||||
|                                             size_t nitems, void *instream) | ||||
|       -> size_t { | ||||
|                                             size_t nitems, | ||||
|                                             void *instream) -> size_t { | ||||
|     return reinterpret_cast<encrypting_reader *>(instream)->reader_function( | ||||
|         buffer, size, nitems); | ||||
|   } | ||||
|   | ||||
| @@ -30,25 +30,24 @@ using reader_func = std::function<api_error(data_buffer &cypher_text, | ||||
|                                             std::uint64_t start_offset, | ||||
|                                             std::uint64_t end_offset)>; | ||||
| // Prototypes | ||||
| [[nodiscard]] auto decrypt_file_path(const std::string &encryption_token, | ||||
| [[nodiscard]] auto decrypt_file_path(std::string_view encryption_token, | ||||
|                                      std::string &file_path) -> api_error; | ||||
|  | ||||
| [[nodiscard]] auto decrypt_file_name(const std::string &encryption_token, | ||||
| [[nodiscard]] auto decrypt_file_name(std::string_view encryption_token, | ||||
|                                      std::string &file_name) -> api_error; | ||||
|  | ||||
| [[nodiscard]] auto generate_key(const std::string &encryption_token) | ||||
|     -> key_type; | ||||
|  | ||||
| [[nodiscard]] auto read_encrypted_range(const http_range &range, | ||||
|                                         const key_type &key, reader_func reader, | ||||
|                                         std::uint64_t total_size, | ||||
|                                         data_buffer &data) -> api_error; | ||||
|  | ||||
| [[nodiscard]] auto generate_key(std::string_view encryption_token) -> key_type; | ||||
|  | ||||
| // Implementations | ||||
| template <typename result> | ||||
| [[nodiscard]] inline auto decrypt_data(const key_type &key, const char *buffer, | ||||
|                                        std::size_t buffer_size, result &res) | ||||
|     -> bool { | ||||
| [[nodiscard]] inline auto | ||||
| decrypt_data(const key_type &key, const unsigned char *buffer, | ||||
|              std::size_t buffer_size, result &res) -> bool { | ||||
|   const auto header_size = | ||||
|       static_cast<std::uint32_t>(encrypting_reader::get_header_size()); | ||||
|   if (buffer_size > header_size) { | ||||
| @@ -56,14 +55,11 @@ template <typename result> | ||||
|         boost::endian::native_to_big(static_cast<std::uint32_t>(buffer_size)); | ||||
|     res.resize(buffer_size - header_size); | ||||
|     return crypto_aead_xchacha20poly1305_ietf_decrypt_detached( | ||||
|                reinterpret_cast<unsigned char *>(&res[0u]), nullptr, | ||||
|                reinterpret_cast<const unsigned char *>(&buffer[header_size]), | ||||
|                res.size(), | ||||
|                reinterpret_cast<const unsigned char *>( | ||||
|                    &buffer[crypto_aead_xchacha20poly1305_IETF_NPUBBYTES]), | ||||
|                reinterpret_cast<unsigned char *>(res.data()), nullptr, | ||||
|                &buffer[header_size], res.size(), | ||||
|                &buffer[crypto_aead_xchacha20poly1305_IETF_NPUBBYTES], | ||||
|                reinterpret_cast<const unsigned char *>(&size), sizeof(size), | ||||
|                reinterpret_cast<const unsigned char *>(buffer), | ||||
|                key.data()) == 0; | ||||
|                buffer, key.data()) == 0; | ||||
|   } | ||||
|  | ||||
|   return false; | ||||
| @@ -72,20 +68,19 @@ template <typename result> | ||||
| template <typename buffer, typename result> | ||||
| [[nodiscard]] inline auto decrypt_data(const key_type &key, const buffer &buf, | ||||
|                                        result &res) -> bool { | ||||
|   return decrypt_data<result>(key, &buf[0u], buf.size(), res); | ||||
|   return decrypt_data<result>(key, buf.data(), buf.size(), res); | ||||
| } | ||||
|  | ||||
| template <typename buffer, typename result> | ||||
| [[nodiscard]] inline auto decrypt_data(const std::string &encryption_token, | ||||
| [[nodiscard]] inline auto decrypt_data(std::string_view encryption_token, | ||||
|                                        const buffer &buf, result &res) -> bool { | ||||
|   return decrypt_data<buffer, result>(generate_key(encryption_token), buf, res); | ||||
| } | ||||
|  | ||||
| template <typename result> | ||||
| [[nodiscard]] inline auto decrypt_data(const std::string &encryption_token, | ||||
|                                        const char *buffer, | ||||
|                                        std::size_t buffer_size, result &res) | ||||
|     -> bool { | ||||
| [[nodiscard]] inline auto | ||||
| decrypt_data(std::string_view encryption_token, const unsigned char *buffer, | ||||
|              std::size_t buffer_size, result &res) -> bool { | ||||
|   return decrypt_data<result>(generate_key(encryption_token), buffer, | ||||
|                               buffer_size, res); | ||||
| } | ||||
| @@ -94,8 +89,8 @@ template <typename result> | ||||
| inline void | ||||
| encrypt_data(const std::array<unsigned char, | ||||
|                               crypto_aead_xchacha20poly1305_IETF_NPUBBYTES> &iv, | ||||
|              const key_type &key, const char *buffer, std::size_t buffer_size, | ||||
|              result &res) { | ||||
|              const key_type &key, const unsigned char *buffer, | ||||
|              std::size_t buffer_size, result &res) { | ||||
|   std::array<unsigned char, crypto_aead_xchacha20poly1305_IETF_ABYTES> mac{}; | ||||
|  | ||||
|   const auto header_size = | ||||
| @@ -109,18 +104,18 @@ encrypt_data(const std::array<unsigned char, | ||||
|   unsigned long long mac_length{}; | ||||
|   if (crypto_aead_xchacha20poly1305_ietf_encrypt_detached( | ||||
|           reinterpret_cast<unsigned char *>(&res[header_size]), mac.data(), | ||||
|           &mac_length, reinterpret_cast<const unsigned char *>(buffer), | ||||
|           buffer_size, reinterpret_cast<const unsigned char *>(&size), | ||||
|           sizeof(size), nullptr, iv.data(), key.data()) != 0) { | ||||
|           &mac_length, buffer, buffer_size, | ||||
|           reinterpret_cast<const unsigned char *>(&size), sizeof(size), nullptr, | ||||
|           iv.data(), key.data()) != 0) { | ||||
|     throw std::runtime_error("encryption failed"); | ||||
|   } | ||||
|  | ||||
|   std::memcpy(&res[0u], &iv[0u], iv.size()); | ||||
|   std::memcpy(&res[iv.size()], &mac[0u], mac.size()); | ||||
|   std::memcpy(res.data(), iv.data(), iv.size()); | ||||
|   std::memcpy(&res[iv.size()], mac.data(), mac.size()); | ||||
| } | ||||
|  | ||||
| template <typename result> | ||||
| inline void encrypt_data(const key_type &key, const char *buffer, | ||||
| inline void encrypt_data(const key_type &key, const unsigned char *buffer, | ||||
|                          std::size_t buffer_size, result &res) { | ||||
|   std::array<unsigned char, crypto_aead_xchacha20poly1305_IETF_NPUBBYTES> iv{}; | ||||
|   randombytes_buf(iv.data(), iv.size()); | ||||
| @@ -129,23 +124,23 @@ inline void encrypt_data(const key_type &key, const char *buffer, | ||||
| } | ||||
|  | ||||
| template <typename result> | ||||
| inline void encrypt_data(const std::string &encryption_token, | ||||
|                          const char *buffer, std::size_t buffer_size, | ||||
| inline void encrypt_data(std::string_view encryption_token, | ||||
|                          const unsigned char *buffer, std::size_t buffer_size, | ||||
|                          result &res) { | ||||
|   encrypt_data<result>(generate_key(encryption_token), buffer, buffer_size, | ||||
|                        res); | ||||
| } | ||||
|  | ||||
| template <typename buffer, typename result> | ||||
| inline void encrypt_data(const std::string &encryption_token, const buffer &buf, | ||||
| inline void encrypt_data(std::string_view encryption_token, const buffer &buf, | ||||
|                          result &res) { | ||||
|   encrypt_data<result>(generate_key(encryption_token), &buf[0u], buf.size(), | ||||
|   encrypt_data<result>(generate_key(encryption_token), buf.data(), buf.size(), | ||||
|                        res); | ||||
| } | ||||
|  | ||||
| template <typename buffer, typename result> | ||||
| inline void encrypt_data(const key_type &key, const buffer &buf, result &res) { | ||||
|   encrypt_data<result>(key, &buf[0u], buf.size(), res); | ||||
|   encrypt_data<result>(key, buf.data(), buf.size(), res); | ||||
| } | ||||
|  | ||||
| template <typename buffer, typename result> | ||||
| @@ -153,7 +148,7 @@ inline void | ||||
| encrypt_data(const std::array<unsigned char, | ||||
|                               crypto_aead_xchacha20poly1305_IETF_NPUBBYTES> &iv, | ||||
|              const key_type &key, const buffer &buf, result &res) { | ||||
|   encrypt_data<result>(iv, key, &buf[0u], buf.size(), res); | ||||
|   encrypt_data<result>(iv, key, buf.data(), buf.size(), res); | ||||
| } | ||||
| } // namespace repertory::utils::encryption | ||||
|  | ||||
|   | ||||
| @@ -27,21 +27,21 @@ | ||||
|  | ||||
| namespace repertory::utils::file { | ||||
| // Prototypes | ||||
| [[nodiscard]] auto calculate_used_space(std::string path, bool recursive) | ||||
|     -> std::uint64_t; | ||||
| [[nodiscard]] auto calculate_used_space(std::string path, | ||||
|                                         bool recursive) -> std::uint64_t; | ||||
|  | ||||
| void change_to_process_directory(); | ||||
|  | ||||
| [[nodiscard]] auto copy_directory_recursively(std::string from_path, | ||||
|                                               std::string to_path) -> bool; | ||||
|  | ||||
| [[nodiscard]] auto copy_file(std::string from_path, std::string to_path) | ||||
|     -> bool; | ||||
| [[nodiscard]] auto copy_file(std::string from_path, | ||||
|                              std::string to_path) -> bool; | ||||
|  | ||||
| [[nodiscard]] auto create_full_directory_path(std::string path) -> bool; | ||||
|  | ||||
| [[nodiscard]] auto delete_directory(std::string path, bool recursive = false) | ||||
|     -> bool; | ||||
| [[nodiscard]] auto delete_directory(std::string path, | ||||
|                                     bool recursive = false) -> bool; | ||||
|  | ||||
| [[nodiscard]] auto delete_directory_recursively(std::string path) -> bool; | ||||
|  | ||||
| @@ -52,18 +52,18 @@ void change_to_process_directory(); | ||||
| [[nodiscard]] auto get_accessed_time(const std::string &path, | ||||
|                                      std::uint64_t &accessed) -> bool; | ||||
|  | ||||
| [[nodiscard]] auto get_directory_files(std::string path, bool oldest_first, | ||||
|                                        bool recursive = false) | ||||
|     -> std::deque<std::string>; | ||||
| [[nodiscard]] auto | ||||
| get_directory_files(std::string path, bool oldest_first, | ||||
|                     bool recursive = false) -> std::deque<std::string>; | ||||
|  | ||||
| [[nodiscard]] auto get_free_drive_space(const std::string &path) | ||||
|     -> std::uint64_t; | ||||
| [[nodiscard]] auto | ||||
| get_free_drive_space(const std::string &path) -> std::uint64_t; | ||||
|  | ||||
| [[nodiscard]] auto get_total_drive_space(const std::string &path) | ||||
|     -> std::uint64_t; | ||||
| [[nodiscard]] auto | ||||
| get_total_drive_space(const std::string &path) -> std::uint64_t; | ||||
|  | ||||
| [[nodiscard]] auto get_file_size(std::string path, std::uint64_t &file_size) | ||||
|     -> bool; | ||||
| [[nodiscard]] auto get_file_size(std::string_view path, | ||||
|                                  std::uint64_t &file_size) -> bool; | ||||
|  | ||||
| [[nodiscard]] auto get_modified_time(const std::string &path, | ||||
|                                      std::uint64_t &modified) -> bool; | ||||
| @@ -72,14 +72,14 @@ void change_to_process_directory(); | ||||
|  | ||||
| [[nodiscard]] auto is_file(const std::string &path) -> bool; | ||||
|  | ||||
| [[nodiscard]] auto is_modified_date_older_than(const std::string &path, | ||||
|                                                const std::chrono::hours &hours) | ||||
|     -> bool; | ||||
| [[nodiscard]] auto | ||||
| is_modified_date_older_than(const std::string &path, | ||||
|                             const std::chrono::hours &hours) -> bool; | ||||
|  | ||||
| [[nodiscard]] auto move_file(std::string from, std::string to) -> bool; | ||||
|  | ||||
| [[nodiscard]] auto read_file_lines(const std::string &path) | ||||
|     -> std::vector<std::string>; | ||||
| [[nodiscard]] auto | ||||
| read_file_lines(const std::string &path) -> std::vector<std::string>; | ||||
|  | ||||
| [[nodiscard]] auto read_json_file(const std::string &path, json &data) -> bool; | ||||
|  | ||||
| @@ -89,8 +89,8 @@ void change_to_process_directory(); | ||||
|  | ||||
| [[nodiscard]] auto retry_delete_file(const std::string &file) -> bool; | ||||
|  | ||||
| [[nodiscard]] auto write_json_file(const std::string &path, const json &j) | ||||
|     -> bool; | ||||
| [[nodiscard]] auto write_json_file(const std::string &path, | ||||
|                                    const json &j) -> bool; | ||||
| } // namespace repertory::utils::file | ||||
|  | ||||
| #endif // INCLUDE_UTILS_FILE_UTILS_HPP_ | ||||
|   | ||||
| @@ -42,17 +42,17 @@ public: | ||||
|   [[nodiscard]] static auto | ||||
|   clone(const native_file_ptr &ptr) -> native_file_ptr; | ||||
|  | ||||
|   [[nodiscard]] static auto create_or_open(const std::string &source_path, | ||||
|   [[nodiscard]] static auto create_or_open(std::string_view source_path, | ||||
|                                            bool read_only, | ||||
|                                            native_file_ptr &ptr) -> api_error; | ||||
|  | ||||
|   [[nodiscard]] static auto create_or_open(const std::string &source_path, | ||||
|   [[nodiscard]] static auto create_or_open(std::string_view source_path, | ||||
|                                            native_file_ptr &ptr) -> api_error; | ||||
|  | ||||
|   [[nodiscard]] static auto open(const std::string &source_path, | ||||
|   [[nodiscard]] static auto open(std::string_view source_path, | ||||
|                                  native_file_ptr &ptr) -> api_error; | ||||
|  | ||||
|   [[nodiscard]] static auto open(const std::string &source_path, bool read_only, | ||||
|   [[nodiscard]] static auto open(std::string_view source_path, bool read_only, | ||||
|                                  native_file_ptr &ptr) -> api_error; | ||||
|  | ||||
| private: | ||||
| @@ -86,11 +86,11 @@ public: | ||||
|   [[nodiscard]] auto get_handle() -> native_handle; | ||||
|  | ||||
| #if defined(_WIN32) | ||||
|   [[nodiscard]] auto read_bytes(char *buffer, std::size_t read_size, | ||||
|   [[nodiscard]] auto read_bytes(unsigned char *buffer, std::size_t read_size, | ||||
|                                 std::uint64_t read_offset, | ||||
|                                 std::size_t &bytes_read) -> bool; | ||||
| #else | ||||
|   [[nodiscard]] auto read_bytes(char *buffer, std::size_t read_size, | ||||
|   [[nodiscard]] auto read_bytes(unsigned char *buffer, std::size_t read_size, | ||||
|                                 std::uint64_t read_offset, | ||||
|                                 std::size_t &bytes_read) -> bool; | ||||
| #endif | ||||
| @@ -99,11 +99,13 @@ public: | ||||
|   [[nodiscard]] auto truncate(std::uint64_t file_size) -> bool; | ||||
|  | ||||
| #if defined(_WIN32) | ||||
|   [[nodiscard]] auto write_bytes(const char *buffer, std::size_t write_size, | ||||
|   [[nodiscard]] auto write_bytes(const unsigned char *buffer, | ||||
|                                  std::size_t write_size, | ||||
|                                  std::uint64_t write_offset, | ||||
|                                  std::size_t &bytes_written) -> bool; | ||||
| #else | ||||
|   [[nodiscard]] auto write_bytes(const char *buffer, std::size_t write_size, | ||||
|   [[nodiscard]] auto write_bytes(const unsigned char *buffer, | ||||
|                                  std::size_t write_size, | ||||
|                                  std::uint64_t write_offset, | ||||
|                                  std::size_t &bytes_written) -> bool; | ||||
| #endif | ||||
|   | ||||
| @@ -32,29 +32,28 @@ constexpr auto contains(std::string_view str, std::string_view search) -> bool { | ||||
|   return (str.find(search) != std::string_view::npos); | ||||
| } | ||||
|  | ||||
| [[nodiscard]] /* constexpr c++20 */ auto ends_with(std::string_view str, | ||||
|                                                    std::string_view val) | ||||
|     -> bool; | ||||
| [[nodiscard]] /* constexpr c++20 */ auto | ||||
| ends_with(std::string_view str, std::string_view val) -> bool; | ||||
|  | ||||
| [[nodiscard]] auto from_bool(bool val) -> std::string; | ||||
|  | ||||
| [[nodiscard]] auto from_dynamic_bitset(const boost::dynamic_bitset<> &bitset) | ||||
|     -> std::string; | ||||
| [[nodiscard]] auto | ||||
| from_dynamic_bitset(const boost::dynamic_bitset<> &bitset) -> std::string; | ||||
|  | ||||
| [[nodiscard]] auto from_utf8(const std::string &str) -> std::wstring; | ||||
| [[nodiscard]] auto from_utf8(std::string_view str) -> std::wstring; | ||||
|  | ||||
| [[nodiscard]] /* constexpr c++20 */ auto is_numeric(std::string_view str) | ||||
|     -> bool; | ||||
| [[nodiscard]] /* constexpr c++20 */ auto | ||||
| is_numeric(std::string_view str) -> bool; | ||||
|  | ||||
| [[nodiscard]] auto join(const std::vector<std::string> &arr, const char &delim) | ||||
|     -> std::string; | ||||
| [[nodiscard]] auto join(const std::vector<std::string> &arr, | ||||
|                         const char &delim) -> std::string; | ||||
|  | ||||
| auto left_trim(std::string &str) -> std::string &; | ||||
|  | ||||
| auto left_trim(std::string &str, const char &trim_ch) -> std::string &; | ||||
|  | ||||
| auto replace(std::string &src, const char &character, const char &with) | ||||
|     -> std::string &; | ||||
| auto replace(std::string &src, const char &character, | ||||
|              const char &with) -> std::string &; | ||||
|  | ||||
| auto replace(std::string &src, const std::string &find, const std::string &with, | ||||
|              size_t start_pos = 0) -> std::string &; | ||||
| @@ -63,8 +62,8 @@ auto replace(std::string &src, const std::string &find, const std::string &with, | ||||
|                                 const char &with) -> std::string; | ||||
|  | ||||
| [[nodiscard]] auto replace_copy(std::string src, const std::string &find, | ||||
|                                 const std::string &with, size_t start_pos = 0) | ||||
|     -> std::string; | ||||
|                                 const std::string &with, | ||||
|                                 size_t start_pos = 0) -> std::string; | ||||
|  | ||||
| auto right_trim(std::string &str) -> std::string &; | ||||
|  | ||||
| @@ -77,8 +76,8 @@ auto right_trim(std::string &str, const char &trim_ch) -> std::string &; | ||||
|  | ||||
| [[nodiscard]] auto to_double(const std::string &str) -> double; | ||||
|  | ||||
| [[nodiscard]] auto to_dynamic_bitset(const std::string &val) | ||||
|     -> boost::dynamic_bitset<>; | ||||
| [[nodiscard]] auto | ||||
| to_dynamic_bitset(const std::string &val) -> boost::dynamic_bitset<>; | ||||
|  | ||||
| [[nodiscard]] auto to_lower(std::string str) -> std::string; | ||||
|  | ||||
| @@ -98,9 +97,9 @@ auto right_trim(std::string &str, const char &trim_ch) -> std::string &; | ||||
|  | ||||
| [[nodiscard]] auto to_upper(std::string str) -> std::string; | ||||
|  | ||||
| [[nodiscard]] auto to_utf8(std::string str) -> std::string; | ||||
| [[nodiscard]] auto to_utf8(std::string_view str) -> std::string; | ||||
|  | ||||
| [[nodiscard]] auto to_utf8(const std::wstring &str) -> std::string; | ||||
| [[nodiscard]] auto to_utf8(std::wstring_view str) -> std::string; | ||||
|  | ||||
| auto trim(std::string &str) -> std::string &; | ||||
|  | ||||
| @@ -108,8 +107,8 @@ auto trim(std::string &str, const char &trim_ch) -> std::string &; | ||||
|  | ||||
| [[nodiscard]] auto trim_copy(std::string str) -> std::string; | ||||
|  | ||||
| [[nodiscard]] auto trim_copy(std::string str, const char &trim_ch) | ||||
|     -> std::string; | ||||
| [[nodiscard]] auto trim_copy(std::string str, | ||||
|                              const char &trim_ch) -> std::string; | ||||
| } // namespace repertory::utils::string | ||||
|  | ||||
| #endif // INCLUDE_UTILS_STRING_UTILS_HPP_ | ||||
|   | ||||
| @@ -36,9 +36,9 @@ void packet::clear() { | ||||
| } | ||||
|  | ||||
| auto packet::decode(std::string &data) -> packet::error_type { | ||||
|   const auto *str = &buffer_[decode_offset_]; | ||||
|   const auto *str = reinterpret_cast<const char *>(&buffer_[decode_offset_]); | ||||
|   const auto length = strnlen(str, buffer_.size() - decode_offset_); | ||||
|   data = std::string(str, length); | ||||
|   data = std::string{str, length}; | ||||
|   decode_offset_ += (length + 1); | ||||
|  | ||||
|   return utils::from_api_error(api_error::success); | ||||
| @@ -236,7 +236,7 @@ auto packet::decode_json(packet &response, json &json_data) -> int { | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| auto packet::decrypt(const std::string &token) -> packet::error_type { | ||||
| auto packet::decrypt(std::string_view token) -> packet::error_type { | ||||
|   constexpr const auto *function_name = static_cast<const char *>(__FUNCTION__); | ||||
|  | ||||
|   auto ret = utils::from_api_error(api_error::success); | ||||
| @@ -267,10 +267,10 @@ void packet::encode(const void *buffer, std::size_t size, bool should_reserve) { | ||||
|   } | ||||
| } | ||||
|  | ||||
| void packet::encode(const std::string &str) { | ||||
|   const auto len = strnlen(str.c_str(), str.size()); | ||||
| void packet::encode(std::string_view str) { | ||||
|   const auto len = str.size(); | ||||
|   buffer_.reserve(len + 1 + buffer_.size()); | ||||
|   encode(str.c_str(), len, false); | ||||
|   encode(str.data(), len, false); | ||||
|   buffer_.emplace_back(0); | ||||
| } | ||||
|  | ||||
| @@ -278,7 +278,7 @@ void packet::encode(const wchar_t *str) { | ||||
|   encode(utils::string::to_utf8(str == nullptr ? L"" : str)); | ||||
| } | ||||
|  | ||||
| void packet::encode(const std::wstring &str) { | ||||
| void packet::encode(std::wstring_view str) { | ||||
|   encode(utils::string::to_utf8(str)); | ||||
| } | ||||
|  | ||||
| @@ -400,14 +400,14 @@ void packet::encode_top(const void *buffer, std::size_t size, | ||||
|   } | ||||
| } | ||||
|  | ||||
| void packet::encode_top(const std::string &str) { | ||||
|   const auto len = strnlen(str.c_str(), str.size()); | ||||
| void packet::encode_top(std::string_view str) { | ||||
|   const auto len = str.size(); | ||||
|   buffer_.reserve(len + 1U + buffer_.size()); | ||||
|   encode_top(str.c_str(), len, false); | ||||
|   encode_top(str.data(), len, false); | ||||
|   buffer_.insert(buffer_.begin() + static_cast<std::int32_t>(len), 0); | ||||
| } | ||||
|  | ||||
| void packet::encode_top(const std::wstring &str) { | ||||
| void packet::encode_top(std::wstring_view str) { | ||||
|   encode_top(utils::string::to_utf8(str)); | ||||
| } | ||||
|  | ||||
| @@ -518,7 +518,7 @@ void packet::encode_top(remote::file_info val) { | ||||
|   encode_top(&val, sizeof(val), true); | ||||
| } | ||||
|  | ||||
| void packet::encrypt(const std::string &token) { | ||||
| void packet::encrypt(std::string_view token) { | ||||
|   constexpr const auto *function_name = static_cast<const char *>(__FUNCTION__); | ||||
|  | ||||
|   try { | ||||
|   | ||||
| @@ -1018,8 +1018,10 @@ auto fuse_drive::setxattr_impl(std::string api_path, const char *name, | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return provider_.set_item_meta(api_path, attribute_name, | ||||
|                                  macaron::Base64::Encode(value, size)); | ||||
|   return provider_.set_item_meta( | ||||
|       api_path, attribute_name, | ||||
|       macaron::Base64::Encode(reinterpret_cast<const unsigned char *>(value), | ||||
|                               size)); | ||||
| } | ||||
| #endif // HAS_SETXATTR | ||||
|  | ||||
|   | ||||
| @@ -691,7 +691,9 @@ auto encrypt_provider::process_directory_entry( | ||||
|          part_idx++) { | ||||
|       data_buffer encrypted_data; | ||||
|       utils::encryption::encrypt_data( | ||||
|           cfg.encryption_token, encrypted_parts.at(part_idx).c_str(), | ||||
|           cfg.encryption_token, | ||||
|           reinterpret_cast<const unsigned char *>( | ||||
|               encrypted_parts.at(part_idx).c_str()), | ||||
|           strnlen(encrypted_parts.at(part_idx).c_str(), | ||||
|                   encrypted_parts.at(part_idx).size()), | ||||
|           encrypted_data); | ||||
| @@ -917,8 +919,9 @@ auto encrypt_provider::read_file_bytes(const std::string &api_path, | ||||
|   info->reader->set_read_position(offset); | ||||
|   data.resize(size); | ||||
|  | ||||
|   const auto res = info->reader->reader_function(data.data(), 1U, data.size(), | ||||
|                                                  info->reader.get()); | ||||
|   const auto res = | ||||
|       info->reader->reader_function(reinterpret_cast<char *>(data.data()), 1U, | ||||
|                                     data.size(), info->reader.get()); | ||||
|   if (res == 0) { | ||||
|     return api_error::os_error; | ||||
|   } | ||||
|   | ||||
| @@ -33,8 +33,8 @@ class encrypting_streambuf final : public encrypting_reader::streambuf { | ||||
| public: | ||||
|   encrypting_streambuf(const encrypting_streambuf &) = default; | ||||
|   encrypting_streambuf(encrypting_streambuf &&) = delete; | ||||
|   auto operator=(const encrypting_streambuf &) | ||||
|       -> encrypting_streambuf & = delete; | ||||
|   auto | ||||
|   operator=(const encrypting_streambuf &) -> encrypting_streambuf & = delete; | ||||
|   auto operator=(encrypting_streambuf &&) -> encrypting_streambuf & = delete; | ||||
|  | ||||
|   explicit encrypting_streambuf(const encrypting_reader &reader) | ||||
| @@ -81,10 +81,9 @@ protected: | ||||
|     return encrypting_reader::streambuf::seekoff(off, dir, which); | ||||
|   } | ||||
|  | ||||
|   auto seekpos(pos_type pos, | ||||
|                std::ios_base::openmode which = std::ios_base::out | | ||||
|                                                std::ios_base::in) | ||||
|       -> pos_type override { | ||||
|   auto seekpos(pos_type pos, std::ios_base::openmode which = | ||||
|                                  std::ios_base::out | | ||||
|                                  std::ios_base::in) -> pos_type override { | ||||
|     return seekoff(pos, std::ios_base::beg, which); | ||||
|   } | ||||
|  | ||||
| @@ -164,29 +163,30 @@ const std::size_t encrypting_reader::encrypted_chunk_size_ = | ||||
|     data_chunk_size_ + header_size_; | ||||
|  | ||||
| encrypting_reader::encrypting_reader( | ||||
|     const std::string &file_name, const std::string &source_path, | ||||
|     stop_type &stop_requested, const std::string &token, | ||||
|     std::optional<std::string> relative_parent_path, std::size_t error_return) | ||||
|     std::string_view file_name, std::string_view source_path, | ||||
|     stop_type &stop_requested, std::string_view token, | ||||
|     std::optional<std::string_view> relative_parent_path, | ||||
|     std::size_t error_return) | ||||
|     : key_(utils::encryption::generate_key(token)), | ||||
|       stop_requested_(stop_requested), | ||||
|       error_return_(error_return) { | ||||
|   const auto res = native_file::create_or_open(source_path, true, source_file_); | ||||
|   if (res != api_error::success) { | ||||
|     throw std::runtime_error("file open failed|src|" + source_path + '|' + | ||||
|     throw std::runtime_error("file open failed|src|" + | ||||
|                              std::string{source_path} + '|' + | ||||
|                              api_error_to_string(res)); | ||||
|   } | ||||
|  | ||||
|   data_buffer result; | ||||
|   utils::encryption::encrypt_data(key_, file_name.c_str(), | ||||
|                                   strnlen(file_name.c_str(), file_name.size()), | ||||
|                                   result); | ||||
|   utils::encryption::encrypt_data( | ||||
|       key_, reinterpret_cast<const unsigned char *>(file_name.data()), | ||||
|       file_name.size(), result); | ||||
|   encrypted_file_name_ = utils::to_hex_string(result); | ||||
|  | ||||
|   if (relative_parent_path.has_value()) { | ||||
|     for (const auto &part : | ||||
|          std::filesystem::path(relative_parent_path.value())) { | ||||
|     for (auto &&part : std::filesystem::path(relative_parent_path.value())) { | ||||
|       utils::encryption::encrypt_data( | ||||
|           key_, part.string().c_str(), | ||||
|           key_, reinterpret_cast<const unsigned char *>(part.string().c_str()), | ||||
|           strnlen(part.string().c_str(), part.string().size()), result); | ||||
|       encrypted_file_path_ += '/' + utils::to_hex_string(result); | ||||
|     } | ||||
| @@ -195,7 +195,8 @@ encrypting_reader::encrypting_reader( | ||||
|  | ||||
|   std::uint64_t file_size{}; | ||||
|   if (not utils::file::get_file_size(source_path, file_size)) { | ||||
|     throw std::runtime_error("get file size failed|src|" + source_path + '|' + | ||||
|     throw std::runtime_error("get file size failed|src|" + | ||||
|                              std::string{source_path} + '|' + | ||||
|                              std::to_string(utils::get_last_error_code())); | ||||
|   } | ||||
|  | ||||
| @@ -214,17 +215,18 @@ encrypting_reader::encrypting_reader( | ||||
|   } | ||||
| } | ||||
|  | ||||
| encrypting_reader::encrypting_reader(const std::string &encrypted_file_path, | ||||
|                                      const std::string &source_path, | ||||
| encrypting_reader::encrypting_reader(std::string_view encrypted_file_path, | ||||
|                                      std::string_view source_path, | ||||
|                                      stop_type &stop_requested, | ||||
|                                      const std::string &token, | ||||
|                                      std::string_view token, | ||||
|                                      std::size_t error_return) | ||||
|     : key_(utils::encryption::generate_key(token)), | ||||
|       stop_requested_(stop_requested), | ||||
|       error_return_(error_return) { | ||||
|   const auto res = native_file::create_or_open(source_path, true, source_file_); | ||||
|   if (res != api_error::success) { | ||||
|     throw std::runtime_error("file open failed|src|" + source_path + '|' + | ||||
|     throw std::runtime_error("file open failed|src|" + | ||||
|                              std::string{source_path} + '|' + | ||||
|                              api_error_to_string(res)); | ||||
|   } | ||||
|  | ||||
| @@ -234,7 +236,8 @@ encrypting_reader::encrypting_reader(const std::string &encrypted_file_path, | ||||
|  | ||||
|   std::uint64_t file_size{}; | ||||
|   if (not utils::file::get_file_size(source_path, file_size)) { | ||||
|     throw std::runtime_error("get file size failed|src|" + source_path + '|' + | ||||
|     throw std::runtime_error("get file size failed|src|" + | ||||
|                              std::string{source_path} + '|' + | ||||
|                              std::to_string(utils::get_last_error_code())); | ||||
|   } | ||||
|  | ||||
| @@ -254,8 +257,8 @@ encrypting_reader::encrypting_reader(const std::string &encrypted_file_path, | ||||
| } | ||||
|  | ||||
| encrypting_reader::encrypting_reader( | ||||
|     const std::string &encrypted_file_path, const std::string &source_path, | ||||
|     stop_type &stop_requested, const std::string &token, | ||||
|     std::string_view encrypted_file_path, std::string_view source_path, | ||||
|     stop_type &stop_requested, std::string_view token, | ||||
|     std::vector< | ||||
|         std::array<unsigned char, crypto_aead_xchacha20poly1305_IETF_NPUBBYTES>> | ||||
|         iv_list, | ||||
| @@ -265,7 +268,8 @@ encrypting_reader::encrypting_reader( | ||||
|       error_return_(error_return) { | ||||
|   const auto res = native_file::create_or_open(source_path, true, source_file_); | ||||
|   if (res != api_error::success) { | ||||
|     throw std::runtime_error("file open failed|src|" + source_path + '|' + | ||||
|     throw std::runtime_error("file open failed|src|" + | ||||
|                              std::string{source_path} + '|' + | ||||
|                              api_error_to_string(res)); | ||||
|   } | ||||
|  | ||||
| @@ -275,7 +279,8 @@ encrypting_reader::encrypting_reader( | ||||
|  | ||||
|   std::uint64_t file_size{}; | ||||
|   if (not utils::file::get_file_size(source_path, file_size)) { | ||||
|     throw std::runtime_error("get file size failed|src|" + source_path + '|' + | ||||
|     throw std::runtime_error("get file size failed|src|" + | ||||
|                              std::string{source_path} + '|' + | ||||
|                              std::to_string(utils::get_last_error_code())); | ||||
|   } | ||||
|  | ||||
| @@ -319,11 +324,12 @@ auto encrypting_reader::calculate_decrypted_size(std::uint64_t total_size) | ||||
|                        get_header_size()); | ||||
| } | ||||
|  | ||||
| auto encrypting_reader::calculate_encrypted_size(const std::string &source_path) | ||||
| auto encrypting_reader::calculate_encrypted_size(std::string_view source_path) | ||||
|     -> std::uint64_t { | ||||
|   std::uint64_t file_size{}; | ||||
|   if (not utils::file::get_file_size(source_path, file_size)) { | ||||
|     throw std::runtime_error("get file size failed|src|" + source_path + '|' + | ||||
|     throw std::runtime_error("get file size failed|src|" + | ||||
|                              std::string{source_path} + '|' + | ||||
|                              std::to_string(utils::get_last_error_code())); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -28,7 +28,7 @@ | ||||
| #include "utils/utils.hpp" | ||||
|  | ||||
| namespace repertory::utils::encryption { | ||||
| auto decrypt_file_path(const std::string &encryption_token, | ||||
| auto decrypt_file_path(std::string_view encryption_token, | ||||
|                        std::string &file_path) -> api_error { | ||||
|   std::string decrypted_file_path{}; | ||||
|   for (const auto &part : std::filesystem::path(file_path)) { | ||||
| @@ -49,7 +49,7 @@ auto decrypt_file_path(const std::string &encryption_token, | ||||
|   return api_error::success; | ||||
| } | ||||
|  | ||||
| auto decrypt_file_name(const std::string &encryption_token, | ||||
| auto decrypt_file_name(std::string_view encryption_token, | ||||
|                        std::string &file_name) -> api_error { | ||||
|   data_buffer buffer; | ||||
|   if (not utils::from_hex_string(file_name, buffer)) { | ||||
| @@ -65,7 +65,7 @@ auto decrypt_file_name(const std::string &encryption_token, | ||||
|   return api_error::success; | ||||
| } | ||||
|  | ||||
| auto generate_key(const std::string &encryption_token) -> key_type { | ||||
| auto generate_key(std::string_view encryption_token) -> key_type { | ||||
|   crypto_hash_sha256_state state{}; | ||||
|   auto res = crypto_hash_sha256_init(&state); | ||||
|   if (res != 0) { | ||||
| @@ -73,8 +73,8 @@ auto generate_key(const std::string &encryption_token) -> key_type { | ||||
|                              std::to_string(res)); | ||||
|   } | ||||
|   res = crypto_hash_sha256_update( | ||||
|       &state, reinterpret_cast<const unsigned char *>(encryption_token.c_str()), | ||||
|       strnlen(encryption_token.c_str(), encryption_token.size())); | ||||
|       &state, reinterpret_cast<const unsigned char *>(encryption_token.data()), | ||||
|       encryption_token.size()); | ||||
|   if (res != 0) { | ||||
|     throw std::runtime_error("failed to update sha256|" + std::to_string(res)); | ||||
|   } | ||||
|   | ||||
| @@ -82,19 +82,19 @@ void change_to_process_directory() { | ||||
| #if defined(_WIN32) | ||||
|   std::string file_name; | ||||
|   file_name.resize(MAX_PATH); | ||||
|   ::GetModuleFileNameA(nullptr, &file_name[0u], | ||||
|   ::GetModuleFileNameA(nullptr, &file_name[0U], | ||||
|                        static_cast<DWORD>(file_name.size())); | ||||
|  | ||||
|   std::string path = file_name.c_str(); | ||||
|   ::PathRemoveFileSpecA(&path[0u]); | ||||
|   ::SetCurrentDirectoryA(&path[0u]); | ||||
|   ::PathRemoveFileSpecA(&path[0U]); | ||||
|   ::SetCurrentDirectoryA(&path[0U]); | ||||
| #else | ||||
|   std::string path; | ||||
|   path.resize(PATH_MAX + 1); | ||||
| #if defined(__APPLE__) | ||||
|   proc_pidpath(getpid(), &path[0u], path.size()); | ||||
|   proc_pidpath(getpid(), &path[0U], path.size()); | ||||
| #else | ||||
|   readlink("/proc/self/exe", &path[0u], path.size()); | ||||
|   readlink("/proc/self/exe", &path[0U], path.size()); | ||||
| #endif | ||||
|   path = utils::path::get_parent_directory(path); | ||||
|   chdir(path.c_str()); | ||||
| @@ -174,9 +174,9 @@ auto create_full_directory_path(std::string path) -> bool { | ||||
| #else | ||||
|   auto ret = true; | ||||
|   const auto paths = utils::string::split(utils::path::absolute(path), | ||||
|                                           utils::path::directory_seperator[0u]); | ||||
|                                           utils::path::directory_seperator[0U]); | ||||
|   std::string current_path; | ||||
|   for (std::size_t i = 0u; ret && (i < paths.size()); i++) { | ||||
|   for (std::size_t i = 0U; ret && (i < paths.size()); i++) { | ||||
|     if (paths[i].empty()) { // Skip root | ||||
|       current_path = utils::path::directory_seperator; | ||||
|     } else { | ||||
| @@ -282,8 +282,8 @@ auto generate_sha256(const std::string &file_path) -> std::string { | ||||
|  | ||||
|   { | ||||
|     data_buffer buffer(1048576u); | ||||
|     std::uint64_t read_offset = 0u; | ||||
|     std::size_t bytes_read = 0u; | ||||
|     std::uint64_t read_offset = 0U; | ||||
|     std::size_t bytes_read = 0U; | ||||
|     while ( | ||||
|         nf->read_bytes(buffer.data(), buffer.size(), read_offset, bytes_read)) { | ||||
|       if (not bytes_read) { | ||||
| @@ -461,7 +461,7 @@ auto get_accessed_time(const std::string &path, | ||||
| auto get_modified_time(const std::string &path, | ||||
|                        std::uint64_t &modified) -> bool { | ||||
|   auto ret = false; | ||||
|   modified = 0u; | ||||
|   modified = 0U; | ||||
| #if defined(_WIN32) | ||||
|   struct _stat64 st {}; | ||||
|   if (_stat64(path.c_str(), &st) != -1) { | ||||
| @@ -483,20 +483,20 @@ auto get_modified_time(const std::string &path, | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| auto get_file_size(std::string path, std::uint64_t &file_size) -> bool { | ||||
|   file_size = 0u; | ||||
|   path = utils::path::absolute(path); | ||||
| auto get_file_size(std::string_view path, std::uint64_t &file_size) -> bool { | ||||
|   file_size = 0U; | ||||
|   auto abs_path = utils::path::absolute(std::string{path}); | ||||
|  | ||||
| #if defined(_WIN32) | ||||
|   struct _stat64 st {}; | ||||
|   if (_stat64(path.c_str(), &st) != 0) { | ||||
|   if (_stat64(abs_path.c_str(), &st) != 0) { | ||||
| #else | ||||
| #if defined(__APPLE__) | ||||
|   struct stat st {}; | ||||
|   if (stat(path.c_str(), &st) != 0) { | ||||
|   if (stat(abs_path.c_str(), &st) != 0) { | ||||
| #else | ||||
|   struct stat64 st {}; | ||||
|   if (stat64(path.c_str(), &st) != 0) { | ||||
|   if (stat64(abs_path.c_str(), &st) != 0) { | ||||
| #endif | ||||
| #endif | ||||
|     return false; | ||||
| @@ -643,7 +643,7 @@ auto reset_modified_time(const std::string &path) -> bool { | ||||
|  | ||||
| auto retry_delete_directory(const std::string &dir) -> bool { | ||||
|   auto deleted = false; | ||||
|   for (std::uint8_t i = 0u; not(deleted = delete_directory(dir)) && (i < 200u); | ||||
|   for (std::uint8_t i = 0U; not(deleted = delete_directory(dir)) && (i < 200U); | ||||
|        i++) { | ||||
|     std::this_thread::sleep_for(10ms); | ||||
|   } | ||||
| @@ -653,7 +653,7 @@ auto retry_delete_directory(const std::string &dir) -> bool { | ||||
|  | ||||
| auto retry_delete_file(const std::string &file) -> bool { | ||||
|   auto deleted = false; | ||||
|   for (std::uint8_t i = 0u; not(deleted = delete_file(file)) && (i < 200u); | ||||
|   for (std::uint8_t i = 0U; not(deleted = delete_file(file)) && (i < 200U); | ||||
|        i++) { | ||||
|     std::this_thread::sleep_for(10ms); | ||||
|   } | ||||
| @@ -671,9 +671,10 @@ auto write_json_file(const std::string &path, const json &j) -> bool { | ||||
|   native_file_ptr nf; | ||||
|   auto ret = (native_file::create_or_open(path, nf) == api_error::success); | ||||
|   if (ret) { | ||||
|     std::size_t bytes_written = 0u; | ||||
|     std::size_t bytes_written{0U}; | ||||
|     ret = nf->truncate(0) && | ||||
|           nf->write_bytes(&data[0u], data.size(), 0u, bytes_written); | ||||
|           nf->write_bytes(reinterpret_cast<const unsigned char *>(data.data()), | ||||
|                           data.size(), 0U, bytes_written); | ||||
|     nf->close(); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -64,24 +64,24 @@ auto native_file::clone(const native_file_ptr &ptr) -> native_file_ptr { | ||||
|   return clone; | ||||
| } | ||||
|  | ||||
| auto native_file::create_or_open(const std::string &source_path, bool read_only, | ||||
| auto native_file::create_or_open(std::string_view source_path, bool read_only, | ||||
|                                  native_file_ptr &ptr) -> api_error { | ||||
| #if defined(_WIN32) | ||||
|   auto handle = | ||||
|       read_only | ||||
|           ? ::CreateFileA(source_path.c_str(), GENERIC_READ, | ||||
|                           FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, | ||||
|                           OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, nullptr) | ||||
|           : ::CreateFileA(source_path.c_str(), GENERIC_READ | GENERIC_WRITE, | ||||
|                           FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, | ||||
|                           OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, nullptr); | ||||
|       read_only ? ::CreateFileA(std::string{source_path}.c_str(), GENERIC_READ, | ||||
|                                 FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, | ||||
|                                 OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, nullptr) | ||||
|                 : ::CreateFileA(std::string{source_path}.c_str(), | ||||
|                                 GENERIC_READ | GENERIC_WRITE, | ||||
|                                 FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, | ||||
|                                 OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, nullptr); | ||||
| #else | ||||
|   auto handle = | ||||
|       read_only | ||||
|           ? ::open(source_path.c_str(), O_CREAT | O_RDONLY | O_CLOEXEC, 0600U) | ||||
|           : ::open(source_path.c_str(), O_CREAT | O_RDWR | O_CLOEXEC, 0600U); | ||||
|   auto handle = read_only ? ::open(std::string{source_path}.c_str(), | ||||
|                                    O_CREAT | O_RDONLY | O_CLOEXEC, 0600U) | ||||
|                           : ::open(std::string{source_path}.c_str(), | ||||
|                                    O_CREAT | O_RDWR | O_CLOEXEC, 0600U); | ||||
|   if (not read_only) { | ||||
|     chmod(source_path.c_str(), 0600U); | ||||
|     chmod(std::string{source_path}.c_str(), 0600U); | ||||
|   } | ||||
| #endif | ||||
|   ptr = native_file::attach(handle); | ||||
| @@ -89,32 +89,34 @@ auto native_file::create_or_open(const std::string &source_path, bool read_only, | ||||
|                                                : api_error::success); | ||||
| } | ||||
|  | ||||
| auto native_file::create_or_open(const std::string &source_path, | ||||
| auto native_file::create_or_open(std::string_view source_path, | ||||
|                                  native_file_ptr &ptr) -> api_error { | ||||
|   return create_or_open(source_path, false, ptr); | ||||
| } | ||||
|  | ||||
| auto native_file::open(const std::string &source_path, | ||||
| auto native_file::open(std::string_view source_path, | ||||
|                        native_file_ptr &ptr) -> api_error { | ||||
|   return open(source_path, false, ptr); | ||||
| } | ||||
|  | ||||
| auto native_file::open(const std::string &source_path, bool read_only, | ||||
| auto native_file::open(std::string_view source_path, bool read_only, | ||||
|                        native_file_ptr &ptr) -> api_error { | ||||
| #if defined(_WIN32) | ||||
|   auto handle = | ||||
|       read_only | ||||
|           ? ::CreateFileA(source_path.c_str(), GENERIC_READ, | ||||
|           ? ::CreateFileA(std::string{source_path}.c_str(), GENERIC_READ, | ||||
|                           FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, | ||||
|                           OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, nullptr) | ||||
|           : ::CreateFileA(source_path.c_str(), GENERIC_READ | GENERIC_WRITE, | ||||
|           : ::CreateFileA(std::string{source_path}.c_str(), | ||||
|                           GENERIC_READ | GENERIC_WRITE, | ||||
|                           FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, | ||||
|                           OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, nullptr); | ||||
| #else | ||||
|   auto handle = read_only ? ::open(source_path.c_str(), O_RDONLY | O_CLOEXEC) | ||||
|                           : ::open(source_path.c_str(), O_RDWR | O_CLOEXEC); | ||||
|   auto handle = | ||||
|       read_only ? ::open(std::string{source_path}.c_str(), O_RDONLY | O_CLOEXEC) | ||||
|                 : ::open(std::string{source_path}.c_str(), O_RDWR | O_CLOEXEC); | ||||
|   if (not read_only) { | ||||
|     chmod(source_path.c_str(), 0600U); | ||||
|     chmod(std::string{source_path}.c_str(), 0600U); | ||||
|   } | ||||
| #endif | ||||
|   ptr = native_file::attach(handle); | ||||
| @@ -216,7 +218,7 @@ auto native_file::get_file_size(std::uint64_t &file_size) -> bool { | ||||
| } | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| auto native_file::read_bytes(char *buffer, std::size_t read_size, | ||||
| auto native_file::read_bytes(unsigned char *buffer, std::size_t read_size, | ||||
|                              std::uint64_t read_offset, | ||||
|                              std::size_t &bytes_read) -> bool { | ||||
|   recur_mutex_lock l(read_write_mutex_); | ||||
| @@ -243,7 +245,7 @@ auto native_file::read_bytes(char *buffer, std::size_t read_size, | ||||
|   return ret; | ||||
| } | ||||
| #else | ||||
| auto native_file::read_bytes(char *buffer, std::size_t read_size, | ||||
| auto native_file::read_bytes(unsigned char *buffer, std::size_t read_size, | ||||
|                              std::uint64_t read_offset, | ||||
|                              std::size_t &bytes_read) -> bool { | ||||
|   bytes_read = 0U; | ||||
| @@ -272,7 +274,8 @@ auto native_file::truncate(std::uint64_t file_size) -> bool { | ||||
| } | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| auto native_file::write_bytes(const char *buffer, std::size_t write_size, | ||||
| auto native_file::write_bytes(const unsigned char *buffer, | ||||
|                               std::size_t write_size, | ||||
|                               std::uint64_t write_offset, | ||||
|                               std::size_t &bytes_written) -> bool { | ||||
|   recur_mutex_lock l(read_write_mutex_); | ||||
| @@ -295,7 +298,8 @@ auto native_file::write_bytes(const char *buffer, std::size_t write_size, | ||||
|   return ret; | ||||
| } | ||||
| #else | ||||
| auto native_file::write_bytes(const char *buffer, std::size_t write_size, | ||||
| auto native_file::write_bytes(const unsigned char *buffer, | ||||
|                               std::size_t write_size, | ||||
|                               std::uint64_t write_offset, | ||||
|                               std::size_t &bytes_written) -> bool { | ||||
|   bytes_written = 0U; | ||||
|   | ||||
| @@ -22,8 +22,8 @@ | ||||
| #include "utils/string_utils.hpp" | ||||
|  | ||||
| namespace repertory::utils::string { | ||||
| /* constexpr c++20 */ auto ends_with(std::string_view str, std::string_view val) | ||||
|     -> bool { | ||||
| /* constexpr c++20 */ auto ends_with(std::string_view str, | ||||
|                                      std::string_view val) -> bool { | ||||
|   if (val.size() > str.size()) { | ||||
|     return false; | ||||
|   } | ||||
| @@ -41,11 +41,11 @@ auto from_dynamic_bitset(const boost::dynamic_bitset<> &bitset) -> std::string { | ||||
|   return stream.str(); | ||||
| } | ||||
|  | ||||
| auto from_utf8(const std::string &str) -> std::wstring { | ||||
| auto from_utf8(std::string_view str) -> std::wstring { | ||||
|   return str.empty() | ||||
|              ? L"" | ||||
|              : std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t>() | ||||
|                    .from_bytes(str); | ||||
|                    .from_bytes(std::string{str}); | ||||
| } | ||||
|  | ||||
| /* constexpr c++20 */ auto is_numeric(std::string_view str) -> bool { | ||||
| @@ -72,8 +72,8 @@ auto from_utf8(const std::string &str) -> std::wstring { | ||||
|                       }) == str.end(); | ||||
| } | ||||
|  | ||||
| auto join(const std::vector<std::string> &arr, const char &delim) | ||||
|     -> std::string { | ||||
| auto join(const std::vector<std::string> &arr, | ||||
|           const char &delim) -> std::string { | ||||
|   if (arr.empty()) { | ||||
|     return ""; | ||||
|   } | ||||
| @@ -92,8 +92,8 @@ auto left_trim(std::string &str, const char &trim_ch) -> std::string & { | ||||
|   return str; | ||||
| } | ||||
|  | ||||
| auto replace(std::string &src, const char &character, const char &with) | ||||
|     -> std::string & { | ||||
| auto replace(std::string &src, const char &character, | ||||
|              const char &with) -> std::string & { | ||||
|   std::replace(src.begin(), src.end(), character, with); | ||||
|   return src; | ||||
| } | ||||
| @@ -109,8 +109,8 @@ auto replace(std::string &src, const std::string &find, const std::string &with, | ||||
|   return src; | ||||
| } | ||||
|  | ||||
| auto replace_copy(std::string src, const char &character, const char &with) | ||||
|     -> std::string { | ||||
| auto replace_copy(std::string src, const char &character, | ||||
|                   const char &with) -> std::string { | ||||
|   std::replace(src.begin(), src.end(), character, with); | ||||
|   return src; | ||||
| } | ||||
| @@ -129,8 +129,8 @@ auto right_trim(std::string &str, const char &trim_ch) -> std::string & { | ||||
|   return str; | ||||
| } | ||||
|  | ||||
| auto split(const std::string &str, const char &delim, bool should_trim) | ||||
|     -> std::vector<std::string> { | ||||
| auto split(const std::string &str, const char &delim, | ||||
|            bool should_trim) -> std::vector<std::string> { | ||||
|   std::vector<std::string> ret; | ||||
|   std::stringstream stream(str); | ||||
|   std::string item; | ||||
| @@ -203,13 +203,13 @@ auto to_upper(std::string str) -> std::string { | ||||
|   return str; | ||||
| } | ||||
|  | ||||
| auto to_utf8(std::string str) -> std::string { return str; } | ||||
| auto to_utf8(std::string_view str) -> std::string { return std::string{str}; } | ||||
|  | ||||
| auto to_utf8(const std::wstring &str) -> std::string { | ||||
| auto to_utf8(std::wstring_view str) -> std::string { | ||||
|   return str.empty() | ||||
|              ? "" | ||||
|              : std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t>() | ||||
|                    .to_bytes(str); | ||||
|                    .to_bytes(std::wstring{str}); | ||||
| } | ||||
|  | ||||
| auto trim(std::string &str) -> std::string & { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user