From 31ec9267933309249b12355d8c25896f0e383687 Mon Sep 17 00:00:00 2001 From: bartfaik04 Date: Sat, 7 Jun 2025 09:26:15 +0200 Subject: [PATCH] Use configfilemanager to get the real command --- ...onfigFileManager.h => configfilemanager.h} | 16 ++++++--- src/definitions.h | 6 ++-- src/main.cpp | 18 +++++++++- src/usermanager.cpp | 35 ++++++++++--------- src/usermanager.h | 5 ++- 5 files changed, 54 insertions(+), 26 deletions(-) rename src/{configFileManager.h => configfilemanager.h} (68%) diff --git a/src/configFileManager.h b/src/configfilemanager.h similarity index 68% rename from src/configFileManager.h rename to src/configfilemanager.h index 3c2886c..7ebe552 100644 --- a/src/configFileManager.h +++ b/src/configfilemanager.h @@ -6,19 +6,22 @@ #include #include #include -#include "usermanager.h" +#include "definitions.h" -class configFileManager{ +class configfilemanager{ private: std::map configs; public: - configFileManager(std::string filepath = "./ncsambawatcher.config") + configfilemanager(std::string filepath = "./ncsambawatcher.config") { std::ifstream is(filepath); std::string tmp; while(std::getline(is, tmp)) { + if (tmp.at(0) == '#') // ignore comments + continue; + std::vector splited = splitString(tmp, '='); if (splited.size() != 2) { @@ -30,11 +33,16 @@ public: } } - std::string at(std::string &config) + std::string at(const std::string &config) { return configs.at(config); } + std::string at(const char* config) + { + return at(std::string(config)); + } + }; #endif // _CONFIGFILEMANAGER_H \ No newline at end of file diff --git a/src/definitions.h b/src/definitions.h index 4e755b9..c9a6e9d 100644 --- a/src/definitions.h +++ b/src/definitions.h @@ -5,7 +5,9 @@ #define USER_LOG_LOCATION 3 -#define SCAN_CMD_USR "docker exec --user www-data nextcloud /var/www/html/occ files:scan --path=" -#define SCAN_CMD_GRP "docker exec --user www-data nextcloud /var/www/html/occ groupfolder:scan " +#define SCAN_CMD_USR "docker exec --user www-data %1% /var/www/html/occ files:scan --path=" +#define SCAN_CMD_GRP "docker exec --user www-data %1% /var/www/html/occ groupfolder:scan " + +std::vector splitString(const std::string& input, char delimiter); #endif // _LOCATIONS_H \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 8974326..a8b5894 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,11 +10,27 @@ #include #include #include +#include "definitions.h" #include "usermanager.h" +#include "configfilemanager.h" userManager manager; std::condition_variable cv; std::mutex mtx; +configfilemanager cfm; + +std::vector splitString(const std::string& str, char delimiter = '|') +{ + std::vector ret; + std::stringstream ss(str); + std::string token; + + while (std::getline(ss, token, delimiter)) { + ret.push_back(token); + } + + return ret; +} void readingThreadFunc() { @@ -68,7 +84,7 @@ void scannerThreadFunc() } else if (child == 0) // child { - std::string cmd = userManager::getScanCommandFromUser(user); + std::string cmd = userManager::getScanCommandFromUser(user, cfm); execl("/bin/sh", "sh", "-c", cmd.c_str(), static_cast(nullptr)); std::cerr << "Scan failed" << std::endl; _exit(EXIT_FAILURE); diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 8d1bf13..86d4ace 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -1,24 +1,27 @@ #include "usermanager.h" -std::vector splitString(const std::string& str, char delimiter = '|') -{ - std::vector ret; - std::stringstream ss(str); - std::string token; - - while (std::getline(ss, token, delimiter)) { - ret.push_back(token); - } - - return ret; -} - -std::string userManager::getScanCommandFromUser(const std::string &user) +std::string userManager::getScanCommandFromUser(const std::string &user, configfilemanager &cfm) { + std::string contname = cfm.at("NEXTCLOUD_CONTAINER_NAME"); + std::string baseCommand; + std::string userCommand; + if (user.find("__groupfolder") != std::string::npos) { - return std::string(SCAN_CMD_GRP) + splitString(user, '/').back(); + baseCommand = SCAN_CMD_GRP; + userCommand = splitString(user, '/').back(); + } + else + { + baseCommand = SCAN_CMD_USR; + userCommand = user; } - return std::string(SCAN_CMD_USR) + user; + size_t pos = 0; + while ((pos = baseCommand.find("%1%", pos)) != std::string::npos) { + baseCommand.replace(pos, contname.length(), contname); + pos += contname.length(); // Move past the replacement + } + + return baseCommand + userCommand; } \ No newline at end of file diff --git a/src/usermanager.h b/src/usermanager.h index ff4c4b4..799c90b 100644 --- a/src/usermanager.h +++ b/src/usermanager.h @@ -8,8 +8,7 @@ #include #include #include "definitions.h" - -std::vector splitString(const std::string& input, char delimiter); +#include "configfilemanager.h" class userManager { @@ -19,7 +18,7 @@ private: public: - static std::string getScanCommandFromUser(const std::string&); + static std::string getScanCommandFromUser(const std::string&, configfilemanager& cfm); void addUserFromLogLine(std::string &line) {