Add plugin permissions and IO API (#5231)

This commit is contained in:
Mm2PL
2024-03-09 20:16:25 +01:00
committed by GitHub
parent 2361d30e4b
commit 658fceddaa
16 changed files with 889 additions and 19 deletions
+51 -1
View File
@@ -7,6 +7,7 @@
# include "controllers/commands/CommandContext.hpp"
# include "controllers/commands/CommandController.hpp"
# include "controllers/plugins/api/ChannelRef.hpp"
# include "controllers/plugins/api/IOWrapper.hpp"
# include "controllers/plugins/LuaAPI.hpp"
# include "controllers/plugins/LuaUtilities.hpp"
# include "messages/MessageBuilder.hpp"
@@ -140,6 +141,8 @@ void PluginController::openLibrariesFor(lua_State *L, const PluginMeta &meta,
luaL_requiref(L, reg.name, reg.func, int(true));
lua_pop(L, 1);
}
luaL_requiref(L, LUA_IOLIBNAME, luaopen_io, int(false));
lua_setfield(L, LUA_REGISTRYINDEX, lua::api::REG_REAL_IO_NAME);
// NOLINTNEXTLINE(*-avoid-c-arrays)
static const luaL_Reg c2Lib[] = {
@@ -234,8 +237,53 @@ void PluginController::openLibrariesFor(lua_State *L, const PluginMeta &meta,
lua::push(L, QString(pluginDir.absolutePath()));
lua_pushcclosure(L, lua::api::searcherAbsolute, 1);
lua_seti(L, -2, 3);
lua_pop(L, 2); // remove package, package.searchers
lua_pop(L, 3); // remove gtable, package, package.searchers
// NOLINTNEXTLINE(*-avoid-c-arrays)
static const luaL_Reg ioLib[] = {
{"close", lua::api::io_close},
{"flush", lua::api::io_flush},
{"input", lua::api::io_input},
{"lines", lua::api::io_lines},
{"open", lua::api::io_open},
{"output", lua::api::io_output},
{"popen", lua::api::io_popen}, // stub
{"read", lua::api::io_read},
{"tmpfile", lua::api::io_tmpfile}, // stub
{"write", lua::api::io_write},
// type = realio.type
{nullptr, nullptr},
};
// TODO: io.popen stub
auto iolibIdx = lua::pushEmptyTable(L, 1);
luaL_setfuncs(L, ioLib, 0);
// set ourio.type = realio.type
lua_pushvalue(L, iolibIdx);
lua_getfield(L, LUA_REGISTRYINDEX, lua::api::REG_REAL_IO_NAME);
lua_getfield(L, -1, "type");
lua_remove(L, -2); // remove realio
lua_setfield(L, iolibIdx, "type");
lua_pop(L, 1); // still have iolib on top of stack
lua_pushvalue(L, iolibIdx);
lua_setfield(L, gtable, "io");
lua_pushvalue(L, iolibIdx);
lua_setfield(L, LUA_REGISTRYINDEX, lua::api::REG_C2_IO_NAME);
luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE);
lua_pushvalue(L, iolibIdx);
lua_setfield(L, -2, "io");
lua_pop(L, 3); // remove gtable, iolib, LOADED
// Don't give plugins the option to shit into our stdio
lua_pushnil(L);
lua_setfield(L, LUA_REGISTRYINDEX, "_IO_input");
lua_pushnil(L);
lua_setfield(L, LUA_REGISTRYINDEX, "_IO_output");
}
void PluginController::load(const QFileInfo &index, const QDir &pluginDir,
@@ -263,6 +311,8 @@ void PluginController::load(const QFileInfo &index, const QDir &pluginDir,
<< meta.name << ") because it is disabled";
return;
}
temp->dataDirectory().mkpath(".");
qCDebug(chatterinoLua) << "Running lua file:" << index;
int err = luaL_dofile(l, index.absoluteFilePath().toStdString().c_str());
if (err != 0)