From dd40780334ec63a3e97615fa084fa8863da37c04 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 7 Dec 2025 01:26:48 +0300 Subject: [PATCH] add 'network' permission --- res/project.toml | 3 +++ res/scripts/classes.lua | 3 +++ src/devtools/DebuggingServer.cpp | 17 +++++++++---- src/devtools/Project.hpp | 1 + src/engine/Engine.cpp | 11 ++++++-- src/engine/Engine.hpp | 7 +++--- src/frontend/debug_panel.cpp | 28 ++++++++++++--------- src/logic/scripting/lua/libs/libapp.cpp | 6 ++++- src/logic/scripting/lua/libs/libnetwork.cpp | 17 ++++++++++--- src/network/Network.cpp | 1 + 10 files changed, 67 insertions(+), 27 deletions(-) diff --git a/res/project.toml b/res/project.toml index c30e72dd..c7e2fb69 100644 --- a/res/project.toml +++ b/res/project.toml @@ -1,3 +1,6 @@ # default project name = "default" base_packs = ["base"] +permissions = [ + "network" +] diff --git a/res/scripts/classes.lua b/res/scripts/classes.lua index f55a503b..664710a3 100644 --- a/res/scripts/classes.lua +++ b/res/scripts/classes.lua @@ -182,6 +182,9 @@ local function clean(iterable, checkFun, ...) end network.__process_events = function() + if not network.is_available() then + return + end local CLIENT_CONNECTED = 1 local CONNECTED_TO_SERVER = 2 local DATAGRAM = 3 diff --git a/src/devtools/DebuggingServer.cpp b/src/devtools/DebuggingServer.cpp index b1aba638..ad56e46e 100644 --- a/src/devtools/DebuggingServer.cpp +++ b/src/devtools/DebuggingServer.cpp @@ -94,12 +94,17 @@ bool ClientConnection::alive() const { static network::Server& create_tcp_server( DebuggingServer& dbgServer, Engine& engine, int port ) { - auto& network = engine.getNetwork(); - u64id_t serverId = network.openTcpServer( + auto network = engine.getNetwork(); + if (network == nullptr) { + throw std::runtime_error( + "unable to create tcp server: project has no network permission" + ); + } + u64id_t serverId = network->openTcpServer( port, [&network, &dbgServer](u64id_t sid, u64id_t id) { auto& connection = dynamic_cast( - *network.getConnection(id, true) + *network->getConnection(id, true) ); connection.setPrivate(true); logger.info() << "connected client " << id << ": " @@ -108,7 +113,7 @@ static network::Server& create_tcp_server( dbgServer.setClient(id); } ); - auto& server = *network.getServer(serverId, true); + auto& server = *network->getServer(serverId, true); server.setPrivate(true); auto& tcpServer = dynamic_cast(server); @@ -302,8 +307,10 @@ void DebuggingServer::sendValue( } void DebuggingServer::setClient(u64id_t client) { + auto network = engine.getNetwork(); + assert (network != nullptr); connection = - std::make_unique(engine.getNetwork(), client); + std::make_unique(*network, client); connectionEstablished = false; } diff --git a/src/devtools/Project.hpp b/src/devtools/Project.hpp index a07aec0c..ba2d0d40 100644 --- a/src/devtools/Project.hpp +++ b/src/devtools/Project.hpp @@ -14,6 +14,7 @@ namespace scripting { struct Permissions { static inline std::string WRITE_TO_USER = "write-to-user"; + static inline std::string NETWORK = "network"; std::set permissions; diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 4e38ac36..9dcfbaa9 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -138,7 +138,10 @@ void Engine::initialize(CoreParameters coreParameters) { editor = std::make_unique(*this); cmd = std::make_unique(); - network = network::Network::create(settings.network); + + if (project->permissions.has(Permissions::NETWORK)) { + network = network::Network::create(settings.network); + } if (!params.debugServerString.empty()) { try { @@ -233,7 +236,9 @@ void Engine::run() { } void Engine::postUpdate() { - network->update(); + if (network) { + network->update(); + } postRunnables.run(); scripting::process_post_runnables(); @@ -266,6 +271,8 @@ void Engine::nextFrame(bool waitForRefresh) { } void Engine::startPauseLoop() { + assert (network != nullptr); + bool initialCursorLocked = false; if (!isHeadless()) { initialCursorLocked = input->isCursorLocked(); diff --git a/src/engine/Engine.hpp b/src/engine/Engine.hpp index 6b09b2ca..c9206786 100644 --- a/src/engine/Engine.hpp +++ b/src/engine/Engine.hpp @@ -3,13 +3,12 @@ #include "CoreParameters.hpp" #include "PostRunnables.hpp" #include "Time.hpp" -#include "delegates.hpp" #include "settings.hpp" -#include "typedefs.hpp" #include "util/ObjectsKeeper.hpp" #include #include +#include class Assets; class ContentControl; @@ -161,8 +160,8 @@ public: return *window; } - network::Network& getNetwork() { - return *network; + network::Network* getNetwork() { + return network.get(); } cmd::CommandsInterpreter& getCmd() { diff --git a/src/frontend/debug_panel.cpp b/src/frontend/debug_panel.cpp index 32439b65..5dc70af0 100644 --- a/src/frontend/debug_panel.cpp +++ b/src/frontend/debug_panel.cpp @@ -59,6 +59,7 @@ std::shared_ptr create_debug_panel( Player& player, bool allowDebugCheats ) { + auto network = engine.getNetwork(); auto& gui = engine.getGUI(); auto panel = std::make_shared( gui, glm::vec2(300, 200), glm::vec4(5.0f), 2.0f @@ -87,17 +88,18 @@ std::shared_ptr create_debug_panel( fpsMax = fps; }); - panel->listenInterval(1.0f, [&engine]() { - const auto& network = engine.getNetwork(); - size_t totalDownload = network.getTotalDownload(); - size_t totalUpload = network.getTotalUpload(); - netSpeedString = - L"download: " + std::to_wstring(totalDownload - lastTotalDownload) + - L" B/s upload: " + std::to_wstring(totalUpload - lastTotalUpload) + - L" B/s"; - lastTotalDownload = totalDownload; - lastTotalUpload = totalUpload; - }); + if (network) { + panel->listenInterval(1.0f, [network]() { + size_t totalDownload = network->getTotalDownload(); + size_t totalUpload = network->getTotalUpload(); + netSpeedString = + L"download: " + std::to_wstring(totalDownload - lastTotalDownload) + + L" B/s upload: " + std::to_wstring(totalUpload - lastTotalUpload) + + L" B/s"; + lastTotalDownload = totalDownload; + lastTotalUpload = totalUpload; + }); + } panel->add(create_label(gui, []() { return L"fps: "+fpsString;})); @@ -116,7 +118,9 @@ std::shared_ptr create_debug_panel( panel->add(create_label(gui, []() { return L"lua-stack: " + std::to_wstring(scripting::get_values_on_stack()); })); - panel->add(create_label(gui, []() { return netSpeedString; })); + if (network) { + panel->add(create_label(gui, []() { return netSpeedString; })); + } panel->add(create_label(gui, [&engine]() { auto& settings = engine.getSettings(); bool culling = settings.graphics.frustumCulling.get(); diff --git a/src/logic/scripting/lua/libs/libapp.cpp b/src/logic/scripting/lua/libs/libapp.cpp index 724bac65..7c406d1a 100644 --- a/src/logic/scripting/lua/libs/libapp.cpp +++ b/src/logic/scripting/lua/libs/libapp.cpp @@ -15,7 +15,11 @@ using namespace scripting; static int l_start_debug_instance(lua::State* L) { int port = lua::tointeger(L, 1); if (port == 0) { - port = engine->getNetwork().findFreePort(); + auto network = engine->getNetwork(); + if (network == nullptr) { + throw std::runtime_error("project has no network permission"); + } + port = network->findFreePort(); if (port == -1) { throw std::runtime_error("could not find free port"); } diff --git a/src/logic/scripting/lua/libs/libnetwork.cpp b/src/logic/scripting/lua/libs/libnetwork.cpp index b1b3a41f..cfacfb28 100644 --- a/src/logic/scripting/lua/libs/libnetwork.cpp +++ b/src/logic/scripting/lua/libs/libnetwork.cpp @@ -133,7 +133,7 @@ static int l_post(lua::State* L, network::Network& network) { auto headers = read_headers(L, 3); int currentRequestId = request_id++; - engine->getNetwork().post( + network.post( url, string, [currentRequestId](std::vector bytes) { @@ -240,7 +240,7 @@ static int l_recv(lua::State* L, network::Network& network) { u64id_t id = lua::tointeger(L, 1); int length = lua::tointeger(L, 2); - auto connection = engine->getNetwork().getConnection(id, false); + auto connection = network.getConnection(id, false); if (connection == nullptr || connection->getTransportType() != network::TransportType::TCP) { return 0; @@ -519,11 +519,21 @@ static int l_pull_events(lua::State* L, network::Network& network) { return 1; } +int l_is_available(lua::State* L) { + return engine->getNetwork() != nullptr; +} + template int wrap(lua_State* L) { int result = 0; try { - result = func(L, engine->getNetwork()); + auto network = engine->getNetwork(); + if (network == nullptr) { + throw std::runtime_error( + "network subsystem is not available in the project" + ); + } + result = func(L, *network); } // transform exception with description into lua_error catch (std::exception& e) { @@ -543,6 +553,7 @@ const luaL_Reg networklib[] = { {"get_total_upload", wrap}, {"get_total_download", wrap}, {"find_free_port", wrap}, + {"is_available", lua::wrap}, {"__pull_events", wrap}, {"__open_tcp", wrap}, {"__open_udp", wrap}, diff --git a/src/network/Network.cpp b/src/network/Network.cpp index 868273bf..a0e1eb60 100644 --- a/src/network/Network.cpp +++ b/src/network/Network.cpp @@ -194,5 +194,6 @@ void Network::update() { } std::unique_ptr Network::create(const NetworkSettings& settings) { + logger.info() << "initializing network"; return std::make_unique(network::create_curl_requests()); }