diff --git a/bb64.cpp b/bb64.cpp index 7abd5bd..74b78cb 100644 --- a/bb64.cpp +++ b/bb64.cpp @@ -4,14 +4,16 @@ #include #include #include - +#include #include "version.h" #include "b64ed.hpp" // Recursively decode and print if nested bb64 command is found void recursive_print(const std::string &decoded) { + std::cout << std::string(80, '-') << std::endl; std::cout << decoded << std::endl; + std::cout << std::string(80, '-') << std::endl; size_t pos = decoded.find("bb64 "); if (pos != std::string::npos) @@ -34,6 +36,33 @@ constexpr unsigned int hash(const char *s, int off = 0) return !s[off] ? 5381 : (hash(s, off + 1) * 33) ^ s[off]; } +int update_bb64() +{ + std::cout << "Updating bb64..." << std::endl; + + // determine path to this executable + std::filesystem::path bb64_path = std::filesystem::canonical("/proc/self/exe"); + std::cout << "bb64 path: " << bb64_path << std::endl; + + return 0; +} + +int decode_and_run(const std::string &encoded) +{ + // Default: decode and run + std::string decoded = base64_decode(encoded); + if (decoded.empty()) + { + std::cerr << "Failed to decode base64 command." << std::endl; + return -1; + } + // Replace current process with bash -c "decoded" + execlp("bash", "bash", "-c", decoded.c_str(), (char *)nullptr); + // If execlp returns, there was an error + std::cerr << "Failed to execute command." << std::endl; + return -1; +} + int main(int argc, char *argv[]) { if (argc < 2) @@ -46,34 +75,30 @@ Usage: bb64 BASE64COMMAND Decodes and runs the command bb64 -[i|d] BASE64COMMAND Displays the decoded command bb64 -e COMMAND Encodes the command and prints the result + bb64 -u Updates bb64 to the latest version (may require sudo) )" << std::endl; return -1; } + std::string mode = argv[1]; + if (argc == 2) { - // Default: decode and run - std::string decoded = base64_decode(argv[1]); - if (decoded.empty()) - { - std::cerr << "Failed to decode base64 command." << std::endl; - return -1; - } - // Replace current process with bash -c "decoded" - execlp("bash", "bash", "-c", decoded.c_str(), (char *)nullptr); - // If execlp returns, there was an error - std::cerr << "Failed to execute command." << std::endl; - return -1; + if (mode == "-u") + return update_bb64(); + else + return decode_and_run(mode); } - std::string mode = argv[1]; std::ostringstream oss; switch (hash(mode.c_str())) { case hash("-i"): case hash("-d"): + std::cout << "Decoding command..." << std::endl + << std::endl; recursive_print(base64_decode(argv[2])); break; case hash("-e"): diff --git a/version.h b/version.h index 4e79690..b42491c 100644 --- a/version.h +++ b/version.h @@ -1 +1 @@ -static const char *VERSION = "8"; +static const char *VERSION = "10";