diff --git a/CHANGELOG.md b/CHANGELOG.md index f07f7873..44068456 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ - Minor: Added cached emotes fallback when fetching from a provider fails. (#6125) - Minor: Add an option for the reduced opacity of message history. (#6121) - Minor: Make paused chat indicator more visible, and fix its zoom behavior. (#6123) -- Minor: Added WebSocket API for plugins. (#6076) +- Minor: Added WebSocket API for plugins. (#6076, #6186) - Minor: Allow for themes to set transparent values for window background on Linux. (#6137) - Minor: Popup overlay now only draws an outline when being interacted with. (#6140) - Minor: Made filters searchable in the Settings dialog search bar. (#5890) diff --git a/src/controllers/plugins/PluginController.cpp b/src/controllers/plugins/PluginController.cpp index 06ce6c32..ab0784ad 100644 --- a/src/controllers/plugins/PluginController.cpp +++ b/src/controllers/plugins/PluginController.cpp @@ -221,16 +221,12 @@ void PluginController::initSol(sol::state_view &lua, Plugin *plugin) lua::api::ChannelRef::createUserType(c2); lua::api::HTTPResponse::createUserType(c2); lua::api::HTTPRequest::createUserType(c2); + lua::api::WebSocket::createUserType(c2, plugin); c2["ChannelType"] = lua::createEnumTable(lua); c2["HTTPMethod"] = lua::createEnumTable(lua); c2["EventType"] = lua::createEnumTable(lua); c2["LogLevel"] = lua::createEnumTable(lua); - if (plugin->hasNetworkPermission()) - { - lua::api::WebSocket::createUserType(c2, plugin); - } - sol::table io = g["io"]; io.set_function( "open", sol::overload(&lua::api::io_open, &lua::api::io_open_modeless)); diff --git a/src/controllers/plugins/api/WebSocket.cpp b/src/controllers/plugins/api/WebSocket.cpp index c2850602..e19e1abd 100644 --- a/src/controllers/plugins/api/WebSocket.cpp +++ b/src/controllers/plugins/api/WebSocket.cpp @@ -31,6 +31,11 @@ void WebSocket::createUserType(sol::table &c2, Plugin *plugin) c2.new_usertype( "WebSocket", sol::factories([plugin](const QString &spec, sol::variadic_args args) { + if (!plugin->hasNetworkPermission()) + { + throw std::runtime_error( + "Plugin does not have permission to use websockets"); + } QUrl url(spec); if (url.scheme() != "wss" && url.scheme() != "ws") { diff --git a/tests/src/Plugins.cpp b/tests/src/Plugins.cpp index acc0ef1c..9f20f263 100644 --- a/tests/src/Plugins.cpp +++ b/tests/src/Plugins.cpp @@ -786,9 +786,14 @@ TEST_F(PluginTest, testWebSocketNoPerms) configure(); bool res = lua->script(R"lua( - return c2["WebSocket"] == nil + return c2["WebSocket"] ~= nil )lua"); ASSERT_TRUE(res); + + const char *shouldThrow = R"lua( + return c2.WebSocket.new('wss://127.0.0.1:9050/echo') + )lua"; + EXPECT_ANY_THROW(lua->script(shouldThrow)); } TEST_F(PluginTest, testWebSocketApi)