Implement minetest.register_can_bypass_userlimit (#6369)
* Implement minetest.register_on_userlimit_check This new callback permits to bypass the max_users parameter with new mods condition, based on player name or IP Only one mod needs to permit it. Move core part for builtin privileges checks to builtinmaster
parent
c05228fa6d
commit
40dd03e328
|
@ -86,3 +86,8 @@ core.register_privilege("debug", {
|
||||||
description = "Allows enabling various debug options that may affect gameplay",
|
description = "Allows enabling various debug options that may affect gameplay",
|
||||||
give_to_singleplayer = false,
|
give_to_singleplayer = false,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
core.register_can_bypass_userlimit(function(name, ip)
|
||||||
|
local privs = core.get_player_privs(name)
|
||||||
|
return privs["server"] or privs["ban"] or privs["privs"] or privs["password"]
|
||||||
|
end)
|
||||||
|
|
|
@ -581,6 +581,7 @@ core.registered_on_item_eats, core.register_on_item_eat = make_registration()
|
||||||
core.registered_on_punchplayers, core.register_on_punchplayer = make_registration()
|
core.registered_on_punchplayers, core.register_on_punchplayer = make_registration()
|
||||||
core.registered_on_priv_grant, core.register_on_priv_grant = make_registration()
|
core.registered_on_priv_grant, core.register_on_priv_grant = make_registration()
|
||||||
core.registered_on_priv_revoke, core.register_on_priv_revoke = make_registration()
|
core.registered_on_priv_revoke, core.register_on_priv_revoke = make_registration()
|
||||||
|
core.registered_can_bypass_userlimit, core.register_can_bypass_userlimit = make_registration()
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Compatibility for on_mapgen_init()
|
-- Compatibility for on_mapgen_init()
|
||||||
|
|
|
@ -2470,6 +2470,9 @@ Call these functions only at load time!
|
||||||
* Called when `revoker` revokes the priv `priv` from `name`.
|
* Called when `revoker` revokes the priv `priv` from `name`.
|
||||||
* Note that the callback will be called twice if it's done by a player, once with revoker being the player name,
|
* Note that the callback will be called twice if it's done by a player, once with revoker being the player name,
|
||||||
and again with revoker being nil.
|
and again with revoker being nil.
|
||||||
|
* `minetest.register_can_bypass_userlimit(function(name, ip))`
|
||||||
|
* Called when `name` user connects with `ip`.
|
||||||
|
* Return `true` to by pass the player limit
|
||||||
|
|
||||||
### Other registration functions
|
### Other registration functions
|
||||||
* `minetest.register_chatcommand(cmd, chatcommand definition)`
|
* `minetest.register_chatcommand(cmd, chatcommand definition)`
|
||||||
|
|
|
@ -209,13 +209,10 @@ void Server::handleCommand_Init(NetworkPacket* pkt)
|
||||||
<< addr_s << " (peer_id=" << pkt->getPeerId() << ")" << std::endl;
|
<< addr_s << " (peer_id=" << pkt->getPeerId() << ")" << std::endl;
|
||||||
|
|
||||||
// Enforce user limit.
|
// Enforce user limit.
|
||||||
// Don't enforce for users that have some admin right
|
// Don't enforce for users that have some admin right or mod permits it.
|
||||||
if (m_clients.isUserLimitReached() &&
|
if (m_clients.isUserLimitReached() &&
|
||||||
!checkPriv(playername, "server") &&
|
playername != g_settings->get("name") &&
|
||||||
!checkPriv(playername, "ban") &&
|
!m_script->can_bypass_userlimit(playername, addr_s)) {
|
||||||
!checkPriv(playername, "privs") &&
|
|
||||||
!checkPriv(playername, "password") &&
|
|
||||||
playername != g_settings->get("name")) {
|
|
||||||
actionstream << "Server: " << playername << " tried to join from "
|
actionstream << "Server: " << playername << " tried to join from "
|
||||||
<< addr_s << ", but there" << " are already max_users="
|
<< addr_s << ", but there" << " are already max_users="
|
||||||
<< g_settings->getU16("max_users") << " players." << std::endl;
|
<< g_settings->getU16("max_users") << " players." << std::endl;
|
||||||
|
|
|
@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "cpp_api/s_internal.h"
|
#include "cpp_api/s_internal.h"
|
||||||
#include "common/c_converter.h"
|
#include "common/c_converter.h"
|
||||||
#include "common/c_content.h"
|
#include "common/c_content.h"
|
||||||
|
#include "debug.h"
|
||||||
#include "util/string.h"
|
#include "util/string.h"
|
||||||
|
|
||||||
void ScriptApiPlayer::on_newplayer(ServerActiveObject *player)
|
void ScriptApiPlayer::on_newplayer(ServerActiveObject *player)
|
||||||
|
@ -123,6 +124,20 @@ bool ScriptApiPlayer::on_prejoinplayer(
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ScriptApiPlayer::can_bypass_userlimit(const std::string &name, const std::string &ip)
|
||||||
|
{
|
||||||
|
SCRIPTAPI_PRECHECKHEADER
|
||||||
|
|
||||||
|
// Get core.registered_on_prejoinplayers
|
||||||
|
lua_getglobal(L, "core");
|
||||||
|
lua_getfield(L, -1, "registered_can_bypass_userlimit");
|
||||||
|
lua_pushstring(L, name.c_str());
|
||||||
|
lua_pushstring(L, ip.c_str());
|
||||||
|
runCallbacks(2, RUN_CALLBACKS_MODE_OR);
|
||||||
|
FATAL_ERROR_IF(!lua_isboolean(L, -1), "on_user_limitcheck must return a boolean");
|
||||||
|
return lua_toboolean(L, -1);
|
||||||
|
}
|
||||||
|
|
||||||
void ScriptApiPlayer::on_joinplayer(ServerActiveObject *player)
|
void ScriptApiPlayer::on_joinplayer(ServerActiveObject *player)
|
||||||
{
|
{
|
||||||
SCRIPTAPI_PRECHECKHEADER
|
SCRIPTAPI_PRECHECKHEADER
|
||||||
|
|
|
@ -35,6 +35,7 @@ public:
|
||||||
bool on_respawnplayer(ServerActiveObject *player);
|
bool on_respawnplayer(ServerActiveObject *player);
|
||||||
bool on_prejoinplayer(const std::string &name, const std::string &ip,
|
bool on_prejoinplayer(const std::string &name, const std::string &ip,
|
||||||
std::string *reason);
|
std::string *reason);
|
||||||
|
bool can_bypass_userlimit(const std::string &name, const std::string &ip);
|
||||||
void on_joinplayer(ServerActiveObject *player);
|
void on_joinplayer(ServerActiveObject *player);
|
||||||
void on_leaveplayer(ServerActiveObject *player, bool timeout);
|
void on_leaveplayer(ServerActiveObject *player, bool timeout);
|
||||||
void on_cheat(ServerActiveObject *player, const std::string &cheat_type);
|
void on_cheat(ServerActiveObject *player, const std::string &cheat_type);
|
||||||
|
|
Loading…
Reference in New Issue