From 155bef0ac4550f63f7916ef8bddb78a3a052d482 Mon Sep 17 00:00:00 2001 From: Abdifatah Osman <137517451+AbdifatahCodes@users.noreply.github.com> Date: Wed, 15 Nov 2023 10:48:54 +0300 Subject: [PATCH] Prewritten code for the tool. --- build/ObsidianGitSync | Bin 0 -> 589824 bytes include/FsManipulator.hpp | 20 ++ include/GitOperations.hpp | 38 +++ include/Init.hpp | 12 + include/LoadEnv.hpp | 13 + include/Logging.hpp | 11 + include/NetworkChecker.hpp | 9 + include/Prompting.hpp | 12 + include/SshWorker.hpp | 17 ++ install.sh | 71 ++++++ main.cpp | 14 ++ platform.cpp | 18 ++ utils/fs_manipulator.cpp | 174 +++++++++++++ utils/git_operations.cpp | 488 +++++++++++++++++++++++++++++++++++++ utils/init.cpp | 135 ++++++++++ utils/load_env.cpp | 23 ++ utils/logging.cpp | 99 ++++++++ utils/network_checker.cpp | 30 +++ utils/prompting.cpp | 69 ++++++ utils/ssh_worker.cpp | 97 ++++++++ 20 files changed, 1350 insertions(+) create mode 100755 build/ObsidianGitSync create mode 100644 include/FsManipulator.hpp create mode 100644 include/GitOperations.hpp create mode 100644 include/Init.hpp create mode 100644 include/LoadEnv.hpp create mode 100644 include/Logging.hpp create mode 100644 include/NetworkChecker.hpp create mode 100644 include/Prompting.hpp create mode 100644 include/SshWorker.hpp create mode 100644 install.sh create mode 100644 main.cpp create mode 100644 platform.cpp create mode 100644 utils/fs_manipulator.cpp create mode 100644 utils/git_operations.cpp create mode 100644 utils/init.cpp create mode 100644 utils/load_env.cpp create mode 100644 utils/logging.cpp create mode 100644 utils/network_checker.cpp create mode 100644 utils/prompting.cpp create mode 100644 utils/ssh_worker.cpp diff --git a/build/ObsidianGitSync b/build/ObsidianGitSync new file mode 100755 index 0000000000000000000000000000000000000000..71ec677288997843f8a60b3fb9c77e51e0b24c1e GIT binary patch literal 589824 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

