Add plugin permissions and IO API (#5231)
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user