pupes-message/client/flow_help.cpp
2025-05-03 16:23:19 +02:00

70 lines
1.9 KiB
C++

#include "../common/color.h"
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <openssl/crypto.h>
#include <openssl/pem.h>
#include <string>
#
namespace pupes_message_client_lib {
void error(std::string msg) {
std::cerr << msg << ": " << strerror(errno) << std::endl;
exit(EXIT_FAILURE);
}
// TODO: CHANGE THIS TO OS KEYRING
EVP_PKEY *SaveOrGetKeypair(EVP_PKEY *keypair = nullptr) {
std::string home = std::getenv("HOME");
if (home.empty()) {
error("HOME environment variable not set.\n");
}
std::string savedir_path = home;
savedir_path.append("/.local/share/pupes-message");
if (!std::filesystem::exists(savedir_path)) {
if (!std::filesystem::create_directories(savedir_path)) {
error("Failed to create directory: " + savedir_path + "\n");
}
}
std::string private_key_file_path = savedir_path + "/private_key.pem";
if (keypair != nullptr) {
FILE *private_key_file = fopen(private_key_file_path.c_str(), "wb");
if (private_key_file == nullptr) {
error("Failed to open private key file for writing.\n");
}
PEM_write_PrivateKey(private_key_file, keypair, nullptr, nullptr, 0,
nullptr, nullptr);
fclose(private_key_file);
return nullptr;
} else {
FILE *private_key_file = fopen(private_key_file_path.c_str(), "rb");
if (private_key_file == nullptr) {
if (errno == ENOENT) {
std::clog << BLUE
"[LOG]" RESET
" Private key file not found. Generating a new keypair.\n";
return nullptr;
}
error("Failed to open private key file for reading.\n");
}
keypair = PEM_read_PrivateKey(private_key_file, nullptr, nullptr, nullptr);
if (keypair == nullptr) {
fclose(private_key_file);
error("Failed to read private key from file.\n");
}
fclose(private_key_file);
return keypair;
}
}
} // namespace pupes_message_client_lib