From b3ae6eb59acfc34a338d4ad7ae2cc2d5fb8cbaa7 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 5 Jan 2026 16:40:00 +0300 Subject: [PATCH 1/4] add 'record-audio' permission --- res/layouts/pages/settings_audio.xml.lua | 5 ++++- res/project.toml | 3 ++- src/audio/audio.cpp | 14 ++++++++++++-- src/audio/audio.hpp | 2 +- src/devtools/Project.hpp | 1 + src/engine/Engine.cpp | 6 +++++- 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/res/layouts/pages/settings_audio.xml.lua b/res/layouts/pages/settings_audio.xml.lua index eaa8b3fb1..03d8e1a9b 100644 --- a/res/layouts/pages/settings_audio.xml.lua +++ b/res/layouts/pages/settings_audio.xml.lua @@ -67,5 +67,8 @@ function on_open() table.insert(devices, {value=name, text=name}) end selectbox.options = devices - selectbox.value = audio.__get_input_info().device_specifier + local info = audio.__get_input_info() + if info then + selectbox.value = info.device_specifier + end end diff --git a/res/project.toml b/res/project.toml index c7e2fb69d..b641ad00f 100644 --- a/res/project.toml +++ b/res/project.toml @@ -2,5 +2,6 @@ name = "default" base_packs = ["base"] permissions = [ - "network" + "network", + "record-audio" ] diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index 436fa1dad..dc0e57463 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -24,6 +24,7 @@ namespace { std::vector> channels; util::ObjectsKeeper objects_keeper {}; std::unique_ptr input_device = nullptr; + static bool input_enabled = false; } Channel::Channel(std::string name) : name(std::move(name)) { @@ -152,7 +153,9 @@ public: } }; -void audio::initialize(bool enabled, AudioSettings& settings) { +void audio::initialize( + bool enabled, bool inputEnabled, AudioSettings& settings +) { enabled = enabled && settings.enabled.get(); if (enabled) { logger.info() << "initializing ALAudio backend"; @@ -182,7 +185,10 @@ void audio::initialize(bool enabled, AudioSettings& settings) { }, true)); } - ::input_device = backend->openInputDevice("", 44100, 1, 16); + if (inputEnabled) { + ::input_device = backend->openInputDevice("", 44100, 1, 16); + ::input_enabled = true; + } if (::input_device) { ::input_device->startCapture(); } @@ -270,6 +276,10 @@ std::vector audio::get_output_devices_names() { void audio::set_input_device(const std::string& deviceName) { logger.info() << "setting input device to " << deviceName; + if (!::input_enabled) { + logger.warning() << "unable to set input device due to project permissions"; + return; + } if (deviceName == audio::DEVICE_NONE) { if (::input_device) { ::input_device->stopCapture(); diff --git a/src/audio/audio.hpp b/src/audio/audio.hpp index 0ccd51f35..642b9235d 100644 --- a/src/audio/audio.hpp +++ b/src/audio/audio.hpp @@ -402,7 +402,7 @@ namespace audio { /// @brief Initialize audio system or use no audio mode /// @param enabled try to initialize actual audio - void initialize(bool enabled, AudioSettings& settings); + void initialize(bool enabled, bool inputEnabled, AudioSettings& settings); /// @brief Load audio file info and PCM data /// @param file audio file diff --git a/src/devtools/Project.hpp b/src/devtools/Project.hpp index ba2d0d407..9be0194ae 100644 --- a/src/devtools/Project.hpp +++ b/src/devtools/Project.hpp @@ -13,6 +13,7 @@ namespace scripting { } struct Permissions { + static inline std::string RECORD_AUDIO = "record-audio"; static inline std::string WRITE_TO_USER = "write-to-user"; static inline std::string NETWORK = "network"; diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 9dcfbaa98..5cb0e7ca6 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -160,7 +160,11 @@ void Engine::initialize(CoreParameters coreParameters) { if (!params.headless) { initializeClient(); } - audio::initialize(!params.headless, settings.audio); + audio::initialize( + !params.headless, + project->permissions.has(Permissions::RECORD_AUDIO), + settings.audio + ); if (settings.ui.language.get() == "auto") { settings.ui.language.set( From 87deff97f3d1e386454de19efc4446fc623ebf69 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 5 Jan 2026 16:45:07 +0300 Subject: [PATCH 2/4] add 'debugging' permission --- src/devtools/Project.hpp | 3 ++- src/logic/scripting/lua/libs/libapp.cpp | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/devtools/Project.hpp b/src/devtools/Project.hpp index 9be0194ae..23aa11ca5 100644 --- a/src/devtools/Project.hpp +++ b/src/devtools/Project.hpp @@ -13,9 +13,10 @@ namespace scripting { } struct Permissions { + static inline std::string DEBUGGING = "debugging"; + static inline std::string NETWORK = "network"; static inline std::string RECORD_AUDIO = "record-audio"; static inline std::string WRITE_TO_USER = "write-to-user"; - static inline std::string NETWORK = "network"; std::set permissions; diff --git a/src/logic/scripting/lua/libs/libapp.cpp b/src/logic/scripting/lua/libs/libapp.cpp index 7c406d1aa..d23f96cb0 100644 --- a/src/logic/scripting/lua/libs/libapp.cpp +++ b/src/logic/scripting/lua/libs/libapp.cpp @@ -6,6 +6,7 @@ #include "content/ContentControl.hpp" #include "engine/Engine.hpp" #include "engine/EnginePaths.hpp" +#include "devtools/Project.hpp" #include "network/Network.hpp" #include "util/platform.hpp" #include "window/Window.hpp" @@ -13,6 +14,10 @@ using namespace scripting; static int l_start_debug_instance(lua::State* L) { + if (!engine->getProject().permissions.has(Permissions::DEBUGGING)) { + throw std::runtime_error("project has no debugging permission"); + } + int port = lua::tointeger(L, 1); if (port == 0) { auto network = engine->getNetwork(); From 6942704c78d7ff3365003bb696a0ee5af935e661 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 5 Jan 2026 16:45:17 +0300 Subject: [PATCH 3/4] cleanup --- res/layouts/pages/settings_audio.xml.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/layouts/pages/settings_audio.xml.lua b/res/layouts/pages/settings_audio.xml.lua index 03d8e1a9b..f8a23baa9 100644 --- a/res/layouts/pages/settings_audio.xml.lua +++ b/res/layouts/pages/settings_audio.xml.lua @@ -18,8 +18,8 @@ function update_setting(x, id, name, postfix) -- updating label document[id..".L"].text = string.format( "%s: %s%s", - gui.str(name, "settings"), - core.str_setting(id), + gui.str(name, "settings"), + core.str_setting(id), postfix ) end From 72040b5dbb37c6588a53e6d7584f16e98ed0a8e2 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 5 Jan 2026 17:19:40 +0300 Subject: [PATCH 4/4] fix debugging server creation --- src/devtools/DebuggingServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devtools/DebuggingServer.cpp b/src/devtools/DebuggingServer.cpp index ad56e46ec..cb50c87a8 100644 --- a/src/devtools/DebuggingServer.cpp +++ b/src/devtools/DebuggingServer.cpp @@ -102,7 +102,7 @@ static network::Server& create_tcp_server( } u64id_t serverId = network->openTcpServer( port, - [&network, &dbgServer](u64id_t sid, u64id_t id) { + [network, &dbgServer](u64id_t sid, u64id_t id) { auto& connection = dynamic_cast( *network->getConnection(id, true) );