diff options
Diffstat (limited to '')
-rw-r--r-- | src/gpg/GpgConstants.cpp | 98 |
1 files changed, 78 insertions, 20 deletions
diff --git a/src/gpg/GpgConstants.cpp b/src/gpg/GpgConstants.cpp index 2ba04ed2..8090a261 100644 --- a/src/gpg/GpgConstants.cpp +++ b/src/gpg/GpgConstants.cpp @@ -23,21 +23,24 @@ */ #include "gpg/GpgConstants.h" + #include <gpg-error.h> +#include <boost/algorithm/string/predicate.hpp> +#include <filesystem> -const char *GpgFrontend::GpgConstants::PGP_CRYPT_BEGIN = +const char* GpgFrontend::GpgConstants::PGP_CRYPT_BEGIN = "-----BEGIN PGP MESSAGE-----"; -const char *GpgFrontend::GpgConstants::PGP_CRYPT_END = +const char* GpgFrontend::GpgConstants::PGP_CRYPT_END = "-----END PGP MESSAGE-----"; -const char *GpgFrontend::GpgConstants::PGP_SIGNED_BEGIN = +const char* GpgFrontend::GpgConstants::PGP_SIGNED_BEGIN = "-----BEGIN PGP SIGNED MESSAGE-----"; -const char *GpgFrontend::GpgConstants::PGP_SIGNED_END = +const char* GpgFrontend::GpgConstants::PGP_SIGNED_END = "-----END PGP SIGNATURE-----"; -const char *GpgFrontend::GpgConstants::PGP_SIGNATURE_BEGIN = +const char* GpgFrontend::GpgConstants::PGP_SIGNATURE_BEGIN = "-----BEGIN PGP SIGNATURE-----"; -const char *GpgFrontend::GpgConstants::PGP_SIGNATURE_END = +const char* GpgFrontend::GpgConstants::PGP_SIGNATURE_END = "-----END PGP SIGNATURE-----"; -const char *GpgFrontend::GpgConstants::GPG_FRONTEND_SHORT_CRYPTO_HEAD = +const char* GpgFrontend::GpgConstants::GPG_FRONTEND_SHORT_CRYPTO_HEAD = "GpgF_Scpt://"; gpgme_error_t GpgFrontend::check_gpg_error(gpgme_error_t err) { @@ -49,9 +52,10 @@ gpgme_error_t GpgFrontend::check_gpg_error(gpgme_error_t err) { return err; } -gpg_err_code_t GpgFrontend::check_gpg_error_2_err_code(gpgme_error_t err) { +gpg_err_code_t GpgFrontend::check_gpg_error_2_err_code(gpgme_error_t err, + gpgme_error_t predict) { auto err_code = gpg_err_code(err); - if (err_code != GPG_ERR_NO_ERROR) { + if (err_code != predict) { LOG(ERROR) << "[Error " << gpg_err_code(err) << "] Source: " << gpgme_strsource(err) << " Description: " << gpgme_strerror(err); @@ -61,18 +65,17 @@ gpg_err_code_t GpgFrontend::check_gpg_error_2_err_code(gpgme_error_t err) { // error-handling gpgme_error_t GpgFrontend::check_gpg_error(gpgme_error_t err, - const std::string &comment) { + const std::string& comment) { if (gpg_err_code(err) != GPG_ERR_NO_ERROR) { LOG(ERROR) << "[Error " << gpg_err_code(err) << "] Source: " << gpgme_strsource(err) - << " Description: " << gpgme_strerror(err) << " " - << comment.c_str(); + << " Description: " << gpgme_strerror(err) << " " << comment; } return err; } -std::string -GpgFrontend::beautify_fingerprint(GpgFrontend::BypeArrayRef fingerprint) { +std::string GpgFrontend::beautify_fingerprint( + GpgFrontend::BypeArrayRef fingerprint) { uint len = fingerprint.size(); if ((len > 0) && (len % 4 == 0)) for (uint n = 0; 4 * (n + 1) < len; ++n) @@ -81,14 +84,14 @@ GpgFrontend::beautify_fingerprint(GpgFrontend::BypeArrayRef fingerprint) { } // trim from start (in place) -static inline void ltrim(std::string &s) { +static inline void ltrim(std::string& s) { s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) { return !std::isspace(ch); })); } // trim from end (in place) -static inline void rtrim(std::string &s) { +static inline void rtrim(std::string& s) { s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { return !std::isspace(ch); }) .base(), @@ -96,12 +99,64 @@ static inline void rtrim(std::string &s) { } // trim from both ends (in place) -static inline std::string trim(std::string &s) { +static inline std::string trim(std::string& s) { ltrim(s); rtrim(s); return s; } +std::string GpgFrontend::read_all_data_in_file(const std::string& path) { + using namespace std::filesystem; + class path file_info(path.c_str()); + + if (!exists(file_info) || !is_regular_file(path)) + throw std::runtime_error("no permission"); + + std::ifstream in_file; + in_file.open(path, std::ios::in); + if (!in_file.good()) + throw std::runtime_error("cannot open file"); + std::istreambuf_iterator<char> begin(in_file); + std::istreambuf_iterator<char> end; + std::string in_buffer(begin, end); + in_file.close(); + return in_buffer; +} + +void GpgFrontend::write_buffer_to_file(const std::string& path, + const std::string& out_buffer) { + std::ofstream out_file(path); + out_file.open(path.c_str(), std::ios::out); + if (!out_file.good()) + throw std::runtime_error("cannot open file"); + out_file.write(out_buffer.c_str(), out_buffer.size()); + out_file.close(); +} + +std::string GpgFrontend::get_file_extension(const std::string& path) { + // Create a Path object from given string + std::filesystem::path path_obj(path); + // Check if file name in the path object has extension + if (path_obj.has_extension()) { + // Fetch the extension from path object and return + return path_obj.extension().string(); + } + // In case of no extension return empty string + return std::string(); +} + +std::string get_file_name_with_path(const std::string& path) { + // Create a Path object from given string + std::filesystem::path path_obj(path); + // Check if file name in the path object has extension + if (path_obj.has_filename()) { + // Fetch the extension from path object and return + return path_obj.parent_path() / path_obj.filename(); + } + // In case of no extension return empty string + throw std::runtime_error("invalid file path"); +} + /* * isSigned returns: * - 0, if text isn't signed at all @@ -109,13 +164,16 @@ static inline std::string trim(std::string &s) { * - 2, if text is completly signed */ int GpgFrontend::text_is_signed(GpgFrontend::BypeArrayRef text) { - if (trim(text).starts_with(GpgConstants::PGP_SIGNED_BEGIN) && - trim(text).ends_with(GpgConstants::PGP_SIGNED_END)) + using boost::algorithm::ends_with; + using boost::algorithm::starts_with; + + auto trim_text = trim(text); + if (starts_with(trim_text, GpgConstants::PGP_SIGNED_BEGIN) && + ends_with(trim_text, GpgConstants::PGP_SIGNED_END)) return 2; else if (text.find(GpgConstants::PGP_SIGNED_BEGIN) != std::string::npos && text.find(GpgConstants::PGP_SIGNED_END) != std::string::npos) return 1; - else return 0; } |