1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-08-26 18:21:04 +00:00

Add on_authplayer callback and 'last_login' to on_joinplayer (#9574)

Replace on_auth_fail callback with more versatile on_authplayer
    Better clarify account login process in Lua API documentation
    Change initial timestamp for newly registered accounts to -1
This commit is contained in:
sorcerykid 2020-05-23 06:24:06 -05:00 committed by SmallJoker
parent 037422fdba
commit 15ba75e4cf
10 changed files with 81 additions and 46 deletions

View file

@ -409,9 +409,12 @@ void Server::handleCommand_ClientReady(NetworkPacket* pkt)
// (u16) 1 + std::string represents a pseudo vector serialization representation
notice_pkt << (u8) PLAYER_LIST_ADD << (u16) 1 << std::string(playersao->getPlayer()->getName());
m_clients.sendToAll(&notice_pkt);
m_clients.event(peer_id, CSE_SetClientReady);
m_script->on_joinplayer(playersao);
s64 last_login;
m_script->getAuth(playersao->getPlayer()->getName(), nullptr, nullptr, &last_login);
m_script->on_joinplayer(playersao, last_login);
// Send shutdown timer if shutdown has been scheduled
if (m_shutdown_state.isTimerRunning()) {
SendChatMessage(peer_id, m_shutdown_state.getShutdownTimerMessage());
@ -1512,6 +1515,7 @@ void Server::handleCommand_FirstSrp(NetworkPacket* pkt)
initial_ver_key = encode_srp_verifier(verification_key, salt);
m_script->createAuth(playername, initial_ver_key);
m_script->on_authplayer(playername, addr_s, true);
acceptAuth(peer_id, false);
} else {
@ -1648,24 +1652,25 @@ void Server::handleCommand_SrpBytesM(NetworkPacket* pkt)
session_t peer_id = pkt->getPeerId();
RemoteClient *client = getClient(peer_id, CS_Invalid);
ClientState cstate = client->getState();
std::string addr_s = getPeerAddress(pkt->getPeerId()).serializeString();
std::string playername = client->getName();
bool wantSudo = (cstate == CS_Active);
verbosestream << "Server: Received TOCLIENT_SRP_BYTES_M." << std::endl;
if (!((cstate == CS_HelloSent) || (cstate == CS_Active))) {
actionstream << "Server: got SRP _M packet in wrong state " << cstate <<
" from " << getPeerAddress(peer_id).serializeString() <<
". Ignoring." << std::endl;
actionstream << "Server: got SRP _M packet in wrong state "
<< cstate << " from " << addr_s
<< ". Ignoring." << std::endl;
return;
}
if (client->chosen_mech != AUTH_MECHANISM_SRP &&
client->chosen_mech != AUTH_MECHANISM_LEGACY_PASSWORD) {
actionstream << "Server: got SRP _M packet, while auth is going on "
"with mech " << client->chosen_mech << " from " <<
getPeerAddress(peer_id).serializeString() <<
" (wantSudo=" << wantSudo << "). Denying." << std::endl;
actionstream << "Server: got SRP _M packet, while auth"
<< "is going on with mech " << client->chosen_mech << " from "
<< addr_s << " (wantSudo=" << wantSudo << "). Denying." << std::endl;
if (wantSudo) {
DenySudoAccess(peer_id);
return;
@ -1680,9 +1685,8 @@ void Server::handleCommand_SrpBytesM(NetworkPacket* pkt)
if (srp_verifier_get_session_key_length((SRPVerifier *) client->auth_data)
!= bytes_M.size()) {
actionstream << "Server: User " << client->getName() << " at " <<
getPeerAddress(peer_id).serializeString() <<
" sent bytes_M with invalid length " << bytes_M.size() << std::endl;
actionstream << "Server: User " << playername << " at " << addr_s
<< " sent bytes_M with invalid length " << bytes_M.size() << std::endl;
DenyAccess(peer_id, SERVER_ACCESSDENIED_UNEXPECTED_DATA);
return;
}
@ -1694,24 +1698,21 @@ void Server::handleCommand_SrpBytesM(NetworkPacket* pkt)
if (!bytes_HAMK) {
if (wantSudo) {
actionstream << "Server: User " << client->getName() << " at " <<
getPeerAddress(peer_id).serializeString() <<
" tried to change their password, but supplied wrong (SRP) "
"password for authentication." << std::endl;
actionstream << "Server: User " << playername << " at " << addr_s
<< " tried to change their password, but supplied wrong"
<< " (SRP) password for authentication." << std::endl;
DenySudoAccess(peer_id);
return;
}
std::string ip = getPeerAddress(peer_id).serializeString();
actionstream << "Server: User " << client->getName() << " at " << ip <<
" supplied wrong password (auth mechanism: SRP)." << std::endl;
m_script->on_auth_failure(client->getName(), ip);
actionstream << "Server: User " << playername << " at " << addr_s
<< " supplied wrong password (auth mechanism: SRP)." << std::endl;
m_script->on_authplayer(playername, addr_s, false);
DenyAccess(peer_id, SERVER_ACCESSDENIED_WRONG_PASSWORD);
return;
}
if (client->create_player_on_auth_success) {
std::string playername = client->getName();
m_script->createAuth(playername, client->enc_pwd);
std::string checkpwd; // not used, but needed for passing something
@ -1725,6 +1726,7 @@ void Server::handleCommand_SrpBytesM(NetworkPacket* pkt)
client->create_player_on_auth_success = false;
}
m_script->on_authplayer(playername, addr_s, true);
acceptAuth(peer_id, wantSudo);
}

View file

@ -147,7 +147,7 @@ bool ScriptApiPlayer::can_bypass_userlimit(const std::string &name, const std::s
return lua_toboolean(L, -1);
}
void ScriptApiPlayer::on_joinplayer(ServerActiveObject *player)
void ScriptApiPlayer::on_joinplayer(ServerActiveObject *player, s64 last_login)
{
SCRIPTAPI_PRECHECKHEADER
@ -156,7 +156,11 @@ void ScriptApiPlayer::on_joinplayer(ServerActiveObject *player)
lua_getfield(L, -1, "registered_on_joinplayers");
// Call callbacks
objectrefGetOrCreate(L, player);
runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
if (last_login != -1)
lua_pushinteger(L, last_login);
else
lua_pushnil(L);
runCallbacks(2, RUN_CALLBACKS_MODE_FIRST);
}
void ScriptApiPlayer::on_leaveplayer(ServerActiveObject *player,
@ -216,16 +220,19 @@ void ScriptApiPlayer::on_playerReceiveFields(ServerActiveObject *player,
runCallbacks(3, RUN_CALLBACKS_MODE_OR_SC);
}
void ScriptApiPlayer::on_auth_failure(const std::string &name, const std::string &ip)
void ScriptApiPlayer::on_authplayer(const std::string &name, const std::string &ip, bool is_success)
{
SCRIPTAPI_PRECHECKHEADER
// Get core.registered_on_auth_failure
// Get core.registered_on_authplayers
lua_getglobal(L, "core");
lua_getfield(L, -1, "registered_on_auth_fail");
lua_getfield(L, -1, "registered_on_authplayers");
// Call callbacks
lua_pushstring(L, name.c_str());
lua_pushstring(L, ip.c_str());
runCallbacks(2, RUN_CALLBACKS_MODE_FIRST);
lua_pushboolean(L, is_success);
runCallbacks(3, RUN_CALLBACKS_MODE_FIRST);
}
void ScriptApiPlayer::pushMoveArguments(

View file

@ -41,7 +41,7 @@ public:
bool on_prejoinplayer(const std::string &name, const std::string &ip,
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, s64 last_login);
void on_leaveplayer(ServerActiveObject *player, bool timeout);
void on_cheat(ServerActiveObject *player, const std::string &cheat_type);
bool on_punchplayer(ServerActiveObject *player, ServerActiveObject *hitter,
@ -51,7 +51,7 @@ public:
const PlayerHPChangeReason &reason);
void on_playerReceiveFields(ServerActiveObject *player,
const std::string &formname, const StringMap &fields);
void on_auth_failure(const std::string &name, const std::string &ip);
void on_authplayer(const std::string &name, const std::string &ip, bool is_success);
// Player inventory callbacks
// Return number of accepted items to be moved

View file

@ -23,7 +23,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
bool ScriptApiServer::getAuth(const std::string &playername,
std::string *dst_password,
std::set<std::string> *dst_privs)
std::set<std::string> *dst_privs,
s64 *dst_last_login)
{
SCRIPTAPI_PRECHECKHEADER
@ -43,8 +44,7 @@ bool ScriptApiServer::getAuth(const std::string &playername,
luaL_checktype(L, -1, LUA_TTABLE);
std::string password;
bool found = getstringfield(L, -1, "password", password);
if (!found)
if (!getstringfield(L, -1, "password", password))
throw LuaError("Authentication handler didn't return password");
if (dst_password)
*dst_password = password;
@ -54,7 +54,13 @@ bool ScriptApiServer::getAuth(const std::string &playername,
throw LuaError("Authentication handler didn't return privilege table");
if (dst_privs)
readPrivileges(-1, *dst_privs);
lua_pop(L, 1);
lua_pop(L, 1); // Remove key from privs table
s64 last_login;
if(!getintfield(L, -1, "last_login", last_login))
throw LuaError("Authentication handler didn't return last_login");
if (dst_last_login)
*dst_last_login = (s64)last_login;
return true;
}

View file

@ -43,7 +43,8 @@ public:
/* auth */
bool getAuth(const std::string &playername,
std::string *dst_password,
std::set<std::string> *dst_privs);
std::set<std::string> *dst_privs,
s64 *dst_last_login = nullptr);
void createAuth(const std::string &playername,
const std::string &password);
bool setPassword(const std::string &playername,