mirror of
https://github.com/luanti-org/luanti.git
synced 2025-09-15 18:57:08 +00:00
Lua API: Unify server env checks and fix missing ones (#16457)
A few functions tried to dereference a ServerEnvironment nullptr by calling 'getEnv()'. This change makes use of a macro where possible. This also cleans up incorrect macro uses, with no functional difference.
This commit is contained in:
parent
d24a7001ab
commit
56bc7814de
6 changed files with 36 additions and 55 deletions
|
@ -15,14 +15,8 @@
|
||||||
// common start: ensure auth db
|
// common start: ensure auth db
|
||||||
AuthDatabase *ModApiAuth::getAuthDb(lua_State *L)
|
AuthDatabase *ModApiAuth::getAuthDb(lua_State *L)
|
||||||
{
|
{
|
||||||
ServerEnvironment *server_environment =
|
GET_ENV_PTR_NO_MAP_LOCK;
|
||||||
dynamic_cast<ServerEnvironment *>(getEnv(L));
|
return env->getAuthDatabase();
|
||||||
if (!server_environment) {
|
|
||||||
luaL_error(L, "Attempt to access an auth function but the auth"
|
|
||||||
" system is yet not initialized. This causes bugs.");
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return server_environment->getAuthDatabase();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModApiAuth::pushAuthEntry(lua_State *L, const AuthEntry &authEntry)
|
void ModApiAuth::pushAuthEntry(lua_State *L, const AuthEntry &authEntry)
|
||||||
|
|
|
@ -1158,7 +1158,6 @@ int ModApiEnv::l_raycast(lua_State *L)
|
||||||
int ModApiEnv::l_load_area(lua_State *L)
|
int ModApiEnv::l_load_area(lua_State *L)
|
||||||
{
|
{
|
||||||
GET_ENV_PTR;
|
GET_ENV_PTR;
|
||||||
MAP_LOCK_REQUIRED;
|
|
||||||
|
|
||||||
Map *map = &(env->getMap());
|
Map *map = &(env->getMap());
|
||||||
v3s16 bp1 = getNodeBlockPos(check_v3s16(L, 1));
|
v3s16 bp1 = getNodeBlockPos(check_v3s16(L, 1));
|
||||||
|
@ -1373,7 +1372,8 @@ int ModApiEnv::l_forceload_free_block(lua_State *L)
|
||||||
// get_translated_string(lang_code, string)
|
// get_translated_string(lang_code, string)
|
||||||
int ModApiEnv::l_get_translated_string(lua_State * L)
|
int ModApiEnv::l_get_translated_string(lua_State * L)
|
||||||
{
|
{
|
||||||
GET_ENV_PTR;
|
NO_MAP_LOCK_REQUIRED;
|
||||||
|
|
||||||
std::string lang_code = luaL_checkstring(L, 1);
|
std::string lang_code = luaL_checkstring(L, 1);
|
||||||
std::string string = luaL_checkstring(L, 2);
|
std::string string = luaL_checkstring(L, 2);
|
||||||
|
|
||||||
|
|
|
@ -44,8 +44,11 @@
|
||||||
#define GET_ENV_PTR_NO_MAP_LOCK \
|
#define GET_ENV_PTR_NO_MAP_LOCK \
|
||||||
DEBUG_ASSERT_NO_CLIENTAPI; \
|
DEBUG_ASSERT_NO_CLIENTAPI; \
|
||||||
ServerEnvironment *env = (ServerEnvironment *)getEnv(L); \
|
ServerEnvironment *env = (ServerEnvironment *)getEnv(L); \
|
||||||
if (env == NULL) \
|
if (!env) { \
|
||||||
return 0
|
log_deprecated(L, "Calling this function during script init is disallowed.", 1); \
|
||||||
|
return 0; \
|
||||||
|
} \
|
||||||
|
((void)0)
|
||||||
|
|
||||||
// Retrieve ServerEnvironment pointer as `env`
|
// Retrieve ServerEnvironment pointer as `env`
|
||||||
#define GET_ENV_PTR \
|
#define GET_ENV_PTR \
|
||||||
|
|
|
@ -1649,14 +1649,13 @@ int ModApiMapgen::l_generate_decorations(lua_State *L)
|
||||||
// create_schematic(p1, p2, probability_list, filename, y_slice_prob_list)
|
// create_schematic(p1, p2, probability_list, filename, y_slice_prob_list)
|
||||||
int ModApiMapgen::l_create_schematic(lua_State *L)
|
int ModApiMapgen::l_create_schematic(lua_State *L)
|
||||||
{
|
{
|
||||||
MAP_LOCK_REQUIRED;
|
GET_ENV_PTR;
|
||||||
|
|
||||||
const NodeDefManager *ndef = getServer(L)->getNodeDefManager();
|
const NodeDefManager *ndef = getServer(L)->getNodeDefManager();
|
||||||
|
|
||||||
const char *filename = luaL_checkstring(L, 4);
|
const char *filename = luaL_checkstring(L, 4);
|
||||||
CHECK_SECURE_PATH(L, filename, true);
|
CHECK_SECURE_PATH(L, filename, true);
|
||||||
|
|
||||||
Map *map = &(getEnv(L)->getMap());
|
|
||||||
Schematic schem;
|
Schematic schem;
|
||||||
|
|
||||||
v3s16 p1 = check_v3s16(L, 1);
|
v3s16 p1 = check_v3s16(L, 1);
|
||||||
|
@ -1694,7 +1693,7 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!schem.getSchematicFromMap(map, p1, p2)) {
|
if (!schem.getSchematicFromMap(&env->getMap(), p1, p2)) {
|
||||||
errorstream << "create_schematic: failed to get schematic "
|
errorstream << "create_schematic: failed to get schematic "
|
||||||
"from map" << std::endl;
|
"from map" << std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1715,8 +1714,6 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
|
||||||
// replacements, force_placement, flagstring)
|
// replacements, force_placement, flagstring)
|
||||||
int ModApiMapgen::l_place_schematic(lua_State *L)
|
int ModApiMapgen::l_place_schematic(lua_State *L)
|
||||||
{
|
{
|
||||||
MAP_LOCK_REQUIRED;
|
|
||||||
|
|
||||||
GET_ENV_PTR;
|
GET_ENV_PTR;
|
||||||
|
|
||||||
ServerMap *map = &(env->getServerMap());
|
ServerMap *map = &(env->getServerMap());
|
||||||
|
|
|
@ -770,7 +770,7 @@ int ObjectRef::l_get_bone_overrides(lua_State *L)
|
||||||
// set_attach(self, parent, bone, position, rotation, force_visible)
|
// set_attach(self, parent, bone, position, rotation, force_visible)
|
||||||
int ObjectRef::l_set_attach(lua_State *L)
|
int ObjectRef::l_set_attach(lua_State *L)
|
||||||
{
|
{
|
||||||
GET_ENV_PTR;
|
GET_ENV_PTR_NO_MAP_LOCK;
|
||||||
ObjectRef *ref = checkObject<ObjectRef>(L, 1);
|
ObjectRef *ref = checkObject<ObjectRef>(L, 1);
|
||||||
ObjectRef *parent_ref = checkObject<ObjectRef>(L, 2);
|
ObjectRef *parent_ref = checkObject<ObjectRef>(L, 2);
|
||||||
ServerActiveObject *sao = getobject(ref);
|
ServerActiveObject *sao = getobject(ref);
|
||||||
|
@ -797,7 +797,7 @@ int ObjectRef::l_set_attach(lua_State *L)
|
||||||
// get_attach(self)
|
// get_attach(self)
|
||||||
int ObjectRef::l_get_attach(lua_State *L)
|
int ObjectRef::l_get_attach(lua_State *L)
|
||||||
{
|
{
|
||||||
GET_ENV_PTR;
|
GET_ENV_PTR_NO_MAP_LOCK;
|
||||||
ObjectRef *ref = checkObject<ObjectRef>(L, 1);
|
ObjectRef *ref = checkObject<ObjectRef>(L, 1);
|
||||||
ServerActiveObject *sao = getobject(ref);
|
ServerActiveObject *sao = getobject(ref);
|
||||||
if (sao == nullptr)
|
if (sao == nullptr)
|
||||||
|
@ -825,7 +825,7 @@ int ObjectRef::l_get_attach(lua_State *L)
|
||||||
// get_children(self)
|
// get_children(self)
|
||||||
int ObjectRef::l_get_children(lua_State *L)
|
int ObjectRef::l_get_children(lua_State *L)
|
||||||
{
|
{
|
||||||
GET_ENV_PTR;
|
GET_ENV_PTR_NO_MAP_LOCK;
|
||||||
ObjectRef *ref = checkObject<ObjectRef>(L, 1);
|
ObjectRef *ref = checkObject<ObjectRef>(L, 1);
|
||||||
ServerActiveObject *sao = getobject(ref);
|
ServerActiveObject *sao = getobject(ref);
|
||||||
if (sao == nullptr)
|
if (sao == nullptr)
|
||||||
|
@ -898,7 +898,7 @@ int ObjectRef::l_get_properties(lua_State *L)
|
||||||
// set_observers(self, observers)
|
// set_observers(self, observers)
|
||||||
int ObjectRef::l_set_observers(lua_State *L)
|
int ObjectRef::l_set_observers(lua_State *L)
|
||||||
{
|
{
|
||||||
GET_ENV_PTR;
|
GET_ENV_PTR_NO_MAP_LOCK;
|
||||||
ObjectRef *ref = checkObject<ObjectRef>(L, 1);
|
ObjectRef *ref = checkObject<ObjectRef>(L, 1);
|
||||||
ServerActiveObject *sao = getobject(ref);
|
ServerActiveObject *sao = getobject(ref);
|
||||||
if (sao == nullptr)
|
if (sao == nullptr)
|
||||||
|
|
|
@ -47,8 +47,7 @@ int ModApiServer::l_get_server_uptime(lua_State *L)
|
||||||
// get_server_max_lag()
|
// get_server_max_lag()
|
||||||
int ModApiServer::l_get_server_max_lag(lua_State *L)
|
int ModApiServer::l_get_server_max_lag(lua_State *L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED;
|
GET_ENV_PTR_NO_MAP_LOCK;
|
||||||
GET_ENV_PTR;
|
|
||||||
lua_pushnumber(L, env->getMaxLagEstimate());
|
lua_pushnumber(L, env->getMaxLagEstimate());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -124,35 +123,34 @@ int ModApiServer::l_get_player_privs(lua_State *L)
|
||||||
// get_player_ip()
|
// get_player_ip()
|
||||||
int ModApiServer::l_get_player_ip(lua_State *L)
|
int ModApiServer::l_get_player_ip(lua_State *L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED;
|
GET_ENV_PTR_NO_MAP_LOCK;
|
||||||
|
|
||||||
Server *server = getServer(L);
|
|
||||||
|
|
||||||
const char *name = luaL_checkstring(L, 1);
|
const char *name = luaL_checkstring(L, 1);
|
||||||
RemotePlayer *player = server->getEnv().getPlayer(name);
|
RemotePlayer *player = env->getPlayer(name);
|
||||||
if (!player) {
|
if (!player) {
|
||||||
lua_pushnil(L); // no such player
|
lua_pushnil(L); // no such player
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_pushstring(L, server->getPeerAddress(player->getPeerId()).serializeString().c_str());
|
lua_pushstring(L, env->getGameDef()->getPeerAddress(
|
||||||
|
player->getPeerId()).serializeString().c_str()
|
||||||
|
);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get_player_information(name)
|
// get_player_information(name)
|
||||||
int ModApiServer::l_get_player_information(lua_State *L)
|
int ModApiServer::l_get_player_information(lua_State *L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED;
|
GET_ENV_PTR_NO_MAP_LOCK;
|
||||||
|
|
||||||
Server *server = getServer(L);
|
|
||||||
|
|
||||||
const char *name = luaL_checkstring(L, 1);
|
const char *name = luaL_checkstring(L, 1);
|
||||||
RemotePlayer *player = server->getEnv().getPlayer(name);
|
RemotePlayer *player = env->getPlayer(name);
|
||||||
if (!player) {
|
if (!player) {
|
||||||
lua_pushnil(L); // no such player
|
lua_pushnil(L); // no such player
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Server *server = env->getGameDef();
|
||||||
ClientInfo info;
|
ClientInfo info;
|
||||||
if (!server->getClientInfo(player->getPeerId(), info)) {
|
if (!server->getClientInfo(player->getPeerId(), info)) {
|
||||||
warningstream << FUNCTION_NAME << ": no client info?!" << std::endl;
|
warningstream << FUNCTION_NAME << ": no client info?!" << std::endl;
|
||||||
|
@ -271,15 +269,14 @@ int ModApiServer::l_get_player_information(lua_State *L)
|
||||||
// get_player_window_information(name)
|
// get_player_window_information(name)
|
||||||
int ModApiServer::l_get_player_window_information(lua_State *L)
|
int ModApiServer::l_get_player_window_information(lua_State *L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED;
|
GET_ENV_PTR_NO_MAP_LOCK;
|
||||||
|
|
||||||
Server *server = getServer(L);
|
|
||||||
|
|
||||||
const char *name = luaL_checkstring(L, 1);
|
const char *name = luaL_checkstring(L, 1);
|
||||||
RemotePlayer *player = server->getEnv().getPlayer(name);
|
RemotePlayer *player = env->getPlayer(name);
|
||||||
if (!player)
|
if (!player)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
Server *server = env->getGameDef();
|
||||||
auto dynamic = server->getClientDynamicInfo(player->getPeerId());
|
auto dynamic = server->getClientDynamicInfo(player->getPeerId());
|
||||||
|
|
||||||
if (!dynamic || dynamic->render_target_size == v2u32())
|
if (!dynamic || dynamic->render_target_size == v2u32())
|
||||||
|
@ -331,19 +328,16 @@ int ModApiServer::l_get_ban_description(lua_State *L)
|
||||||
// ban_player()
|
// ban_player()
|
||||||
int ModApiServer::l_ban_player(lua_State *L)
|
int ModApiServer::l_ban_player(lua_State *L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED;
|
GET_ENV_PTR_NO_MAP_LOCK;
|
||||||
|
|
||||||
if (!getEnv(L))
|
|
||||||
throw LuaError("Can't ban player before server has started up");
|
|
||||||
|
|
||||||
Server *server = getServer(L);
|
|
||||||
const char *name = luaL_checkstring(L, 1);
|
const char *name = luaL_checkstring(L, 1);
|
||||||
RemotePlayer *player = server->getEnv().getPlayer(name);
|
RemotePlayer *player = env->getPlayer(name);
|
||||||
if (!player) {
|
if (!player) {
|
||||||
lua_pushboolean(L, false); // no such player
|
lua_pushboolean(L, false); // no such player
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Server *server = env->getGameDef();
|
||||||
std::string ip_str = server->getPeerAddress(player->getPeerId()).serializeString();
|
std::string ip_str = server->getPeerAddress(player->getPeerId()).serializeString();
|
||||||
server->setIpBanned(ip_str, name);
|
server->setIpBanned(ip_str, name);
|
||||||
lua_pushboolean(L, true);
|
lua_pushboolean(L, true);
|
||||||
|
@ -353,10 +347,7 @@ int ModApiServer::l_ban_player(lua_State *L)
|
||||||
// disconnect_player(name[, reason[, reconnect]]) -> success
|
// disconnect_player(name[, reason[, reconnect]]) -> success
|
||||||
int ModApiServer::l_disconnect_player(lua_State *L)
|
int ModApiServer::l_disconnect_player(lua_State *L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED;
|
GET_ENV_PTR_NO_MAP_LOCK;
|
||||||
|
|
||||||
if (!getEnv(L))
|
|
||||||
throw LuaError("Can't kick player before server has started up");
|
|
||||||
|
|
||||||
const char *name = luaL_checkstring(L, 1);
|
const char *name = luaL_checkstring(L, 1);
|
||||||
std::string message;
|
std::string message;
|
||||||
|
@ -365,9 +356,7 @@ int ModApiServer::l_disconnect_player(lua_State *L)
|
||||||
else
|
else
|
||||||
message.append("Disconnected.");
|
message.append("Disconnected.");
|
||||||
|
|
||||||
Server *server = getServer(L);
|
RemotePlayer *player = env->getPlayer(name);
|
||||||
|
|
||||||
RemotePlayer *player = server->getEnv().getPlayer(name);
|
|
||||||
if (!player) {
|
if (!player) {
|
||||||
lua_pushboolean(L, false); // No such player
|
lua_pushboolean(L, false); // No such player
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -375,6 +364,7 @@ int ModApiServer::l_disconnect_player(lua_State *L)
|
||||||
|
|
||||||
bool reconnect = readParam<bool>(L, 3, false);
|
bool reconnect = readParam<bool>(L, 3, false);
|
||||||
|
|
||||||
|
Server *server = env->getGameDef();
|
||||||
server->DenyAccess(player->getPeerId(), SERVER_ACCESSDENIED_CUSTOM_STRING, message, reconnect);
|
server->DenyAccess(player->getPeerId(), SERVER_ACCESSDENIED_CUSTOM_STRING, message, reconnect);
|
||||||
lua_pushboolean(L, true);
|
lua_pushboolean(L, true);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -382,15 +372,12 @@ int ModApiServer::l_disconnect_player(lua_State *L)
|
||||||
|
|
||||||
int ModApiServer::l_remove_player(lua_State *L)
|
int ModApiServer::l_remove_player(lua_State *L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED;
|
GET_ENV_PTR_NO_MAP_LOCK;
|
||||||
std::string name = luaL_checkstring(L, 1);
|
std::string name = luaL_checkstring(L, 1);
|
||||||
ServerEnvironment *s_env = dynamic_cast<ServerEnvironment *>(getEnv(L));
|
|
||||||
if (!s_env)
|
|
||||||
throw LuaError("Can't remove player before server has started up");
|
|
||||||
|
|
||||||
RemotePlayer *player = s_env->getPlayer(name.c_str());
|
RemotePlayer *player = env->getPlayer(name.c_str());
|
||||||
if (!player)
|
if (!player)
|
||||||
lua_pushinteger(L, s_env->removePlayerFromDatabase(name) ? 0 : 1);
|
lua_pushinteger(L, env->removePlayerFromDatabase(name) ? 0 : 1);
|
||||||
else
|
else
|
||||||
lua_pushinteger(L, 2);
|
lua_pushinteger(L, 2);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue