diff options
| author | ilotterytea <iltsu@alright.party> | 2025-12-01 20:51:32 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-12-01 20:51:32 +0500 |
| commit | 638622d66dbe58ff96b7d1c2c6ec4b040b27da6d (patch) | |
| tree | 2f04c3b26a320f4abf5927edc5af34716e42b970 /bot/src/commands/lua.hpp | |
| parent | 0d36a1ee88fb7aedf5b33af7ac95140b002c5a64 (diff) | |
feat: switch for lua scripts
Diffstat (limited to 'bot/src/commands/lua.hpp')
| -rw-r--r-- | bot/src/commands/lua.hpp | 62 |
1 files changed, 39 insertions, 23 deletions
diff --git a/bot/src/commands/lua.hpp b/bot/src/commands/lua.hpp index 27cc142..2f236f2 100644 --- a/bot/src/commands/lua.hpp +++ b/bot/src/commands/lua.hpp @@ -1,5 +1,6 @@ #pragma once +#include <algorithm> #include <memory> #include <optional> #include <sol/sol.hpp> @@ -18,52 +19,52 @@ #include "schemas/user.hpp" #include "utils/string.hpp" -void print_lua_object_type(const sol::object &obj); +void print_lua_object_type(const sol::object& obj); namespace bot::command::lua { namespace library { void add_bot_library(std::shared_ptr<sol::state> state); void add_bot_library(std::shared_ptr<sol::state> state, - const InstanceBundle &bundle); + const InstanceBundle& bundle); void add_time_library(std::shared_ptr<sol::state> state); void add_json_library(std::shared_ptr<sol::state> state); void add_twitch_library(std::shared_ptr<sol::state> state, - const Request &request, - const InstanceBundle &bundle); + const Request& request, + const InstanceBundle& bundle); void add_kick_library(std::shared_ptr<sol::state> state, - const InstanceBundle &bundle); + const InstanceBundle& bundle); void add_net_library(std::shared_ptr<sol::state> state); void add_db_library(std::shared_ptr<sol::state> state, - const Configuration &config); + const Configuration& config); void add_irc_library(std::shared_ptr<sol::state> state, - const InstanceBundle &bundle); + const InstanceBundle& bundle); void add_l10n_library(std::shared_ptr<sol::state> state, - const InstanceBundle &bundle); + const InstanceBundle& bundle); void add_storage_library(std::shared_ptr<sol::state> state, - const Request &request, const Configuration &cfg, - const std::string &lua_id); + const Request& request, const Configuration& cfg, + const std::string& lua_id); void add_rss_library(std::shared_ptr<sol::state> state); void add_base_libraries(std::shared_ptr<sol::state> state); void add_chat_libraries(std::shared_ptr<sol::state> state, - const Request &request, - const InstanceBundle &bundle); + const Request& request, + const InstanceBundle& bundle); } - command::Response run_safe_lua_script(const Request &request, - const InstanceBundle &bundle, - const std::string &script, + command::Response run_safe_lua_script(const Request& request, + const InstanceBundle& bundle, + const std::string& script, std::string lua_id = ""); class LuaCommand : public Command { public: LuaCommand(std::shared_ptr<sol::state> luaState, - const std::string &content); + const std::string& content); ~LuaCommand() = default; - Response run(const InstanceBundle &bundle, - const Request &request) const override; + Response run(const InstanceBundle& bundle, + const Request& request) const override; std::string get_name() const override { return this->name; } int get_delay_seconds() const override { return this->delay; } @@ -94,8 +95,13 @@ namespace bot::command::lua { int get_delay_seconds() const override { return 1; } - command::Response run(const InstanceBundle &bundle, - const command::Request &request) const override { + command::Response run(const InstanceBundle& bundle, + const command::Request& request) const override { + if (!bundle.configuration.lua.allow_arbitrary_scripts) { + throw ResponseException<ResponseError::ILLEGAL_COMMAND>( + request, bundle.localization); + } + if (!request.message.has_value()) { throw ResponseException<ResponseError::NOT_ENOUGH_ARGUMENTS>( request, bundle.localization, command::CommandArgument::VALUE); @@ -112,13 +118,23 @@ namespace bot::command::lua { int get_delay_seconds() const override { return 2; } - command::Response run(const InstanceBundle &bundle, - const command::Request &request) const override { + command::Response run(const InstanceBundle& bundle, + const command::Request& request) const override { if (!request.message.has_value()) { throw ResponseException<ResponseError::NOT_ENOUGH_ARGUMENTS>( request, bundle.localization, command::CommandArgument::VALUE); } + if (!bundle.configuration.lua.allow_arbitrary_scripts && + !std::any_of(bundle.configuration.lua.script_whitelist.begin(), + bundle.configuration.lua.script_whitelist.end(), + [&request](const std::string& i) { + return i == request.message.value(); + })) { + throw ResponseException<ResponseError::ILLEGAL_COMMAND>( + request, bundle.localization); + } + std::vector<std::string> parts = utils::string::split_text(request.message.value(), ' '); @@ -154,7 +170,7 @@ namespace bot::command::lua { std::string contentType = response.header["Content-Type"]; if (!std::any_of( mimeTypes.begin(), mimeTypes.end(), - [&contentType](const auto &x) { return x == contentType; })) { + [&contentType](const auto& x) { return x == contentType; })) { throw ResponseException<ResponseError::INCORRECT_ARGUMENT>( request, bundle.localization, url); } |
