db: prepare safebox password change flow
Some checks failed
build / Linux asan (push) Has been cancelled
build / Linux release (push) Has been cancelled
build / FreeBSD build (push) Has been cancelled

This commit is contained in:
server
2026-04-14 11:04:06 +02:00
parent c5cac17125
commit 719440575f

View File

@@ -17,6 +17,7 @@
#include "Marriage.h"
#include "ItemIDRangeManager.h"
#include "Cache.h"
#include "libsql/Statement.h"
#include <memory>
@@ -37,6 +38,72 @@ CPacketInfo g_item_info;
int g_item_count = 0;
int g_query_count[2];
namespace
{
bool LoadSafeboxPasswordByAccountId(DWORD accountId, char* password, size_t passwordSize, bool* found)
{
char query[QUERY_MAX_LEN];
snprintf(query, sizeof(query), "SELECT password FROM safebox%s WHERE account_id = ?", GetTablePostfix());
*found = false;
password[0] = '\0';
CStmt stmt;
if (!stmt.Prepare(CDBManager::instance().GetDirectSQL(SQL_PLAYER), query))
return false;
if (!stmt.BindParam(MYSQL_TYPE_LONG, &accountId))
return false;
if (!stmt.BindResult(MYSQL_TYPE_STRING, password, passwordSize))
return false;
if (!stmt.Execute())
return false;
if (stmt.iRows == 0)
return true;
if (!stmt.Fetch())
return false;
*found = true;
return true;
}
bool UpdateSafeboxPasswordByAccountId(DWORD accountId, const char* password)
{
char query[QUERY_MAX_LEN];
snprintf(query, sizeof(query), "UPDATE safebox%s SET password = ? WHERE account_id = ?", GetTablePostfix());
CStmt stmt;
if (!stmt.Prepare(CDBManager::instance().GetDirectSQL(SQL_PLAYER), query))
return false;
if (!stmt.BindParam(MYSQL_TYPE_STRING, const_cast<char*>(password), SAFEBOX_PASSWORD_MAX_LEN))
return false;
if (!stmt.BindParam(MYSQL_TYPE_LONG, &accountId))
return false;
return stmt.Execute() != 0;
}
bool MatchesSafeboxPassword(const char* storedPassword, const char* providedPassword)
{
if ((storedPassword && *storedPassword))
return !strcasecmp(storedPassword, providedPassword);
return !strcmp("000000", providedPassword);
}
void EncodeSafeboxPasswordChangeAnswer(CPeer* pkPeer, DWORD dwHandle, BYTE success)
{
pkPeer->EncodeHeader(DG::SAFEBOX_CHANGE_PASSWORD_ANSWER, dwHandle, sizeof(BYTE));
pkPeer->EncodeBYTE(success);
}
}
CClientManager::CClientManager() :
m_pkAuthPeer(NULL),
m_iPlayerIDStart(0),
@@ -817,15 +884,28 @@ void CClientManager::RESULT_SAFEBOX_CHANGE_SIZE(CPeer * pkPeer, SQLMsg * msg)
void CClientManager::QUERY_SAFEBOX_CHANGE_PASSWORD(CPeer * pkPeer, DWORD dwHandle, TSafeboxChangePasswordPacket * p)
{
ClientHandleInfo * pi = new ClientHandleInfo(dwHandle);
strlcpy(pi->safebox_password, p->szNewPassword, sizeof(pi->safebox_password));
strlcpy(pi->login, p->szOldPassword, sizeof(pi->login));
pi->account_id = p->dwID;
char storedPassword[SAFEBOX_PASSWORD_MAX_LEN + 1];
bool found = false;
char szQuery[QUERY_MAX_LEN];
snprintf(szQuery, sizeof(szQuery), "SELECT password FROM safebox%s WHERE account_id=%u", GetTablePostfix(), p->dwID);
if (!LoadSafeboxPasswordByAccountId(p->dwID, storedPassword, sizeof(storedPassword), &found))
{
EncodeSafeboxPasswordChangeAnswer(pkPeer, dwHandle, 0);
return;
}
CDBManager::instance().ReturnQuery(szQuery, QID_SAFEBOX_CHANGE_PASSWORD, pkPeer->GetHandle(), pi);
if (!found || !MatchesSafeboxPassword(storedPassword, p->szOldPassword))
{
EncodeSafeboxPasswordChangeAnswer(pkPeer, dwHandle, 0);
return;
}
if (!UpdateSafeboxPasswordByAccountId(p->dwID, p->szNewPassword))
{
EncodeSafeboxPasswordChangeAnswer(pkPeer, dwHandle, 0);
return;
}
EncodeSafeboxPasswordChangeAnswer(pkPeer, dwHandle, 1);
}
void CClientManager::RESULT_SAFEBOX_CHANGE_PASSWORD(CPeer * pkPeer, SQLMsg * msg)