CKeyAutoBinder::CKeyAutoBinder() : CLuaHandle("KeyAutoBinder", 1234, false, NULL) { if (L == NULL) { return; } LoadCompareFunc(); // load the standard libraries LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); LUA_OPEN_LIB(L, luaopen_debug); //LUA_OPEN_LIB(L, luaopen_io); //LUA_OPEN_LIB(L, luaopen_os); //LUA_OPEN_LIB(L, luaopen_package); // load the spring libraries lua_pushvalue(L, LUA_GLOBALSINDEX); if (!AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries)) { logOutput.Print("KeyAutoBinder: error loading lua libraries\n"); } lua_settop(L, 0); }
void LuaParser::SetupEnv() { LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); //LUA_OPEN_LIB(L, luaopen_io); //LUA_OPEN_LIB(L, luaopen_os); //LUA_OPEN_LIB(L, luaopen_package); //LUA_OPEN_LIB(L, luaopen_debug); // delete some dangerous/unsynced functions lua_pushnil(L); lua_setglobal(L, "dofile"); lua_pushnil(L); lua_setglobal(L, "loadfile"); lua_pushnil(L); lua_setglobal(L, "loadlib"); lua_pushnil(L); lua_setglobal(L, "require"); lua_pushnil(L); lua_setglobal(L, "gcinfo"); lua_pushnil(L); lua_setglobal(L, "collectgarbage"); // FIXME: replace "random" as in LuaHandleSynced (can write your own for now) lua_getglobal(L, "math"); lua_pushstring(L, "random"); lua_pushnil(L); lua_rawset(L, -3); lua_pushstring(L, "randomseed"); lua_pushnil(L); lua_rawset(L, -3); lua_pop(L, 1); // pop "math" AddFunc("DontMessWithMyCase", DontMessWithMyCase); GetTable("Spring"); AddFunc("Echo", Echo); AddFunc("TimeCheck", TimeCheck); EndTable(); GetTable("VFS"); AddFunc("DirList", DirList); AddFunc("SubDirs", SubDirs); AddFunc("Include", Include); AddFunc("LoadFile", LoadFile); AddFunc("FileExists", FileExists); EndTable(); }
void CLuaHandleSynced::Init(const string& syncedFile, const string& unsyncedFile, const string& modes) { if (L == NULL) { return; } if (fullCtrl) { // numWeaponDefs has an extra slot for (int w = 0; w <= weaponDefHandler->numWeaponDefs; w++) { watchWeapons.push_back(false); } } const string syncedCode = LoadFile(syncedFile, modes); const string unsyncedCode = LoadFile(unsyncedFile, modes); if (syncedCode.empty() && unsyncedCode.empty()) { KillLua(); return; } // load the standard libraries LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); //LUA_OPEN_LIB(L, luaopen_io); //LUA_OPEN_LIB(L, luaopen_os); //LUA_OPEN_LIB(L, luaopen_package); //LUA_OPEN_LIB(L, luaopen_debug); // delete some dangerous functions lua_pushnil(L); lua_setglobal(L, "dofile"); lua_pushnil(L); lua_setglobal(L, "loadfile"); lua_pushnil(L); lua_setglobal(L, "loadlib"); lua_pushnil(L); lua_setglobal(L, "loadstring"); // replaced lua_pushnil(L); lua_setglobal(L, "require"); lua_pushnil(L); lua_setglobal(L, "rawequal"); lua_pushnil(L); lua_setglobal(L, "rawget"); lua_pushnil(L); lua_setglobal(L, "rawset"); // lua_pushnil(L); lua_setglobal(L, "getfenv"); // lua_pushnil(L); lua_setglobal(L, "setfenv"); lua_pushnil(L); lua_setglobal(L, "newproxy"); lua_pushnil(L); lua_setglobal(L, "gcinfo"); lua_pushnil(L); lua_setglobal(L, "collectgarbage"); // use gs->randFloat() for the synchronized code, and disable randomseed() // (this first copies the original functions to the registry for unsynced) if (!SyncifyRandomFuncs()) { KillLua(); return; } CLuaHandle* origHandle = activeHandle; SetActiveHandle(); synced = true; const bool haveSynced = SetupSynced(syncedCode, syncedFile); if (L == NULL) { SetActiveHandle(origHandle); return; } synced = false; const bool haveUnsynced = SetupUnsynced(unsyncedCode, unsyncedFile); if (L == NULL) { SetActiveHandle(origHandle); return; } synced = true; if (!haveSynced && !haveUnsynced) { KillLua(); SetActiveHandle(origHandle); return; } // register for call-ins eventHandler.AddClient(this); SetActiveHandle(origHandle); }
CLuaIntro::CLuaIntro() : CLuaHandle("LuaIntro", LUA_HANDLE_ORDER_INTRO, true) { LuaIntro = this; if (!IsValid()) { return; } const std::string file = "LuaIntro/main.lua"; const string code = LoadFile(file); if (code.empty()) { KillLua(); return; } // load the standard libraries LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_io); LUA_OPEN_LIB(L, luaopen_os); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); LUA_OPEN_LIB(L, luaopen_debug); // setup the lua IO access check functions lua_set_fopen(L, LuaIO::fopen); lua_set_popen(L, LuaIO::popen, LuaIO::pclose); lua_set_system(L, LuaIO::system); lua_set_remove(L, LuaIO::remove); lua_set_rename(L, LuaIO::rename); // remove a few dangerous calls lua_getglobal(L, "io"); lua_pushstring(L, "popen"); lua_pushnil(L); lua_rawset(L, -3); lua_pop(L, 1); lua_getglobal(L, "os"); { lua_pushliteral(L, "exit"); lua_pushnil(L); lua_rawset(L, -3); lua_pushliteral(L, "execute"); lua_pushnil(L); lua_rawset(L, -3); //lua_pushliteral(L, "remove"); lua_pushnil(L); lua_rawset(L, -3); //lua_pushliteral(L, "rename"); lua_pushnil(L); lua_rawset(L, -3); lua_pushliteral(L, "tmpname"); lua_pushnil(L); lua_rawset(L, -3); lua_pushliteral(L, "getenv"); lua_pushnil(L); lua_rawset(L, -3); //lua_pushliteral(L, "setlocale"); lua_pushnil(L); lua_rawset(L, -3); } lua_pop(L, 1); // os lua_pushvalue(L, LUA_GLOBALSINDEX); AddBasicCalls(L); // into Global // load the spring libraries if ( !AddEntriesToTable(L, "Spring", LoadUnsyncedCtrlFunctions) || !AddEntriesToTable(L, "Spring", LoadUnsyncedReadFunctions) || !AddEntriesToTable(L, "Spring", LoadSyncedReadFunctions) || !AddEntriesToTable(L, "VFS", LuaVFS::PushUnsynced) || !AddEntriesToTable(L, "VFS", LuaZipFileReader::PushUnsynced) || !AddEntriesToTable(L, "VFS", LuaZipFileWriter::PushUnsynced) || !AddEntriesToTable(L, "Script", LuaScream::PushEntries) || //!AddEntriesToTable(L, "Script", LuaInterCall::PushEntriesUnsynced) || //!AddEntriesToTable(L, "Script", LuaLobby::PushEntries) || !AddEntriesToTable(L, "gl", LuaOpenGL::PushEntries) || !AddEntriesToTable(L, "GL", LuaConstGL::PushEntries) || !AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "CMD", LuaConstCMD::PushEntries) || !AddEntriesToTable(L, "CMDTYPE", LuaConstCMDTYPE::PushEntries) || !AddEntriesToTable(L, "LOG", LuaUtils::PushLogEntries) ) { KillLua(); return; } RemoveSomeOpenGLFunctions(L); lua_settop(L, 0); if (!LoadCode(L, code, file)) { KillLua(); return; } lua_settop(L, 0); // register for call-ins eventHandler.AddClient(this); }
bool CUnsyncedLuaHandle::Init(const string& code, const string& file) { if (!IsValid()) { return false; } // load the standard libraries LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); //LUA_OPEN_LIB(L, luaopen_io); //LUA_OPEN_LIB(L, luaopen_os); //LUA_OPEN_LIB(L, luaopen_package); //LUA_OPEN_LIB(L, luaopen_debug); // delete some dangerous functions lua_pushnil(L); lua_setglobal(L, "dofile"); lua_pushnil(L); lua_setglobal(L, "loadfile"); lua_pushnil(L); lua_setglobal(L, "loadlib"); lua_pushnil(L); lua_setglobal(L, "loadstring"); // replaced lua_pushnil(L); lua_setglobal(L, "require"); lua_pushvalue(L, LUA_GLOBALSINDEX); AddBasicCalls(L); // remove Script.Kill() lua_getglobal(L, "Script"); LuaPushNamedNil(L, "Kill"); lua_pop(L, 1); LuaPushNamedCFunc(L, "loadstring", CLuaHandleSynced::LoadStringData); LuaPushNamedCFunc(L, "CallAsTeam", CLuaHandleSynced::CallAsTeam); LuaPushNamedNumber(L, "COBSCALE", COBSCALE); // load our libraries if (!LuaSyncedTable::PushEntries(L) || !AddEntriesToTable(L, "VFS", LuaVFS::PushUnsynced) || !AddEntriesToTable(L, "VFS", LuaZipFileReader::PushUnsynced) || !AddEntriesToTable(L, "VFS", LuaZipFileWriter::PushUnsynced) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries) || !AddEntriesToTable(L, "FeatureDefs", LuaFeatureDefs::PushEntries) || !AddEntriesToTable(L, "Script", LuaInterCall::PushEntriesUnsynced) || !AddEntriesToTable(L, "Script", LuaScream::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedRead::PushEntries) || !AddEntriesToTable(L, "Spring", LuaUnsyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaUnsyncedRead::PushEntries) || !AddEntriesToTable(L, "gl", LuaOpenGL::PushEntries) || !AddEntriesToTable(L, "GL", LuaConstGL::PushEntries) || !AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "CMD", LuaConstCMD::PushEntries) || !AddEntriesToTable(L, "CMDTYPE", LuaConstCMDTYPE::PushEntries) || !AddEntriesToTable(L, "LOG", LuaUtils::PushLogEntries) ) { KillLua(); return false; } lua_settop(L, 0); // add code from the sub-class if (!base.AddUnsyncedCode(L)) { KillLua(); return false; } lua_settop(L, 0); if (!LoadCode(L, code, file)) { KillLua(); return false; } lua_settop(L, 0); eventHandler.AddClient(this); return true; }
bool CSyncedLuaHandle::Init(const string& code, const string& file) { if (!IsValid()) return false; watchUnitDefs.resize(unitDefHandler->unitDefs.size() + 1, false); watchFeatureDefs.resize(featureHandler->GetFeatureDefs().size(), false); watchWeaponDefs.resize(weaponDefHandler->weaponDefs.size(), false); // load the standard libraries LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); //LUA_OPEN_LIB(L, luaopen_io); //LUA_OPEN_LIB(L, luaopen_os); //LUA_OPEN_LIB(L, luaopen_package); //LUA_OPEN_LIB(L, luaopen_debug); lua_getglobal(L, "next"); origNextRef = luaL_ref(L, LUA_REGISTRYINDEX); // delete/replace some dangerous functions lua_pushnil(L); lua_setglobal(L, "dofile"); lua_pushnil(L); lua_setglobal(L, "loadfile"); lua_pushnil(L); lua_setglobal(L, "loadlib"); lua_pushnil(L); lua_setglobal(L, "require"); lua_pushnil(L); lua_setglobal(L, "rawequal"); //FIXME not unsafe anymore since split? lua_pushnil(L); lua_setglobal(L, "rawget"); //FIXME not unsafe anymore since split? lua_pushnil(L); lua_setglobal(L, "rawset"); //FIXME not unsafe anymore since split? // lua_pushnil(L); lua_setglobal(L, "getfenv"); // lua_pushnil(L); lua_setglobal(L, "setfenv"); lua_pushnil(L); lua_setglobal(L, "newproxy"); // sync unsafe cause of __gc lua_pushnil(L); lua_setglobal(L, "gcinfo"); lua_pushnil(L); lua_setglobal(L, "collectgarbage"); lua_pushvalue(L, LUA_GLOBALSINDEX); LuaPushNamedCFunc(L, "loadstring", CLuaHandleSynced::LoadStringData); LuaPushNamedCFunc(L, "pairs", SyncedPairs); LuaPushNamedCFunc(L, "next", SyncedNext); lua_pop(L, 1); lua_pushvalue(L, LUA_GLOBALSINDEX); AddBasicCalls(L); // into Global // adjust the math.random() and math.randomseed() calls lua_getglobal(L, "math"); LuaPushNamedCFunc(L, "random", SyncedRandom); LuaPushNamedCFunc(L, "randomseed", SyncedRandomSeed); lua_pop(L, 1); // pop the global math table lua_getglobal(L, "Script"); LuaPushNamedCFunc(L, "AddActionFallback", AddSyncedActionFallback); LuaPushNamedCFunc(L, "RemoveActionFallback", RemoveSyncedActionFallback); LuaPushNamedCFunc(L, "GetWatchUnit", GetWatchUnitDef); LuaPushNamedCFunc(L, "SetWatchUnit", SetWatchUnitDef); LuaPushNamedCFunc(L, "GetWatchFeature", GetWatchFeatureDef); LuaPushNamedCFunc(L, "SetWatchFeature", SetWatchFeatureDef); LuaPushNamedCFunc(L, "GetWatchWeapon", GetWatchWeaponDef); LuaPushNamedCFunc(L, "SetWatchWeapon", SetWatchWeaponDef); lua_pop(L, 1); // add the custom file loader LuaPushNamedCFunc(L, "SendToUnsynced", SendToUnsynced); LuaPushNamedCFunc(L, "CallAsTeam", CLuaHandleSynced::CallAsTeam); LuaPushNamedNumber(L, "COBSCALE", COBSCALE); // load our libraries (LuaSyncedCtrl overrides some LuaUnsyncedCtrl entries) if ( !AddEntriesToTable(L, "VFS", LuaVFS::PushSynced) || !AddEntriesToTable(L, "VFS", LuaZipFileReader::PushSynced) || !AddEntriesToTable(L, "VFS", LuaZipFileWriter::PushSynced) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries) || !AddEntriesToTable(L, "FeatureDefs", LuaFeatureDefs::PushEntries) || !AddEntriesToTable(L, "Script", LuaInterCall::PushEntriesSynced) || !AddEntriesToTable(L, "Spring", LuaUnsyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedRead::PushEntries) || !AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "CMD", LuaConstCMD::PushEntries) || !AddEntriesToTable(L, "CMDTYPE", LuaConstCMDTYPE::PushEntries) || !AddEntriesToTable(L, "COB", LuaConstCOB::PushEntries) || !AddEntriesToTable(L, "SFX", LuaConstSFX::PushEntries) || !AddEntriesToTable(L, "LOG", LuaUtils::PushLogEntries) ) { KillLua(); return false; } // add code from the sub-class if (!base.AddSyncedCode(L)) { KillLua(); return false; } lua_settop(L, 0); if (!LoadCode(L, code, file)) { KillLua(); return false; } lua_settop(L, 0); eventHandler.AddClient(this); return true; }
void CLuaHandleSynced::Init(const string& syncedFile, const string& unsyncedFile, const string& modes) { if (!IsValid()) return; if (GetFullCtrl()) { watchUnitDefs.resize(unitDefHandler->unitDefs.size() + 1, false); watchFeatureDefs.resize(featureHandler->GetFeatureDefs().size(), false); watchWeaponDefs.resize(weaponDefHandler->numWeaponDefs, false); } const string syncedCode = LoadFile(syncedFile, modes); const string unsyncedCode = LoadFile(unsyncedFile, modes); if (syncedCode.empty() && unsyncedCode.empty()) { KillLua(); return; } BEGIN_ITERATE_LUA_STATES(); // load the standard libraries LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); //LUA_OPEN_LIB(L, luaopen_io); //LUA_OPEN_LIB(L, luaopen_os); //LUA_OPEN_LIB(L, luaopen_package); //LUA_OPEN_LIB(L, luaopen_debug); // delete some dangerous functions lua_pushnil(L); lua_setglobal(L, "dofile"); lua_pushnil(L); lua_setglobal(L, "loadfile"); lua_pushnil(L); lua_setglobal(L, "loadlib"); lua_pushnil(L); lua_setglobal(L, "loadstring"); // replaced lua_pushnil(L); lua_setglobal(L, "require"); lua_pushnil(L); lua_setglobal(L, "rawequal"); lua_pushnil(L); lua_setglobal(L, "rawget"); lua_pushnil(L); lua_setglobal(L, "rawset"); // lua_pushnil(L); lua_setglobal(L, "getfenv"); // lua_pushnil(L); lua_setglobal(L, "setfenv"); lua_pushnil(L); lua_setglobal(L, "newproxy"); lua_pushnil(L); lua_setglobal(L, "gcinfo"); lua_pushnil(L); lua_setglobal(L, "collectgarbage"); // use gs->randFloat() for the synchronized code, and disable randomseed() // (this first copies the original functions to the registry for unsynced) if (!SyncifyRandomFuncs(L)) { KillLua(); return; } SetAllowChanges(true, true); SetSynced(true, true); const bool haveSynced = (SingleState() || L == L_Sim) && SetupSynced(L, syncedCode, syncedFile); if (!IsValid()) return; SetAllowChanges(false, true); SetSynced(false, true); const bool haveUnsynced = (SingleState() || L == L_Draw) && SetupUnsynced(L, unsyncedCode, unsyncedFile); if (!IsValid()) return; SetSynced(true, true); SetAllowChanges(true, true); if (!haveSynced && !haveUnsynced) { KillLua(); return; } // register for call-ins eventHandler.AddClient(this); END_ITERATE_LUA_STATES(); }