From bdb1dd01018633883dc460501fad15b11b856f30 Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Fri, 27 Oct 2017 02:35:04 +0300 Subject: [PATCH] massive api changes: replace public method results to Result --- .gitmodules | 3 + sources/3rdparty/result | 1 + sources/compiler.cmake | 2 +- sources/queued-daemon/queued.ini.example | 3 +- .../src/QueuedApplicationInterface.cpp | 12 +- .../src/QueuedApplicationInterface.h | 5 +- sources/queued-daemon/src/main.cpp | 5 +- sources/queued-server/src/QueuedServer.cpp | 4 + .../src/QueuedTcpServerResponseHelper.h | 2 +- .../src/QueuedTcpServerResponseHelperApi1.cpp | 5 +- .../src/QueuedTcpServerResponseHelperAuth.cpp | 22 +- .../QueuedTcpServerResponseHelperOption.cpp | 31 +- ...euedTcpServerResponseHelperPermissions.cpp | 36 +- .../QueuedTcpServerResponseHelperPlugins.cpp | 47 ++- .../src/QueuedTcpServerResponseHelperTask.cpp | 135 ++++++-- .../src/QueuedTcpServerResponseHelperTask.h | 2 + .../src/QueuedTcpServerResponseHelperUser.cpp | 98 ++++-- sources/queued/QueuedConfig.h.in | 36 +- sources/queued/adds.cmake | 1 + sources/queued/include/queued/Queued.h | 1 + sources/queued/include/queued/QueuedCore.h | 121 ++++--- .../queued/include/queued/QueuedCoreAdaptor.h | 170 +++++++--- .../include/queued/QueuedCoreInterface.h | 75 +++-- .../include/queued/QueuedDatabaseSchema.h | 10 +- sources/queued/include/queued/QueuedDebug.h | 11 +- sources/queued/include/queued/QueuedEnums.h | 21 +- .../include/queued/QueuedPropertyInterface.h | 2 +- sources/queued/include/queued/QueuedResult.h | 204 ++++++++++++ .../include/queued/QueuedStaticConfig.h | 33 +- sources/queued/include/queued/QueuedUser.h | 9 +- .../queued/include/queued/QueuedUserManager.h | 16 + sources/queued/src/CMakeLists.txt | 1 + sources/queued/src/QueuedAdvancedSettings.cpp | 2 +- .../queued/src/QueuedControlGroupsAdaptor.cpp | 2 +- sources/queued/src/QueuedCore.cpp | 279 ++++++++++------ sources/queued/src/QueuedCoreAdaptor.cpp | 313 ++++++++---------- sources/queued/src/QueuedCoreInterface.cpp | 122 ++++--- sources/queued/src/QueuedDatabase.cpp | 2 +- sources/queued/src/QueuedDatabaseManager.cpp | 2 +- sources/queued/src/QueuedDebug.cpp | 2 +- sources/queued/src/QueuedLimits.cpp | 2 +- sources/queued/src/QueuedPluginManager.cpp | 2 +- sources/queued/src/QueuedProcess.cpp | 2 +- sources/queued/src/QueuedProcessManager.cpp | 2 +- .../queued/src/QueuedPropertyInterface.cpp | 38 ++- sources/queued/src/QueuedReportInterface.cpp | 40 ++- sources/queued/src/QueuedReportManager.cpp | 2 +- sources/queued/src/QueuedSettings.cpp | 4 +- sources/queued/src/QueuedSystemInfo.cpp | 2 +- sources/queued/src/QueuedTokenManager.cpp | 2 +- sources/queued/src/QueuedUser.cpp | 13 +- sources/queued/src/QueuedUserManager.cpp | 22 +- sources/queuedctl/src/QueuedctlAuth.cpp | 25 +- sources/queuedctl/src/QueuedctlAuth.h | 5 +- sources/queuedctl/src/QueuedctlCommon.cpp | 156 ++++----- sources/queuedctl/src/QueuedctlOption.cpp | 31 +- sources/queuedctl/src/QueuedctlOption.h | 9 +- .../queuedctl/src/QueuedctlPermissions.cpp | 42 ++- sources/queuedctl/src/QueuedctlPermissions.h | 12 +- sources/queuedctl/src/QueuedctlPlugins.cpp | 47 ++- sources/queuedctl/src/QueuedctlPlugins.h | 10 +- sources/queuedctl/src/QueuedctlTask.cpp | 129 ++++++-- sources/queuedctl/src/QueuedctlTask.h | 27 +- sources/queuedctl/src/QueuedctlUser.cpp | 122 +++++-- sources/queuedctl/src/QueuedctlUser.h | 25 +- sources/version.h.in | 79 ++--- 66 files changed, 1807 insertions(+), 891 deletions(-) create mode 100644 .gitmodules create mode 160000 sources/3rdparty/result create mode 100644 sources/queued/include/queued/QueuedResult.h diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..47ff01a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "sources/3rdparty/result"] + path = sources/3rdparty/result + url = https://github.com/arcan1s/result.git diff --git a/sources/3rdparty/result b/sources/3rdparty/result new file mode 160000 index 0000000..e03dc8e --- /dev/null +++ b/sources/3rdparty/result @@ -0,0 +1 @@ +Subproject commit e03dc8efb056f468b108c5034e19fec96e5b976b diff --git a/sources/compiler.cmake b/sources/compiler.cmake index 9e6a05c..0e25c13 100644 --- a/sources/compiler.cmake +++ b/sources/compiler.cmake @@ -17,7 +17,7 @@ else () endif () # some flags -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # verbose output for debug builds diff --git a/sources/queued-daemon/queued.ini.example b/sources/queued-daemon/queued.ini.example index a0cb798..023209f 100644 --- a/sources/queued-daemon/queued.ini.example +++ b/sources/queued-daemon/queued.ini.example @@ -1,6 +1,7 @@ [Administrator] Username = root -Password = 0dd3e512642c97ca3f747f9a76e374fbda73f9292823c0313be9d78add7cdd8f72235af0c553dd26797e78e1854edee0ae002f8aba074b066dfce1af114e32f8 +Password = 9bc0798aa9d5de1f41e56ea4654cf86694dae080912d7df83cf293e7c7beb1b62e2811ed88bb24553a50d53f5cf85458928d25aea19aca5dc42fb316ba9c0e2c +Salt = suzMBxyKxtyQtu7c4vVfbQTB [Database] Driver = QSQLITE diff --git a/sources/queued-daemon/src/QueuedApplicationInterface.cpp b/sources/queued-daemon/src/QueuedApplicationInterface.cpp index 5407cfa..d213fa9 100644 --- a/sources/queued-daemon/src/QueuedApplicationInterface.cpp +++ b/sources/queued-daemon/src/QueuedApplicationInterface.cpp @@ -17,6 +17,7 @@ #include "QueuedApplicationInterface.h" #include +#include #include @@ -33,6 +34,9 @@ QueuedApplicationInterface::QueuedApplicationInterface( , m_application(parent) { qCDebug(LOG_DBUS) << __PRETTY_FUNCTION__; + + qRegisterMetaType>("QueuedResult"); + qDBusRegisterMetaType>(); } @@ -42,17 +46,17 @@ QueuedApplicationInterface::~QueuedApplicationInterface() } -bool QueuedApplicationInterface::Active() const +QDBusVariant QueuedApplicationInterface::Active() const { - return true; + return QueuedCoreAdaptor::toDBusVariant(QueuedResult(true)); } -QStringList QueuedApplicationInterface::UIDs() const +QDBusVariant QueuedApplicationInterface::UIDs() const { QStringList uids; uids.append(QString::number(::getuid())); uids.append(QString::number(::geteuid())); - return uids; + return QueuedCoreAdaptor::toDBusVariant(QueuedResult(uids)); } diff --git a/sources/queued-daemon/src/QueuedApplicationInterface.h b/sources/queued-daemon/src/QueuedApplicationInterface.h index 61d87a0..af1e5f1 100644 --- a/sources/queued-daemon/src/QueuedApplicationInterface.h +++ b/sources/queued-daemon/src/QueuedApplicationInterface.h @@ -18,6 +18,7 @@ #define QUEUEDAPPLICATIONINTERFACE_H #include +#include #include "QueuedConfig.h" @@ -34,8 +35,8 @@ public: virtual ~QueuedApplicationInterface(); public slots: - bool Active() const; - QStringList UIDs() const; + QDBusVariant Active() const; + QDBusVariant UIDs() const; private: QueuedApplication *m_application = nullptr; diff --git a/sources/queued-daemon/src/main.cpp b/sources/queued-daemon/src/main.cpp index b42a302..d124907 100644 --- a/sources/queued-daemon/src/main.cpp +++ b/sources/queued-daemon/src/main.cpp @@ -35,12 +35,11 @@ QueuedApplication *instance = nullptr; bool existingSessionOperation(const QString &operation) { - QVariantList arguments = QueuedCoreAdaptor::sendRequest( + auto res = QueuedCoreAdaptor::sendRequest( QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_APPLICATION_PATH, QueuedConfig::DBUS_SERVICE, operation, QVariantList()); - return (!arguments.isEmpty() && arguments.at(0).type() == QVariant::Bool - && arguments[0].toBool()); + return ((res.type() == Result::Content::Value) && res.get()); } diff --git a/sources/queued-server/src/QueuedServer.cpp b/sources/queued-server/src/QueuedServer.cpp index 9902d9d..d36090e 100644 --- a/sources/queued-server/src/QueuedServer.cpp +++ b/sources/queued-server/src/QueuedServer.cpp @@ -45,17 +45,21 @@ void QueuedServer::init() { m_server->init(QueuedCoreAdaptor::getOption( QueuedConfig::QueuedSettings::ServerTimeout) + .get() .toInt()); QString address = QueuedCoreAdaptor::getOption( QueuedConfig::QueuedSettings::ServerAddress) + .get() .toString(); ushort port = QueuedCoreAdaptor::getOption(QueuedConfig::QueuedSettings::ServerPort) + .get() .toUInt(); m_server->listen(QHostAddress(address), port); m_server->setMaxPendingConnections( QueuedCoreAdaptor::getOption( QueuedConfig::QueuedSettings::ServerMaxConnections) + .get() .toInt()); qCInfo(LOG_SERV) << "Server listen on" << m_server->serverAddress() diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelper.h b/sources/queued-server/src/QueuedTcpServerResponseHelper.h index 1a09b90..707662b 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelper.h +++ b/sources/queued-server/src/QueuedTcpServerResponseHelper.h @@ -42,7 +42,7 @@ typedef struct { QString type; bool valid; } Request; -const QHash HTTPCodeMap +static const QHash HTTPCodeMap = {{100, "Continue"}, {101, "Switching Protocols"}, {200, "OK"}, diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelperApi1.cpp b/sources/queued-server/src/QueuedTcpServerResponseHelperApi1.cpp index 275d123..94d48f3 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelperApi1.cpp +++ b/sources/queued-server/src/QueuedTcpServerResponseHelperApi1.cpp @@ -139,7 +139,10 @@ QVariantHash QueuedTcpServerResponseHelperApi1::getStatus() { QVariantHash output = {{"code", 200}}; - auto data = QueuedCoreAdaptor::getStatus(); + auto res = QueuedCoreAdaptor::getStatus(); + if (res.type() != Result::Content::Value) + return {}; + auto data = res.get(); auto sections = data.keys(); sections.sort(); for (auto §ion : sections) { diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelperAuth.cpp b/sources/queued-server/src/QueuedTcpServerResponseHelperAuth.cpp index efb6418..523e284 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelperAuth.cpp +++ b/sources/queued-server/src/QueuedTcpServerResponseHelperAuth.cpp @@ -25,9 +25,17 @@ QVariantHash QueuedTcpServerResponseHelperAuth::auth(const QVariantHash &_data) QVariantHash output; if (_data.contains("user") && _data.contains("password")) { - output["token"] = QueuedCoreAdaptor::auth(_data["user"].toString(), - _data["password"].toString()); - output["code"] = output["token"].toString().isEmpty() ? 401 : 200; + auto res = QueuedCoreAdaptor::auth(_data["user"].toString(), + _data["password"].toString()); + + Result::match( + res, + [&output](const QString &val) { + output = {{"code", 200}, {"token", val}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 401}, {"message", err.message().c_str()}}; + }); } else { output = {{"code", 400}, {"message", "No required fields found"}}; } @@ -40,5 +48,11 @@ bool QueuedTcpServerResponseHelperAuth::tryAuth(const QString &_token) { qCDebug(LOG_APP) << "Try auth with" << _token; - return QueuedCoreAdaptor::auth(_token); + auto res = QueuedCoreAdaptor::auth(_token); + + bool ret = true; + Result::match(res, [&ret](const bool val) { ret = val; }, + [&ret](const QueuedError &err) { ret = false; }); + + return ret; } diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelperOption.cpp b/sources/queued-server/src/QueuedTcpServerResponseHelperOption.cpp index b762e5c..90649a3 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelperOption.cpp +++ b/sources/queued-server/src/QueuedTcpServerResponseHelperOption.cpp @@ -24,7 +24,18 @@ QueuedTcpServerResponseHelperOption::getOption(const QString &_option) { qCDebug(LOG_SERV) << "Get option" << _option; - return {{"code", 200}, {"value", QueuedCoreAdaptor::getOption(_option)}}; + auto res = QueuedCoreAdaptor::getOption(_option); + + QVariantHash output; + Result::match(res, + [&output](const QVariant &val) { + output = {{"code", 200}, {"token", val}}; + }, + [&output](const QueuedError &) { + output = {{"code", 404}, {"message", "Option not found"}}; + }); + + return output; } @@ -36,8 +47,18 @@ QVariantHash QueuedTcpServerResponseHelperOption::setOption( if (!_value.contains("value")) return {{"code", 400}, {"message", "No required fields found"}}; - return {{"code", - QueuedCoreAdaptor::sendOptionEdit(_option, _value["value"], _token) - ? 200 - : 400}}; + auto res + = QueuedCoreAdaptor::sendOptionEdit(_option, _value["value"], _token); + + QVariantHash output; + Result::match( + res, + [&output](const QVariant &) { + output = {{"code", 200}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + + return output; } diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelperPermissions.cpp b/sources/queued-server/src/QueuedTcpServerResponseHelperPermissions.cpp index 9a1c907..8cb4c4f 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelperPermissions.cpp +++ b/sources/queued-server/src/QueuedTcpServerResponseHelperPermissions.cpp @@ -32,10 +32,20 @@ QVariantHash QueuedTcpServerResponseHelperPermissions::addPermission( if (permission == QueuedEnums::Permission::Invalid) return {{"code", 400}, {"message", "Invalid permission"}}; - return {{"code", - QueuedCoreAdaptor::sendUserPermissionAdd(_id, permission, _token) - ? 200 - : 400}}; + auto res + = QueuedCoreAdaptor::sendUserPermissionAdd(_id, permission, _token); + + QVariantHash output; + Result::match( + res, + [&output](const QVariant &) { + output = {{"code", 200}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + + return output; } @@ -52,8 +62,18 @@ QVariantHash QueuedTcpServerResponseHelperPermissions::removePermission( if (permission == QueuedEnums::Permission::Invalid) return {{"code", 400}, {"message", "Invalid permission"}}; - return {{"code", QueuedCoreAdaptor::sendUserPermissionRemove( - _id, permission, _token) - ? 200 - : 400}}; + auto res + = QueuedCoreAdaptor::sendUserPermissionRemove(_id, permission, _token); + + QVariantHash output; + Result::match( + res, + [&output](const QVariant &) { + output = {{"code", 200}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + + return output; } diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelperPlugins.cpp b/sources/queued-server/src/QueuedTcpServerResponseHelperPlugins.cpp index 8e4662b..97f8315 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelperPlugins.cpp +++ b/sources/queued-server/src/QueuedTcpServerResponseHelperPlugins.cpp @@ -25,16 +25,38 @@ QueuedTcpServerResponseHelperPlugins::addPlugin(const QString &_name, { qCDebug(LOG_SERV) << "Add plugin" << _name; - return { - {"code", QueuedCoreAdaptor::sendPluginAdd(_name, _token) ? 200 : 400}}; + auto res = QueuedCoreAdaptor::sendPluginAdd(_name, _token); + + QVariantHash output; + Result::match( + res, + [&output](const bool) { + output = {{"code", 200}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + + return output; } QVariantHash QueuedTcpServerResponseHelperPlugins::listPlugins() { - return {{"code", 200}, - {"plugins", QueuedCoreAdaptor::getOption( - QueuedConfig::QueuedSettings::Plugins)}}; + auto res + = QueuedCoreAdaptor::getOption(QueuedConfig::QueuedSettings::Plugins); + + QVariantHash output; + Result::match( + res, + [&output](const QVariant &val) { + output = {{"code", 200}, {"plugins", val.toStringList()}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + + return output; } @@ -44,6 +66,17 @@ QueuedTcpServerResponseHelperPlugins::removePlugin(const QString &_name, { qCDebug(LOG_SERV) << "Remove plugin" << _name; - return {{"code", - QueuedCoreAdaptor::sendPluginRemove(_name, _token) ? 200 : 400}}; + auto res = QueuedCoreAdaptor::sendPluginRemove(_name, _token); + + QVariantHash output; + Result::match( + res, + [&output](const bool) { + output = {{"code", 200}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + + return output; } diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelperTask.cpp b/sources/queued-server/src/QueuedTcpServerResponseHelperTask.cpp index f7f60ce..114deca 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelperTask.cpp +++ b/sources/queued-server/src/QueuedTcpServerResponseHelperTask.cpp @@ -25,15 +25,33 @@ QVariantHash QueuedTcpServerResponseHelperTask::addOrEditTask( qCDebug(LOG_SERV) << "Add or edit task" << _id << "with data" << _data; auto defs = getDefinitions(_data); + + QVariantHash output; if (_id > 0) { // edit existing task - bool status = QueuedCoreAdaptor::sendTaskEdit(_id, defs, _token); - return {{"code", status ? 200 : 400}}; + auto res = QueuedCoreAdaptor::sendTaskEdit(_id, defs, _token); + Result::match( + res, + [&output](const bool val) { + output = {{"code", val ? 200 : 500}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); } else { // add new task - auto id = QueuedCoreAdaptor::sendTaskAdd(defs, _token); - return {{"code", id > 0 ? 200 : 400}, {"id", id}}; + auto res = QueuedCoreAdaptor::sendTaskAdd(defs, _token); + Result::match( + res, + [&output](const long long val) { + output = {{"code", val ? 200 : 500}, {"id", val}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); } + + return output; } @@ -78,11 +96,25 @@ QueuedTcpServerResponseHelperTask::getTask(const long long _id, auto property = _data["property"].toString(); QVariantHash output = {{"code", 200}}; - if (property.isEmpty()) - output["properties"] = QueuedCoreAdaptor::getTask(_id); - else - output["properties"] = QVariantHash( - {{property, QueuedCoreAdaptor::getTask(_id, property)}}); + if (property.isEmpty()) { + auto res = QueuedCoreAdaptor::getTask(_id); + Result::match( + res, + [&output](const QVariantHash &val) { output["properties"] = val; }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + } else { + auto res = QueuedCoreAdaptor::getTask(_id, property); + Result::match( + res, + [&output, &property](const QVariant &val) { + output["properties"] = {{property, val}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + } return output; } @@ -100,13 +132,20 @@ QueuedTcpServerResponseHelperTask::getTasks(const QVariantHash &_data, QDateTime stop = QDateTime::fromString(_data["stop"].toString(), Qt::ISODateWithMs); - QVariantHash output = {{"code", 200}}; + QVariantHash output; // some conversion magic QVariantList outputReport; - auto report = QueuedCoreAdaptor::getTasks(userId, start, stop, _token); - for (auto &user : report) - outputReport.append(user); - output["report"] = outputReport; + auto res = QueuedCoreAdaptor::getTasks(userId, start, stop, _token); + Result::match( + res, + [&output, &outputReport](const QList &val) { + for (auto &user : val) + outputReport += user; + output = {{"code", 200}, {"report", outputReport}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); return output; } @@ -118,15 +157,63 @@ QueuedTcpServerResponseHelperTask::startOrStopTask(const long long _id, { qCDebug(LOG_SERV) << "Change task state" << _id; - QVariantHash task = QueuedCoreAdaptor::getTask(_id); - if (task.isEmpty()) - return {{"code", 400}, {"message", "No task found"}}; + auto res = QueuedCoreAdaptor::getTask(_id); - if (task["startTime"].toString().isEmpty() - || !task["endTime"].toString().isEmpty()) - return {{"code", - QueuedCoreAdaptor::sendTaskStart(_id, _token) ? 200 : 400}}; - else - return { - {"code", QueuedCoreAdaptor::sendTaskStop(_id, _token) ? 200 : 400}}; + QVariantHash output; + Result::match( + res, + [&output, &_id, &_token](const QVariantHash &val) { + if (val["startTime"].toString().isEmpty() + || !val["endTime"].toString().isEmpty()) + output = startTask(_id, _token); + else + output = stopTask(_id, _token); + }, + [&output](const QueuedError &err) { + output = {{"code", 400}, {"message", err.message().c_str()}}; + }); + + return output; +} + + +QVariantHash QueuedTcpServerResponseHelperTask::startTask(const long long _id, + const QString &_token) +{ + qCDebug(LOG_SERV) << "Start task" << _id; + + auto res = QueuedCoreAdaptor::sendTaskStart(_id, _token); + + QVariantHash output; + Result::match( + res, + [&output](const bool val) { + output = {{"code", val ? 200 : 500}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + + return output; +} + + +QVariantHash QueuedTcpServerResponseHelperTask::stopTask(const long long _id, + const QString &_token) +{ + qCDebug(LOG_SERV) << "Stop task" << _id; + + auto res = QueuedCoreAdaptor::sendTaskStop(_id, _token); + + QVariantHash output; + Result::match( + res, + [&output](const bool val) { + output = {{"code", val ? 200 : 500}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + + return output; } diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelperTask.h b/sources/queued-server/src/QueuedTcpServerResponseHelperTask.h index f73d3ff..d496d3f 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelperTask.h +++ b/sources/queued-server/src/QueuedTcpServerResponseHelperTask.h @@ -31,6 +31,8 @@ getDefinitions(const QVariantHash &_data); QVariantHash getTask(const long long _id, const QVariantHash &_data); QVariantHash getTasks(const QVariantHash &_data, const QString &_token); QVariantHash startOrStopTask(const long long _id, const QString &_token); +QVariantHash startTask(const long long _id, const QString &_token); +QVariantHash stopTask(const long long _id, const QString &_token); }; diff --git a/sources/queued-server/src/QueuedTcpServerResponseHelperUser.cpp b/sources/queued-server/src/QueuedTcpServerResponseHelperUser.cpp index c4111fb..8583927 100644 --- a/sources/queued-server/src/QueuedTcpServerResponseHelperUser.cpp +++ b/sources/queued-server/src/QueuedTcpServerResponseHelperUser.cpp @@ -25,19 +25,40 @@ QVariantHash QueuedTcpServerResponseHelperUser::addOrEditUser( qCDebug(LOG_SERV) << "Add user" << _user << "with data" << _data; // try define if user exists first - auto userId = QueuedCoreAdaptor::getUserId(_user); + auto userIdRes = QueuedCoreAdaptor::getUserId(_user); + long long userId = -1; + Result::match(userIdRes, [&userId](const long long val) { userId = val; }, + [&userId](const QueuedError &) {}); auto defs = getDefinitions(_data); defs.name = _user; + + QVariantHash output; if (userId > 0) { // edit existing user - bool status = QueuedCoreAdaptor::sendUserEdit(userId, defs, _token); - return {{"code", status ? 200 : 400}}; + auto res = QueuedCoreAdaptor::sendUserEdit(userId, defs, _token); + Result::match( + res, + [&output](const bool val) { + output = {{"code", val ? 200 : 500}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); } else { // add new user - auto id = QueuedCoreAdaptor::sendUserAdd(defs, _token); - return {{"code", id > 0 ? 200 : 400}, {"id", id}}; + auto res = QueuedCoreAdaptor::sendUserAdd(defs, _token); + Result::match( + res, + [&output](const long long val) { + output = {{"code", val ? 200 : 500}, {"id", val}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); } + + return output; } @@ -48,7 +69,10 @@ QueuedTcpServerResponseHelperUser::getDefinitions(const QVariantHash &_data) QueuedUser::QueuedUserDefinitions defs; defs.email = _data["email"].toString(); - defs.password = QueuedUser::hashFromPassword(_data["password"].toString()); + auto res = QueuedCoreAdaptor::sendPasswordHash(_data["password"].toString()); + Result::match( + res, [&defs](const QString &val) { defs.password = val; }, + [](const QueuedError &) {}); defs.permissions = _data["permissions"].toUInt(); // limits QueuedLimits::Limits limits; @@ -77,10 +101,17 @@ QueuedTcpServerResponseHelperUser::getReport(const QVariantHash &_data, QVariantHash output = {{"code", 200}}; // some conversion magic QVariantList outputReport; - auto report = QueuedCoreAdaptor::getPerformance(start, stop, _token); - for (auto &user : report) - outputReport.append(user); - output["report"] = outputReport; + auto res = QueuedCoreAdaptor::getPerformance(start, stop, _token); + Result::match( + res, + [&output, &outputReport](const QList &val) { + for (auto &user : val) + outputReport += user; + output = {{"code", 200}, {"report", outputReport}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); return output; } @@ -92,15 +123,35 @@ QueuedTcpServerResponseHelperUser::getUser(const QString &_user, { qCDebug(LOG_SERV) << "Get user data for" << _user << _data; - auto userId = QueuedCoreAdaptor::getUserId(_user); + auto userIdRes = QueuedCoreAdaptor::getUserId(_user); + long long userId = -1; + Result::match(userIdRes, [&userId](const long long val) { userId = val; }, + [](const QueuedError &) {}); + if (userId == -1) + return {{"code", 500}}; + auto property = _data["property"].toString(); QVariantHash output = {{"code", 200}}; - if (property.isEmpty()) - output["properties"] = QueuedCoreAdaptor::getUser(userId); - else - output["properties"] = QVariantHash( - {{property, QueuedCoreAdaptor::getUser(userId, property)}}); + if (property.isEmpty()) { + auto res = QueuedCoreAdaptor::getUser(userId); + Result::match( + res, + [&output](const QVariantHash &val) { output["properties"] = val; }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + } else { + auto res = QueuedCoreAdaptor::getUser(userId, property); + Result::match( + res, + [&output, &property](const QVariant &val) { + output["properties"] = {{property, val}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); + } return output; } @@ -120,10 +171,17 @@ QueuedTcpServerResponseHelperUser::getUsers(const QVariantHash &_data, QVariantHash output = {{"code", 200}}; // some conversion magic QVariantList outputReport; - auto report = QueuedCoreAdaptor::getUsers(lastLogin, permission, _token); - for (auto &user : report) - outputReport.append(user); - output["report"] = outputReport; + auto res = QueuedCoreAdaptor::getUsers(lastLogin, permission, _token); + Result::match( + res, + [&output, &outputReport](const QList &val) { + for (auto &user : val) + outputReport += user; + output = {{"code", 200}, {"report", outputReport}}; + }, + [&output](const QueuedError &err) { + output = {{"code", 500}, {"message", err.message().c_str()}}; + }); return output; } diff --git a/sources/queued/QueuedConfig.h.in b/sources/queued/QueuedConfig.h.in index ffa1cf9..f702d04 100644 --- a/sources/queued/QueuedConfig.h.in +++ b/sources/queued/QueuedConfig.h.in @@ -16,7 +16,7 @@ * @file QueuedConfig.h * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ @@ -39,75 +39,75 @@ namespace QueuedConfig /** * @brief DBus service name for library and application */ -const char DBUS_SERVICE[] = DBUS_SERVICE_NAME; +static const char DBUS_SERVICE[] = DBUS_SERVICE_NAME; /** * @brief DBus object path for application */ -const char DBUS_APPLICATION_PATH[] = "/application"; +static const char DBUS_APPLICATION_PATH[] = "/application"; /** * @brief DBus object path for library */ -const char DBUS_OBJECT_PATH[] = "/queued"; +static const char DBUS_OBJECT_PATH[] = "/queued"; /** * @brief DBus properties path for properties library */ -const char DBUS_PROPERTY_PATH[] = "/property"; +static const char DBUS_PROPERTY_PATH[] = "/property"; /** * @brief DBus properties path for reports library */ -const char DBUS_REPORTS_PATH[] = "/report"; +static const char DBUS_REPORTS_PATH[] = "/report"; // path configuration // common paths /** * @brief installation directory for executables */ -const char BIN_INSTALL_DIR[] = "@BIN_INSTALL_DIR@"; +static const char BIN_INSTALL_DIR[] = "@BIN_INSTALL_DIR@"; /** * @brief installation directory for data */ -const char DATA_INSTALL_DIR[] = "@DATA_INSTALL_DIR@"; +static const char DATA_INSTALL_DIR[] = "@DATA_INSTALL_DIR@"; /** * @brief installation directory for headers */ -const char INCLUDE_INSTALL_DIR[] = "@INCLUDE_INSTALL_DIR@"; +static const char INCLUDE_INSTALL_DIR[] = "@INCLUDE_INSTALL_DIR@"; /** * @brief installation directory for libraries */ -const char LIB_INSTALL_DIR[] = "@LIB_INSTALL_DIR@"; +static const char LIB_INSTALL_DIR[] = "@LIB_INSTALL_DIR@"; /** * @brief the same as CMAKE_INSTALL_PREFIX */ -const char ROOT_INSTALL_DIR[] = "@CMAKE_INSTALL_PREFIX@"; +static const char ROOT_INSTALL_DIR[] = "@CMAKE_INSTALL_PREFIX@"; // application specific /** * @brief path to queued home directory */ -const char HOME_PATH[] = "queued"; +static const char HOME_PATH[] = "queued"; /** * @brief path to plugins inside @ref HOME_PATH */ -const char PLUGIN_PATH[] = "plugins"; +static const char PLUGIN_PATH[] = "plugins"; // internal configuration /** * @brief version of internal storage */ -const int DATABASE_VERSION = 1; +static const int DATABASE_VERSION = 1; /** * @brief header name for token */ -const char WEBAPI_TOKEN_HEADER[] = "x-queued-token"; +static const char WEBAPI_TOKEN_HEADER[] = "x-queued-token"; /** * @brief supported web server API versions */ -const int WEBAPI_VERSIONS[] = {1}; +static const int WEBAPI_VERSIONS[] = {1}; // cgroups configuration /** * @brief path to root directory of cgroups */ -const char CG_FS_PATH[] = "/sys/fs/cgroup"; +static const char CG_FS_PATH[] = "/sys/fs/cgroup"; // plugin interfaces /** @@ -119,7 +119,7 @@ const char CG_FS_PATH[] = "/sys/fs/cgroup"; /** * @brief plugin interface name */ -const char PLUGIN_INTERFACE[] = PLUGIN_INTERFACE_NAME; +static const char PLUGIN_INTERFACE[] = PLUGIN_INTERFACE_NAME; } diff --git a/sources/queued/adds.cmake b/sources/queued/adds.cmake index fe9c7c0..6e4a51d 100644 --- a/sources/queued/adds.cmake +++ b/sources/queued/adds.cmake @@ -5,3 +5,4 @@ install (FILES "QueuedConfig.cmake" DESTINATION "${LIB_INSTALL_DIR}/cmake/Queued install (FILES "QueuedLibraries.cmake" DESTINATION "${LIB_INSTALL_DIR}/cmake/Queued") install (FILES "QueuedMacros.cmake" DESTINATION "${LIB_INSTALL_DIR}/cmake/Queued") install (FILES "${CMAKE_CURRENT_BINARY_DIR}/QueuedPaths.cmake" DESTINATION "${LIB_INSTALL_DIR}/cmake/Queued") +install (FILES "${PROJECT_TRDPARTY_DIR}/result/result.hpp" DESTINATION "${INCLUDE_INSTALL_DIR}/${SUBPROJECT}/result") diff --git a/sources/queued/include/queued/Queued.h b/sources/queued/include/queued/Queued.h index 6519544..be83364 100644 --- a/sources/queued/include/queued/Queued.h +++ b/sources/queued/include/queued/Queued.h @@ -43,6 +43,7 @@ #include "QueuedPropertyInterface.h" #include "QueuedReportInterface.h" #include "QueuedReportManager.h" +#include "QueuedResult.h" #include "QueuedSettings.h" #include "QueuedStaticConfig.h" #include "QueuedSystemInfo.h" diff --git a/sources/queued/include/queued/QueuedCore.h b/sources/queued/include/queued/QueuedCore.h index 45cb906..1a63cdf 100644 --- a/sources/queued/include/queued/QueuedCore.h +++ b/sources/queued/include/queued/QueuedCore.h @@ -28,6 +28,7 @@ #include "QueuedEnums.h" #include "QueuedLimits.h" +#include "QueuedResult.h" #include "QueuedStaticConfig.h" @@ -69,7 +70,7 @@ public: * user auth token * @return true on successfully addition */ - bool addPlugin(const QString &_plugin, const QString &_token); + QueuedResult addPlugin(const QString &_plugin, const QString &_token); /** * @brief add new task * @param _command @@ -86,10 +87,10 @@ public: * user auth token * @return task ID or -1 if no task added */ - long long addTask(const QString &_command, const QStringList &_arguments, - const QString &_workingDirectory, const long long _userId, - const QueuedLimits::Limits &_limits, - const QString &_token); + QueuedResult + addTask(const QString &_command, const QStringList &_arguments, + const QString &_workingDirectory, const long long _userId, + const QueuedLimits::Limits &_limits, const QString &_token); /** * @brief add new user * @param _name @@ -106,17 +107,18 @@ public: * user auth token * @return user ID or -1 if no user created */ - long long addUser(const QString &_name, const QString &_email, - const QString &_password, const uint _permissions, - const QueuedLimits::Limits &_limits, - const QString &_token); + QueuedResult addUser(const QString &_name, const QString &_email, + const QString &_password, + const uint _permissions, + const QueuedLimits::Limits &_limits, + const QString &_token); /** * @brief try to authorize by given token * @param _token * token ID * @return true if token is valid */ - bool authorization(const QString &_token); + QueuedResult authorization(const QString &_token); /** * @brief authorize and create new token for user * @param _name @@ -125,7 +127,8 @@ public: * user password * @return token. It will be empty if authorization error occurs */ - QString authorization(const QString &_name, const QString &_password); + QueuedResult authorization(const QString &_name, + const QString &_password); /** * @brief edit advanced settings * @param _key @@ -136,8 +139,8 @@ public: * user auth token * @return true on successful option edition */ - bool editOption(const QString &_key, const QVariant &_value, - const QString &_token); + QueuedResult editOption(const QString &_key, const QVariant &_value, + const QString &_token); /** * @brief edit task * @param _id @@ -150,8 +153,9 @@ public: * fields will be ignored. No need to pass all properties here * @return true on successful task edition */ - bool editTask(const long long _id, const QVariantHash &_taskData, - const QString &_token); + QueuedResult editTask(const long long _id, + const QVariantHash &_taskData, + const QString &_token); /** * @brief edit user * @param _id @@ -164,8 +168,9 @@ public: * fields will be ignored. No need to pass all properties here * @return true on successful user edition */ - bool editUser(const long long _id, const QVariantHash &_userData, - const QString &_token); + QueuedResult editUser(const long long _id, + const QVariantHash &_userData, + const QString &_token); /** * @brief edit user permissions * @param _id @@ -178,16 +183,24 @@ public: * user auth token * @return true on successful user permission edition */ - bool editUserPermission(const long long _id, - const QueuedEnums::Permission &_permission, - const bool _add, const QString &_token); + QueuedResult + editUserPermission(const long long _id, + const QueuedEnums::Permission &_permission, + const bool _add, const QString &_token); + /** + * @brief hash password + * @param _password + * user password as plain text + * @return hashed password with applied salt + */ + QueuedResult hashFromPassword(const QString &_password); /** * @brief get value from advanced settings * @param _key * key string * @return option value or empty QVariant */ - QVariant option(const QString &_key); + QueuedResult option(const QString &_key); /** * @brief usage report * @param _from @@ -198,9 +211,9 @@ public: * user auth token * @return performance table */ - QList performanceReport(const QDateTime &_from, - const QDateTime &_to, - const QString &_token) const; + QueuedResult> + performanceReport(const QDateTime &_from, const QDateTime &_to, + const QString &_token) const; /** * @brief get plugin settings * @param _plugin @@ -216,7 +229,8 @@ public: * user auth token * @return true on successful plugin removal */ - bool removePlugin(const QString &_plugin, const QString &_token); + QueuedResult removePlugin(const QString &_plugin, + const QString &_token); /** * @brief force start task * @param _id @@ -225,7 +239,7 @@ public: * user auth token * @return true on successful task start */ - bool startTask(const long long _id, const QString &_token); + QueuedResult startTask(const long long _id, const QString &_token); /** * @brief force stop task * @param _id @@ -234,7 +248,7 @@ public: * user auth token * @return true on successful task stop */ - bool stopTask(const long long _id, const QString &_token); + QueuedResult stopTask(const long long _id, const QString &_token); /** * @brief get task by ID * @param _id @@ -254,9 +268,10 @@ public: * user auth token * @return list of tasks in database format */ - QList taskReport(const long long _user, - const QDateTime &_from, const QDateTime &_to, - const QString &_token) const; + QueuedResult> taskReport(const long long _user, + const QDateTime &_from, + const QDateTime &_to, + const QString &_token) const; /** * @brief get user by ID * @param _id @@ -281,9 +296,10 @@ public: * user auth token * @return list of users in database format */ - QList userReport(const QDateTime &_lastLogged, - const QueuedEnums::Permission _permission, - const QString &_token) const; + QueuedResult> + userReport(const QDateTime &_lastLogged, + const QueuedEnums::Permission _permission, + const QString &_token) const; // control methods /** * @brief deinit subclasses @@ -394,7 +410,7 @@ private: * @param _args * class constructor arguments */ - template T *initObject(T *_dest, Args... _args) + template T *initObject(T *_dest, Args... _args) { return _dest ? _dest : new T(this, _args...); }; @@ -432,11 +448,11 @@ private: * task defined limits * @return task ID or -1 if no task added */ - long long addTaskPrivate(const QString &_command, - const QStringList &_arguments, - const QString &_workingDirectory, - const long long _userId, - const QueuedLimits::Limits &_limits); + QueuedResult addTaskPrivate(const QString &_command, + const QStringList &_arguments, + const QString &_workingDirectory, + const long long _userId, + const QueuedLimits::Limits &_limits); /** * @brief add new user * @param _name @@ -451,9 +467,11 @@ private: * user limits * @return user ID or -1 if no user found */ - long long addUserPrivate(const QString &_name, const QString &_email, - const QString &_password, const uint _permissions, - const QueuedLimits::Limits &_limits); + QueuedResult addUserPrivate(const QString &_name, + const QString &_email, + const QString &_password, + const uint _permissions, + const QueuedLimits::Limits &_limits); /** * @brief edit advanced settings * @param _key @@ -462,7 +480,8 @@ private: * advanced settings value * @return true on successful option edition */ - bool editOptionPrivate(const QString &_key, const QVariant &_value); + QueuedResult editOptionPrivate(const QString &_key, + const QVariant &_value); /** * @brief edit plugin list * @param _plugin @@ -471,7 +490,8 @@ private: * true if it requires add plugin * @return true on successful action */ - bool editPluginPrivate(const QString &_plugin, const bool _add); + QueuedResult editPluginPrivate(const QString &_plugin, + const bool _add); /** * @brief edit task * @param _id @@ -482,7 +502,8 @@ private: * fields will be ignored. No need to pass all properties here * @return true on successful task edition */ - bool editTaskPrivate(const long long _id, const QVariantHash &_taskData); + QueuedResult editTaskPrivate(const long long _id, + const QVariantHash &_taskData); /** * @brief edit user * @param _id @@ -493,7 +514,8 @@ private: * fields will be ignored. No need to pass all properties here * @return true on successful user edition */ - bool editUserPrivate(const long long _id, const QVariantHash &_userData); + QueuedResult editUserPrivate(const long long _id, + const QVariantHash &_userData); /** * @brief edit user permissions * @param _id @@ -504,9 +526,10 @@ private: * indicates whether it should be added or removed * @return true on successful user permission edition */ - bool editUserPermissionPrivate(const long long _id, - const QueuedEnums::Permission &_permission, - const bool _add); + QueuedResult + editUserPermissionPrivate(const long long _id, + const QueuedEnums::Permission &_permission, + const bool _add); }; diff --git a/sources/queued/include/queued/QueuedCoreAdaptor.h b/sources/queued/include/queued/QueuedCoreAdaptor.h index 55fc362..21848f9 100644 --- a/sources/queued/include/queued/QueuedCoreAdaptor.h +++ b/sources/queued/include/queued/QueuedCoreAdaptor.h @@ -24,8 +24,8 @@ #ifndef QUEUEDCOREADAPTOR_H #define QUEUEDCOREADAPTOR_H -#include -#include +#include +#include #include "QueuedProcess.h" #include "QueuedStaticConfig.h" @@ -45,7 +45,7 @@ namespace QueuedCoreAdaptor * token ID * @return true if token is valid */ -bool auth(const QString &_token); +QueuedResult auth(const QString &_token); /** * @brief send auth method * @param _name @@ -54,7 +54,7 @@ bool auth(const QString &_token); * user password * @return generated token ID or empty string in case of invalid password */ -QString auth(const QString &_name, const QString &_password); +QueuedResult auth(const QString &_name, const QString &_password); /** * @brief send OptionEdit * @param _key @@ -65,8 +65,15 @@ QString auth(const QString &_name, const QString &_password); * auth user token * @return true on successful option edition */ -bool sendOptionEdit(const QString &_key, const QVariant &_value, - const QString &_token); +QueuedResult sendOptionEdit(const QString &_key, const QVariant &_value, + const QString &_token); +/** + * @brief send PasswordHash + * @param _password + * user password + * @return hashed password with applied salt + */ +QueuedResult sendPasswordHash(const QString &_password); /** * @brief send PluginAdd * @param _plugin @@ -75,7 +82,7 @@ bool sendOptionEdit(const QString &_key, const QVariant &_value, * auth user token * @return true on successful plugin addition */ -bool sendPluginAdd(const QString &_plugin, const QString &_token); +QueuedResult sendPluginAdd(const QString &_plugin, const QString &_token); /** * @brief send PluginRemove * @param _plugin @@ -84,7 +91,8 @@ bool sendPluginAdd(const QString &_plugin, const QString &_token); * auth user token * @return true on successful plugin removal */ -bool sendPluginRemove(const QString &_plugin, const QString &_token); +QueuedResult sendPluginRemove(const QString &_plugin, + const QString &_token); /** * @brief send TaskAdd * @param _definitions @@ -93,7 +101,7 @@ bool sendPluginRemove(const QString &_plugin, const QString &_token); * auth user token * @return task ID or {0, -1} if no task added */ -long long +QueuedResult sendTaskAdd(const QueuedProcess::QueuedProcessDefinitions &_definitions, const QString &_token); /** @@ -106,9 +114,10 @@ sendTaskAdd(const QueuedProcess::QueuedProcessDefinitions &_definitions, * auth user token * @return true on successful task edition */ -bool sendTaskEdit(const long long _id, - const QueuedProcess::QueuedProcessDefinitions &_definitions, - const QString &_token); +QueuedResult +sendTaskEdit(const long long _id, + const QueuedProcess::QueuedProcessDefinitions &_definitions, + const QString &_token); /** * @brief send TaskStart * @param _id @@ -117,7 +126,7 @@ bool sendTaskEdit(const long long _id, * auth user token * @return true on successful task start */ -bool sendTaskStart(const long long _id, const QString &_token); +QueuedResult sendTaskStart(const long long _id, const QString &_token); /** * @brief send TaskStop * @param _id @@ -126,7 +135,7 @@ bool sendTaskStart(const long long _id, const QString &_token); * auth user token * @return true on successful task stop */ -bool sendTaskStop(const long long _id, const QString &_token); +QueuedResult sendTaskStop(const long long _id, const QString &_token); /** * @brief send UserAdd * @param _definitions @@ -135,8 +144,9 @@ bool sendTaskStop(const long long _id, const QString &_token); * auth user token * @return user ID or -1 if no user added */ -long long sendUserAdd(const QueuedUser::QueuedUserDefinitions &_definitions, - const QString &_token); +QueuedResult +sendUserAdd(const QueuedUser::QueuedUserDefinitions &_definitions, + const QString &_token); /** * @brief send UserEdit * @param _id @@ -147,9 +157,10 @@ long long sendUserAdd(const QueuedUser::QueuedUserDefinitions &_definitions, * auth user token * @return true on successful user edition */ -bool sendUserEdit(const long long _id, - const QueuedUser::QueuedUserDefinitions &_definitions, - const QString &_token); +QueuedResult +sendUserEdit(const long long _id, + const QueuedUser::QueuedUserDefinitions &_definitions, + const QString &_token); /** * @brief send UserPermissionsAdd * @param _id @@ -160,9 +171,10 @@ bool sendUserEdit(const long long _id, * auth user token * @return true on successful permission addition */ -bool sendUserPermissionAdd(const long long _id, - const QueuedEnums::Permission _permission, - const QString &_token); +QueuedResult +sendUserPermissionAdd(const long long _id, + const QueuedEnums::Permission _permission, + const QString &_token); /** * @brief send sendUserPermissionRemove * @param _id @@ -173,9 +185,10 @@ bool sendUserPermissionAdd(const long long _id, * auth user token * @return true on successful permission removal */ -bool sendUserPermissionRemove(const long long _id, - const QueuedEnums::Permission _permission, - const QString &_token); +QueuedResult +sendUserPermissionRemove(const long long _id, + const QueuedEnums::Permission _permission, + const QString &_token); // specific methods for properties /** * @brief get option @@ -183,14 +196,14 @@ bool sendUserPermissionRemove(const long long _id, * option name * @return option value */ -QVariant getOption(const QString &_property); +QueuedResult getOption(const QString &_property); /** * @brief get option * @param _property * option name * @return option value */ -QVariant getOption(const QueuedConfig::QueuedSettings _property); +QueuedResult getOption(const QueuedConfig::QueuedSettings _property); /** * @brief performance report * @param _from @@ -201,24 +214,21 @@ QVariant getOption(const QueuedConfig::QueuedSettings _property); * user auth token * @return list of user with used resources */ -QList getPerformance(const QDateTime &_from, const QDateTime &_to, - const QString &_token); +QueuedResult> getPerformance(const QDateTime &_from, + const QDateTime &_to, + const QString &_token); /** * @brief server status * @return server status information */ -QHash> getStatus(); +QueuedResult getStatus(); /** * @brief get all task properties * @param _id * task ID * @return task properties */ -QVariantHash getTask(const long long _id); -/** - * @return server status information - */ -QHash> getStatus(); +QueuedResult getTask(const long long _id); /** * @brief get task property * @param _id @@ -227,7 +237,7 @@ QHash> getStatus(); * task property name * @return task property value */ -QVariant getTask(const long long _id, const QString &_property); +QueuedResult getTask(const long long _id, const QString &_property); /** * @brief get tasks list * @param _user @@ -240,15 +250,17 @@ QVariant getTask(const long long _id, const QString &_property); * user auth token * @return list of task in database representation */ -QList getTasks(const long long _user, const QDateTime &_from, - const QDateTime &_to, const QString &_token); +QueuedResult> getTasks(const long long _user, + const QDateTime &_from, + const QDateTime &_to, + const QString &_token); /** * @brief get user properties * @param _id * user id * @return user properties */ -QVariantHash getUser(const long long _id); +QueuedResult getUser(const long long _id); /** * @brief get user property * @param _id @@ -257,7 +269,7 @@ QVariantHash getUser(const long long _id); * user property name * @return user property value */ -QVariant getUser(const long long _id, const QString &_property); +QueuedResult getUser(const long long _id, const QString &_property); /** * @brief get user ID * @param _name @@ -265,7 +277,7 @@ QVariant getUser(const long long _id, const QString &_property); * @return user ID or {0, -1} if no user found. If _name is numeric value it * returns converted one */ -long long getUserId(const QString &_name); +QueuedResult getUserId(const QString &_name); /** * @brief get users list * @param _lastLogged @@ -276,10 +288,49 @@ long long getUserId(const QString &_name); * user auth token * @return list of users in database representation */ -QList getUsers(const QDateTime &_lastLogged, - const QueuedEnums::Permission _permission, - const QString &_token); +QueuedResult> +getUsers(const QDateTime &_lastLogged, + const QueuedEnums::Permission _permission, const QString &_token); // common methods +/** + * @brief additional method to avoid conversion from QueuedResult to + * QDBusVariant + * @tparam T + * QueuedResult payload class + * @param _data + * input data + * @return converted data to QDBusVariant + */ +template QDBusVariant toDBusVariant(const QueuedResult &_data) +{ + return QDBusVariant(QVariant::fromValue>(_data)); +}; +/** + * @brief additional method to avoid conversion from QDBusVariant to + * QueuedResult + * @tparam T + * QueuedResult payload class + * @param _data + * input data + * @return converted data to QueuedResult + */ +template QueuedResult toResult(const QDBusVariant &_data) +{ + return qdbus_cast>(_data.variant().value()); +}; +/** + * @brief additional method to avoid conversion from QVariant to + * QueuedResult + * @tparam T + * QueuedResult payload class + * @param _data + * input data + * @return converted data to QueuedResult + */ +template QueuedResult toResult(const QVariant &_data) +{ + return qdbus_cast>(_data.value()); +}; /** * @brief common DBus request * @param _service @@ -294,16 +345,27 @@ QList getUsers(const QDateTime &_lastLogged, * command arguments * @return reply object from DBus request */ -QVariantList sendRequest(const QString &_service, const QString &_path, - const QString &_interface, const QString &_cmd, - const QVariantList &_args); -/** - * @brief additional method to avoid conversion from DBus type to native ones - * @param _data - * source data - * @return converted value - */ -QVariant toNativeType(const QVariant &_data); +template +QueuedResult sendRequest(const QString &_service, const QString &_path, + const QString &_interface, const QString &_cmd, + const QVariantList &_args) +{ + QDBusConnection bus = QDBusConnection::systemBus(); + QDBusMessage request + = QDBusMessage::createMethodCall(_service, _path, _interface, _cmd); + if (!_args.isEmpty()) + request.setArguments(_args); + + QDBusReply dbusResponse + = bus.call(request, QDBus::BlockWithGui); + + if (dbusResponse.isValid()) { + auto response = dbusResponse.value(); + return toResult(response); + } else { + return QueuedError(dbusResponse.error().message().toStdString()); + } +}; } diff --git a/sources/queued/include/queued/QueuedCoreInterface.h b/sources/queued/include/queued/QueuedCoreInterface.h index 38acab1..418abef 100644 --- a/sources/queued/include/queued/QueuedCoreInterface.h +++ b/sources/queued/include/queued/QueuedCoreInterface.h @@ -61,7 +61,7 @@ public slots: * user password * @return generated token ID or empty string in case of invalid password */ - QString Auth(const QString &name, const QString &password); + QDBusVariant Auth(const QString &name, const QString &password); /** * @brief edit option * @param key @@ -72,8 +72,15 @@ public slots: * auth user token * @return true on successful option edition */ - bool OptionEdit(const QString &key, const QDBusVariant &value, - const QString &token); + QDBusVariant OptionEdit(const QString &key, const QDBusVariant &value, + const QString &token); + /** + * @brief get password hash + * @param password + * user password as plain text + * @return hashed password + */ + QDBusVariant PasswordHash(const QString &password); /** * @brief add plugin * @param plugin @@ -82,7 +89,7 @@ public slots: * auth user token * @return true on successful plugin addition */ - bool PluginAdd(const QString &plugin, const QString &token); + QDBusVariant PluginAdd(const QString &plugin, const QString &token); /** * @brief remove plugin * @param plugin @@ -91,7 +98,7 @@ public slots: * auth user token * @return true on successful plugin removal */ - bool PluginRemove(const QString &plugin, const QString &token); + QDBusVariant PluginRemove(const QString &plugin, const QString &token); /** * @brief add new task * @param command @@ -116,11 +123,11 @@ public slots: * auth user token * @return task ID or -1 if no task added */ - qlonglong TaskAdd(const QString &command, const QStringList &arguments, - const QString &workingDirectory, const qlonglong user, - const qlonglong cpu, const qlonglong gpu, - const qlonglong memory, const qlonglong gpumemory, - const qlonglong storage, const QString &token); + QDBusVariant TaskAdd(const QString &command, const QStringList &arguments, + const QString &workingDirectory, const qlonglong user, + const qlonglong cpu, const qlonglong gpu, + const qlonglong memory, const qlonglong gpumemory, + const qlonglong storage, const QString &token); /** * @brief edit task * @param id @@ -153,13 +160,13 @@ public slots: * auth user token * @return true on successful task edition */ - bool TaskEdit(const qlonglong id, const QString &command, - const QStringList &arguments, const QString &directory, - const uint nice, const uint uid, const uint gid, - const qlonglong user, const qlonglong cpu, - const qlonglong gpu, const qlonglong memory, - const qlonglong gpumemory, const qlonglong storage, - const QString &token); + QDBusVariant TaskEdit(const qlonglong id, const QString &command, + const QStringList &arguments, + const QString &directory, const uint nice, + const uint uid, const uint gid, const qlonglong user, + const qlonglong cpu, const qlonglong gpu, + const qlonglong memory, const qlonglong gpumemory, + const qlonglong storage, const QString &token); /** * @brief force start task * @param id @@ -168,7 +175,7 @@ public slots: * auth user token * @return true on successful task start */ - bool TaskStart(const qlonglong id, const QString &token); + QDBusVariant TaskStart(const qlonglong id, const QString &token); /** * @brief force stop task * @param id @@ -177,14 +184,14 @@ public slots: * auth user token * @return true on successful task stop */ - bool TaskStop(const qlonglong id, const QString &token); + QDBusVariant TaskStop(const qlonglong id, const QString &token); /** * @brief try auth by token * @param token * token ID * @return true if token is valid */ - bool TryAuth(const QString &token); + QDBusVariant TryAuth(const QString &token); /** * @brief add new user * @param name @@ -209,11 +216,11 @@ public slots: * auth user token * @return user ID or -1 if no user found */ - qlonglong UserAdd(const QString &name, const QString &email, - const QString &password, const uint permissions, - const qlonglong cpu, const qlonglong gpu, - const qlonglong memory, const qlonglong gpumemory, - const qlonglong storage, const QString &token); + QDBusVariant UserAdd(const QString &name, const QString &email, + const QString &password, const uint permissions, + const qlonglong cpu, const qlonglong gpu, + const qlonglong memory, const qlonglong gpumemory, + const qlonglong storage, const QString &token); /** * @brief edit user * @param id @@ -238,11 +245,11 @@ public slots: * auth user token * @return true on successful user edition */ - bool UserEdit(const qlonglong id, const QString &name, - const QString &password, const QString &email, - const qlonglong cpu, const qlonglong gpu, - const qlonglong memory, const qlonglong gpumemory, - const qlonglong storage, const QString &token); + QDBusVariant UserEdit(const qlonglong id, const QString &name, + const QString &password, const QString &email, + const qlonglong cpu, const qlonglong gpu, + const qlonglong memory, const qlonglong gpumemory, + const qlonglong storage, const QString &token); /** * @brief add permission to user * @param id @@ -253,8 +260,8 @@ public slots: * auth user token * @return true on successful permission addition */ - bool UserPermissionAdd(const qlonglong id, const uint permission, - const QString &token); + QDBusVariant UserPermissionAdd(const qlonglong id, const uint permission, + const QString &token); /** * @brief remove permission from user * @param id @@ -265,8 +272,8 @@ public slots: * auth user token * @return true on successful permission removal */ - bool UserPermissionRemove(const qlonglong id, const uint permission, - const QString &token); + QDBusVariant UserPermissionRemove(const qlonglong id, const uint permission, + const QString &token); private: /** diff --git a/sources/queued/include/queued/QueuedDatabaseSchema.h b/sources/queued/include/queued/QueuedDatabaseSchema.h index 5bca573..ea67370 100644 --- a/sources/queued/include/queued/QueuedDatabaseSchema.h +++ b/sources/queued/include/queued/QueuedDatabaseSchema.h @@ -37,19 +37,19 @@ namespace QueuedDB /** * @brief settings table name */ -const char SETTINGS_TABLE[] = "settings"; +static const char SETTINGS_TABLE[] = "settings"; /** * @brief tasks table name */ -const char TASKS_TABLE[] = "tasks"; +static const char TASKS_TABLE[] = "tasks"; /** * @brief tokens table name */ -const char TOKENS_TABLE[] = "tokens"; +static const char TOKENS_TABLE[] = "tokens"; /** * @brief users table name */ -const char USERS_TABLE[] = "users"; +static const char USERS_TABLE[] = "users"; /** * @struct QueuedDBField * @brief describes database column @@ -76,7 +76,7 @@ typedef QHash> QueuedDBSchema; /** * @brief database schema */ -const QueuedDBSchema DBSchema = { +static const QueuedDBSchema DBSchema = { {SETTINGS_TABLE, {{"_id", {"_id", "INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE", QVariant::LongLong, diff --git a/sources/queued/include/queued/QueuedDebug.h b/sources/queued/include/queued/QueuedDebug.h index 8464467..d3a58f7 100644 --- a/sources/queued/include/queued/QueuedDebug.h +++ b/sources/queued/include/queued/QueuedDebug.h @@ -62,11 +62,12 @@ namespace QueuedDebug /** * @brief default log format */ -const char LOG_FORMAT[] = "[%{time " - "process}][%{if-debug}DD%{endif}%{if-info}II%{endif}%" - "{if-warning}WW%{endif}%{if-critical}CC%{endif}%{if-" - "fatal}FF%{endif}][%{category}][%{function}] " - "%{message}"; +static const char LOG_FORMAT[] + = "[%{time " + "process}][%{if-debug}DD%{endif}%{if-info}II%{endif}%" + "{if-warning}WW%{endif}%{if-critical}CC%{endif}%{if-" + "fatal}FF%{endif}][%{category}][%{function}] " + "%{message}"; /** * @brief method to apply log format */ diff --git a/sources/queued/include/queued/QueuedEnums.h b/sources/queued/include/queued/QueuedEnums.h index 7564dfe..6e16528 100644 --- a/sources/queued/include/queued/QueuedEnums.h +++ b/sources/queued/include/queued/QueuedEnums.h @@ -56,7 +56,7 @@ enum class Permission { }; Q_DECLARE_FLAGS(Permissions, Permission) Q_DECLARE_OPERATORS_FOR_FLAGS(Permissions) -const QHash PermissionMap = { +static const QHash PermissionMap = { {"superadmin", Permission::SuperAdmin}, {"admin", Permission::Admin}, {"job", Permission::Job}, @@ -71,7 +71,7 @@ const QHash PermissionMap = { inline Permission stringToPermission(const QString &_permission) { return PermissionMap.contains(_permission.toLower()) - ? PermissionMap[_permission.toLower()] + ? PermissionMap.value(_permission.toLower()) : Permission::Invalid; }; /** @@ -83,6 +83,23 @@ inline Permission stringToPermission(const QString &_permission) * send SIGKILL on exit */ enum class ExitAction { Terminate = 1 << 1, Kill = 1 << 2 }; +/** + * @enum ReturnStatus + * @brief DBus response status + * @var ReturnStatus::OK + * no errors in report + * @var ReturnStatus::Error + * generic error occurs + * @var ReturnStatus::InsufficientPermissions + * insufficient user permissions + */ +enum class ReturnStatus { + Error = 1 << 1, + InvalidArgument = 1 << 2, + InsufficientPermissions = 1 << 3, + InvalidToken = 1 << 4, + InvalidPassword = 1 << 5 +}; }; diff --git a/sources/queued/include/queued/QueuedPropertyInterface.h b/sources/queued/include/queued/QueuedPropertyInterface.h index 849c915..4df619c 100644 --- a/sources/queued/include/queued/QueuedPropertyInterface.h +++ b/sources/queued/include/queued/QueuedPropertyInterface.h @@ -86,7 +86,7 @@ public slots: * user name * @return user ID or -1 if no user found */ - qlonglong UserIdByName(const QString &name); + QDBusVariant UserIdByName(const QString &name); private: /** diff --git a/sources/queued/include/queued/QueuedResult.h b/sources/queued/include/queued/QueuedResult.h new file mode 100644 index 0000000..01d2f84 --- /dev/null +++ b/sources/queued/include/queued/QueuedResult.h @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2017 Queued team + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + */ +/** + * @file QueuedResult.h + * Header of Queued library + * @author Queued team + * @copyright MIT + * @bug https://github.com/arcan1s/queued/issues + */ + + +#ifndef QUEUEDRESULT_H +#define QUEUEDRESULT_H + +#include + +#include + +namespace QueuedEnums +{ +enum class ReturnStatus; +}; + +/** + * @typedef QueuedError + * custom result error implementation + */ +typedef Result::Error QueuedError; +/** + * @brief DBus marshalling method + * @param _argument + * output DBus argument + * @param _arg + * input error class + * @return appended argument body + */ +inline QDBusArgument &operator<<(QDBusArgument &_argument, + const QueuedError &_arg) +{ + _argument.beginStructure(); + _argument << QString(_arg.message().c_str()); + _argument << static_cast(_arg.code()); + _argument.endStructure(); + + return _argument; +}; +/** + * @brief DBus un-marshalling method + * @param _argument + * input DBus argument + * @param _arg + * output object + * @return source DBus argument + */ +inline const QDBusArgument &operator>>(const QDBusArgument &_argument, + QueuedError &_arg) +{ + QString message; + long long code; + + _argument.beginStructure(); + _argument >> message; + _argument >> code; + _argument.endStructure(); + + _arg = QueuedError(message.toStdString(), + static_cast(code)); + return _argument; +}; +/** + * @typedef QueuedStatusMap + * status report representation + */ +typedef QHash> QueuedStatusMap; +/** + * @typedef QueuedResult + * @tparam T + * result value payload class + * custom Result implementation + */ +template +using QueuedResult = Result::Result; +Q_DECLARE_METATYPE(QueuedResult) +Q_DECLARE_METATYPE(QueuedResult) +Q_DECLARE_METATYPE(QueuedResult) +Q_DECLARE_METATYPE(QueuedResult) +Q_DECLARE_METATYPE(QueuedResult) +Q_DECLARE_METATYPE(QueuedResult>) +Q_DECLARE_METATYPE(QueuedResult) +/** + * @brief DBus marshalling method + * @param _argument + * output DBus argument + * @param _arg + * input variant object + * @return appended argument body + */ +inline QDBusArgument &operator<<(QDBusArgument &_argument, const QVariant &_arg) +{ + return _argument << QDBusVariant(_arg.isValid() ? _arg : ""); +}; +/** + * @brief DBus un-marshalling method + * @param _argument + * input DBus argument + * @param _arg + * output variant object + * @return source DBus argument + */ +inline const QDBusArgument &operator>>(const QDBusArgument &_argument, + QVariant &_arg) +{ + QDBusVariant variant; + + _argument >> variant; + _arg = variant.variant(); + + return _argument; +}; +/** + * @brief DBus marshalling method + * @tparam T + * result value payload class + * @param _argument + * output DBus argument + * @param _arg + * input result object + * @return appended argument body + */ +template +inline QDBusArgument &operator<<(QDBusArgument &_argument, + const QueuedResult &_arg) +{ + // HACK we are using explicit cast to QString here to make sure of valid + // marshalling + _argument.beginStructure(); + switch (_arg.type()) { + case Result::Content::Value: + _argument << QString("v"); + _argument << _arg.get(); + _argument << QueuedError(); + break; + case Result::Content::Error: + _argument << QString("e"); + _argument << T(); + _argument << _arg.error(); + break; + case Result::Content::Empty: + _argument << QString("n"); + _argument << T(); + _argument << QueuedError(); + break; + } + _argument.endStructure(); + + return _argument; +}; +/** + * @brief DBus un-marshalling method + * @tparam T + * result value payload class + * @param _argument + * input DBus argument + * @param _arg + * output result object + * @return source DBus argument + */ +template +inline const QDBusArgument &operator>>(const QDBusArgument &_argument, + QueuedResult &_arg) +{ + QString type; + T value; + QueuedError error; + + _argument.beginStructure(); + _argument >> type; + _argument >> value; + _argument >> error; + _argument.endStructure(); + + if (type == "v") + _arg = value; + else if (type == "e") + _arg = error; + else if (type == "n") + _arg = QueuedResult(); + return _argument; +}; + + +#endif /* QUEUEDRESULT_H */ diff --git a/sources/queued/include/queued/QueuedStaticConfig.h b/sources/queued/include/queued/QueuedStaticConfig.h index 3309c81..1f1c2fc 100644 --- a/sources/queued/include/queued/QueuedStaticConfig.h +++ b/sources/queued/include/queued/QueuedStaticConfig.h @@ -44,10 +44,13 @@ namespace QueuedConfig * administrator user name * @var QueuedAdminSetup::password * administrator user password + * @var QueuedAdminSetup::salt + * user passwords salt */ typedef struct { QString name; QString password; + QString salt; } QueuedAdminSetup; /** * @struct QueuedDBSetup @@ -80,6 +83,8 @@ typedef struct { * unknown key * @var QueuedSettings::DatabaseInterval * database actions interval in msecs + * @var QueuedSettings::DatabaseVersion + * internal field to control current database version * @var QueuedSettings::DefaultLimits * default limits value * @var QueuedSettings::KeepTasks @@ -88,14 +93,10 @@ typedef struct { * keep users last logged in msecs * @var QueuedSettings::OnExitAction * on queued exit action enum - * @var QueuedSettings::TokenExpiration - * token expiration value in days - * @var QueuedSettings::DatabaseVersion - * internal field to control current database version - * @var QueuedSettings::ProcessCommandLine - * control process command line * @var QueuedSettings::Plugins * plugin list + * @var QueuedSettings::ProcessCommandLine + * control process command line * @var QueuedSettings::ServerAddress * queued server bind address * @var QueuedSettings::ServerMaxConnections @@ -104,22 +105,24 @@ typedef struct { * queued server bind port * @var QueuedSettings::ServerTimeout * server thread timeout + * @var QueuedSettings::TokenExpiration + * token expiration value in days */ enum class QueuedSettings { Invalid, DatabaseInterval, + DatabaseVersion, DefaultLimits, KeepTasks, KeepUsers, OnExitAction, - TokenExpiration, - DatabaseVersion, - ProcessCommandLine, Plugins, + ProcessCommandLine, ServerAddress, ServerMaxConnections, ServerPort, - ServerTimeout + ServerTimeout, + TokenExpiration }; /** * @struct QueuedSettingsField @@ -141,25 +144,25 @@ typedef QHash QueuedSettingsDefaultMap; /** * @brief default settings map */ -const QueuedSettingsDefaultMap QueuedSettingsDefaults = { +static const QueuedSettingsDefaultMap QueuedSettingsDefaults = { {"", {QueuedSettings::Invalid, QVariant()}}, {"DatabaseInterval", {QueuedSettings::DatabaseInterval, 86400000}}, + {"DatabaseVersion", + {QueuedSettings::DatabaseVersion, QueuedConfig::DATABASE_VERSION}}, {"DefaultLimits", {QueuedSettings::DefaultLimits, "0\n0\n0\n0\n0"}}, {"KeepTasks", {QueuedSettings::KeepTasks, 0}}, {"KeepUsers", {QueuedSettings::KeepUsers, 0}}, {"OnExitAction", {QueuedSettings::OnExitAction, 2}}, - {"TokenExpiration", {QueuedSettings::TokenExpiration, 30}}, - {"DatabaseVersion", - {QueuedSettings::DatabaseVersion, QueuedConfig::DATABASE_VERSION}}, + {"Plugins", {QueuedSettings::Plugins, ""}}, {"ProcessCommandLine", {QueuedSettings::ProcessCommandLine, "systemd-run\n--scope\n--unit={name}\n--uid={uid}\n--gid={gid}" "\n-p\nCPUQuota={cpu}%\n-p\nMemoryHigh={memory}\n{application}"}}, - {"Plugins", {QueuedSettings::Plugins, ""}}, {"ServerAddress", {QueuedSettings::ServerAddress, ""}}, {"ServerMaxConnections", {QueuedSettings::ServerMaxConnections, 30}}, {"ServerPort", {QueuedSettings::ServerPort, 8080}}, {"ServerTimeout", {QueuedSettings::ServerTimeout, -1}}, + {"TokenExpiration", {QueuedSettings::TokenExpiration, 30}}, }; }; diff --git a/sources/queued/include/queued/QueuedUser.h b/sources/queued/include/queued/QueuedUser.h index c92cc33..2e8c337 100644 --- a/sources/queued/include/queued/QueuedUser.h +++ b/sources/queued/include/queued/QueuedUser.h @@ -98,9 +98,12 @@ public: * @brief generates SHA512 hash from given password * @param _password * password as string + * @param _salt + * password salt if any * @return SHA512 of password */ - static QString hashFromPassword(const QString &_password); + static QString hashFromPassword(const QString &_password, + const QString &_salt); /** * @brief test user permissions * @param _permission @@ -117,9 +120,11 @@ public: * @brief check if password is valid * @param _password * password as string + * @param _salt + * password salt if any * @return true if password matches stored hash */ - bool isPasswordValid(const QString &_password) const; + bool isPasswordValid(const QString &_password, const QString &_salt) const; /** * @brief remove permissions from user * @param _permission diff --git a/sources/queued/include/queued/QueuedUserManager.h b/sources/queued/include/queued/QueuedUserManager.h index 0c7044a..29294fc 100644 --- a/sources/queued/include/queued/QueuedUserManager.h +++ b/sources/queued/include/queued/QueuedUserManager.h @@ -39,6 +39,7 @@ class QueuedTokenManager; class QueuedUserManager : public QObject { Q_OBJECT + Q_PROPERTY(QString salt READ salt WRITE setSalt) Q_PROPERTY( long long tokenExpiration READ tokenExpiration WRITE setTokenExpiration) @@ -144,11 +145,22 @@ public: */ QueuedUser *user(const QString &_name, const bool _isToken); // properties + /** + * @brief password salt if any + * @return password salt if any or empty string + */ + QString salt() const; /** * @brief token expiration * @return token expiration in days */ long long tokenExpiration() const; + /** + * @brief set password salt + * @param _salt + * new password salt + */ + void setSalt(const QString &_salt); /** * @brief set token expiration * @param _expiry @@ -167,6 +179,10 @@ signals: void userLoggedIn(const long long _id, const QDateTime &_time); private: + /** + * @brief password salt + */ + QString m_salt; /** * @brief token expiration in days */ diff --git a/sources/queued/src/CMakeLists.txt b/sources/queued/src/CMakeLists.txt index f232d36..03383e6 100644 --- a/sources/queued/src/CMakeLists.txt +++ b/sources/queued/src/CMakeLists.txt @@ -6,6 +6,7 @@ file (GLOB_RECURSE SUBPROJECT_HEADERS "*.h" "${PROJECT_LIBRARY_DIR}/*h") include_directories ("${PROJECT_LIBRARY_DIR}/include" "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_BINARY_DIR}" + "${PROJECT_TRDPARTY_DIR}" "${Qt_INCLUDE}") qt5_wrap_cpp (SUBPROJECT_MOC_SOURCES "${SUBPROJECT_HEADERS}") diff --git a/sources/queued/src/QueuedAdvancedSettings.cpp b/sources/queued/src/QueuedAdvancedSettings.cpp index bd45fa3..9602a78 100644 --- a/sources/queued/src/QueuedAdvancedSettings.cpp +++ b/sources/queued/src/QueuedAdvancedSettings.cpp @@ -16,7 +16,7 @@ * @file QueuedAdvancedSettings.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ diff --git a/sources/queued/src/QueuedControlGroupsAdaptor.cpp b/sources/queued/src/QueuedControlGroupsAdaptor.cpp index e3188f3..daa7592 100644 --- a/sources/queued/src/QueuedControlGroupsAdaptor.cpp +++ b/sources/queued/src/QueuedControlGroupsAdaptor.cpp @@ -16,7 +16,7 @@ * @file QueuedControlGroupsAdaptor.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ diff --git a/sources/queued/src/QueuedCore.cpp b/sources/queued/src/QueuedCore.cpp index 2a71f0f..2a51165 100644 --- a/sources/queued/src/QueuedCore.cpp +++ b/sources/queued/src/QueuedCore.cpp @@ -16,7 +16,7 @@ * @file QueuedCore.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ @@ -25,8 +25,11 @@ #include #include +#include +#include "../../3rdparty/result/result.hpp" #include +#include /** @@ -56,14 +59,16 @@ QueuedCore::~QueuedCore() /** * @fn addPlugin */ -bool QueuedCore::addPlugin(const QString &_plugin, const QString &_token) +QueuedResult QueuedCore::addPlugin(const QString &_plugin, + const QString &_token) { qCDebug(LOG_LIB) << "Add plugin" << _plugin; bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Admin); if (!isAdmin) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to add plugin"; - return false; + return QueuedError("Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } return editPluginPrivate(_plugin, true); @@ -73,7 +78,7 @@ bool QueuedCore::addPlugin(const QString &_plugin, const QString &_token) /** * @addTask */ -long long +QueuedResult QueuedCore::addTask(const QString &_command, const QStringList &_arguments, const QString &_workingDirectory, const long long _userId, const QueuedLimits::Limits &_limits, const QString &_token) @@ -84,7 +89,8 @@ QueuedCore::addTask(const QString &_command, const QStringList &_arguments, auto authUser = m_users->user(_token, true); if (!authUser) { qCWarning(LOG_LIB) << "Could not find auth user" << _token; - return false; + return QueuedError("Invalid token", + QueuedEnums::ReturnStatus::InvalidToken); } long long userAuthId = authUser->index(); long long actualUserId = (_userId == -1) ? userAuthId : _userId; @@ -96,13 +102,17 @@ QueuedCore::addTask(const QString &_command, const QStringList &_arguments, // it means that user places task as own one if (!isUser) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to add task"; - return -1; + return QueuedError( + "Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } } else { // user tries to place task as another one if (!isAdmin) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to add task"; - return -1; + return QueuedError( + "Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } } @@ -114,10 +124,10 @@ QueuedCore::addTask(const QString &_command, const QStringList &_arguments, /** * @fn addUser */ -long long QueuedCore::addUser(const QString &_name, const QString &_email, - const QString &_password, const uint _permissions, - const QueuedLimits::Limits &_limits, - const QString &_token) +QueuedResult +QueuedCore::addUser(const QString &_name, const QString &_email, + const QString &_password, const uint _permissions, + const QueuedLimits::Limits &_limits, const QString &_token) { qCDebug(LOG_LIB) << "Add user" << _name << "with email" << _email << "and permissions" << _permissions; @@ -126,14 +136,16 @@ long long QueuedCore::addUser(const QString &_name, const QString &_email, bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Admin); if (!isAdmin) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to add user"; - return -1; + return QueuedError("Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } // check if already exists auto userObj = user(_name); if (userObj) { qCWarning(LOG_LIB) << "User" << _name << "already exists"; - return -1; + return QueuedError("User already exists", + QueuedEnums::ReturnStatus::InvalidArgument); } return addUserPrivate(_name, _email, _password, _permissions, _limits); @@ -143,7 +155,7 @@ long long QueuedCore::addUser(const QString &_name, const QString &_email, /** * @fn authorization */ -bool QueuedCore::authorization(const QString &_token) +QueuedResult QueuedCore::authorization(const QString &_token) { bool status = false; m_users->checkToken(_token, &status); @@ -155,30 +167,33 @@ bool QueuedCore::authorization(const QString &_token) /** * @fn authorization */ -QString QueuedCore::authorization(const QString &_name, - const QString &_password) +QueuedResult QueuedCore::authorization(const QString &_name, + const QString &_password) { qCDebug(LOG_LIB) << "Authorize user" << _name; QString token = m_users->authorize(_name, _password); - if (!token.isEmpty()) { + if (token.isEmpty()) { + return QueuedError("Invalid username or password", + QueuedEnums::ReturnStatus::InvalidPassword); + } else { QVariantHash payload = {{"token", token}, {"user", _name}, {"validUntil", m_users->checkToken(token).toString(Qt::ISODateWithMs)}}; m_database->add(QueuedDB::TOKENS_TABLE, payload); + return token; } - - return token; } /** * @fn editOption */ -bool QueuedCore::editOption(const QString &_key, const QVariant &_value, - const QString &_token) +QueuedResult QueuedCore::editOption(const QString &_key, + const QVariant &_value, + const QString &_token) { qCDebug(LOG_LIB) << "Set key" << _key << "to" << _value; @@ -186,7 +201,8 @@ bool QueuedCore::editOption(const QString &_key, const QVariant &_value, bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Admin); if (!isAdmin) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to edit options"; - return false; + return QueuedError("Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } return editOptionPrivate(_key, _value); @@ -196,22 +212,25 @@ bool QueuedCore::editOption(const QString &_key, const QVariant &_value, /** * @fn editTask */ -bool QueuedCore::editTask(const long long _id, const QVariantHash &_taskData, - const QString &_token) +QueuedResult QueuedCore::editTask(const long long _id, + const QVariantHash &_taskData, + const QString &_token) { qCDebug(LOG_LIB) << "Edit task with ID" << _id; auto task = m_processes->process(_id); if (!task) { qCWarning(LOG_LIB) << "Could not find task with ID" << _id; - return false; + return QueuedError("Task does not exist", + QueuedEnums::ReturnStatus::InvalidArgument); } // check permissions auto authUser = m_users->user(_token, true); if (!authUser) { qCWarning(LOG_LIB) << "Could not find auth user" << _token; - return false; + return QueuedError("Invalid token", + QueuedEnums::ReturnStatus::InvalidToken); } long long userAuthId = authUser->index(); bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Admin); @@ -220,13 +239,17 @@ bool QueuedCore::editTask(const long long _id, const QVariantHash &_taskData, // it means that user edits own task if (!isUser) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to edit task"; - return false; + return QueuedError( + "Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } } else { // user tries to edit random task if (!isAdmin) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to edit task"; - return false; + return QueuedError( + "Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } } // only admin can edit run/stopped task @@ -234,7 +257,9 @@ bool QueuedCore::editTask(const long long _id, const QVariantHash &_taskData, if (!isAdmin) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to edit run/exited task"; - return false; + return QueuedError( + "Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } } @@ -250,29 +275,34 @@ bool QueuedCore::editTask(const long long _id, const QVariantHash &_taskData, /** * @fn editUser */ -bool QueuedCore::editUser(const long long _id, const QVariantHash &_userData, - const QString &_token) +QueuedResult QueuedCore::editUser(const long long _id, + const QVariantHash &_userData, + const QString &_token) { qCDebug(LOG_LIB) << "Edit user with ID" << _id; auto userObj = user(_id); if (!userObj) { qCWarning(LOG_LIB) << "Could not find user with ID" << _id; - return false; + return QueuedError("User does not exist", + QueuedEnums::ReturnStatus::InvalidArgument); } // check permissions auto authUser = m_users->user(_token, true); if (!authUser) { qCWarning(LOG_LIB) << "Could not find auth user" << _token; - return false; + return QueuedError("Invalid token", + QueuedEnums::ReturnStatus::InvalidToken); } long long userAuthId = authUser->index(); bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Admin); if (userAuthId != _id) { if (!isAdmin) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to edit user"; - return false; + return QueuedError( + "Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } } @@ -288,37 +318,42 @@ bool QueuedCore::editUser(const long long _id, const QVariantHash &_userData, /** * @fn editUserPermission */ -bool QueuedCore::editUserPermission(const long long _id, - const QueuedEnums::Permission &_permission, - const bool _add, const QString &_token) +QueuedResult +QueuedCore::editUserPermission(const long long _id, + const QueuedEnums::Permission &_permission, + const bool _add, const QString &_token) { qCDebug(LOG_LIB) << "Edit permissions" << static_cast(_permission) << "for user" << _id << "add" << _add; // check permissions - auto authUser = m_users->user(_token, true); - if (!authUser) { - qCWarning(LOG_LIB) << "Could not find auth user" << _token; - return false; - } - long long userAuthId = authUser->index(); bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Admin); - if (userAuthId != _id) { - if (!isAdmin) { - qCInfo(LOG_LIB) - << "User" << _token << "not allowed to edit permissions"; - return false; - } + if (!isAdmin) { + qCInfo(LOG_LIB) << "User" << _token + << "not allowed to edit permissions"; + return QueuedError("Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } return editUserPermissionPrivate(_id, _permission, _add); } +/** + * @fn hashFromPassword + */ +QueuedResult QueuedCore::hashFromPassword(const QString &_password) +{ + return _password.isEmpty() ? "" + : QueuedUser::hashFromPassword( + _password, m_settings->admin().salt); +} + + /** * @fn option */ -QVariant QueuedCore::option(const QString &_key) +QueuedResult QueuedCore::option(const QString &_key) { qCDebug(LOG_LIB) << "Look for option" << _key; @@ -329,9 +364,9 @@ QVariant QueuedCore::option(const QString &_key) /** * @fn performanceReport */ -QList QueuedCore::performanceReport(const QDateTime &_from, - const QDateTime &_to, - const QString &_token) const +QueuedResult> +QueuedCore::performanceReport(const QDateTime &_from, const QDateTime &_to, + const QString &_token) const { qCDebug(LOG_LIB) << "Get performance report for" << _from << _to; @@ -339,7 +374,8 @@ QList QueuedCore::performanceReport(const QDateTime &_from, auto authUser = m_users->user(_token, true); if (!authUser) { qCWarning(LOG_LIB) << "Could not find auth user" << _token; - return QList(); + return QueuedError("Invalid token", + QueuedEnums::ReturnStatus::InvalidToken); } long long userAuthId = authUser->index(); bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Reports); @@ -382,14 +418,16 @@ QVariantHash QueuedCore::pluginSettings(const QString &_plugin) /** * @fn removePlugin */ -bool QueuedCore::removePlugin(const QString &_plugin, const QString &_token) +QueuedResult QueuedCore::removePlugin(const QString &_plugin, + const QString &_token) { qCDebug(LOG_LIB) << "Remove plugin" << _plugin; bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Admin); if (!isAdmin) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to remove plugin"; - return false; + return QueuedError("Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } return editPluginPrivate(_plugin, false); @@ -399,7 +437,8 @@ bool QueuedCore::removePlugin(const QString &_plugin, const QString &_token) /** * @fn startTask */ -bool QueuedCore::startTask(const long long _id, const QString &_token) +QueuedResult QueuedCore::startTask(const long long _id, + const QString &_token) { qCDebug(LOG_LIB) << "Force start task with ID" << _id; @@ -407,14 +446,17 @@ bool QueuedCore::startTask(const long long _id, const QString &_token) auto authUser = m_users->user(_token, true); if (!authUser) { qCWarning(LOG_LIB) << "Could not find auth user" << _token; - return false; + return QueuedError("Invalid token", + QueuedEnums::ReturnStatus::InvalidToken); } long long userAuthId = authUser->index(); bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Admin); if (userAuthId != _id) { if (!isAdmin) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to start tasks"; - return false; + return QueuedError( + "Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } } @@ -427,21 +469,24 @@ bool QueuedCore::startTask(const long long _id, const QString &_token) /** * @fn stopTask */ -bool QueuedCore::stopTask(const long long _id, const QString &_token) +QueuedResult QueuedCore::stopTask(const long long _id, + const QString &_token) { qCDebug(LOG_LIB) << "Force stop task with ID" << _id; auto task = m_processes->process(_id); if (!task) { qCWarning(LOG_LIB) << "Could not find task with ID" << _id; - return false; + return QueuedError("Task does not exist", + QueuedEnums::ReturnStatus::InvalidArgument); } // check permissions auto authUser = m_users->user(_token, true); if (!authUser) { qCWarning(LOG_LIB) << "Could not find auth user" << _token; - return false; + return QueuedError("Invalid token", + QueuedEnums::ReturnStatus::InvalidToken); } long long userAuthId = authUser->index(); bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Admin); @@ -450,13 +495,17 @@ bool QueuedCore::stopTask(const long long _id, const QString &_token) // it means that user edits own task if (!isUser) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to stop task"; - return false; + return QueuedError( + "Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } } else { // user tries to edit random task if (!isAdmin) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to stop task"; - return false; + return QueuedError( + "Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } } @@ -480,10 +529,9 @@ const QueuedProcess *QueuedCore::task(const long long _id) const /** * @fn taskReport */ -QList QueuedCore::taskReport(const long long _user, - const QDateTime &_from, - const QDateTime &_to, - const QString &_token) const +QueuedResult> +QueuedCore::taskReport(const long long _user, const QDateTime &_from, + const QDateTime &_to, const QString &_token) const { qCDebug(LOG_LIB) << "Get tasks table by" << _user << _from << _to; @@ -491,7 +539,8 @@ QList QueuedCore::taskReport(const long long _user, auto authUser = m_users->user(_token, true); if (!authUser) { qCWarning(LOG_LIB) << "Could not find auth user" << _token; - return QList(); + return QueuedError("Invalid token", + QueuedEnums::ReturnStatus::InvalidToken); } long long userAuthId = authUser->index(); bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Reports); @@ -502,7 +551,9 @@ QList QueuedCore::taskReport(const long long _user, if (!isAdmin) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to get task report"; - return QList(); + return QueuedError( + "Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } } @@ -535,7 +586,7 @@ const QueuedUser *QueuedCore::user(const QString &_name) const /** * @fn userReport */ -QList +QueuedResult> QueuedCore::userReport(const QDateTime &_lastLogged, const QueuedEnums::Permission _permission, const QString &_token) const @@ -547,7 +598,8 @@ QueuedCore::userReport(const QDateTime &_lastLogged, bool isAdmin = m_users->authorize(_token, QueuedEnums::Permission::Reports); if (!isAdmin) { qCInfo(LOG_LIB) << "User" << _token << "not allowed to get user report"; - return QList(); + return QueuedError("Not allowed", + QueuedEnums::ReturnStatus::InsufficientPermissions); } return m_reports->users(_lastLogged, _permission); @@ -617,7 +669,7 @@ void QueuedCore::updateSettings(const QueuedConfig::QueuedSettings _id, qCDebug(LOG_LIB) << "Received update for" << static_cast(_id) << _key << "with value" << _value; - // FIXME propbably there is a better way to change settings + // FIXME probably there is a better way to change settings switch (_id) { case QueuedConfig::QueuedSettings::Invalid: // check if it is plugin settings @@ -827,7 +879,7 @@ void QueuedCore::initSettings(const QString &_configuration) m_settings->readConfiguration(); // init database now auto dbSetup = m_settings->db(); - m_database = initObject(m_database, dbSetup.path, dbSetup.driver); + m_database = initObject(m_database, dbSetup.path, dbSetup.driver); m_database->close(); bool status = m_database->open(dbSetup.hostname, dbSetup.port, dbSetup.username, dbSetup.password); @@ -870,6 +922,7 @@ void QueuedCore::initUsers() .toLongLong(); m_users = initObject(m_users); + m_users->setSalt(m_settings->admin().salt); m_users->setTokenExpiration(expiry); QString now = QDateTime::currentDateTimeUtc().toString(Qt::ISODateWithMs); auto dbTokens = m_database->get( @@ -888,11 +941,10 @@ void QueuedCore::initUsers() /** * @addTaskPrivate */ -long long QueuedCore::addTaskPrivate(const QString &_command, - const QStringList &_arguments, - const QString &_workingDirectory, - const long long _userId, - const QueuedLimits::Limits &_limits) +QueuedResult QueuedCore::addTaskPrivate( + const QString &_command, const QStringList &_arguments, + const QString &_workingDirectory, const long long _userId, + const QueuedLimits::Limits &_limits) { qCDebug(LOG_LIB) << "Add task" << _command << "with arguments" << _arguments << "from user" << _userId; @@ -902,7 +954,8 @@ long long QueuedCore::addTaskPrivate(const QString &_command, auto userObj = user(_userId); if (!userObj) { qCWarning(LOG_LIB) << "Could not find task user" << _userId; - return false; + return QueuedError("Invalid token", + QueuedEnums::ReturnStatus::InvalidToken); } auto taskLimits = QueuedLimits::minimalLimits( _limits, userObj->nativeLimits(), @@ -920,7 +973,7 @@ long long QueuedCore::addTaskPrivate(const QString &_command, auto id = m_database->add(QueuedDB::TASKS_TABLE, properties); if (id == -1) { qCWarning(LOG_LIB) << "Could not add task" << _command; - return id; + return QueuedError("", QueuedEnums::ReturnStatus::Error); } // add to child object @@ -936,11 +989,10 @@ long long QueuedCore::addTaskPrivate(const QString &_command, /** * @fn addUserPrivate */ -long long QueuedCore::addUserPrivate(const QString &_name, - const QString &_email, - const QString &_password, - const uint _permissions, - const QueuedLimits::Limits &_limits) +QueuedResult +QueuedCore::addUserPrivate(const QString &_name, const QString &_email, + const QString &_password, const uint _permissions, + const QueuedLimits::Limits &_limits) { qCDebug(LOG_LIB) << "Add user" << _name << "with email" << _email << "and permissions" << _permissions; @@ -953,7 +1005,7 @@ long long QueuedCore::addUserPrivate(const QString &_name, auto id = m_database->add(QueuedDB::USERS_TABLE, properties); if (id == -1) { qCWarning(LOG_LIB) << "Could not add user" << _name; - return id; + return QueuedError("", QueuedEnums::ReturnStatus::Error); } // add to child object @@ -969,7 +1021,8 @@ long long QueuedCore::addUserPrivate(const QString &_name, /** * @fn editOptionPrivate */ -bool QueuedCore::editOptionPrivate(const QString &_key, const QVariant &_value) +QueuedResult QueuedCore::editOptionPrivate(const QString &_key, + const QVariant &_value) { qCDebug(LOG_LIB) << "Set key" << _key << "to" << _value; @@ -1009,7 +1062,8 @@ bool QueuedCore::editOptionPrivate(const QString &_key, const QVariant &_value) /** * @fn editPluginPrivate */ -bool QueuedCore::editPluginPrivate(const QString &_plugin, const bool _add) +QueuedResult QueuedCore::editPluginPrivate(const QString &_plugin, + const bool _add) { qCDebug(LOG_LIB) << "Edit plugin" << _plugin << "add" << _add; @@ -1018,19 +1072,25 @@ bool QueuedCore::editPluginPrivate(const QString &_plugin, const bool _add) .toString() .split('\n'); - bool status = false; + QueuedResult r; if (_add && !pluginList.contains(_plugin)) { - status = m_plugins->loadPlugin(_plugin, pluginSettings(_plugin)); - pluginList.append(_plugin); + if (m_plugins->loadPlugin(_plugin, pluginSettings(_plugin))) { + pluginList.append(_plugin); + r = true; + } } else if (!_add && pluginList.contains(_plugin)) { - status = m_plugins->unloadPlugin(_plugin); - pluginList.removeAll(_plugin); + if (m_plugins->unloadPlugin(_plugin)) { + pluginList.removeAll(_plugin); + r = true; + } } else { qCDebug(LOG_LIB) << "Plugin" << _plugin << "not loaded or already loaded"; + r = QueuedError("Plugin is not loaded or already loaded", + QueuedEnums::ReturnStatus::Error); } - if (status) { + if (r.type() == Result::Content::Value) { editOptionPrivate(m_advancedSettings->internalId( QueuedConfig::QueuedSettings::Plugins), pluginList.join('\n')); @@ -1043,22 +1103,23 @@ bool QueuedCore::editPluginPrivate(const QString &_plugin, const bool _add) } } - return status; + return r; } /** * @fn editTaskPrivate */ -bool QueuedCore::editTaskPrivate(const long long _id, - const QVariantHash &_taskData) +QueuedResult QueuedCore::editTaskPrivate(const long long _id, + const QVariantHash &_taskData) { qCDebug(LOG_LIB) << "Edit task with ID" << _id; auto task = m_processes->process(_id); if (!task) { qCWarning(LOG_LIB) << "Could not find task with ID" << _id; - return false; + return QueuedError("Task does not exist", + QueuedEnums::ReturnStatus::InvalidArgument); } // modify record in database first @@ -1066,7 +1127,7 @@ bool QueuedCore::editTaskPrivate(const long long _id, if (!status) { qCWarning(LOG_LIB) << "Could not modify task record" << _id << "in database, do not edit it in memory"; - return false; + return QueuedError("", QueuedEnums::ReturnStatus::Error); } // modify values stored in memory @@ -1083,15 +1144,16 @@ bool QueuedCore::editTaskPrivate(const long long _id, /** * @fn editUserPrivate */ -bool QueuedCore::editUserPrivate(const long long _id, - const QVariantHash &_userData) +QueuedResult QueuedCore::editUserPrivate(const long long _id, + const QVariantHash &_userData) { qCDebug(LOG_LIB) << "Edit user with ID" << _id; auto userObj = m_users->user(_id); if (!userObj) { qCWarning(LOG_LIB) << "Could not find user with ID" << _id; - return false; + return QueuedError("User does not exist", + QueuedEnums::ReturnStatus::InvalidArgument); }; // modify record in database first @@ -1099,7 +1161,7 @@ bool QueuedCore::editUserPrivate(const long long _id, if (!status) { qCWarning(LOG_LIB) << "Could not modify user record" << _id << "in database, do not edit it in memory"; - return false; + return QueuedError("", QueuedEnums::ReturnStatus::Error); } // modify values stored in memory @@ -1116,7 +1178,7 @@ bool QueuedCore::editUserPrivate(const long long _id, /** * @fn editUserPermissionPrivate */ -bool QueuedCore::editUserPermissionPrivate( +QueuedResult QueuedCore::editUserPermissionPrivate( const long long _id, const QueuedEnums::Permission &_permission, const bool _add) { @@ -1126,14 +1188,15 @@ bool QueuedCore::editUserPermissionPrivate( auto userObj = m_users->user(_id); if (!userObj) { qCWarning(LOG_LIB) << "Could not find user with ID" << _id; - return false; + return QueuedError("User does not exist", + QueuedEnums::ReturnStatus::InvalidArgument); } // edit runtime permissions to get value auto perms = _add ? userObj->addPermission(_permission) : userObj->removePermission(_permission); auto permissions = static_cast(perms); - qCInfo(LOG_LIB) << "New user permissions" << perms << permissions; + qCInfo(LOG_LIB) << "New user permissions" << perms; // modify in database now QVariantHash payload = {{"permissions", permissions}}; @@ -1146,7 +1209,7 @@ bool QueuedCore::editUserPermissionPrivate( userObj->removePermission(_permission); else userObj->addPermission(_permission); - return false; + return QueuedError("", QueuedEnums::ReturnStatus::Error); } return true; diff --git a/sources/queued/src/QueuedCoreAdaptor.cpp b/sources/queued/src/QueuedCoreAdaptor.cpp index da07c35..6a473cd 100644 --- a/sources/queued/src/QueuedCoreAdaptor.cpp +++ b/sources/queued/src/QueuedCoreAdaptor.cpp @@ -16,104 +16,105 @@ * @file QueuedCoreAdaptor.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ #include -#include -#include - /** * @fn auth */ -bool QueuedCoreAdaptor::auth(const QString &_token) +QueuedResult QueuedCoreAdaptor::auth(const QString &_token) { QVariantList args = {_token}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "TryAuth", args) - .first() - .toBool(); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "TryAuth", args); } /** * @fn auth */ -QString QueuedCoreAdaptor::auth(const QString &_name, const QString &_password) +QueuedResult QueuedCoreAdaptor::auth(const QString &_name, + const QString &_password) { qCDebug(LOG_DBUS) << "Auth user" << _name; QVariantList args = {_name, _password}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "Auth", args) - .first() - .toString(); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "Auth", args); } /** * @fn sendOptionEdit */ -bool QueuedCoreAdaptor::sendOptionEdit(const QString &_key, - const QVariant &_value, - const QString &_token) +QueuedResult QueuedCoreAdaptor::sendOptionEdit(const QString &_key, + const QVariant &_value, + const QString &_token) { qCDebug(LOG_DBUS) << "Edit option" << _key << "to" << _value; QVariantList args = {_key, QVariant::fromValue(QDBusVariant(_value)), _token}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "OptionEdit", args) - .first() - .toBool(); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "OptionEdit", args); +} + + +/** + * @fn sendPasswordHash + */ +QueuedResult +QueuedCoreAdaptor::sendPasswordHash(const QString &_password) +{ + QVariantList args = {_password}; + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "Auth", args); } /** * @fn sendPluginAdd */ -bool QueuedCoreAdaptor::sendPluginAdd(const QString &_plugin, - const QString &_token) +QueuedResult QueuedCoreAdaptor::sendPluginAdd(const QString &_plugin, + const QString &_token) { qCDebug(LOG_DBUS) << "Add plugin" << _plugin; QVariantList args = {_plugin, _token}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "PluginAdd", args) - .first() - .toBool(); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "PluginAdd", args); } /** * @fn sendPluginRemove */ -bool QueuedCoreAdaptor::sendPluginRemove(const QString &_plugin, - const QString &_token) +QueuedResult QueuedCoreAdaptor::sendPluginRemove(const QString &_plugin, + const QString &_token) { qCDebug(LOG_DBUS) << "Remove plugin" << _plugin; QVariantList args = {_plugin, _token}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "PluginRemove", args) - .first() - .toBool(); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "PluginRemove", args); } /** * @fn sendTaskAdd */ -long long QueuedCoreAdaptor::sendTaskAdd( +QueuedResult QueuedCoreAdaptor::sendTaskAdd( const QueuedProcess::QueuedProcessDefinitions &_definitions, const QString &_token) { @@ -130,18 +131,16 @@ long long QueuedCoreAdaptor::sendTaskAdd( limits.gpumemory, limits.storage, _token}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "TaskAdd", args) - .first() - .toLongLong(); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "TaskAdd", args); } /** * @fn sendTaskEdit */ -bool QueuedCoreAdaptor::sendTaskEdit( +QueuedResult QueuedCoreAdaptor::sendTaskEdit( const long long _id, const QueuedProcess::QueuedProcessDefinitions &_definitions, const QString &_token) @@ -163,51 +162,46 @@ bool QueuedCoreAdaptor::sendTaskEdit( limits.gpumemory, limits.storage, _token}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "TaskEdit", args) - .first() - .toBool(); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "TaskEdit", args); } /** * @fn sendTaskStart */ -bool QueuedCoreAdaptor::sendTaskStart(const long long _id, - const QString &_token) +QueuedResult QueuedCoreAdaptor::sendTaskStart(const long long _id, + const QString &_token) { qCDebug(LOG_DBUS) << "Start task" << _id; QVariantList args = {_id, _token}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "TaskStart", args) - .first() - .toBool(); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "TaskStart", args); } /** * @fn sendTaskStop */ -bool QueuedCoreAdaptor::sendTaskStop(const long long _id, const QString &_token) +QueuedResult QueuedCoreAdaptor::sendTaskStop(const long long _id, + const QString &_token) { qCDebug(LOG_DBUS) << "Stop task" << _id; QVariantList args = {_id, _token}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "TaskStop", args) - .first() - .toBool(); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "TaskStop", args); } /** * @fn sendUserAdd */ -long long QueuedCoreAdaptor::sendUserAdd( +QueuedResult QueuedCoreAdaptor::sendUserAdd( const QueuedUser::QueuedUserDefinitions &_definitions, const QString &_token) { @@ -224,18 +218,16 @@ long long QueuedCoreAdaptor::sendUserAdd( limits.gpumemory, limits.storage, _token}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "UserAdd", args) - .first() - .toLongLong(); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "UserAdd", args); } /** * @fn sendUserEdit */ -bool QueuedCoreAdaptor::sendUserEdit( +QueuedResult QueuedCoreAdaptor::sendUserEdit( const long long _id, const QueuedUser::QueuedUserDefinitions &_definitions, const QString &_token) { @@ -252,18 +244,16 @@ bool QueuedCoreAdaptor::sendUserEdit( limits.gpumemory, limits.storage, _token}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "UserEdit", args) - .first() - .toBool(); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "UserEdit", args); } /** * @fn sendUserPermissionAdd */ -bool QueuedCoreAdaptor::sendUserPermissionAdd( +QueuedResult QueuedCoreAdaptor::sendUserPermissionAdd( const long long _id, const QueuedEnums::Permission _permission, const QString &_token) { @@ -271,18 +261,16 @@ bool QueuedCoreAdaptor::sendUserPermissionAdd( << "to" << _id; QVariantList args = {_id, static_cast(_permission), _token}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "UserPermissionAdd", args) - .first() - .toBool(); + return sendRequest( + QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "UserPermissionAdd", args); } /** * @fn sendUserPermissionRemove */ -bool QueuedCoreAdaptor::sendUserPermissionRemove( +QueuedResult QueuedCoreAdaptor::sendUserPermissionRemove( const long long _id, const QueuedEnums::Permission _permission, const QString &_token) { @@ -290,33 +278,30 @@ bool QueuedCoreAdaptor::sendUserPermissionRemove( << "from" << _id; QVariantList args = {_id, static_cast(_permission), _token}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_OBJECT_PATH, - QueuedConfig::DBUS_SERVICE, "UserPermissionRemove", args) - .first() - .toBool(); + return sendRequest( + QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_OBJECT_PATH, + QueuedConfig::DBUS_SERVICE, "UserPermissionRemove", args); } /** * @fn getOption */ -QVariant QueuedCoreAdaptor::getOption(const QString &_property) +QueuedResult QueuedCoreAdaptor::getOption(const QString &_property) { qCDebug(LOG_DBUS) << "Get option" << _property; QVariantList args = {_property}; - return toNativeType(sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_PROPERTY_PATH, - QueuedConfig::DBUS_SERVICE, "Option", args) - .first()); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_PROPERTY_PATH, + QueuedConfig::DBUS_SERVICE, "Option", args); } /** * @fn getOption */ -QVariant +QueuedResult QueuedCoreAdaptor::getOption(const QueuedConfig::QueuedSettings _property) { qCDebug(LOG_DBUS) << "Get option" << static_cast(_property); @@ -328,110 +313,122 @@ QueuedCoreAdaptor::getOption(const QueuedConfig::QueuedSettings _property) /** * @fn getPerformance */ -QList QueuedCoreAdaptor::getPerformance(const QDateTime &_from, - const QDateTime &_to, - const QString &_token) +QueuedResult> +QueuedCoreAdaptor::getPerformance(const QDateTime &_from, const QDateTime &_to, + const QString &_token) { qCDebug(LOG_DBUS) << "Get performance report for" << _from << _to; QVariantList args = {_from.toString(Qt::ISODateWithMs), _to.toString(Qt::ISODateWithMs), _token}; - return qdbus_cast>(toNativeType( - sendRequest(QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_REPORTS_PATH, - QueuedConfig::DBUS_SERVICE, "Performance", args) - .first())); + return sendRequest>( + QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_REPORTS_PATH, + QueuedConfig::DBUS_SERVICE, "Performance", args); } /** * @fn getStatus */ -QHash> QueuedCoreAdaptor::getStatus() +QueuedResult QueuedCoreAdaptor::getStatus() { - return qdbus_cast>>(toNativeType( - sendRequest(QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_REPORTS_PATH, - QueuedConfig::DBUS_SERVICE, "Status", {}) - .first())); + return sendRequest( + QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_REPORTS_PATH, + QueuedConfig::DBUS_SERVICE, "Status", {}); } /** * @fn getTask */ -QVariantHash QueuedCoreAdaptor::getTask(const long long _id) +QueuedResult QueuedCoreAdaptor::getTask(const long long _id) { qCDebug(LOG_DBUS) << "Get task properties" << _id; - return qdbus_cast(getTask(_id, "")); + auto res = getTask(_id, ""); + + QueuedResult output; + Result::match(res, + [&output](const QVariant &val) { + output = toResult(val); + }, + [&output](const QueuedError &err) { output = err; }); + + return output; } /** * @fn getTask */ -QVariant QueuedCoreAdaptor::getTask(const long long _id, - const QString &_property) +QueuedResult QueuedCoreAdaptor::getTask(const long long _id, + const QString &_property) { qCDebug(LOG_DBUS) << "Get task property" << _id << _property; QVariantList args = {_id, _property}; - return toNativeType(sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_PROPERTY_PATH, - QueuedConfig::DBUS_SERVICE, "Task", args) - .first()); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_PROPERTY_PATH, + QueuedConfig::DBUS_SERVICE, "Task", args); } /** * @fn getTasks */ -QList QueuedCoreAdaptor::getTasks(const long long _user, - const QDateTime &_from, - const QDateTime &_to, - const QString &_token) +QueuedResult> +QueuedCoreAdaptor::getTasks(const long long _user, const QDateTime &_from, + const QDateTime &_to, const QString &_token) { qCDebug(LOG_DBUS) << "Get tasks list for" << _user << _from << _to; QVariantList args = {_user, _from.toString(Qt::ISODateWithMs), _to.toString(Qt::ISODateWithMs), _token}; - return qdbus_cast>(toNativeType( - sendRequest(QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_REPORTS_PATH, - QueuedConfig::DBUS_SERVICE, "Tasks", args) - .first())); + return sendRequest>( + QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_REPORTS_PATH, + QueuedConfig::DBUS_SERVICE, "Tasks", args); } /** * @fn getUser */ -QVariantHash QueuedCoreAdaptor::getUser(const long long _id) +QueuedResult QueuedCoreAdaptor::getUser(const long long _id) { qCDebug(LOG_DBUS) << "Get user property" << _id; - return qdbus_cast(getUser(_id, "")); + auto res = getUser(_id, ""); + + QueuedResult output; + Result::match(res, + [&output](const QVariant &val) { + output = toResult(val); + }, + [&output](const QueuedError &err) { output = err; }); + + return output; } /** * @fn getUser */ -QVariant QueuedCoreAdaptor::getUser(const long long _id, - const QString &_property) +QueuedResult QueuedCoreAdaptor::getUser(const long long _id, + const QString &_property) { qCDebug(LOG_DBUS) << "Get user property" << _id << _property; QVariantList args = {_id, _property}; - return toNativeType(sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_PROPERTY_PATH, - QueuedConfig::DBUS_SERVICE, "User", args) - .first()); + return sendRequest(QueuedConfig::DBUS_SERVICE, + QueuedConfig::DBUS_PROPERTY_PATH, + QueuedConfig::DBUS_SERVICE, "User", args); } /** * @fn getUserId */ -long long QueuedCoreAdaptor::getUserId(const QString &_name) +QueuedResult QueuedCoreAdaptor::getUserId(const QString &_name) { qCDebug(LOG_DBUS) << "Get user ID for" << _name; @@ -441,18 +438,16 @@ long long QueuedCoreAdaptor::getUserId(const QString &_name) return stringToLong; QVariantList args = {_name}; - return sendRequest(QueuedConfig::DBUS_SERVICE, - QueuedConfig::DBUS_PROPERTY_PATH, - QueuedConfig::DBUS_SERVICE, "UserIdByName", args) - .first() - .toLongLong(); + return sendRequest( + QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_PROPERTY_PATH, + QueuedConfig::DBUS_SERVICE, "UserIdByName", args); } /** * @fn getUsers */ -QList +QueuedResult> QueuedCoreAdaptor::getUsers(const QDateTime &_lastLogged, const QueuedEnums::Permission _permission, const QString &_token) @@ -462,47 +457,7 @@ QueuedCoreAdaptor::getUsers(const QDateTime &_lastLogged, QVariantList args = {_lastLogged.toString(Qt::ISODateWithMs), static_cast(_permission), _token}; - return qdbus_cast>(toNativeType( - sendRequest(QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_REPORTS_PATH, - QueuedConfig::DBUS_SERVICE, "Users", args) - .first())); -} - - -/** - * @fn sendRequest - */ -QVariantList QueuedCoreAdaptor::sendRequest(const QString &_service, - const QString &_path, - const QString &_interface, - const QString &_cmd, - const QVariantList &_args) -{ - qCDebug(LOG_DBUS) << "Send request to service" << _service << "by interface" - << _interface << "to" << _path << "command" << _cmd - << "with args" << _args; - - QDBusConnection bus = QDBusConnection::systemBus(); - QDBusMessage request - = QDBusMessage::createMethodCall(_service, _path, _interface, _cmd); - if (!_args.isEmpty()) - request.setArguments(_args); - - QDBusMessage response = bus.call(request, QDBus::BlockWithGui); - QVariantList arguments = response.arguments(); - - QString error = response.errorMessage(); - if (!error.isEmpty()) - qCWarning(LOG_DBUS) << "Error message" << error; - - return arguments; -} - - -/** - * @fn toNativeType - */ -QVariant QueuedCoreAdaptor::toNativeType(const QVariant &_data) -{ - return _data.value().variant(); + return sendRequest>( + QueuedConfig::DBUS_SERVICE, QueuedConfig::DBUS_REPORTS_PATH, + QueuedConfig::DBUS_SERVICE, "Users", args); } diff --git a/sources/queued/src/QueuedCoreInterface.cpp b/sources/queued/src/QueuedCoreInterface.cpp index 852c617..5bdf4b4 100644 --- a/sources/queued/src/QueuedCoreInterface.cpp +++ b/sources/queued/src/QueuedCoreInterface.cpp @@ -16,13 +16,15 @@ * @file QueuedCoreInterface.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ #include +#include + /** * @class QueuedCoreInterface @@ -35,6 +37,15 @@ QueuedCoreInterface::QueuedCoreInterface(QueuedCore *parent) , m_core(parent) { qCDebug(LOG_DBUS) << __PRETTY_FUNCTION__; + + qRegisterMetaType>("QueuedResult"); + qDBusRegisterMetaType>(); + + qRegisterMetaType>("QueuedResult"); + qDBusRegisterMetaType>(); + + qRegisterMetaType>("QueuedResult"); + qDBusRegisterMetaType>(); } @@ -50,54 +61,68 @@ QueuedCoreInterface::~QueuedCoreInterface() /** * @fn Auth */ -QString QueuedCoreInterface::Auth(const QString &name, const QString &password) +QDBusVariant QueuedCoreInterface::Auth(const QString &name, + const QString &password) { qCDebug(LOG_DBUS) << "Authorize user" << name; - return m_core->authorization(name, password); + return QueuedCoreAdaptor::toDBusVariant( + m_core->authorization(name, password)); } /** * @fn OptionEdit */ -bool QueuedCoreInterface::OptionEdit(const QString &key, - const QDBusVariant &value, - const QString &token) +QDBusVariant QueuedCoreInterface::OptionEdit(const QString &key, + const QDBusVariant &value, + const QString &token) { qCDebug(LOG_DBUS) << "Edit option" << key << value.variant(); - return m_core->editOption(key, value.variant(), token); + return QueuedCoreAdaptor::toDBusVariant( + m_core->editOption(key, value.variant(), token)); +} + + +/** + * @fn PasswordHash + */ +QDBusVariant QueuedCoreInterface::PasswordHash(const QString &password) +{ + return QueuedCoreAdaptor::toDBusVariant(m_core->hashFromPassword(password)); } /** * @fn PluginAdd */ -bool QueuedCoreInterface::PluginAdd(const QString &plugin, const QString &token) +QDBusVariant QueuedCoreInterface::PluginAdd(const QString &plugin, + const QString &token) { qCDebug(LOG_DBUS) << "Add plugin" << plugin; - return m_core->addPlugin(plugin, token); + return QueuedCoreAdaptor::toDBusVariant(m_core->addPlugin(plugin, token)); } /** * @fn PluginRemove */ -bool QueuedCoreInterface::PluginRemove(const QString &plugin, - const QString &token) +QDBusVariant QueuedCoreInterface::PluginRemove(const QString &plugin, + const QString &token) { qCDebug(LOG_DBUS) << "Remove plugin" << plugin; - return m_core->removePlugin(plugin, token); + return QueuedCoreAdaptor::toDBusVariant( + m_core->removePlugin(plugin, token)); } /** * @fn TaskAdd */ -qlonglong QueuedCoreInterface::TaskAdd( +QDBusVariant QueuedCoreInterface::TaskAdd( const QString &command, const QStringList &arguments, const QString &workingDirectory, const qlonglong user, const qlonglong cpu, const qlonglong gpu, const qlonglong memory, const qlonglong gpumemory, @@ -106,16 +131,16 @@ qlonglong QueuedCoreInterface::TaskAdd( qCDebug(LOG_DBUS) << "Add new task with parameters" << command << arguments << workingDirectory << "from user" << user; - return m_core->addTask( + return QueuedCoreAdaptor::toDBusVariant(m_core->addTask( command, arguments, workingDirectory, user, - QueuedLimits::Limits(cpu, gpu, memory, gpumemory, storage), token); + QueuedLimits::Limits(cpu, gpu, memory, gpumemory, storage), token)); } /** * @fn TaskEdit */ -bool QueuedCoreInterface::TaskEdit( +QDBusVariant QueuedCoreInterface::TaskEdit( const qlonglong id, const QString &command, const QStringList &arguments, const QString &directory, const uint nice, const uint uid, const uint gid, const qlonglong user, const qlonglong cpu, const qlonglong gpu, @@ -129,7 +154,9 @@ bool QueuedCoreInterface::TaskEdit( auto task = m_core->task(id); if (!task) { qCWarning(LOG_DBUS) << "Could not find task" << id; - return false; + return QueuedCoreAdaptor::toDBusVariant(QueuedResult( + QueuedError("Task does not exist", + QueuedEnums::ReturnStatus::InvalidArgument))); } // build payload @@ -162,45 +189,47 @@ bool QueuedCoreInterface::TaskEdit( limits.storage = storage; data["limits"] = limits.toString(); - return m_core->editTask(id, data, token); + return QueuedCoreAdaptor::toDBusVariant(m_core->editTask(id, data, token)); } /** * @fn TaskStart */ -bool QueuedCoreInterface::TaskStart(const qlonglong id, const QString &token) +QDBusVariant QueuedCoreInterface::TaskStart(const qlonglong id, + const QString &token) { qCDebug(LOG_DBUS) << "Force start task" << id; - return m_core->startTask(id, token); + return QueuedCoreAdaptor::toDBusVariant(m_core->startTask(id, token)); } /** * @fn TaskStop */ -bool QueuedCoreInterface::TaskStop(const qlonglong id, const QString &token) +QDBusVariant QueuedCoreInterface::TaskStop(const qlonglong id, + const QString &token) { qCDebug(LOG_DBUS) << "Force stop task" << id; - return m_core->stopTask(id, token); + return QueuedCoreAdaptor::toDBusVariant(m_core->stopTask(id, token)); } /** * @fn TryAuth */ -bool QueuedCoreInterface::TryAuth(const QString &token) +QDBusVariant QueuedCoreInterface::TryAuth(const QString &token) { - return m_core->authorization(token); + return QueuedCoreAdaptor::toDBusVariant(m_core->authorization(token)); } /** * @fn UserAdd */ -qlonglong +QDBusVariant QueuedCoreInterface::UserAdd(const QString &name, const QString &email, const QString &password, const uint permissions, const qlonglong cpu, const qlonglong gpu, @@ -210,22 +239,21 @@ QueuedCoreInterface::UserAdd(const QString &name, const QString &email, qCDebug(LOG_DBUS) << "Add new user with paramaters" << name << email << permissions; - return m_core->addUser( + return QueuedCoreAdaptor::toDBusVariant(m_core->addUser( name, email, password, permissions, - QueuedLimits::Limits(cpu, gpu, memory, gpumemory, storage), token); + QueuedLimits::Limits(cpu, gpu, memory, gpumemory, storage), token)); } /** * @fn UserEdit */ -bool QueuedCoreInterface::UserEdit(const qlonglong id, const QString &name, - const QString &password, - const QString &email, const qlonglong cpu, - const qlonglong gpu, const qlonglong memory, - const qlonglong gpumemory, - const qlonglong storage, - const QString &token) +QDBusVariant +QueuedCoreInterface::UserEdit(const qlonglong id, const QString &name, + const QString &password, const QString &email, + const qlonglong cpu, const qlonglong gpu, + const qlonglong memory, const qlonglong gpumemory, + const qlonglong storage, const QString &token) { qCDebug(LOG_DBUS) << "Edit user" << id << name << email << cpu << gpu << memory << gpumemory << storage; @@ -234,7 +262,9 @@ bool QueuedCoreInterface::UserEdit(const qlonglong id, const QString &name, auto user = m_core->user(id); if (!user) { qCWarning(LOG_DBUS) << "Could not find user" << id; - return false; + return QueuedCoreAdaptor::toDBusVariant(QueuedResult( + QueuedError("User does not exist", + QueuedEnums::ReturnStatus::InvalidArgument))); } // build payload @@ -259,33 +289,33 @@ bool QueuedCoreInterface::UserEdit(const qlonglong id, const QString &name, limits.storage = storage; data["limits"] = limits.toString(); - return m_core->editUser(id, data, token); + return QueuedCoreAdaptor::toDBusVariant(m_core->editUser(id, data, token)); } /** * @fn UserPermissionAdd */ -bool QueuedCoreInterface::UserPermissionAdd(const qlonglong id, - const uint permission, - const QString &token) +QDBusVariant QueuedCoreInterface::UserPermissionAdd(const qlonglong id, + const uint permission, + const QString &token) { qCDebug(LOG_DBUS) << "Add permission" << permission << "to user" << id; - return m_core->editUserPermission( - id, static_cast(permission), true, token); + return QueuedCoreAdaptor::toDBusVariant(m_core->editUserPermission( + id, static_cast(permission), true, token)); } /** * @fn UserPermissionRemove */ -bool QueuedCoreInterface::UserPermissionRemove(const qlonglong id, - const uint permission, - const QString &token) +QDBusVariant QueuedCoreInterface::UserPermissionRemove(const qlonglong id, + const uint permission, + const QString &token) { qCDebug(LOG_DBUS) << "Remove permission" << permission << "from user" << id; - return m_core->editUserPermission( - id, static_cast(permission), false, token); + return QueuedCoreAdaptor::toDBusVariant(m_core->editUserPermission( + id, static_cast(permission), false, token)); } diff --git a/sources/queued/src/QueuedDatabase.cpp b/sources/queued/src/QueuedDatabase.cpp index 336e9f3..8d25a5b 100644 --- a/sources/queued/src/QueuedDatabase.cpp +++ b/sources/queued/src/QueuedDatabase.cpp @@ -16,7 +16,7 @@ * @file QueuedDatabase.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ diff --git a/sources/queued/src/QueuedDatabaseManager.cpp b/sources/queued/src/QueuedDatabaseManager.cpp index 666d0eb..c715377 100644 --- a/sources/queued/src/QueuedDatabaseManager.cpp +++ b/sources/queued/src/QueuedDatabaseManager.cpp @@ -16,7 +16,7 @@ * @file QueuedDatabaseManager.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ diff --git a/sources/queued/src/QueuedDebug.cpp b/sources/queued/src/QueuedDebug.cpp index 17e9440..663f970 100644 --- a/sources/queued/src/QueuedDebug.cpp +++ b/sources/queued/src/QueuedDebug.cpp @@ -16,7 +16,7 @@ * @file QueuedDebug.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ diff --git a/sources/queued/src/QueuedLimits.cpp b/sources/queued/src/QueuedLimits.cpp index fd64257..2d0021b 100644 --- a/sources/queued/src/QueuedLimits.cpp +++ b/sources/queued/src/QueuedLimits.cpp @@ -16,7 +16,7 @@ * @file QueuedLimits.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ diff --git a/sources/queued/src/QueuedPluginManager.cpp b/sources/queued/src/QueuedPluginManager.cpp index b0bc4d3..e7dba74 100644 --- a/sources/queued/src/QueuedPluginManager.cpp +++ b/sources/queued/src/QueuedPluginManager.cpp @@ -16,7 +16,7 @@ * @file QueuedPluginManager.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ diff --git a/sources/queued/src/QueuedProcess.cpp b/sources/queued/src/QueuedProcess.cpp index 02c7273..e672f16 100644 --- a/sources/queued/src/QueuedProcess.cpp +++ b/sources/queued/src/QueuedProcess.cpp @@ -16,7 +16,7 @@ * @file QueuedProcess.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ diff --git a/sources/queued/src/QueuedProcessManager.cpp b/sources/queued/src/QueuedProcessManager.cpp index f2714dc..9f160cc 100644 --- a/sources/queued/src/QueuedProcessManager.cpp +++ b/sources/queued/src/QueuedProcessManager.cpp @@ -16,7 +16,7 @@ * @file QueuedProcessManager.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ diff --git a/sources/queued/src/QueuedPropertyInterface.cpp b/sources/queued/src/QueuedPropertyInterface.cpp index 750df5e..38f413e 100644 --- a/sources/queued/src/QueuedPropertyInterface.cpp +++ b/sources/queued/src/QueuedPropertyInterface.cpp @@ -16,13 +16,14 @@ * @file QueuedPropertyInterface.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ #include +#include #include @@ -37,6 +38,9 @@ QueuedPropertyInterface::QueuedPropertyInterface(QueuedCore *parent) , m_core(parent) { qCDebug(LOG_DBUS) << __PRETTY_FUNCTION__; + + qRegisterMetaType>("QueuedResult"); + qDBusRegisterMetaType>(); } @@ -56,8 +60,7 @@ QDBusVariant QueuedPropertyInterface::Option(const QString &property) { qCDebug(LOG_DBUS) << "Get property" << property; - auto response = m_core->option(property); - return QDBusVariant(response.isValid() ? response : ""); + return QueuedCoreAdaptor::toDBusVariant(m_core->option(property)); } @@ -72,17 +75,21 @@ QDBusVariant QueuedPropertyInterface::Task(const long long id, auto task = m_core->task(id); if (!task) { qCWarning(LOG_DBUS) << "Could not find task" << id; - return QDBusVariant(""); + return QueuedCoreAdaptor::toDBusVariant(QueuedResult( + QueuedError("Task does not exist", + QueuedEnums::ReturnStatus::InvalidArgument))); } if (property.isEmpty()) { auto response = QVariant::fromValue(getProperties(task)); - return QDBusVariant(response); + return QueuedCoreAdaptor::toDBusVariant( + QueuedResult(response)); } else { auto response = task->property(qPrintable(property)); if (response.type() == QVariant::DateTime) response = response.toDateTime().toString(Qt::ISODateWithMs); - return QDBusVariant(response.isValid() ? response : ""); + return QueuedCoreAdaptor::toDBusVariant( + QueuedResult(response)); } } @@ -98,17 +105,21 @@ QDBusVariant QueuedPropertyInterface::User(const long long id, auto user = m_core->user(id); if (!user) { qCWarning(LOG_DBUS) << "Could not find user" << id; - return QDBusVariant(""); + return QueuedCoreAdaptor::toDBusVariant(QueuedResult( + QueuedError("User does not exist", + QueuedEnums::ReturnStatus::InvalidArgument))); } if (property.isEmpty()) { auto response = QVariant::fromValue(getProperties(user)); - return QDBusVariant(response); + return QueuedCoreAdaptor::toDBusVariant( + QueuedResult(response)); } else { auto response = user->property(qPrintable(property)); if (response.type() == QVariant::DateTime) response = response.toDateTime().toString(Qt::ISODateWithMs); - return QDBusVariant(response.isValid() ? response : ""); + return QueuedCoreAdaptor::toDBusVariant( + QueuedResult(response)); } } @@ -116,17 +127,20 @@ QDBusVariant QueuedPropertyInterface::User(const long long id, /** * @fn UserIdByName */ -qlonglong QueuedPropertyInterface::UserIdByName(const QString &name) +QDBusVariant QueuedPropertyInterface::UserIdByName(const QString &name) { qCDebug(LOG_DBUS) << "Look for user ID" << name; auto user = m_core->user(name); if (!user) { qCWarning(LOG_DBUS) << "Could not find user" << name; - return -1; + return QueuedCoreAdaptor::toDBusVariant(QueuedResult( + QueuedError("User does not exist", + QueuedEnums::ReturnStatus::InvalidArgument))); } - return user->index(); + return QueuedCoreAdaptor::toDBusVariant( + QueuedResult(user->index())); } diff --git a/sources/queued/src/QueuedReportInterface.cpp b/sources/queued/src/QueuedReportInterface.cpp index ea3027c..93fde43 100644 --- a/sources/queued/src/QueuedReportInterface.cpp +++ b/sources/queued/src/QueuedReportInterface.cpp @@ -16,7 +16,7 @@ * @file QueuedReportInterface.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ @@ -38,16 +38,16 @@ QueuedReportInterface::QueuedReportInterface(QueuedCore *parent) { qCDebug(LOG_DBUS) << __PRETTY_FUNCTION__; - // QList - qRegisterMetaType>("QList"); - qDBusRegisterMetaType>(); - // QHash qRegisterMetaType>("QHash"); qDBusRegisterMetaType>(); - // QHash> - qRegisterMetaType>>( - "QHash>"); - qDBusRegisterMetaType>>(); + + qRegisterMetaType>>( + "QueuedResult>"); + qDBusRegisterMetaType>>(); + + qRegisterMetaType>( + "QueuedResult"); + qDBusRegisterMetaType>(); } @@ -69,10 +69,9 @@ QDBusVariant QueuedReportInterface::Performance(const QString &from, { qCDebug(LOG_DBUS) << "Performance report for" << from << to; - return QDBusVariant( - QVariant::fromValue>(m_core->performanceReport( - QDateTime::fromString(from, Qt::ISODateWithMs), - QDateTime::fromString(to, Qt::ISODateWithMs), token))); + return QueuedCoreAdaptor::toDBusVariant(m_core->performanceReport( + QDateTime::fromString(from, Qt::ISODateWithMs), + QDateTime::fromString(to, Qt::ISODateWithMs), token)); } @@ -81,11 +80,11 @@ QDBusVariant QueuedReportInterface::Performance(const QString &from, */ QDBusVariant QueuedReportInterface::Status() { - auto metadata = QueuedDebug::getBuildMetaData(); + QueuedResult metadata = QueuedDebug::getBuildMetaData(); // append metadata here return QDBusVariant( - QVariant::fromValue>>(metadata)); + QVariant::fromValue>(metadata)); } @@ -99,10 +98,9 @@ QDBusVariant QueuedReportInterface::Tasks(const qlonglong user, { qCDebug(LOG_DBUS) << "Search for tasks" << user << from << to; - return QDBusVariant(QVariant::fromValue>( - m_core->taskReport(user, QDateTime::fromString(from, Qt::ISODateWithMs), - QDateTime::fromString(to, Qt::ISODateWithMs), - token))); + return QueuedCoreAdaptor::toDBusVariant(m_core->taskReport( + user, QDateTime::fromString(from, Qt::ISODateWithMs), + QDateTime::fromString(to, Qt::ISODateWithMs), token)); } @@ -115,9 +113,9 @@ QDBusVariant QueuedReportInterface::Users(const QString &lastLogged, { qCDebug(LOG_DBUS) << "Search for users" << lastLogged << permission; - return QDBusVariant(QVariant::fromValue>( + return QueuedCoreAdaptor::toDBusVariant( m_core->userReport(QDateTime::fromString(lastLogged, Qt::ISODateWithMs), permission < 1 ? QueuedEnums::Permission::Invalid : QueuedEnums::Permission(permission), - token))); + token)); } diff --git a/sources/queued/src/QueuedReportManager.cpp b/sources/queued/src/QueuedReportManager.cpp index 2f4cf44..1ff70e6 100644 --- a/sources/queued/src/QueuedReportManager.cpp +++ b/sources/queued/src/QueuedReportManager.cpp @@ -16,7 +16,7 @@ * @file QueuedReportManager.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ diff --git a/sources/queued/src/QueuedSettings.cpp b/sources/queued/src/QueuedSettings.cpp index 807adcd..404d193 100644 --- a/sources/queued/src/QueuedSettings.cpp +++ b/sources/queued/src/QueuedSettings.cpp @@ -16,7 +16,7 @@ * @file QueuedSettings.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ @@ -25,6 +25,7 @@ #include #include +#include /** @@ -121,6 +122,7 @@ void QueuedSettings::readConfiguration() settings.beginGroup("Administrator"); m_cfgAdmin.name = settings.value("Username", "root").toString(); m_cfgAdmin.password = settings.value("Password").toString(); + m_cfgAdmin.salt = settings.value("Salt").toString(); settings.endGroup(); // database related settings diff --git a/sources/queued/src/QueuedSystemInfo.cpp b/sources/queued/src/QueuedSystemInfo.cpp index 32668e8..bca99fb 100644 --- a/sources/queued/src/QueuedSystemInfo.cpp +++ b/sources/queued/src/QueuedSystemInfo.cpp @@ -16,7 +16,7 @@ * @file QueuedSystemInfo.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ diff --git a/sources/queued/src/QueuedTokenManager.cpp b/sources/queued/src/QueuedTokenManager.cpp index 0db8162..ffde7f8 100644 --- a/sources/queued/src/QueuedTokenManager.cpp +++ b/sources/queued/src/QueuedTokenManager.cpp @@ -16,7 +16,7 @@ * @file QueuedTokenManager.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ diff --git a/sources/queued/src/QueuedUser.cpp b/sources/queued/src/QueuedUser.cpp index 8a38197..fcc2320 100644 --- a/sources/queued/src/QueuedUser.cpp +++ b/sources/queued/src/QueuedUser.cpp @@ -16,7 +16,7 @@ * @file QueuedUser.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ @@ -77,9 +77,10 @@ QueuedUser::addPermission(const QueuedEnums::Permission _permission) /** * @fn hashFromPassword */ -QString QueuedUser::hashFromPassword(const QString &_password) +QString QueuedUser::hashFromPassword(const QString &_password, + const QString &_salt) { - return QCryptographicHash::hash(_password.toUtf8(), + return QCryptographicHash::hash(_salt.toUtf8() + _password.toUtf8(), QCryptographicHash::Sha512) .toHex(); } @@ -120,9 +121,11 @@ QPair QueuedUser::ids() /** * @fn isPasswordValid */ -bool QueuedUser::isPasswordValid(const QString &_password) const +bool QueuedUser::isPasswordValid(const QString &_password, + const QString &_salt) const { - return (m_definitions.password.toUtf8() == hashFromPassword(_password)); + return (m_definitions.password.toUtf8() + == hashFromPassword(_password, _salt)); } diff --git a/sources/queued/src/QueuedUserManager.cpp b/sources/queued/src/QueuedUserManager.cpp index c9ca7cb..6af3e41 100644 --- a/sources/queued/src/QueuedUserManager.cpp +++ b/sources/queued/src/QueuedUserManager.cpp @@ -16,7 +16,7 @@ * @file QueuedUserManager.cpp * Source code of queued library * @author Queued team - * @copyright GPLv3 + * @copyright MIT * @bug https://github.com/arcan1s/queued/issues */ @@ -119,7 +119,7 @@ QString QueuedUserManager::authorize(const QString &_user, return ""; } - bool status = userObj->isPasswordValid(_password); + bool status = userObj->isPasswordValid(_password, salt()); if (!status) { qCInfo(LOG_LIB) << "User password invalid for" << _user; return ""; @@ -243,6 +243,15 @@ QueuedUser *QueuedUserManager::user(const QString &_name, const bool _isToken) } +/** + * @salt + */ +QString QueuedUserManager::salt() const +{ + return m_salt; +} + + /* * @fn tokenExpiration */ @@ -252,6 +261,15 @@ long long QueuedUserManager::tokenExpiration() const } +/** + * @fn setSalt + */ +void QueuedUserManager::setSalt(const QString &_salt) +{ + m_salt = _salt; +} + + /** * @fn setTokenExpiration */ diff --git a/sources/queuedctl/src/QueuedctlAuth.cpp b/sources/queuedctl/src/QueuedctlAuth.cpp index 395583a..4f098cf 100644 --- a/sources/queuedctl/src/QueuedctlAuth.cpp +++ b/sources/queuedctl/src/QueuedctlAuth.cpp @@ -23,11 +23,25 @@ #include "QueuedctlUser.h" -QString QueuedctlAuth::auth(const QString &_user) +QueuedctlCommon::QueuedctlResult QueuedctlAuth::auth(const QString &_user, + const QString &_cache) { qCDebug(LOG_APP) << "Auth as user" << _user; - return QueuedCoreAdaptor::auth(_user, QueuedctlUser::getPassword()); + QueuedctlCommon::QueuedctlResult output; + + auto res = QueuedCoreAdaptor::auth(_user, QueuedctlUser::getPassword()); + Result::match(res, + [&output, &_user, &_cache](const QString &val) { + setToken(val, _user, _cache); + output.status = true; + }, + [&output](const QueuedError &err) { + output.status = false; + output.output = err.message().c_str(); + }); + + return output; } @@ -40,8 +54,7 @@ QString QueuedctlAuth::getToken(const QString &_cache, const QString &_user) if (tryAuth(tokenId)) { return tokenId; } else { - tokenId = auth(_user); - setToken(tokenId, _user, _cache); + auth(_user, _cache); return getToken(_cache, _user); } } @@ -83,5 +96,7 @@ bool QueuedctlAuth::tryAuth(const QString &_token) { qCDebug(LOG_APP) << "Try auth with" << _token; - return QueuedCoreAdaptor::auth(_token); + auto res = QueuedCoreAdaptor::auth(_token); + + return ((res.type() == Result::Content::Value) && res.get()); } diff --git a/sources/queuedctl/src/QueuedctlAuth.h b/sources/queuedctl/src/QueuedctlAuth.h index 0850241..edc4c33 100644 --- a/sources/queuedctl/src/QueuedctlAuth.h +++ b/sources/queuedctl/src/QueuedctlAuth.h @@ -19,10 +19,13 @@ #include +#include "QueuedctlCommon.h" + namespace QueuedctlAuth { -QString auth(const QString &_user); +QueuedctlCommon::QueuedctlResult auth(const QString &_user, + const QString &_cache); QString getToken(const QString &_cache, const QString &_user); void parser(QCommandLineParser &_parser); void setToken(const QString &_token, const QString &_user, diff --git a/sources/queuedctl/src/QueuedctlCommon.cpp b/sources/queuedctl/src/QueuedctlCommon.cpp index b4bea8e..621bc8e 100644 --- a/sources/queuedctl/src/QueuedctlCommon.cpp +++ b/sources/queuedctl/src/QueuedctlCommon.cpp @@ -221,173 +221,147 @@ QueuedctlCommon::process(QCommandLineParser &_parser, const QString &_cache, switch (id) { case QueuedctlArgument::Auth: { - QString token = QueuedctlAuth::auth(_user); - result.status = !token.isEmpty(); - if (result.status) - QueuedctlAuth::setToken(token, _user, _cache); + result = QueuedctlAuth::auth(_user, _cache); break; } case QueuedctlArgument::OptionGet: { - QVariant value = QueuedctlOption::getOption(args.at(1)); - result.status = value.isValid(); - result.output = value.toString(); + result = QueuedctlOption::getOption(args.at(1)); break; } case QueuedctlArgument::OptionSet: { QString token = QueuedctlAuth::getToken(_cache, _user); - result.status - = QueuedctlOption::editOption(args.at(1), args.at(2), token); - if (result.status) - result.output - = QString("Option %1 set to %2").arg(args.at(1), args.at(2)); - else - result.output = QString("Could not set option %1 to %2") - .arg(args.at(1), args.at(2)); + result = QueuedctlOption::editOption(args.at(1), args.at(2), token); break; } case QueuedctlArgument::PermissionAdd: { - auto userId = QueuedCoreAdaptor::getUserId(args.at(1)); + auto userIdRes = QueuedCoreAdaptor::getUserId(args.at(1)); + long long userId = -1; + Result::match(userIdRes, + [&userId](const long long val) { userId = val; }, + [&result](const QueuedError &err) { + result.output = err.message().c_str(); + }); + if (userId == -1) + break; QString token = QueuedctlAuth::getToken(_cache, _user); - result.status - = QueuedctlPermissions::addPermission(userId, args.at(2), token); - if (result.status) - result.output = QString("Add permission %2 to user %1") - .arg(args.at(1)) - .arg(args.at(2)); - else - result.output = QString("Could not add permission %2 to user %1") - .arg(args.at(1)) - .arg(args.at(2)); + result = QueuedctlPermissions::addPermission(userId, args.at(2), token); break; } case QueuedctlArgument::PermissionRemove: { - auto userId = QueuedCoreAdaptor::getUserId(args.at(1)); + auto userIdRes = QueuedCoreAdaptor::getUserId(args.at(1)); + long long userId = -1; + Result::match(userIdRes, + [&userId](const long long val) { userId = val; }, + [&result](const QueuedError &err) { + result.output = err.message().c_str(); + }); + if (userId == -1) + break; QString token = QueuedctlAuth::getToken(_cache, _user); - result.status + result = QueuedctlPermissions::removePermission(userId, args.at(2), token); - if (result.status) - result.output = QString("Remove permission %2 from user %1") - .arg(args.at(1)) - .arg(args.at(2)); - else - result.output - = QString("Could not remove permission %2 from user %1") - .arg(args.at(1)) - .arg(args.at(2)); break; } case QueuedctlArgument::PluginAdd: { QString token = QueuedctlAuth::getToken(_cache, _user); - result.status = QueuedctlPlugins::addPlugin(args.at(1), token); - if (result.status) - result.output = QString("Add plugin %1").arg(args.at(1)); - else - result.output = QString("Could not add plugin %1").arg(args.at(1)); + result = QueuedctlPlugins::addPlugin(args.at(1), token); break; } case QueuedctlArgument::PluginList: { - result.status = true; - result.output = QueuedctlPlugins::listPlugins().join('\n'); + result = QueuedctlPlugins::listPlugins(); break; } case QueuedctlArgument::PluginRemove: { QString token = QueuedctlAuth::getToken(_cache, _user); - result.status = QueuedctlPlugins::removePlugin(args.at(1), token); - if (result.status) - result.output = QString("Remove plugin %1").arg(args.at(1)); - else - result.output - = QString("Could not remove plugin %1").arg(args.at(1)); + result = QueuedctlPlugins::removePlugin(args.at(1), token); break; } case QueuedctlArgument::Report: { QString token = QueuedctlAuth::getToken(_cache, _user); - result.status = true; - result.output - = hashListToString(QueuedctlUser::getReport(_parser, token)); + result = QueuedctlUser::getReport(_parser, token); break; } case QueuedctlArgument::Status: { - auto status = QueuedCoreAdaptor::getStatus(); - result.status = !status.isEmpty(); - result.output = hashHashToString(status); + auto res = QueuedCoreAdaptor::getStatus(); + Result::match(res, + [&result](const QueuedStatusMap &val) { + result.status = true; + result.output = hashHashToString(val); + }, + [&result](const QueuedError &err) { + result.output = err.message().c_str(); + }); break; } case QueuedctlArgument::TaskAdd: { QString token = QueuedctlAuth::getToken(_cache, _user); auto definitions = QueuedctlTask::getDefinitions(_parser, false); - long long taskId = QueuedctlTask::addTask(definitions, token); - result.status = (taskId > 0); - if (result.status) - result.output = QString("Task %1 added").arg(taskId); - else - result.output = "Could not add task"; + result = QueuedctlTask::addTask(definitions, token); break; } case QueuedctlArgument::TaskGet: { - QVariant value - = QueuedctlTask::getTask(args.at(1).toLongLong(), args.at(2)); - result.status = value.isValid(); - result.output = args.at(2).isEmpty() ? hashToString(value.toHash()) - : value.toString(); + result = QueuedctlTask::getTask(args.at(1).toLongLong(), args.at(2)); break; } case QueuedctlArgument::TaskList: { QString token = QueuedctlAuth::getToken(_cache, _user); - result.status = true; - result.output - = hashListToString(QueuedctlTask::getTasks(_parser, token)); + result = QueuedctlTask::getTasks(_parser, token); break; } case QueuedctlArgument::TaskSet: { QString token = QueuedctlAuth::getToken(_cache, _user); auto definitions = QueuedctlTask::getDefinitions(_parser, true); - result.status = QueuedctlTask::setTask(args.at(1).toLongLong(), - definitions, token); + result = QueuedctlTask::setTask(args.at(1).toLongLong(), definitions, + token); break; } case QueuedctlArgument::TaskStart: { QString token = QueuedctlAuth::getToken(_cache, _user); - result.status - = QueuedctlTask::startTask(args.at(1).toLongLong(), token); + result = QueuedctlTask::startTask(args.at(1).toLongLong(), token); break; } case QueuedctlArgument::TaskStop: { QString token = QueuedctlAuth::getToken(_cache, _user); - result.status = QueuedctlTask::stopTask(args.at(1).toLongLong(), token); + result = QueuedctlTask::stopTask(args.at(1).toLongLong(), token); break; } case QueuedctlArgument::UserAdd: { QString token = QueuedctlAuth::getToken(_cache, _user); auto definitions = QueuedctlUser::getDefinitions(_parser, false); - long long userId = QueuedctlUser::addUser(definitions, token); - result.status = (userId > 0); - if (result.status) - result.output = QString("User %1 added").arg(userId); - else - result.output = "Could not add user"; + result = QueuedctlUser::addUser(definitions, token); break; } case QueuedctlArgument::UserGet: { - auto userId = QueuedCoreAdaptor::getUserId(args.at(1)); - QVariant value = QueuedctlUser::getUser(userId, args.at(2)); - result.status = value.isValid(); - result.output = args.at(2).isEmpty() ? hashToString(value.toHash()) - : value.toString(); + auto userIdRes = QueuedCoreAdaptor::getUserId(args.at(1)); + long long userId = -1; + Result::match(userIdRes, + [&userId](const long long val) { userId = val; }, + [&result](const QueuedError &err) { + result.output = err.message().c_str(); + }); + if (userId == -1) + break; + result = QueuedctlUser::getUser(userId, args.at(2)); break; } case QueuedctlArgument::UserList: { QString token = QueuedctlAuth::getToken(_cache, _user); - result.status = true; - result.output - = hashListToString(QueuedctlUser::getUsers(_parser, token)); + result = QueuedctlUser::getUsers(_parser, token); break; } case QueuedctlArgument::UserSet: { - auto userId = QueuedCoreAdaptor::getUserId(args.at(1)); + auto userIdRes = QueuedCoreAdaptor::getUserId(args.at(1)); + long long userId = -1; + Result::match(userIdRes, + [&userId](const long long val) { userId = val; }, + [&result](const QueuedError &err) { + result.output = err.message().c_str(); + }); + if (userId == -1) + break; QString token = QueuedctlAuth::getToken(_cache, _user); auto definitions = QueuedctlUser::getDefinitions(_parser, true); - result.status = QueuedctlUser::setUser(userId, definitions, token); + result = QueuedctlUser::setUser(userId, definitions, token); break; } case QueuedctlArgument::Invalid: { diff --git a/sources/queuedctl/src/QueuedctlOption.cpp b/sources/queuedctl/src/QueuedctlOption.cpp index 4ac9bb9..f776102 100644 --- a/sources/queuedctl/src/QueuedctlOption.cpp +++ b/sources/queuedctl/src/QueuedctlOption.cpp @@ -15,24 +15,45 @@ #include "QueuedctlOption.h" +#include "QueuedctlCommon.h" #include -bool QueuedctlOption::editOption(const QString &_option, const QVariant &_value, - const QString &_token) +QueuedctlCommon::QueuedctlResult +QueuedctlOption::editOption(const QString &_option, const QVariant &_value, + const QString &_token) { qCDebug(LOG_APP) << "Edit option" << _option << "to" << _value; - return QueuedCoreAdaptor::sendOptionEdit(_option, _value, _token); + QueuedctlCommon::QueuedctlResult output; + auto res = QueuedCoreAdaptor::sendOptionEdit(_option, _value, _token); + Result::match(res, [&output](const bool val) { output.status = val; }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } -QVariant QueuedctlOption::getOption(const QString &_option) +QueuedctlCommon::QueuedctlResult +QueuedctlOption::getOption(const QString &_option) { qCDebug(LOG_APP) << "Get option" << _option; - return QueuedCoreAdaptor::getOption(_option); + QueuedctlCommon::QueuedctlResult output; + auto res = QueuedCoreAdaptor::getOption(_option); + Result::match(res, + [&output](const QVariant &val) { + output.status = val.isValid(); + output.output = val.toString(); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } diff --git a/sources/queuedctl/src/QueuedctlOption.h b/sources/queuedctl/src/QueuedctlOption.h index f923b83..ad0b213 100644 --- a/sources/queuedctl/src/QueuedctlOption.h +++ b/sources/queuedctl/src/QueuedctlOption.h @@ -19,12 +19,15 @@ #include +#include "QueuedctlCommon.h" + namespace QueuedctlOption { -bool editOption(const QString &_option, const QVariant &_value, - const QString &_token); -QVariant getOption(const QString &_option); +QueuedctlCommon::QueuedctlResult editOption(const QString &_option, + const QVariant &_value, + const QString &_token); +QueuedctlCommon::QueuedctlResult getOption(const QString &_option); void parserGet(QCommandLineParser &_parser); void parserSet(QCommandLineParser &_parser); }; diff --git a/sources/queuedctl/src/QueuedctlPermissions.cpp b/sources/queuedctl/src/QueuedctlPermissions.cpp index 9a0ff42..9afc946 100644 --- a/sources/queuedctl/src/QueuedctlPermissions.cpp +++ b/sources/queuedctl/src/QueuedctlPermissions.cpp @@ -15,34 +15,54 @@ #include "QueuedctlPermissions.h" +#include "QueuedctlCommon.h" #include -bool QueuedctlPermissions::addPermission(const long long _id, - const QString &_permission, - const QString &_token) +QueuedctlCommon::QueuedctlResult QueuedctlPermissions::addPermission( + const long long _id, const QString &_permission, const QString &_token) { qCDebug(LOG_APP) << "Add permission" << _permission << "to" << _id; auto permission = QueuedEnums::stringToPermission(_permission); + QueuedctlCommon::QueuedctlResult output; - return (permission != QueuedEnums::Permission::Invalid) - && QueuedCoreAdaptor::sendUserPermissionAdd(_id, permission, _token); + if (permission == QueuedEnums::Permission::Invalid) { + output.output = "Invalid permission"; + } else { + auto res + = QueuedCoreAdaptor::sendUserPermissionAdd(_id, permission, _token); + Result::match(res, [&output](const bool val) { output.status = val; }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + } + + return output; } -bool QueuedctlPermissions::removePermission(const long long _id, - const QString &_permission, - const QString &_token) +QueuedctlCommon::QueuedctlResult QueuedctlPermissions::removePermission( + const long long _id, const QString &_permission, const QString &_token) { qCDebug(LOG_APP) << "Remove permission" << _permission << "to" << _id; auto permission = QueuedEnums::stringToPermission(_permission); + QueuedctlCommon::QueuedctlResult output; - return (permission != QueuedEnums::Permission::Invalid) - && QueuedCoreAdaptor::sendUserPermissionRemove(_id, permission, - _token); + if (permission == QueuedEnums::Permission::Invalid) { + output.output = "Invalid permission"; + } else { + auto res = QueuedCoreAdaptor::sendUserPermissionRemove(_id, permission, + _token); + Result::match(res, [&output](const bool val) { output.status = val; }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + } + + return output; } diff --git a/sources/queuedctl/src/QueuedctlPermissions.h b/sources/queuedctl/src/QueuedctlPermissions.h index cf96695..fae607b 100644 --- a/sources/queuedctl/src/QueuedctlPermissions.h +++ b/sources/queuedctl/src/QueuedctlPermissions.h @@ -19,13 +19,17 @@ #include +#include "QueuedctlCommon.h" + namespace QueuedctlPermissions { -bool addPermission(const long long _id, const QString &_permission, - const QString &_token); -bool removePermission(const long long _id, const QString &_permission, - const QString &_token); +QueuedctlCommon::QueuedctlResult addPermission(const long long _id, + const QString &_permission, + const QString &_token); +QueuedctlCommon::QueuedctlResult removePermission(const long long _id, + const QString &_permission, + const QString &_token); void parser(QCommandLineParser &_parser); }; diff --git a/sources/queuedctl/src/QueuedctlPlugins.cpp b/sources/queuedctl/src/QueuedctlPlugins.cpp index 5486654..0598a40 100644 --- a/sources/queuedctl/src/QueuedctlPlugins.cpp +++ b/sources/queuedctl/src/QueuedctlPlugins.cpp @@ -15,32 +15,61 @@ #include "QueuedctlPlugins.h" +#include "QueuedctlCommon.h" #include -bool QueuedctlPlugins::addPlugin(const QString &_plugin, const QString &_token) +QueuedctlCommon::QueuedctlResult +QueuedctlPlugins::addPlugin(const QString &_plugin, const QString &_token) { qCDebug(LOG_APP) << "Add plugin" << _plugin; - return QueuedCoreAdaptor::sendPluginAdd(_plugin, _token); + auto res = QueuedCoreAdaptor::sendPluginAdd(_plugin, _token); + + QueuedctlCommon::QueuedctlResult output; + Result::match(res, [&output](const bool val) { output.status = val; }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } -QStringList QueuedctlPlugins::listPlugins() +QueuedctlCommon::QueuedctlResult QueuedctlPlugins::listPlugins() { - return QueuedCoreAdaptor::getOption(QueuedConfig::QueuedSettings::Plugins) - .toString() - .split('\n'); + auto res + = QueuedCoreAdaptor::getOption(QueuedConfig::QueuedSettings::Plugins); + + QueuedctlCommon::QueuedctlResult output; + Result::match(res, + [&output](const QVariant &val) { + output.status = val.isValid(); + output.output = val.toString(); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } -bool QueuedctlPlugins::removePlugin(const QString &_plugin, - const QString &_token) +QueuedctlCommon::QueuedctlResult +QueuedctlPlugins::removePlugin(const QString &_plugin, const QString &_token) { qCDebug(LOG_APP) << "Remove plugin" << _plugin; - return QueuedCoreAdaptor::sendPluginRemove(_plugin, _token); + auto res = QueuedCoreAdaptor::sendPluginRemove(_plugin, _token); + + QueuedctlCommon::QueuedctlResult output; + Result::match(res, [&output](const bool val) { output.status = val; }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } diff --git a/sources/queuedctl/src/QueuedctlPlugins.h b/sources/queuedctl/src/QueuedctlPlugins.h index b76c553..e1106d6 100644 --- a/sources/queuedctl/src/QueuedctlPlugins.h +++ b/sources/queuedctl/src/QueuedctlPlugins.h @@ -19,12 +19,16 @@ #include +#include "QueuedctlCommon.h" + namespace QueuedctlPlugins { -bool addPlugin(const QString &_plugin, const QString &_token); -QStringList listPlugins(); -bool removePlugin(const QString &_plugin, const QString &_token); +QueuedctlCommon::QueuedctlResult addPlugin(const QString &_plugin, + const QString &_token); +QueuedctlCommon::QueuedctlResult listPlugins(); +QueuedctlCommon::QueuedctlResult removePlugin(const QString &_plugin, + const QString &_token); void parser(QCommandLineParser &_parser); }; diff --git a/sources/queuedctl/src/QueuedctlTask.cpp b/sources/queuedctl/src/QueuedctlTask.cpp index b85aa0b..2c79f6e 100644 --- a/sources/queuedctl/src/QueuedctlTask.cpp +++ b/sources/queuedctl/src/QueuedctlTask.cpp @@ -15,6 +15,7 @@ #include "QueuedctlTask.h" +#include "QueuedctlCommon.h" #include @@ -25,13 +26,25 @@ extern "C" { } -long long QueuedctlTask::addTask( +QueuedctlCommon::QueuedctlResult QueuedctlTask::addTask( const QueuedProcess::QueuedProcessDefinitions &_definitions, const QString &_token) { qCDebug(LOG_APP) << "Add task" << _definitions.command; - return QueuedCoreAdaptor::sendTaskAdd(_definitions, _token); + auto res = QueuedCoreAdaptor::sendTaskAdd(_definitions, _token); + + QueuedctlCommon::QueuedctlResult output; + Result::match(res, + [&output](const long long val) { + output.status = (val > 0); + output.output = QString::number(val); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } @@ -52,10 +65,15 @@ QueuedctlTask::getDefinitions(const QCommandLineParser &_parser, }); definitions.nice = _parser.value("nice").toUInt(); - definitions.user - = _parser.value("task-user").isEmpty() - ? 0 - : QueuedCoreAdaptor::getUserId(_parser.value("task-user")); + if (_parser.value("task-user").isEmpty()) { + definitions.user = 0; + } else { + auto res = QueuedCoreAdaptor::getUserId(_parser.value("task-user")); + Result::match( + res, + [&definitions](const long long val) { definitions.user = val; }, + [&definitions](const QueuedError &) { definitions.user = 0; }); + } definitions.workingDirectory = QFileInfo(_parser.value("directory")).absoluteFilePath(); // limits now @@ -87,30 +105,67 @@ QueuedctlTask::getDefinitions(const QCommandLineParser &_parser, } -QVariant QueuedctlTask::getTask(const long long _id, const QString &_property) +QueuedctlCommon::QueuedctlResult +QueuedctlTask::getTask(const long long _id, const QString &_property) { qCDebug(LOG_APP) << "Get property" << _property << "from task" << _id; - if (_property.isEmpty()) - return QueuedCoreAdaptor::getTask(_id); - else - return QueuedCoreAdaptor::getTask(_id, _property); + QueuedctlCommon::QueuedctlResult output; + + if (_property.isEmpty()) { + auto res = QueuedCoreAdaptor::getTask(_id); + Result::match(res, + [&output](const QVariantHash &val) { + output.status = true; + output.output = QueuedctlCommon::hashToString(val); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + } else { + auto res = QueuedCoreAdaptor::getTask(_id, _property); + Result::match(res, + [&output](const QVariant &val) { + output.status = val.isValid(); + output.output = val.toString(); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + } + + return output; } -QList QueuedctlTask::getTasks(const QCommandLineParser &_parser, - const QString &_token) +QueuedctlCommon::QueuedctlResult +QueuedctlTask::getTasks(const QCommandLineParser &_parser, + const QString &_token) { - long long user - = _parser.value("task-user").isEmpty() - ? -1 - : QueuedCoreAdaptor::getUserId(_parser.value("task-user")); + long long userId = -1; + if (!_parser.value("task-user").isEmpty()) { + auto res = QueuedCoreAdaptor::getUserId(_parser.value("task-user")); + Result::match(res, [&userId](const long long val) { userId = val; }, + [&userId](const QueuedError &) {}); + } QDateTime stop = QDateTime::fromString(_parser.value("stop"), Qt::ISODateWithMs); QDateTime start = QDateTime::fromString(_parser.value("start"), Qt::ISODateWithMs); - return QueuedCoreAdaptor::getTasks(user, start, stop, _token); + QueuedctlCommon::QueuedctlResult output; + + auto res = QueuedCoreAdaptor::getTasks(userId, start, stop, _token); + Result::match(res, + [&output](const QList &val) { + output.status = true; + output.output = QueuedctlCommon::hashListToString(val); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } @@ -245,28 +300,54 @@ void QueuedctlTask::parserStart(QCommandLineParser &_parser) } -bool QueuedctlTask::setTask( +QueuedctlCommon::QueuedctlResult QueuedctlTask::setTask( const long long _id, const QueuedProcess::QueuedProcessDefinitions &_definitions, const QString &_token) { qCDebug(LOG_APP) << "Edit task" << _id; - return QueuedCoreAdaptor::sendTaskEdit(_id, _definitions, _token); + auto res = QueuedCoreAdaptor::sendTaskEdit(_id, _definitions, _token); + + QueuedctlCommon::QueuedctlResult output; + Result::match(res, [&output](const bool val) { output.status = val; }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } -bool QueuedctlTask::startTask(const long long _id, const QString &_token) +QueuedctlCommon::QueuedctlResult QueuedctlTask::startTask(const long long _id, + const QString &_token) { qCDebug(LOG_APP) << "Start task" << _id; - return QueuedCoreAdaptor::sendTaskStart(_id, _token); + auto res = QueuedCoreAdaptor::sendTaskStart(_id, _token); + + QueuedctlCommon::QueuedctlResult output; + Result::match(res, [&output](const bool val) { output.status = val; }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } -bool QueuedctlTask::stopTask(const long long _id, const QString &_token) +QueuedctlCommon::QueuedctlResult QueuedctlTask::stopTask(const long long _id, + const QString &_token) { qCDebug(LOG_APP) << "Stop task" << _id; - return QueuedCoreAdaptor::sendTaskStop(_id, _token); + auto res = QueuedCoreAdaptor::sendTaskStart(_id, _token); + + QueuedctlCommon::QueuedctlResult output; + Result::match(res, [&output](const bool val) { output.status = val; }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } diff --git a/sources/queuedctl/src/QueuedctlTask.h b/sources/queuedctl/src/QueuedctlTask.h index 5cde7a8..d3bacad 100644 --- a/sources/queuedctl/src/QueuedctlTask.h +++ b/sources/queuedctl/src/QueuedctlTask.h @@ -21,26 +21,33 @@ #include +#include "QueuedctlCommon.h" + namespace QueuedctlTask { -long long addTask(const QueuedProcess::QueuedProcessDefinitions &_definitions, - const QString &_token); +QueuedctlCommon::QueuedctlResult +addTask(const QueuedProcess::QueuedProcessDefinitions &_definitions, + const QString &_token); QueuedProcess::QueuedProcessDefinitions getDefinitions(const QCommandLineParser &_parser, const bool _expandAll); -QVariant getTask(const long long _id, const QString &_property); -QList getTasks(const QCommandLineParser &_parser, - const QString &_token); +QueuedctlCommon::QueuedctlResult getTask(const long long _id, + const QString &_property); +QueuedctlCommon::QueuedctlResult getTasks(const QCommandLineParser &_parser, + const QString &_token); void parserAdd(QCommandLineParser &_parser); void parserGet(QCommandLineParser &_parser); void parserList(QCommandLineParser &_parser); void parserSet(QCommandLineParser &_parser); void parserStart(QCommandLineParser &_parser); -bool setTask(const long long _id, - const QueuedProcess::QueuedProcessDefinitions &_definitions, - const QString &_token); -bool startTask(const long long _id, const QString &_token); -bool stopTask(const long long _id, const QString &_token); +QueuedctlCommon::QueuedctlResult +setTask(const long long _id, + const QueuedProcess::QueuedProcessDefinitions &_definitions, + const QString &_token); +QueuedctlCommon::QueuedctlResult startTask(const long long _id, + const QString &_token); +QueuedctlCommon::QueuedctlResult stopTask(const long long _id, + const QString &_token); }; diff --git a/sources/queuedctl/src/QueuedctlUser.cpp b/sources/queuedctl/src/QueuedctlUser.cpp index 52b1827..c570499 100644 --- a/sources/queuedctl/src/QueuedctlUser.cpp +++ b/sources/queuedctl/src/QueuedctlUser.cpp @@ -15,10 +15,12 @@ #include "QueuedctlUser.h" +#include "QueuedctlCommon.h" #include #include +#include extern "C" { #include @@ -26,18 +28,31 @@ extern "C" { } -long long +QueuedctlCommon::QueuedctlResult QueuedctlUser::addUser(const QueuedUser::QueuedUserDefinitions &_definitions, const QString &_token) { qCDebug(LOG_APP) << "Add user" << _definitions.name; - return QueuedCoreAdaptor::sendUserAdd(_definitions, _token); + auto res = QueuedCoreAdaptor::sendUserAdd(_definitions, _token); + + QueuedctlCommon::QueuedctlResult output; + Result::match(res, + [&output](const long long val) { + output.status = (val > 0); + output.output = QString::number(val); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } -QList QueuedctlUser::getReport(const QCommandLineParser &_parser, - const QString &_token) +QueuedctlCommon::QueuedctlResult +QueuedctlUser::getReport(const QCommandLineParser &_parser, + const QString &_token) { qCDebug(LOG_APP) << "Get usage report"; @@ -46,7 +61,19 @@ QList QueuedctlUser::getReport(const QCommandLineParser &_parser, QDateTime start = QDateTime::fromString(_parser.value("start"), Qt::ISODateWithMs); - return QueuedCoreAdaptor::getPerformance(start, stop, _token); + auto res = QueuedCoreAdaptor::getPerformance(start, stop, _token); + + QueuedctlCommon::QueuedctlResult output; + Result::match(res, + [&output](const QList &val) { + output.status = true; + output.output = QueuedctlCommon::hashListToString(val); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } @@ -59,15 +86,16 @@ QueuedctlUser::getDefinitions(const QCommandLineParser &_parser, QueuedUser::QueuedUserDefinitions definitions; - definitions.email = _parser.value("email"); + // define password first definitions.password = _parser.isSet("stdin-password") - ? getPassword() - : _parser.value("password"); - // transform to hash - definitions.password - = definitions.password.isEmpty() - ? "" - : QueuedUser::hashFromPassword(definitions.password); + ? getPassword() + : _parser.value("password"); + auto res = QueuedCoreAdaptor::sendPasswordHash(definitions.password); + Result::match( + res, [&definitions](const QString &val) { definitions.password = val; }, + [](const QueuedError &) {}); + + definitions.email = _parser.value("email"); // limits now QueuedLimits::Limits limits( _parser.value("limit-cpu").toLongLong(), @@ -107,19 +135,42 @@ QString QueuedctlUser::getPassword() } -QVariant QueuedctlUser::getUser(const long long _id, const QString &_property) +QueuedctlCommon::QueuedctlResult +QueuedctlUser::getUser(const long long _id, const QString &_property) { qCDebug(LOG_APP) << "Get property" << _property << "from user" << _id; - if (_property.isEmpty()) - return QueuedCoreAdaptor::getUser(_id); - else - return QueuedCoreAdaptor::getUser(_id, _property); + QueuedctlCommon::QueuedctlResult output; + + if (_property.isEmpty()) { + auto res = QueuedCoreAdaptor::getUser(_id); + Result::match(res, + [&output](const QVariantHash &val) { + output.status = true; + output.output = QueuedctlCommon::hashToString(val); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + } else { + auto res = QueuedCoreAdaptor::getUser(_id, _property); + Result::match(res, + [&output](const QVariant &val) { + output.status = val.isValid(); + output.output = val.toString(); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + } + + return output; } -QList QueuedctlUser::getUsers(const QCommandLineParser &_parser, - const QString &_token) +QueuedctlCommon::QueuedctlResult +QueuedctlUser::getUsers(const QCommandLineParser &_parser, + const QString &_token) { QDateTime lastLogin = QDateTime::fromString(_parser.value("last-logged"), Qt::ISODateWithMs); @@ -128,7 +179,19 @@ QList QueuedctlUser::getUsers(const QCommandLineParser &_parser, ? QueuedEnums::Permission::Invalid : QueuedEnums::Permission(_parser.value("access").toInt()); - return QueuedCoreAdaptor::getUsers(lastLogin, permission, _token); + auto res = QueuedCoreAdaptor::getUsers(lastLogin, permission, _token); + + QueuedctlCommon::QueuedctlResult output; + Result::match(res, + [&output](const QList &val) { + output.status = true; + output.output = QueuedctlCommon::hashListToString(val); + }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } @@ -253,11 +316,20 @@ void QueuedctlUser::parserSet(QCommandLineParser &_parser) } -bool QueuedctlUser::setUser( - const long long _id, const QueuedUser::QueuedUserDefinitions &_definitions, - const QString &_token) +QueuedctlCommon::QueuedctlResult +QueuedctlUser::setUser(const long long _id, + const QueuedUser::QueuedUserDefinitions &_definitions, + const QString &_token) { qCDebug(LOG_APP) << "Edit user" << _id; - return QueuedCoreAdaptor::sendUserEdit(_id, _definitions, _token); + auto res = QueuedCoreAdaptor::sendUserEdit(_id, _definitions, _token); + + QueuedctlCommon::QueuedctlResult output; + Result::match(res, [&output](const bool val) { output.status = val; }, + [&output](const QueuedError &err) { + output.output = err.message().c_str(); + }); + + return output; } diff --git a/sources/queuedctl/src/QueuedctlUser.h b/sources/queuedctl/src/QueuedctlUser.h index dc5560d..4049d66 100644 --- a/sources/queuedctl/src/QueuedctlUser.h +++ b/sources/queuedctl/src/QueuedctlUser.h @@ -21,27 +21,32 @@ #include +#include "QueuedctlCommon.h" + namespace QueuedctlUser { -long long addUser(const QueuedUser::QueuedUserDefinitions &_definitions, - const QString &_token); -QList getReport(const QCommandLineParser &_parser, - const QString &_token); +QueuedctlCommon::QueuedctlResult +addUser(const QueuedUser::QueuedUserDefinitions &_definitions, + const QString &_token); +QueuedctlCommon::QueuedctlResult getReport(const QCommandLineParser &_parser, + const QString &_token); QueuedUser::QueuedUserDefinitions getDefinitions(const QCommandLineParser &_parser, const bool _expandAll); QString getPassword(); -QVariant getUser(const long long _id, const QString &_property); -QList getUsers(const QCommandLineParser &_parser, - const QString &_token); +QueuedctlCommon::QueuedctlResult getUser(const long long _id, + const QString &_property); +QueuedctlCommon::QueuedctlResult getUsers(const QCommandLineParser &_parser, + const QString &_token); void parserAdd(QCommandLineParser &_parser); void parserGet(QCommandLineParser &_parser); void parserList(QCommandLineParser &_parser); void parserReport(QCommandLineParser &_parser); void parserSet(QCommandLineParser &_parser); -bool setUser(const long long _id, - const QueuedUser::QueuedUserDefinitions &_definitions, - const QString &_token); +QueuedctlCommon::QueuedctlResult +setUser(const long long _id, + const QueuedUser::QueuedUserDefinitions &_definitions, + const QString &_token); }; diff --git a/sources/version.h.in b/sources/version.h.in index cedf0e2..d580999 100644 --- a/sources/version.h.in +++ b/sources/version.h.in @@ -3,14 +3,14 @@ // information -const char NAME[] = "Queued"; -const char VERSION[] = "@PROJECT_VERSION@"; -const char COMMIT_SHA[] = "@PROJECT_COMMIT_SHA@"; -const char AUTHOR[] = "@PROJECT_AUTHOR@"; -const char EMAIL[] = "@PROJECT_CONTACT@"; -const char LICENSE[] = "@PROJECT_LICENSE@"; -const char TRDPARTY_LICENSE[] = ""; -const char SPECIAL_THANKS[] = ""; +static const char NAME[] = "Queued"; +static const char VERSION[] = "@PROJECT_VERSION@"; +static const char COMMIT_SHA[] = "@PROJECT_COMMIT_SHA@"; +static const char AUTHOR[] = "@PROJECT_AUTHOR@"; +static const char EMAIL[] = "@PROJECT_CONTACT@"; +static const char LICENSE[] = "@PROJECT_LICENSE@"; +static const char TRDPARTY_LICENSE[] = ""; +static const char SPECIAL_THANKS[] = ""; // configuration // use define here instead of normal const definition for moc @@ -20,43 +20,46 @@ const char SPECIAL_THANKS[] = ""; #cmakedefine BUILD_TESTING // links -const char HOMEPAGE[] = "https://arcanis.me/projects/queued"; -const char REPOSITORY[] = "https://github.com/arcan1s/queued"; -const char RELEASES[] = "https://github.com/arcan1s/queued/releases/tag/V."; -const char VERSION_API[] +static const char HOMEPAGE[] = "https://arcanis.me/projects/queued"; +static const char REPOSITORY[] = "https://github.com/arcan1s/queued"; +static const char RELEASES[] + = "https://github.com/arcan1s/queued/releases/tag/V."; +static const char VERSION_API[] = "https://api.github.com/repos/arcan1s/queued/releases"; -const char BUGTRACKER[] = "https://github.com/arcan1s/queued/issues"; -const char BUGTRACKER_API[] = "https://arcanis.me/repos/arcan1s/queued/issues"; +static const char BUGTRACKER[] = "https://github.com/arcan1s/queued/issues"; +static const char BUGTRACKER_API[] + = "https://arcanis.me/repos/arcan1s/queued/issues"; // build information -const char BUILD_DATE[] = "@CURRENT_DATE@"; +static const char BUILD_DATE[] = "@CURRENT_DATE@"; // cmake properties -const char CMAKE_BUILD_TYPE[] = "@CMAKE_BUILD_TYPE@"; -const char CMAKE_CXX_COMPILER[] = "@CMAKE_CXX_COMPILER@"; -const char CMAKE_CXX_FLAGS[] = "@CMAKE_CXX_FLAGS@"; -const char CMAKE_CXX_FLAGS_DEBUG[] = "@CMAKE_CXX_FLAGS_DEBUG@"; -const char CMAKE_CXX_FLAGS_RELEASE[] = "@CMAKE_CXX_FLAGS_RELEASE@"; -const char CMAKE_CXX_FLAGS_OPTIMIZATION[] = "@CMAKE_CXX_FLAGS_OPTIMIZATION@"; -const char CMAKE_DEFINITIONS[] = "@CMAKE_DEFINITIONS@"; -const char CMAKE_INSTALL_PREFIX[] = "@CMAKE_INSTALL_PREFIX@"; -const char CMAKE_MODULE_LINKER_FLAGS[] = "@CMAKE_MODULE_LINKER_FLAGS@"; -const char CMAKE_SHARED_LINKER_FLAGS[] = "@CMAKE_SHARED_LINKER_FLAGS@"; +static const char CMAKE_BUILD_TYPE[] = "@CMAKE_BUILD_TYPE@"; +static const char CMAKE_CXX_COMPILER[] = "@CMAKE_CXX_COMPILER@"; +static const char CMAKE_CXX_FLAGS[] = "@CMAKE_CXX_FLAGS@"; +static const char CMAKE_CXX_FLAGS_DEBUG[] = "@CMAKE_CXX_FLAGS_DEBUG@"; +static const char CMAKE_CXX_FLAGS_RELEASE[] = "@CMAKE_CXX_FLAGS_RELEASE@"; +static const char CMAKE_CXX_FLAGS_OPTIMIZATION[] + = "@CMAKE_CXX_FLAGS_OPTIMIZATION@"; +static const char CMAKE_DEFINITIONS[] = "@CMAKE_DEFINITIONS@"; +static const char CMAKE_INSTALL_PREFIX[] = "@CMAKE_INSTALL_PREFIX@"; +static const char CMAKE_MODULE_LINKER_FLAGS[] = "@CMAKE_MODULE_LINKER_FLAGS@"; +static const char CMAKE_SHARED_LINKER_FLAGS[] = "@CMAKE_SHARED_LINKER_FLAGS@"; // components -const char BUILD_DEB_PACKAGE[] = "@BUILD_DEB_PACKAGE@"; -const char BUILD_RPM_PACKAGE[] = "@BUILD_RPM_PACKAGE@"; -const char CLANGFORMAT_EXECUTABLE[] = "@CLANGFORMAT_EXECUTABLE@"; -const char COVERITY_COMMENT[] = "@COVERITY_COMMENT@"; -const char COVERITY_DIRECTORY[] = "@COVERITY_DIRECTORY@"; -const char COVERITY_EMAIL[] = "@COVERITY_EMAIL@"; -const char COVERITY_EXECUTABLE[] = "@COVERITY_EXECUTABLE@"; -const char COVERITY_URL[] = "@COVERITY_URL@"; -const char CPPCHECK_EXECUTABLE[] = "@CPPCHECK_EXECUTABLE@"; +static const char BUILD_DEB_PACKAGE[] = "@BUILD_DEB_PACKAGE@"; +static const char BUILD_RPM_PACKAGE[] = "@BUILD_RPM_PACKAGE@"; +static const char CLANGFORMAT_EXECUTABLE[] = "@CLANGFORMAT_EXECUTABLE@"; +static const char COVERITY_COMMENT[] = "@COVERITY_COMMENT@"; +static const char COVERITY_DIRECTORY[] = "@COVERITY_DIRECTORY@"; +static const char COVERITY_EMAIL[] = "@COVERITY_EMAIL@"; +static const char COVERITY_EXECUTABLE[] = "@COVERITY_EXECUTABLE@"; +static const char COVERITY_URL[] = "@COVERITY_URL@"; +static const char CPPCHECK_EXECUTABLE[] = "@CPPCHECK_EXECUTABLE@"; // additional functions -const char PROP_DOCS[] = "@BUILD_DOCS@"; -const char PROP_FUTURE[] = "@BUILD_FUTURE@"; -const char PROP_LOAD[] = "@BUILD_LOAD@"; -const char PROP_TEST[] = "@BUILD_TESTING@"; +static const char PROP_DOCS[] = "@BUILD_DOCS@"; +static const char PROP_FUTURE[] = "@BUILD_FUTURE@"; +static const char PROP_LOAD[] = "@BUILD_LOAD@"; +static const char PROP_TEST[] = "@BUILD_TESTING@"; #endif /* VERSION_H */