aboutsummaryrefslogtreecommitdiffstats
path: root/src/gpg/GpgConstants.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpg/GpgConstants.cpp')
-rw-r--r--src/gpg/GpgConstants.cpp163
1 files changed, 154 insertions, 9 deletions
diff --git a/src/gpg/GpgConstants.cpp b/src/gpg/GpgConstants.cpp
index 1d59dab5..5688287e 100644
--- a/src/gpg/GpgConstants.cpp
+++ b/src/gpg/GpgConstants.cpp
@@ -1,7 +1,7 @@
/**
- * This file is part of GPGFrontend.
+ * This file is part of GpgFrontend.
*
- * GPGFrontend is free software: you can redistribute it and/or modify
+ * GpgFrontend is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
@@ -24,11 +24,156 @@
#include "gpg/GpgConstants.h"
-const char *GpgConstants::PGP_CRYPT_BEGIN = "-----BEGIN PGP MESSAGE-----";
-const char *GpgConstants::PGP_CRYPT_END = "-----END PGP MESSAGE-----";
-const char *GpgConstants::PGP_SIGNED_BEGIN = "-----BEGIN PGP SIGNED MESSAGE-----";
-const char *GpgConstants::PGP_SIGNED_END = "-----END PGP SIGNATURE-----";
-const char *GpgConstants::PGP_SIGNATURE_BEGIN = "-----BEGIN PGP SIGNATURE-----";
-const char *GpgConstants::PGP_SIGNATURE_END = "-----END PGP SIGNATURE-----";
-const char *GpgConstants::GPG_FRONTEND_SHORT_CRYPTO_HEAD = "GpgF_Scpt://";
+#include <gpg-error.h>
+#include <boost/algorithm/string/predicate.hpp>
+#include <boost/filesystem.hpp>
+
+const char* GpgFrontend::GpgConstants::PGP_CRYPT_BEGIN =
+ "-----BEGIN PGP MESSAGE-----";
+const char* GpgFrontend::GpgConstants::PGP_CRYPT_END =
+ "-----END PGP MESSAGE-----";
+const char* GpgFrontend::GpgConstants::PGP_SIGNED_BEGIN =
+ "-----BEGIN PGP SIGNED MESSAGE-----";
+const char* GpgFrontend::GpgConstants::PGP_SIGNED_END =
+ "-----END PGP SIGNATURE-----";
+const char* GpgFrontend::GpgConstants::PGP_SIGNATURE_BEGIN =
+ "-----BEGIN PGP SIGNATURE-----";
+const char* GpgFrontend::GpgConstants::PGP_SIGNATURE_END =
+ "-----END PGP SIGNATURE-----";
+const char* GpgFrontend::GpgConstants::GPG_FRONTEND_SHORT_CRYPTO_HEAD =
+ "GpgF_Scpt://";
+
+gpgme_error_t GpgFrontend::check_gpg_error(gpgme_error_t err) {
+ if (gpg_err_code(err) != GPG_ERR_NO_ERROR) {
+ LOG(ERROR) << "[Error " << gpg_err_code(err)
+ << "] Source: " << gpgme_strsource(err)
+ << " Description: " << gpgme_strerror(err);
+ }
+ return 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 != predict) {
+ LOG(ERROR) << "[Error " << gpg_err_code(err)
+ << "] Source: " << gpgme_strsource(err)
+ << " Description: " << gpgme_strerror(err);
+ }
+ return err_code;
+}
+
+// error-handling
+gpgme_error_t GpgFrontend::check_gpg_error(gpgme_error_t err,
+ 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;
+ }
+ return err;
+}
+
+std::string GpgFrontend::beautify_fingerprint(
+ GpgFrontend::BypeArrayConstRef fingerprint) {
+ auto _fingerprint = fingerprint;
+ unsigned len = fingerprint.size();
+ if ((len > 0) && (len % 4 == 0))
+ for (unsigned n = 0; 4 * (n + 1) < len; ++n)
+ _fingerprint.insert(static_cast<int>(5u * n + 4u), " ");
+ return fingerprint;
+}
+
+// trim from start (in place)
+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) {
+ s.erase(std::find_if(s.rbegin(), s.rend(),
+ [](unsigned char ch) { return !std::isspace(ch); })
+ .base(),
+ s.end());
+}
+
+// trim from both ends (in place)
+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 boost::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;
+}
+
+bool GpgFrontend::write_buffer_to_file(const std::string& path,
+ const std::string& out_buffer) {
+ std::ofstream out_file(boost::filesystem::path(path).string(), std::ios::out);
+ if (!out_file.good()) return false;
+ out_file.write(out_buffer.c_str(), out_buffer.size());
+ out_file.close();
+ return true;
+}
+
+std::string GpgFrontend::get_file_extension(const std::string& path) {
+ // Create a Path object from given string
+ boost::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 GpgFrontend::get_only_file_name_with_path(const std::string& path) {
+ // Create a Path object from given string
+ boost::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.stem()).string();
+ }
+ // 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
+ * - 1, if text is partially signed
+ * - 2, if text is completly signed
+ */
+int GpgFrontend::text_is_signed(GpgFrontend::BypeArrayRef text) {
+ 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;
+}