Tw$Nw<|Z&rRKYc zsQc4OxC*v^g(m7QJoYi_;M>ly0N%e|i8yku{O)-!_C_gW_hsVq%k zYY><6J{6NfgOB^uTDclLrPDmFx_Yw$1}>Ui7a>P3m(rdw?5$Uq#Cb=YkgU(*;*ggYUJM$ZQ$7Y-^cSJb;|dr zrMg@*UG=H(*GgR1dYelx@#-rs3YY%Kt$*?AX>R?ESO4kOlsnd=*J!=SqbYpXJo;O$ zHw5XQBGl0!y(&We7Nn;~sE>p7@CY?4SYHoUABO0C5o#j+8>KQs^z{feGgL2+Qd>jy z-AHvNRG*7fe}(D;k!oU?ULUDehUvMHYFC&ZP5*}L2~p~oDDsTDjQ3sdtNi3|VaMm! zT`x5y-e-bqgx5n3e(mwBa_co7Po`U6@^~(I_4#0xqV@I=wN&fzA!@tUS;1;}kX{_3 zz9lz9)s-OqTZsBFSf310dxQ1RP<1+3FAY_@L&>mPQE|>@e!uwsG%BwV;hsZXzk56s z7HYIqDmB`(ZfeFJYF(>?)pm+lusY_|89{1>)>DJkDy>sO)G4h8hp0caJ{oLx>h@rD zI7nX(R_B9E?vfC{@)|qkz3h6SHsPjIUHi4`o=YF{y2iWpCa>!xwHU8!q(>89;L(${ zYqLiW)~>-`y;8fbX}v30B?sv#!D?oZ9ulm63DTbhtJ^{PyI^%Sm`qAXV7iotsS9bP z+pD*U|7Vv%B<~w~rc2Rbd(@>SyYv>9TJNgvXmgjR@4TpwyVOEg`9EALgZq*Hx({-? zv|?nVhOVnRaQSu@7gAeyR_}9O^H(UP!D_5m-w0BtygC_ypy~}MOGaPR--f6+^p+4c!lf65 zm_B$&h&t@jSAx|omx&t{vN>3-aqD@(YL7>c4O7%rT@O(+y?R!tTIOR*27}dtzi9oPPHIJf0I*f4bh+HRA)oW#tbYp)?$Uj0|FnxM_0yw*90*9PNcSfy-xy2HVxXL`-a@?)?1%|+wSy>5MkdUv

d-h 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∓ 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 m7e7|#|96k%dhpZcd)1>x<2Q5m|LkY#n|9 + +class FsManipulator { +public: + int is_dir_present(const std::string dir_path); + int create_dir(const std::string dir_path); + int delete_dir(const std::string dir_path); + int is_file_present(const std::string file_path); + int create_file(const std::string file_path); + int delete_file(const std::string file_path); + std::string read_config_var(const std::string file_path, const std::string config_var_name); + std::string add_config_var(const std::string file_path, const std::string config_var_name, const std::string input_value); + std::string update_config_var(const std::string file_path, const std::string config_var_name, const std::string input_value); + std::string delete_config_var(const std::string file_path, const std::string config_var_name); +}; + +#endif // FSMANIPULATOR_HPP \ No newline at end of file diff --git a/include/GitOperations.hpp b/include/GitOperations.hpp new file mode 100644 index 0000000..d52c03b --- /dev/null +++ b/include/GitOperations.hpp @@ -0,0 +1,38 @@ +#ifndef GITOPERATIONS_HPP +#define GITOPERATIONS_HPP + +#include +#include + +class GitOperations { +public: + // For the is_repo_present method, use the var workspace_dir to look for a folder with the same name as var main_repository. + // If the folder is available, verify that it is a valid git repo using the var imported from the config. + // Try connecting to it using the provided credentials and links from the config. + // If all passes, return 0, if not, return a non-zero and log the error using Logging class methods. + int is_repo_present(const std::string config_path); + // Clone the repo using git2 and return a 0 for success and a non zero for error while logging everything. + int clone_repo(const std::string config_path); + git_repository* open_repo(const std::string config_path); + // are_changes_present checks for changes that are not commited and returns a 0 for true and non-zero for errors. Log everything. + int are_unindexed_changes_present(git_repository *repo); + // add_to_index would detect any new changes in the repo and add them to index to prepare them for a commit. + int add_to_index(git_repository *repo); + int are_uncommitted_changes_present(git_repository *repo); + int are_unpushed_commits_present(git_repository *repo); + // create_commit commits everything in the index and uses the vars git_username and commits_email from the config file. Return 0 or non-zero as above and log everthing. + int create_commit(const std::string config_path, git_repository *repo); + // push_to_remote pushes the commits to remote. Return 0 or non-zero like above and log everything. + int push_to_remote(const std::string config_path, git_repository *repo); + // Fetches latest changes from the remote repository. + int fetch_remote(const std::string config_path, git_repository *repo); + // Method to handle non-fast-forward error + int handle_non_fast_forward_error(const std::string config_path); + // Backup everything in repo_dir except .git dir to backup_dir + int backup_user_notes(const std::string repo_dir, const std::string backup_dir); + // Replace the contents of repo_dir except .git dir with the contents of backup_dir and delete backup_dir if success. + int recover_user_notes(const std::string repo_dir, const std::string backup_dir); + +}; + +#endif // GITOPERATIONS_HPP \ No newline at end of file diff --git a/include/Init.hpp b/include/Init.hpp new file mode 100644 index 0000000..aa70c88 --- /dev/null +++ b/include/Init.hpp @@ -0,0 +1,12 @@ +#ifndef INIT_HPP +#define INIT_HPP + +#include + +class Init { +public: + // root_dir in linux is "~/.config/ObsidianGitSync". + std::string init_for_linux_desktop(const std::string root_dir, const std::string workspace_dir); +}; + +#endif // INIT_HPP \ No newline at end of file diff --git a/include/LoadEnv.hpp b/include/LoadEnv.hpp new file mode 100644 index 0000000..f3c7109 --- /dev/null +++ b/include/LoadEnv.hpp @@ -0,0 +1,13 @@ +#ifndef LOADENV_HPP +#define LOADENV_HPP + +#include +#include + +class LoadEnv { +public: + std::string load_env_variables(const std::string file_path, const nlohmann::json json_data, const bool update_var); + std::string get_env_var(const std::string file_path, const std::string var_name, const bool update_var); +}; + +#endif // LOADENV_HPP \ No newline at end of file diff --git a/include/Logging.hpp b/include/Logging.hpp new file mode 100644 index 0000000..bf21e2d --- /dev/null +++ b/include/Logging.hpp @@ -0,0 +1,11 @@ +#ifndef LOGGING_HPP +#define LOGGING_HPP + +#include + +class Logging { +public: + int log_to_file(const std::string new_data); +}; + +#endif // LOGGING_HPP \ No newline at end of file diff --git a/include/NetworkChecker.hpp b/include/NetworkChecker.hpp new file mode 100644 index 0000000..8707a84 --- /dev/null +++ b/include/NetworkChecker.hpp @@ -0,0 +1,9 @@ +#ifndef NETWORKCHECKER_HPP +#define NETWORKCHECKER_HPP + +class NetworkChecker { +public: + int checkConnectivity(); +}; + +#endif // NETWORKCHECKER_HPP diff --git a/include/Prompting.hpp b/include/Prompting.hpp new file mode 100644 index 0000000..b074e04 --- /dev/null +++ b/include/Prompting.hpp @@ -0,0 +1,12 @@ +#ifndef PROMPTING_HPP +#define PROMPTING_HPP + +#include + +class Prompting { +public: + std::string prompt_user_for_var(const std::string file_path, const std::string var_name, const std::string default_value = ""); + std::string is_prompt_required(const std::string file_path, const std::string var_name, const std::string default_value = "", const bool update_var = false); +}; + +#endif // PROMPTING_HPP \ No newline at end of file diff --git a/include/SshWorker.hpp b/include/SshWorker.hpp new file mode 100644 index 0000000..09abe8c --- /dev/null +++ b/include/SshWorker.hpp @@ -0,0 +1,17 @@ +#ifndef SSHWORKER_HPP +#define SSHWORKER_HPP + +#include + +class SshWorker { +public: + // This class will use libssh library and retrieve vars like SSH_KEY_NAME, ROOT_DIR, SSH_DIR, COMMITS_EMAIL from config_path using the FsManipulator method read_config_var. + // Use the Logging method log_to_file that takes in a string to log everything, from successes to errors with errors being prepended with a string 'Error: '. + // Then use method from FsManipulator to check if the 2 ssh keys exist using the file path ssh_dir/ssh_key_name and ssh_dir/ssh_key_name.pub, if they exist, try to verify them that they are actually SSH_KEYTYPE_ED25519 and not just random file with the right names that we looked for, if they are verified ssh keys, return 0, else return a non-zero number and use logging class to log all the returns or log worthy events. + // + int is_ssh_setup(const std::string config_path); + // Create a new SSH_KEYTYPE_ED25519 keypair using the keynames ssh_key_name and add .pub to the public key, then create a private function that will be used by the inhabitants of ssh_worker.cpp only to change the email at the end of the pub key file to the var commits_email. Log everything including errors in the way specified above. + std::string setup_new_ssh_keypair(const std::string config_path); +}; + +#endif // SSHWORKER_HPP \ No newline at end of file diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..19cfde4 --- /dev/null +++ b/install.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +# Function to install dependencies on Debian-based systems +install_on_debian() { + echo "Detected a Debian-based Linux distribution." + sudo apt-get update + sudo apt-get install -y libgit2-dev libssh2-1-dev libconfig++-dev libssh-dev libcurl4-openssl-dev +} + +# Function to install dependencies on Red Hat-based systems +install_on_redhat() { + echo "Detected a Red Hat-based Linux distribution." + sudo yum install -y epel-release + sudo yum install -y libgit2-devel libssh2-devel libconfig-devel libssh-devel libcurl-devel +} + +# Function to install dependencies on Fedora +install_on_fedora() { + echo "Detected Fedora." + sudo dnf install -y libgit2-devel libssh2-devel libconfig-devel libssh-devel libcurl-devel +} + +# Function to install dependencies on Arch Linux +install_on_arch() { + echo "Detected Arch Linux." + sudo pacman -Syu --noconfirm + sudo pacman -S --noconfirm libgit2 libssh2 libconfig libssh curl +} + +# Detect the distribution +if [ -f /etc/os-release ]; then + . /etc/os-release + case $ID in + ubuntu | debian) + install_on_debian + ;; + rhel | centos) + install_on_redhat + ;; + fedora) + install_on_fedora + ;; + arch | manjaro) + install_on_arch + ;; + *) + echo "Your distribution ($ID) is not recognized. Please manually install the dependencies." + exit 1 + ;; + esac +else + echo "Cannot identify the Linux distribution. Please manually install the dependencies." + exit 1 +fi + +# Function to download and run the binary package +download_and_run() { + echo "Downloading the binary package from GitHub releases..." + # Replace with the direct link to your binary in GitHub releases + binary_url="https://github.com/username/repository/releases/download/v1.0/your-binary" + curl -L -o your-binary "$binary_url" + + echo "Making the binary executable..." + chmod +x your-binary + + echo "Running the binary..." + ./your-binary +} + +# After installing dependencies, download and run the binary +download_and_run \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..5827af4 --- /dev/null +++ b/main.cpp @@ -0,0 +1,14 @@ +#include "Init.hpp" +#include +#include +#include // For getenv + +int main() { + Init init; + std::string home_dir = getenv("HOME"); + std::string root_dir = home_dir + "/.config/ObsidianGitSync"; + std::string workspace_dir = home_dir + "/Documents/Documents/Obsidian"; + + init.init_for_linux_desktop(root_dir, workspace_dir); + return 0; +} diff --git a/platform.cpp b/platform.cpp new file mode 100644 index 0000000..4a332bd --- /dev/null +++ b/platform.cpp @@ -0,0 +1,18 @@ +#include + +int main() { + #ifdef _WIN32 + std::cout << "Running on Windows" << std::endl; + #elif __APPLE__ + std::cout << "Running on Apple" << std::endl; + #elif __linux__ + #ifdef __ANDROID__ + std::cout << "Running on Android" << std::endl; + #else + std::cout << "Running on Real Linux" << std::endl; + #endif + #else + std::cout << "Unknown platform" << std::endl; + #endif + return 0; +} diff --git a/utils/fs_manipulator.cpp b/utils/fs_manipulator.cpp new file mode 100644 index 0000000..920e9d8 --- /dev/null +++ b/utils/fs_manipulator.cpp @@ -0,0 +1,174 @@ +#include "FsManipulator.hpp" +#include "Logging.hpp" +#include +#include +#include +#include +#include + +Logging logging; + +int FsManipulator::is_dir_present(const std::string dir_path) { + try { + if (std::filesystem::exists(dir_path) && std::filesystem::is_directory(dir_path)) { + logging.log_to_file("Directory '" + dir_path + "' is Present."); + return 0; + } + logging.log_to_file("Directory '" + dir_path + "' is not Present."); + return -1; + } catch (const std::filesystem::filesystem_error& e) { + logging.log_to_file(e.what()); + return -1; + } +} + +int FsManipulator::create_dir(const std::string dir_path) { + try { + if (std::filesystem::create_directories(dir_path)) { + logging.log_to_file("Directory '" + dir_path + "' was Created."); + return 0; + } + logging.log_to_file("Directory '" + dir_path + "' was not Created."); + return -1; + } catch (const std::filesystem::filesystem_error& e) { + logging.log_to_file(e.what()); + return -1; + } +} + +int FsManipulator::delete_dir(const std::string dir_path) { + try { + if (std::filesystem::remove_all(dir_path)) { + logging.log_to_file("Directory '" + dir_path + "' was Deleted."); + return 0; + } + logging.log_to_file("Directory '" + dir_path + "' was not Deleted."); + return -1; + } catch (const std::filesystem::filesystem_error& e) { + logging.log_to_file(e.what()); + return -1; + } +} + +int FsManipulator::is_file_present(const std::string file_path) { + try { + if (std::filesystem::exists(file_path) && std::filesystem::is_regular_file(file_path)) { + logging.log_to_file("File '" + file_path + "' is Present."); + return 0; + } + logging.log_to_file("File '" + file_path + "' is not Present."); + return -1; + } catch (const std::filesystem::filesystem_error& e) { + logging.log_to_file(e.what()); + return -1; + } +} + +int FsManipulator::create_file(const std::string file_path) { + try { + std::ofstream file(file_path); + if (file.is_open()) { + file.close(); + logging.log_to_file("File '" + file_path + "' was Created."); + return 0; + } + logging.log_to_file("File '" + file_path + "' was not Created."); + return -1; + } catch (const std::ios_base::failure& e) { + logging.log_to_file(e.what()); + return -1; + } +} + +int FsManipulator::delete_file(const std::string file_path) { + try { + if (std::filesystem::remove(file_path)) { + logging.log_to_file("File '" + file_path + "' was Deleted."); + return 0; + } + logging.log_to_file("File '" + file_path + "' was not Deleted."); + return -1; + } catch (const std::filesystem::filesystem_error& e) { + logging.log_to_file(e.what()); + return -1; + } +} + +std::string FsManipulator::read_config_var(const std::string file_path, const std::string config_var_name) { + libconfig::Config config; + try { + config.readFile(file_path.c_str()); + const char *out_value; + if (config.lookupValue(config_var_name, out_value)) { + std::string result = out_value; + logging.log_to_file("Config variable '" + config_var_name + "' was Read."); + return result; + } else { + logging.log_to_file("Error: Config variable '" + config_var_name + "' was Not found."); + return "VAR_NOT_FOUND"; + } + } catch (const libconfig::FileIOException &fioex) { + logging.log_to_file("Error: I/O error while reading file '" + file_path + "' for config variable '" + config_var_name + "'."); + return "ERROR"; + } catch (const libconfig::ParseException &pex) { + int getLine = pex.getLine(); + std::string getError = pex.getError(); + logging.log_to_file("Error: Parse error at " + file_path + ":" + std::to_string(getLine) + " - " + getError); + return "ERROR"; + } +} + +std::string FsManipulator::add_config_var(const std::string file_path, const std::string config_var_name, const std::string input_value) { + libconfig::Config config; + try { + config.readFile(file_path.c_str()); + config.getRoot().add(config_var_name.c_str(), libconfig::Setting::TypeString) = input_value.c_str(); + config.writeFile(file_path.c_str()); + logging.log_to_file("Config variable '" + config_var_name + "' was Added."); + return "SUCCESS"; + } catch (const libconfig::SettingException &sex) { + std::string what = sex.what(); + logging.log_to_file("Error: Setting error: '" + what + "'."); + return "ERROR"; + } catch (...) { + logging.log_to_file("Error: An error occurred while adding the config var '" + config_var_name + "'."); + return "ERROR"; + } +} + +std::string FsManipulator::update_config_var(const std::string file_path, const std::string config_var_name, const std::string input_value) { + libconfig::Config config; + try { + config.readFile(file_path.c_str()); + libconfig::Setting &setting = config.lookup(config_var_name); + setting = input_value.c_str(); + config.writeFile(file_path.c_str()); + logging.log_to_file("Config variable '" + config_var_name + "' was updated."); + return "SUCCESS"; + } catch (const libconfig::SettingNotFoundException &snfex) { + logging.log_to_file("Error: No such config var '" + config_var_name + "'."); + return "ERROR"; + } catch (...) { + logging.log_to_file("Error: An error occurred while updating the config var '" + config_var_name + "'."); + return "ERROR"; + } +} + +std::string FsManipulator::delete_config_var(const std::string file_path, const std::string config_var_name) { + libconfig::Config config; + try { + libconfig::Setting &root = config.getRoot(); + if(root.exists(config_var_name.c_str())) { + root.remove(config_var_name.c_str()); + config.writeFile(file_path.c_str()); + logging.log_to_file("Config variable '" + config_var_name + "' was deleted."); + return "SUCCESS"; + } else { + logging.log_to_file("Error: No such config var '" + config_var_name + "'."); + return "VAR_NOT_FOUND"; + } + } catch (...) { + logging.log_to_file("Error: An error occurred while deleting the config var '" + config_var_name + "'."); + return "ERROR"; + } +} diff --git a/utils/git_operations.cpp b/utils/git_operations.cpp new file mode 100644 index 0000000..e6b64f9 --- /dev/null +++ b/utils/git_operations.cpp @@ -0,0 +1,488 @@ +#include "GitOperations.hpp" +#include "FsManipulator.hpp" +#include "Logging.hpp" +#include +#include +#include + +namespace fs = std::filesystem; + +int cred_acquire_cb(git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload) { + FsManipulator fs; + + std::string* config_path_ptr = reinterpret_cast(payload); + std::string config_path = *config_path_ptr; + + std::string ssh_dir = fs.read_config_var(config_path, "SSH_DIR"); + std::string ssh_key_name = fs.read_config_var(config_path, "SSH_KEY_NAME"); + + std::string ssh_pub_key_path = ssh_dir + "/" + ssh_key_name + ".pub"; + std::string ssh_priv_key_path = ssh_dir + "/" + ssh_key_name; + + return git_cred_ssh_key_new(cred, username_from_url, ssh_pub_key_path.c_str(), ssh_priv_key_path.c_str(), ""); +} + +int GitOperations::is_repo_present(const std::string config_path) { + git_libgit2_init(); + FsManipulator fs; + Logging log; + std::string repo_dir = fs.read_config_var(config_path, "WORKSPACE_DIR") + "/" + fs.read_config_var(config_path, "MAIN_REPOSITORY"); + if (fs.is_dir_present(repo_dir) != 0) { + log.log_to_file("Error: Repository directory not found"); + git_libgit2_shutdown(); + return -1; + } + git_repository *repo = nullptr; + if (git_repository_open(&repo, repo_dir.c_str()) != 0) { + log.log_to_file("Error: Failed to open repository"); + git_libgit2_shutdown(); + return -1; + } + git_repository_free(repo); + log.log_to_file("Repository is present and valid"); + git_libgit2_shutdown(); + return 0; +} + +int GitOperations::clone_repo(const std::string config_path) { + git_libgit2_init(); + FsManipulator fs; + Logging log; + git_clone_options clone_opts = GIT_CLONE_OPTIONS_INIT; + git_repository *repo = nullptr; + + clone_opts.fetch_opts.callbacks.credentials = cred_acquire_cb; + clone_opts.fetch_opts.callbacks.payload = (void*)&config_path; + + std::string url = "ssh://git@" + fs.read_config_var(config_path, "GIT_HOST") + "/" + fs.read_config_var(config_path, "GIT_USERNAME") + "/" + fs.read_config_var(config_path, "MAIN_REPOSITORY") + ".git"; + std::string path = fs.read_config_var(config_path, "WORKSPACE_DIR") + "/" + fs.read_config_var(config_path, "MAIN_REPOSITORY"); + + int error = git_clone(&repo, url.c_str(), path.c_str(), &clone_opts); + if (error != 0) { + const git_error *err = giterr_last(); + std::string message = err->message; + log.log_to_file("Error: Failed to clone repository with message: '" + message + "'."); + git_libgit2_shutdown(); + return -1; + } + git_repository_free(repo); + log.log_to_file("Repository cloned successfully"); + + git_libgit2_shutdown(); + return 0; +} + +git_repository* GitOperations::open_repo(const std::string config_path) { + git_libgit2_init(); + // Changed return type to git_repository* + FsManipulator fs; + Logging log; + std::string repo_dir = fs.read_config_var(config_path, "WORKSPACE_DIR") + "/" + fs.read_config_var(config_path, "MAIN_REPOSITORY"); + git_repository *repo = nullptr; + if (git_repository_open(&repo, repo_dir.c_str()) != 0) { + log.log_to_file("Error: Failed to open repository"); + git_libgit2_shutdown(); + return nullptr; // Changed to return nullptr on error + } + log.log_to_file("Repository opened successfully"); + git_libgit2_shutdown(); + return repo; +} + +int GitOperations::are_unindexed_changes_present(git_repository *repo) { + git_libgit2_init(); + Logging log; + git_status_options status_opts = GIT_STATUS_OPTIONS_INIT; + status_opts.show = GIT_STATUS_SHOW_WORKDIR_ONLY; // Show working directory only status + status_opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; // Include untracked and renamed files + + git_status_list *status; + if (git_status_list_new(&status, repo, &status_opts) != 0) { + log.log_to_file("Error: Failed to retrieve status"); + git_libgit2_shutdown(); + return -1; + } + size_t status_count = git_status_list_entrycount(status); + git_status_list_free(status); + if (status_count == 0) { + log.log_to_file("No Unindexed changes detected"); + git_libgit2_shutdown(); + return 1; + } + log.log_to_file("Unindexed Changes detected"); + git_libgit2_shutdown(); + return 0; +} + +int GitOperations::add_to_index(git_repository *repo) { + git_libgit2_init(); + Logging log; + git_index *index = nullptr; + if (git_repository_index(&index, repo) != 0) { + log.log_to_file("Error: Failed to get repository index"); + git_libgit2_shutdown(); + return -1; + } + if (git_index_add_all(index, nullptr, 0, nullptr, nullptr) != 0) { + log.log_to_file("Error: Failed to add changes to index"); + git_index_free(index); + git_libgit2_shutdown(); + return -1; + } + if (git_index_write(index) != 0) { + log.log_to_file("Error: Failed to write index"); + git_index_free(index); + git_libgit2_shutdown(); + return -1; + } + git_index_free(index); + log.log_to_file("Successfully added changes to index"); + git_libgit2_shutdown(); + return 0; +} + +int GitOperations::are_uncommitted_changes_present(git_repository *repo) { + git_libgit2_init(); + Logging log; + git_status_options status_opts = GIT_STATUS_OPTIONS_INIT; + status_opts.show = GIT_STATUS_SHOW_INDEX_ONLY; // Show index only status + status_opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX; // Include untracked and renamed files + + git_status_list *status; + if (git_status_list_new(&status, repo, &status_opts) != 0) { + log.log_to_file("Error: Failed to retrieve status"); + git_libgit2_shutdown(); + return -1; + } + size_t status_count = git_status_list_entrycount(status); + git_status_list_free(status); + if (status_count == 0) { + log.log_to_file("No uncommitted changes detected"); + git_libgit2_shutdown(); + return 1; + } + log.log_to_file("Uncommitted changes detected"); + git_libgit2_shutdown(); + return 0; +} + +int GitOperations::create_commit(const std::string config_path, git_repository *repo) { + git_libgit2_init(); + FsManipulator fs; + Logging log; + git_signature *sig = nullptr; + git_index *index = nullptr; + git_oid tree_id, commit_id; + git_tree *tree = nullptr; + + if (git_signature_now(&sig, fs.read_config_var(config_path, "GIT_USERNAME").c_str(), fs.read_config_var(config_path, "COMMITS_EMAIL").c_str()) != 0) { + log.log_to_file("Error: Failed to create signature"); + git_libgit2_shutdown(); + return -1; + } + if (git_repository_index(&index, repo) != 0 || git_index_write_tree(&tree_id, index) != 0 || git_tree_lookup(&tree, repo, &tree_id) != 0) { + log.log_to_file("Error: Index or tree operation failed"); + git_signature_free(sig); + git_index_free(index); + git_libgit2_shutdown(); + return -1; + } + git_oid parent_id; + git_reference_name_to_id(&parent_id, repo, "HEAD"); + git_commit *parent = nullptr; + git_commit_lookup(&parent, repo, &parent_id); + if (git_commit_create_v(&commit_id, repo, "HEAD", sig, sig, NULL, "Commit made via ObsidianGitSync", tree, 1, parent) != 0) { + log.log_to_file("Error: Failed to create commit"); + git_signature_free(sig); + git_index_free(index); + git_tree_free(tree); + git_libgit2_shutdown(); + return -1; + } + git_signature_free(sig); + git_index_free(index); + git_tree_free(tree); + log.log_to_file("Commit created successfully"); + git_libgit2_shutdown(); + return 0; +} + +int GitOperations::are_unpushed_commits_present(git_repository *repo) { + git_libgit2_init(); + Logging log; + int error = 0; + + git_oid local_oid, remote_oid; + git_reference *head_ref = nullptr, *remote_ref = nullptr; + const char *branch_name = nullptr; + char remote_branch_ref_name[1024]; + + // Get the current HEAD + error = git_repository_head(&head_ref, repo); + if (error != 0) { + log.log_to_file("Error: Failed to get HEAD reference"); + git_libgit2_shutdown(); + return -1; + } + + // Get the branch name from HEAD + branch_name = git_reference_shorthand(head_ref); + if (!branch_name) { + log.log_to_file("Error: Failed to get branch name from HEAD reference"); + git_reference_free(head_ref); + git_libgit2_shutdown(); + return -1; + } + + // Construct the reference name of the remote tracking branch + snprintf(remote_branch_ref_name, sizeof(remote_branch_ref_name), "refs/remotes/origin/%s", branch_name); + + // Look up the remote tracking branch + error = git_reference_lookup(&remote_ref, repo, remote_branch_ref_name); + if (error != 0) { + log.log_to_file("Error: Failed to find remote tracking branch"); + git_reference_free(head_ref); + git_libgit2_shutdown(); + return -1; + } + + // Get the OIDs for local and remote + const git_oid *local_oid_ptr = git_reference_target(head_ref); + const git_oid *remote_oid_ptr = git_reference_target(remote_ref); + if (!local_oid_ptr || !remote_oid_ptr) { + log.log_to_file("Error: Failed to get OIDs for local or remote branch"); + git_reference_free(head_ref); + git_reference_free(remote_ref); + git_libgit2_shutdown(); + return -1; + } + git_oid_cpy(&local_oid, local_oid_ptr); + git_oid_cpy(&remote_oid, remote_oid_ptr); + + git_reference_free(head_ref); + git_reference_free(remote_ref); + + // Compare OIDs + if (git_oid_cmp(&local_oid, &remote_oid) != 0) { + log.log_to_file("Unpushed commits detected"); + git_libgit2_shutdown(); + return 0; + } + + log.log_to_file("No unpushed commits detected"); + git_libgit2_shutdown(); + return 1; +} + +int GitOperations::fetch_remote(const std::string config_path, git_repository *repo) { + git_libgit2_init(); + Logging log; + git_remote *remote = nullptr; + int error = git_remote_lookup(&remote, repo, "origin"); + + if (error != 0) { + const git_error *last_error = giterr_last(); + log.log_to_file("Error: Failed to lookup remote - " + std::string(last_error->message)); + git_libgit2_shutdown(); + return -1; + } + + git_fetch_options fetch_opts = GIT_FETCH_OPTIONS_INIT; + fetch_opts.callbacks.credentials = cred_acquire_cb; + fetch_opts.callbacks.payload = (void*)&config_path; + + error = git_remote_fetch(remote, nullptr, &fetch_opts, "Fetch completed"); + + if (error != 0) { + const git_error *last_error = giterr_last(); + log.log_to_file("Error: Failed to fetch from remote - " + std::string(last_error->message)); + git_remote_free(remote); + git_libgit2_shutdown(); + return -1; + } + + log.log_to_file("Fetched from remote successfully"); + git_remote_free(remote); + git_libgit2_shutdown(); + return 0; +} + +int GitOperations::backup_user_notes(const std::string repo_dir, const std::string backup_dir) { + FsManipulator fs; + Logging log; + + // Check if repo_dir and backup_dir exist + if (fs.is_dir_present(repo_dir) != 0 && fs.is_dir_present(backup_dir) != 0) { + log.log_to_file("Error: Repository directory or Backup directory not found."); + return -1; + } + + // Create backup directory if it doesn't exist + if (fs.is_dir_present(backup_dir) != 0 && fs.create_dir(backup_dir) != 0) { + log.log_to_file("Error: Failed to create backup directory."); + return -1; + } + + // Backup the contents + try { + // Iterate through the files and directories in repo_dir + for (const auto& entry : fs::recursive_directory_iterator(repo_dir)) { + const auto& path = entry.path(); + auto relative_path = fs::relative(path, repo_dir); + if (relative_path == ".git" || relative_path.string().rfind(".git/", 0) == 0) { + // Skip the .git directory and its contents + continue; + } + + fs::path target_path = backup_dir / relative_path; + if (entry.is_directory()) { + fs::create_directory(target_path); + } else if (entry.is_regular_file()) { + fs::copy(path, target_path, fs::copy_options::overwrite_existing); + } + } + } catch (const std::exception& e) { + log.log_to_file("Error: Failed to backup user notes. Exception: " + std::string(e.what())); + return -1; + } + + log.log_to_file("User notes backed up successfully."); + return 0; +} + +int GitOperations::recover_user_notes(const std::string repo_dir, const std::string backup_dir) { + FsManipulator fs; + Logging log; + + // Check if backup_dir exists + if (fs.is_dir_present(backup_dir) != 0) { + log.log_to_file("Error: Backup directory not found for recovery."); + return -1; + } + + try { + // Clear repo_dir except for the .git directory + for (const auto& entry : fs::directory_iterator(repo_dir)) { + if (entry.path().filename() == ".git") { + // Skip the .git directory + continue; + } + + if (entry.is_directory()) { + fs::remove_all(entry.path()); + } else { + fs::remove(entry.path()); + } + } + + // Recover the contents from backup_dir + for (const auto& entry : fs::recursive_directory_iterator(backup_dir)) { + fs::path target_path = repo_dir / fs::relative(entry.path(), backup_dir); + if (entry.is_directory()) { + fs::create_directory(target_path); + } else if (entry.is_regular_file()) { + fs::copy(entry.path(), target_path, fs::copy_options::overwrite_existing); + } + } + } catch (const std::exception& e) { + log.log_to_file("Error: Failed to recover user notes. Exception: " + std::string(e.what())); + return -1; + } + + // Delete backup directory + if (fs.delete_dir(backup_dir) != 0) { + log.log_to_file("Warning: Failed to delete backup directory after recovery."); + // Not returning -1 here as the primary operation of recovery is successful + } + + log.log_to_file("User notes recovered successfully."); + return 0; +} + +int GitOperations::handle_non_fast_forward_error(const std::string config_path) { + git_libgit2_init(); + Logging log; + FsManipulator fs; + + std::string repo_dir = fs.read_config_var(config_path, "WORKSPACE_DIR") + "/" + fs.read_config_var(config_path, "MAIN_REPOSITORY"); + std::string backup_dir = fs.read_config_var(config_path, "BACKUP_DIR"); + + // Backup everything except .git dir in the repo_dir to backup_dir + if(backup_user_notes(repo_dir, backup_dir) != 0) { + log.log_to_file("Error: Failed to backup user notes before dealing with non-fast-forward error."); + } + + // Clear the contents of the local repository directory + try { + for (const auto& entry : fs::directory_iterator(repo_dir)) { + if (entry.is_directory()) { + fs::remove_all(entry.path()); + } else { + fs::remove(entry.path()); + } + } + } catch (const std::exception& e) { + log.log_to_file("Error: Failed to clear the local repository directory. Exception: " + std::string(e.what())); + git_libgit2_shutdown(); + return -1; + } + + // Clone the repository again + if (clone_repo(config_path) != 0) { + log.log_to_file("Error: Failed to clone the repository after starting the handling of non-fast-forward error."); + git_libgit2_shutdown(); + return -1; + } + + // Replace the contents of repo_dir except .git dir with the contents of backup_dir and delete backup_dir if success. + if(recover_user_notes(repo_dir, backup_dir) != 0) { + log.log_to_file("Error: Failed to Recover user notes After dealing with non-fast-forward error."); + } + + git_libgit2_shutdown(); + return 0; +} + +int GitOperations::push_to_remote(const std::string config_path, git_repository *repo) { + git_libgit2_init(); + Logging log; + git_remote *remote = nullptr; + int error = git_remote_lookup(&remote, repo, "origin"); + + if (error != 0) { + const git_error *last_error = giterr_last(); + log.log_to_file("Error: Failed to lookup remote - " + std::string(last_error->message)); + git_libgit2_shutdown(); + return -1; + } + git_push_options push_opts = GIT_PUSH_OPTIONS_INIT; + push_opts.callbacks.credentials = cred_acquire_cb; + push_opts.callbacks.payload = (void*)&config_path; + + git_strarray refspecs = {NULL, 0}; + refspecs.strings = (char **)malloc(sizeof(char*)); + refspecs.strings[0] = const_cast("refs/heads/main:refs/heads/main"); + refspecs.count = 1; + error = git_remote_push(remote, &refspecs, &push_opts); + if (error != 0) { + const git_error *last_error = giterr_last(); + log.log_to_file("Error: Failed to push to remote - '" + std::string(last_error->message) + "', handling it..."); + // if(auto_fetch_and_merge_with_conflict_markers(config_path) != 0) { + // log.log_to_file("Error: Segementation fault tracking, line 575"); + // log.log_to_file("Error: Failed to Auto fetch and merge the remote to local."); + // git_libgit2_shutdown(); + // return -1; + // } + if(handle_non_fast_forward_error(config_path) == 0) { + log.log_to_file("Successfully maneuvered the non-fast-forward error above."); + return 3; + } + git_remote_free(remote); + git_libgit2_shutdown(); + return -1; + } + git_remote_free(remote); + log.log_to_file("Pushed to remote successfully"); + git_libgit2_shutdown(); + return 0; +} \ No newline at end of file diff --git a/utils/init.cpp b/utils/init.cpp new file mode 100644 index 0000000..e093101 --- /dev/null +++ b/utils/init.cpp @@ -0,0 +1,135 @@ +#include "Init.hpp" +#include "FsManipulator.hpp" +#include "LoadEnv.hpp" +#include "Logging.hpp" +#include "SshWorker.hpp" +#include "GitOperations.hpp" +#include "NetworkChecker.hpp" +#include +#include +#include +#include +#include +#include + + +std::string Init::init_for_linux_desktop(const std::string root_dir, const std::string workspace_dir) { + std::string config_file_path = root_dir + "/config.txt"; + GitOperations gitOperations; + FsManipulator fsManipulator; + NetworkChecker networkChecker; + SshWorker sshWorker; + LoadEnv loadEnv; + Logging logging; + + logging.log_to_file("\n\n\n------------STARTED THE PROGRAM FROM THE COMMAND LINE--------------\n"); + + // Check for root directory and create if not present + if (fsManipulator.is_dir_present(root_dir) != 0) { + int dir_creation_result = fsManipulator.create_dir(root_dir); + if (dir_creation_result != 0) { + logging.log_to_file("Error: Error creating root directory: '" + root_dir + "'."); + return "Error"; + } + } + + // Check for config file and create if not present + if (fsManipulator.is_file_present(config_file_path) != 0) { + int file_creation_result = fsManipulator.create_file(config_file_path); + if (file_creation_result != 0) { + logging.log_to_file("Error: Error creating config file: '" + config_file_path + "'."); + return "Error"; + } + } + + // Load environment variables from config file + nlohmann::json json_data = nlohmann::json::array({ + {{"name", "GIT_HOST"}, {"default", "github.com"}}, + {{"name", "GIT_USERNAME"}, {"default", "username"}}, + {{"name", "MAIN_REPOSITORY"}, {"default", "ObsidianGitVault"}}, + {{"name", "SSH_KEY_NAME"}, {"default", "ObsidianGitSync"}} + }); + std::string load_env_result = loadEnv.load_env_variables(config_file_path, json_data, false); + + if (load_env_result != "Success!") { + logging.log_to_file("Error: Initialization failed: '" + load_env_result + "'."); + return "Failed!"; // Return an error code + } + + std::string git_host = fsManipulator.read_config_var(config_file_path, "GIT_HOST"); + std::string git_username = fsManipulator.read_config_var(config_file_path, "GIT_USERNAME"); + std::string git_repo_name = fsManipulator.read_config_var(config_file_path, "MAIN_REPOSITORY"); + + std::string programEmail = "264351479+" + git_username + "+ObsidianGitSync@users.noreply." + git_host; + std::string backup_dir = workspace_dir + "/." + git_repo_name; + + if(fsManipulator.read_config_var(config_file_path, "ROOT_DIR") != root_dir){ + if(fsManipulator.read_config_var(config_file_path, "ROOT_DIR") == "VAR_NOT_FOUND"){ + fsManipulator.add_config_var(config_file_path, "ROOT_DIR", root_dir); + } else { + fsManipulator.update_config_var(config_file_path, "ROOT_DIR", root_dir); + } + } + if(fsManipulator.read_config_var(config_file_path, "WORKSPACE_DIR") != workspace_dir){ + if(fsManipulator.read_config_var(config_file_path, "WORKSPACE_DIR") == "VAR_NOT_FOUND"){ + fsManipulator.add_config_var(config_file_path, "WORKSPACE_DIR", workspace_dir); + } else { + fsManipulator.update_config_var(config_file_path, "WORKSPACE_DIR", workspace_dir); + } + } + if(fsManipulator.read_config_var(config_file_path, "BACKUP_DIR") != backup_dir){ + if(fsManipulator.read_config_var(config_file_path, "BACKUP_DIR") == "VAR_NOT_FOUND"){ + fsManipulator.add_config_var(config_file_path, "BACKUP_DIR", backup_dir); + } else { + fsManipulator.update_config_var(config_file_path, "BACKUP_DIR", backup_dir); + } + } + if(fsManipulator.read_config_var(config_file_path, "SSH_DIR") != root_dir + "/.ssh"){ + if(fsManipulator.read_config_var(config_file_path, "SSH_DIR") == "VAR_NOT_FOUND"){ + fsManipulator.add_config_var(config_file_path, "SSH_DIR", root_dir + "/.ssh"); + } else { + fsManipulator.update_config_var(config_file_path, "SSH_DIR", root_dir + "/.ssh"); + } + } + if(fsManipulator.read_config_var(config_file_path, "COMMITS_EMAIL") != programEmail){ + if(fsManipulator.read_config_var(config_file_path, "COMMITS_EMAIL") == "VAR_NOT_FOUND"){ + fsManipulator.add_config_var(config_file_path, "COMMITS_EMAIL", programEmail); + } else { + fsManipulator.update_config_var(config_file_path, "COMMITS_EMAIL", programEmail); + } + } + + if(sshWorker.is_ssh_setup(config_file_path) != 0) { + sshWorker.setup_new_ssh_keypair(config_file_path); + } + + if(gitOperations.is_repo_present(config_file_path) != 0) { + gitOperations.clone_repo(config_file_path); + } + + git_repository *repo = gitOperations.open_repo(config_file_path); + while (repo != nullptr) { // This will run indefinitely + logging.log_to_file("\n\n------------------Infinite Scanning Cycle Start---------------\n"); + if(networkChecker.checkConnectivity() == 0) { + if(gitOperations.are_unindexed_changes_present(repo) == 0) { + if (gitOperations.are_unindexed_changes_present(repo) == 0) { + gitOperations.add_to_index(repo); + } + } + + if(gitOperations.are_uncommitted_changes_present(repo) == 0) { + gitOperations.create_commit(config_file_path, repo); + } + + if(gitOperations.are_unpushed_commits_present(repo) == 0) { + gitOperations.push_to_remote(config_file_path, repo); + } + + } + + std::this_thread::sleep_for(std::chrono::seconds(60)); // Sleep for 60 seconds + logging.log_to_file("\n\n------------------Infinite Scanning Cycle End---------------\n"); + } + + return "Success!"; +} diff --git a/utils/load_env.cpp b/utils/load_env.cpp new file mode 100644 index 0000000..21e52bd --- /dev/null +++ b/utils/load_env.cpp @@ -0,0 +1,23 @@ +#include "LoadEnv.hpp" +#include "Prompting.hpp" +#include +#include +#include +#include + +std::string LoadEnv::load_env_variables(const std::string file_path, const nlohmann::json json_data, const bool update_var) { + Prompting prompting; + std::string result; + for (const auto& var_obj : json_data) { + std::string var_name = var_obj["name"]; + std::string default_value = var_obj["default"]; + std::string value = prompting.is_prompt_required(file_path, var_name, default_value, update_var); + } + return "Success!"; +} + +std::string LoadEnv::get_env_var(const std::string file_path, const std::string var_name, const bool update_var) { + Prompting prompting; + std::string value = prompting.is_prompt_required(file_path, var_name, "", update_var); + return value; +} diff --git a/utils/logging.cpp b/utils/logging.cpp new file mode 100644 index 0000000..247d45c --- /dev/null +++ b/utils/logging.cpp @@ -0,0 +1,99 @@ +#include "Logging.hpp" +#include +#include +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; + +int is_dir_present(const std::string dir_path) { + try { + if (fs::exists(dir_path) && fs::is_directory(dir_path)) { + return 0; + } + return -1; + } catch (const fs::filesystem_error& e) { + std::cerr << e.what() << std::endl; + return -1; + } +} + +int is_file_present(const std::string file_path) { + try { + if (fs::exists(file_path) && fs::is_regular_file(file_path)) { + return 0; + } + return -1; + } catch (const fs::filesystem_error& e) { + std::cerr << e.what() << std::endl; + return -1; + } +} + +int Logging::log_to_file(const std::string new_data) { + std::string temp_log_path = fs::path(std::string(std::getenv("HOME")) + "/.tempOGRlog.txt"); + std::string ideal_log_dir = fs::path(std::string(std::getenv("HOME")) + "/.config/ObsidianGitSync"); + std::string ideal_log_path = ideal_log_dir + "/logfile.txt"; + + auto now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + std::stringstream ss; + ss << std::put_time(std::localtime(&now), "%Y-%m-%d %H:%M:%S") << " -:- " << new_data; + std::string timestamped_data = ss.str(); + + if (is_file_present(ideal_log_path) == 0) { + std::ofstream log_file(ideal_log_path, std::ios::app); + log_file << timestamped_data << std::endl; + log_file.close(); + } else { + if (is_dir_present(ideal_log_dir) == 0) { + if (is_file_present(temp_log_path) == 0) { + fs::rename(temp_log_path, ideal_log_path); + std::ofstream log_file(ideal_log_path, std::ios::app); + log_file << timestamped_data << std::endl; + log_file.close(); + } else { + std::ofstream log_file(ideal_log_path); + log_file << timestamped_data << std::endl; + log_file.close(); + } + } else { + if (is_file_present(temp_log_path) == 0) { + std::ofstream log_file(temp_log_path, std::ios::app); + log_file << timestamped_data << std::endl; + log_file.close(); + } else { + std::ofstream log_file(temp_log_path); + log_file << timestamped_data << std::endl; + log_file.close(); + } + } + } + + // Use the ideal log path only when present + std::string log_path = temp_log_path; + if (is_file_present(ideal_log_path) == 0) { + log_path = ideal_log_path; + } + + // Ensure log file size does not exceed 10MB. + if (fs::file_size(log_path) > 10 * 1024 * 1024) { + std::vector lines; + std::string line; + std::ifstream log_file(log_path); + while (std::getline(log_file, line)) { + lines.push_back(line); + } + log_file.close(); + lines.erase(lines.begin(), lines.begin() + (lines.size() / 10)); // Remove first half of the log entries. + std::ofstream log_file_out(log_path); + for (const auto& log_line : lines) { + log_file_out << log_line << std::endl; + } + log_file_out.close(); + } + + return 0; +} diff --git a/utils/network_checker.cpp b/utils/network_checker.cpp new file mode 100644 index 0000000..fcf953a --- /dev/null +++ b/utils/network_checker.cpp @@ -0,0 +1,30 @@ +#include "NetworkChecker.hpp" +#include "Logging.hpp" +#include + +int NetworkChecker::checkConnectivity() { + CURL *curl; + CURLcode res; + Logging logging; + + curl_global_init(CURL_GLOBAL_DEFAULT); + curl = curl_easy_init(); + if(curl) { + curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.com"); + curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); // HEAD request, no body + res = curl_easy_perform(curl); + if(res == CURLE_OK) { + curl_easy_cleanup(curl); + curl_global_cleanup(); + logging.log_to_file("Network connection is Up, Continuing..."); + return 0; + } + curl_easy_cleanup(curl); + curl_global_cleanup(); + logging.log_to_file("Error: Network connection is Down, Aborting push to remote for now."); + return -1; + } + curl_global_cleanup(); + logging.log_to_file("Error: Failed to initialize curl."); + return -1; // Return -1 if curl initialization failed +} diff --git a/utils/prompting.cpp b/utils/prompting.cpp new file mode 100644 index 0000000..36053cc --- /dev/null +++ b/utils/prompting.cpp @@ -0,0 +1,69 @@ +// Prompting.cpp +#include "Prompting.hpp" +#include "FsManipulator.hpp" +#include +#include +#include // For std::numeric_limits + +std::string Prompting::prompt_user_for_var(const std::string file_path, const std::string var_name, const std::string default_value) { + FsManipulator fs; + std::string current_value = fs.read_config_var(file_path, var_name); + + std::cout << "Enter value for " << var_name; + if (!default_value.empty()) { + std::cout << " (default: " << default_value << ")"; + } + std::cout << ": "; + + std::string user_input; + std::getline(std::cin, user_input); + if (user_input.empty() && !default_value.empty()) { + user_input = default_value; + } + while (user_input.empty()) { + std::cout << var_name << " is required. Please enter value for " << var_name << ": "; + std::getline(std::cin, user_input); + } + + if(current_value == "VAR_NOT_FOUND") { + fs.add_config_var(file_path, var_name, user_input); + } + + fs.update_config_var(file_path, var_name, user_input); + return user_input; +} + +std::string Prompting::is_prompt_required(const std::string file_path, const std::string var_name, const std::string default_value, const bool update_var) { + FsManipulator fs; + std::string current_value = fs.read_config_var(file_path, var_name); + // std::cout << current_value << "\n"; + if (current_value == "VAR_NOT_FOUND" || current_value == "ERROR" || current_value.empty()) { + return prompt_user_for_var(file_path, var_name, default_value); + } else if(!update_var){ + return current_value; + } else { + std::cout << "Current value of " << var_name << " is " << current_value << "." << std::endl; + std::string input; + int choice = 2; // Default choice is 2 + std::cout << "Would you like to change it? (1 - Change, 2 - Don't change): "; + std::getline(std::cin, input); // Read a line of input + + // If input is not empty, try to convert it to an integer + if (!input.empty()) { + try { + choice = std::stoi(input); // Convert string to int + } catch (const std::invalid_argument&) { + std::cout << "Invalid input. Assuming choice 2." << std::endl; + choice = 2; + } + } + + // Now process the choice + if (choice == 1) { + return prompt_user_for_var(file_path, var_name, default_value); + } else { + return current_value; + } + } + return current_value; +} diff --git a/utils/ssh_worker.cpp b/utils/ssh_worker.cpp new file mode 100644 index 0000000..3cbce13 --- /dev/null +++ b/utils/ssh_worker.cpp @@ -0,0 +1,97 @@ +#include "SshWorker.hpp" +#include "FsManipulator.hpp" +#include "Logging.hpp" +#include +#include + +void change_email_in_key(const std::string& pub_key_path, const std::string& email) { + Logging logging; + + std::ifstream pub_key_file(pub_key_path); + if (!pub_key_file) { + logging.log_to_file("Error: Failed to open public key file for reading."); + return; + } + + std::string pub_key_content((std::istreambuf_iterator(pub_key_file)), std::istreambuf_iterator()); + size_t pos = pub_key_content.rfind(' '); + if (pos != std::string::npos) { + pub_key_content.replace(pos + 1, std::string::npos, email); + } else { + logging.log_to_file("Error: Space not found in public key file."); + return; + } + + std::ofstream pub_key_out(pub_key_path); + if (!pub_key_out) { + logging.log_to_file("Error: Failed to open public key file for writing."); + return; + } + pub_key_out << pub_key_content; + logging.log_to_file("Changed email in public key file to '" + email + "'."); +} + +int SshWorker::is_ssh_setup(const std::string config_path) { + Logging logging; + FsManipulator fsManipulator; + + std::string ssh_key_name = fsManipulator.read_config_var(config_path, "SSH_KEY_NAME"); + std::string ssh_dir = fsManipulator.read_config_var(config_path, "SSH_DIR"); + std::string commits_email = fsManipulator.read_config_var(config_path, "COMMITS_EMAIL"); + + std::string private_key_path = ssh_dir + "/" + ssh_key_name; + std::string public_key_path = private_key_path + ".pub"; + + if (fsManipulator.is_file_present(private_key_path) != 0 || fsManipulator.is_file_present(public_key_path) != 0) { + fsManipulator.create_dir(ssh_dir); + logging.log_to_file("Error: SSH key files do not exist."); + return -1; + } + + // Verifying the key type for both private and public keys + ssh_key private_key, public_key; + if (ssh_pki_import_privkey_file(private_key_path.c_str(), nullptr, nullptr, nullptr, &private_key) != SSH_OK || + ssh_pki_import_pubkey_file(public_key_path.c_str(), &public_key) != SSH_OK) { + logging.log_to_file("Error: Failed to import SSH keys."); + return -2; + } + + int key_type = ssh_key_type(private_key); + if (key_type != SSH_KEYTYPE_ED25519) { + logging.log_to_file("Error: SSH key type is not ED25519."); + ssh_key_free(private_key); + ssh_key_free(public_key); + return -3; + } + + ssh_key_free(private_key); + ssh_key_free(public_key); + logging.log_to_file("SSH keys are set up and verified."); + return 0; +} + +std::string SshWorker::setup_new_ssh_keypair(const std::string config_path) { + Logging logging; + FsManipulator fsManipulator; + + std::string ssh_key_name = fsManipulator.read_config_var(config_path, "SSH_KEY_NAME"); + std::string ssh_dir = fsManipulator.read_config_var(config_path, "SSH_DIR"); + std::string commits_email = fsManipulator.read_config_var(config_path, "COMMITS_EMAIL"); + + std::string private_key_path = ssh_dir + "/" + ssh_key_name; + std::string public_key_path = private_key_path + ".pub"; + + ssh_key key; + if (ssh_pki_generate(SSH_KEYTYPE_ED25519, 0, &key) != SSH_OK || + ssh_pki_export_privkey_file(key, nullptr, nullptr, nullptr, private_key_path.c_str()) != SSH_OK || + ssh_pki_export_pubkey_file(key, public_key_path.c_str()) != SSH_OK) { + logging.log_to_file("Error: Generating or exporting SSH key pair failed."); + ssh_key_free(key); + return "Error"; + } + + change_email_in_key(public_key_path, commits_email); + ssh_key_free(key); + logging.log_to_file("New SSH key pair has been set up."); + return "Success!"; +}