Files
Client/Server/ManageTool/ManageLibrary/UserManage/ToolUserManageTable.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

543 lines
13 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include "ToolUserManageTable.h"
#include <tchar.h>
#include <Log/ServerLog.h>
#include <Stream/Buffer/Buffer.h>
#include <Stream/Buffer/BufferFactory.h>
#include <Network/Session/Session.h>
#include <Network/Dispatch/SendManagePacket.h>
#include <Network/Dispatch/ManageServer/ManageToolServerDispatch.h>
#include <DB/SQLite.h>
#include <DB/ManageServerDB.h>
#include <Setup/RylServerGroupSetup.h>
CToolUserManager& CToolUserManager::GetInstance()
{
static CToolUserManager toolUserManager(CManageServerDB::GetInstance());
return toolUserManager;
}
inline void SetUserInfo(ServerManage::UserInfo& UserInfo_Out,
const char* szID, const char* szPass,
const char* szFullName, const char* szIP,
const char* szAdminLevel)
{
_snprintf(UserInfo_Out.szID, ServerManage::UserInfo::ID_LEN - 1, "%s", szID);
UserInfo_Out.szID[ServerManage::UserInfo::ID_LEN - 1] = 0;
_snprintf(UserInfo_Out.szPassword, ServerManage::UserInfo::PASS_LEN - 1, "%s", szPass);
UserInfo_Out.szPassword[ServerManage::UserInfo::PASS_LEN - 1] = 0;
_snprintf(UserInfo_Out.szFullName, ServerManage::UserInfo::NAME_LEN - 1, "%s", szFullName);
UserInfo_Out.szFullName[ServerManage::UserInfo::NAME_LEN - 1] = 0;
UserInfo_Out.dwIP = inet_addr(szIP);
UserInfo_Out.usAdminLevel = atoi(szAdminLevel);
}
CToolUserManager::ToolUser::ToolUser(CManageToolServerDispatch* lpDispatch,
ServerManage::UserInfo& userInfo)
: m_lpDispatch(lpDispatch), m_UserInfo(userInfo)
{
}
CToolUserManager::ToolUser::ToolUser()
: m_lpDispatch(0)
{
memset(&m_UserInfo, 0, sizeof(ServerManage::UserInfo));
}
enum ToolUserConst
{
TOOLUSER_MAX_QUERY = 1024
};
CToolUserManager::CToolUserManager(CManageServerDB& ManageServerDB)
: m_ManageServerDB(ManageServerDB)
{
memset(&m_ManageUser, 0, sizeof(ServerManage::UserInfo));
}
CToolUserManager::~CToolUserManager()
{
}
// -------------------------------------------------------------------------
// UserManagement
bool CToolUserManager::AddUser(const ServerManage::UserInfo& userInfo)
{
char szQuery[TOOLUSER_MAX_QUERY];
in_addr addr;
addr.S_un.S_addr = userInfo.dwIP;
int nQueryLen = _snprintf(szQuery, TOOLUSER_MAX_QUERY - 1,
"INSERT INTO TblManageToolUser values('%s', '%s', '%s', '%s', %d)",
userInfo.szID, userInfo.szPassword, userInfo.szFullName,
inet_ntoa(addr), userInfo.usAdminLevel);
szQuery[TOOLUSER_MAX_QUERY - 1] = 0;
if(0 < nQueryLen)
{
CSQLite::Dataset addUserQuery(m_ManageServerDB.GetSQLite(), szQuery);
if(addUserQuery.Compile() && addUserQuery.Execute())
{
return true;
}
ERRLOG2(g_Log, "AddUser failed - query failed : %s(Query:%s)",
addUserQuery.GetLastError(), szQuery);
}
else
{
ERRLOG1(g_Log, "AddUser failed - make query failed : (Query:%s)", szQuery);
}
return false;
}
bool CToolUserManager::GetUserInfo(const char* szID_In,
ServerManage::UserInfo& userInfo_Out)
{
char szQuery[TOOLUSER_MAX_QUERY];
int nQueryLen = _snprintf(szQuery, TOOLUSER_MAX_QUERY - 1,
"SELECT ID, PASS, NAME, IP, LEVEL FROM TblManageToolUser WHERE ID = '%s'", szID_In);
szQuery[TOOLUSER_MAX_QUERY - 1] = 0;
if(0 < nQueryLen)
{
CSQLite::Dataset getUserQuery(m_ManageServerDB.GetSQLite(), szQuery);
int nColNum = 0;
const char** pazValue = 0;
const char** pazColumn = 0;
if(getUserQuery.Compile() &&
getUserQuery.Execute(&nColNum, &pazValue, &pazColumn))
{
if(5 == nColNum && 0 != pazValue)
{
SetUserInfo(userInfo_Out, pazValue[0], pazValue[1],
pazValue[2], pazValue[3], pazValue[4]);
return true;
}
}
ERRLOG2(g_Log, "Getuser failed - query error : %s(Query:%s)",
getUserQuery.GetLastError(), szQuery);
}
else
{
ERRLOG1(g_Log, "Getuser failed - create query failed : (Query:%s)", szQuery);
}
return false;
}
bool CToolUserManager::DelUser(const char* szID)
{
char szQuery[TOOLUSER_MAX_QUERY];
int nQueryLen = _snprintf(szQuery, TOOLUSER_MAX_QUERY - 1,
"DELETE FROM TblManageToolUser WHERE ID = '%s'", szID);
szQuery[TOOLUSER_MAX_QUERY - 1] = 0;
if(0 < nQueryLen)
{
CSQLite::Dataset delUserQuery(m_ManageServerDB.GetSQLite(), szQuery);
if(delUserQuery.Compile() && delUserQuery.Execute())
{
return true;
}
ERRLOG2(g_Log, "Deluser failed - query error : %s(Query:%s)",
delUserQuery.GetLastError(), szQuery);
}
else
{
ERRLOG1(g_Log, "Deluser failed - create query error : %s", szQuery);
}
return false;
}
bool CToolUserManager::ModifyUser(const ServerManage::UserInfo& modified)
{
char szQuery[TOOLUSER_MAX_QUERY];
in_addr addr;
addr.S_un.S_addr = modified.dwIP;
int nQueryLen = _snprintf(szQuery, TOOLUSER_MAX_QUERY - 1,
"UPDATE TblManageToolUser SET PASS = '%s', NAME = '%s', IP = '%s', LEVEL = %d WHERE ID = '%s'",
modified.szPassword, modified.szFullName, inet_ntoa(addr),
modified.usAdminLevel, modified.szID);
szQuery[TOOLUSER_MAX_QUERY - 1] = 0;
if(0 < nQueryLen)
{
CSQLite::Dataset modUserQuery(m_ManageServerDB.GetSQLite(), szQuery);
if(modUserQuery.Compile() && modUserQuery.Execute())
{
return true;
}
ERRLOG2(g_Log, "Moduser failed - query error : %s(Query:%s)",
modUserQuery.GetLastError(), szQuery);
}
else
{
ERRLOG1(g_Log, "Moduser failed - create query error : %s", szQuery);
}
return false;
}
bool CToolUserManager::SendAllUserInfo(CSession& Session)
{
const int MAX_USER_INFO = (PktMaxLen - sizeof(ServerManage::UserCommand)) / sizeof(ServerManage::UserInfo);
ServerManage::UserInfo tempUserInfo[MAX_USER_INFO];
CBufferFactory& bufferFactory = Session.GetPolicy().GetBufferFactory();
const char* szQuery = "SELECT ID, PASS, NAME, IP, LEVEL FROM TblManageToolUser";
CSQLite::Dataset getUserQuery(m_ManageServerDB.GetSQLite(), szQuery);
if(getUserQuery.Compile())
{
int nColNum = 0;
const char** pazValue = 0;
const char** pazColumn = 0;
int nRowCount = 0;
while(getUserQuery.Execute(&nColNum, &pazValue, &pazColumn))
{
if(5 == nColNum && 0 != pazValue)
{
SetUserInfo(tempUserInfo[nRowCount], pazValue[0],
pazValue[1], pazValue[2], pazValue[3], pazValue[4]);
memset(tempUserInfo[nRowCount].szPassword, 0,
ServerManage::UserInfo::PASS_LEN);
++nRowCount;
}
if(nRowCount == MAX_USER_INFO)
{
ServerManage::SendUserInfo(bufferFactory, &Session, tempUserInfo,
nRowCount, ServerManage::CMD::UserList, 0);
nRowCount = 0;
}
}
if(0 < nRowCount)
{
ServerManage::SendUserInfo(bufferFactory, &Session, tempUserInfo,
nRowCount, ServerManage::CMD::UserList, 0);
}
if(0 != getUserQuery.GetLastError())
{
ERRLOG2(g_Log, "Getuser failed - query error : %s(Query:%s)",
getUserQuery.GetLastError(), szQuery);
}
}
else if(0 != getUserQuery.GetLastError())
{
ERRLOG2(g_Log, "Getuser failed - compile query failed : %s(Query:%s)",
getUserQuery.GetLastError(), szQuery);
}
return true;
}
bool CToolUserManager::GetUserInfo(UserList& userList_Out)
{
const unsigned char MAX_USER_INFO = 100;
ServerManage::UserInfo tempUserInfo[MAX_USER_INFO];
const char* szQuery = "SELECT ID, PASS, NAME, IP, LEVEL FROM TblManageToolUser";
CSQLite::Dataset getUserQuery(m_ManageServerDB.GetSQLite(), szQuery);
if(getUserQuery.Compile())
{
int nColNum = 0;
const char** pazValue = 0;
const char** pazColumn = 0;
int nRowCount = 0;
while(getUserQuery.Execute(&nColNum, &pazValue, &pazColumn))
{
if(5 == nColNum && 0 != pazValue)
{
SetUserInfo(tempUserInfo[nRowCount], pazValue[0],
pazValue[1], pazValue[2], pazValue[3], pazValue[4]);
++nRowCount;
}
if(nRowCount == MAX_USER_INFO)
{
userList_Out.insert(userList_Out.end(), tempUserInfo, tempUserInfo + nRowCount);
nRowCount = 0;
}
}
if(0 < nRowCount)
{
userList_Out.insert(userList_Out.end(), tempUserInfo, tempUserInfo + nRowCount);
}
if(0 != getUserQuery.GetLastError())
{
ERRLOG2(g_Log, "Getuser failed - query error : %s(Query:%s)",
getUserQuery.GetLastError(), szQuery);
}
else
{
return true;
}
}
else if(0 != getUserQuery.GetLastError())
{
ERRLOG2(g_Log, "Getuser failed - compile query failed : %s(Query:%s)",
getUserQuery.GetLastError(), szQuery);
}
return false;
}
// Login/Logout
ServerManage::UserCommandError CToolUserManager::Authorize(CManageToolServerDispatch& dispatch,
ServerManage::UserInfo& userInfo_inout)
{
ServerManage::UserInfo foundUserInfo;
memset(&foundUserInfo, 0, sizeof(ServerManage::UserInfo));
ServerManage::UserCommandError eUserCommandErr = ServerManage::NO_USER_COMMAND_ERROR;
int iCheck =
GetPrivateProfileInt("SETTING", "USER_IP_CHECK", 1, CRylServerGroupSetup::GetInstance().GetSetupFileName());
if(IsLogin(userInfo_inout.szID))
{
eUserCommandErr = ServerManage::ALREADY_LOGINED;
}
else if(!GetUserInfo(userInfo_inout.szID, foundUserInfo))
{
eUserCommandErr = ServerManage::CANNOT_AUTHORIZE_NOT_USER;
}
else if(0 != strncmp(foundUserInfo.szPassword, userInfo_inout.szPassword,
ServerManage::UserInfo::PASS_LEN))
{
eUserCommandErr = ServerManage::CANNOT_AUTHORIZE_INVALID_PASSWORD;
}
else if((1 == iCheck) && (foundUserInfo.dwIP != userInfo_inout.dwIP))
{
eUserCommandErr = ServerManage::CANNOT_AUTHORIZE_INVALID_IPADDRESS;
}
else
{
// ID, Password°¡ °°´Ù. ÀÎÁõ ¼º°ø.
Logout(foundUserInfo.szID);
m_LoginUserList.push_back(ToolUser(&dispatch, foundUserInfo));
userInfo_inout = foundUserInfo;
}
return eUserCommandErr;
}
bool CToolUserManager::IsLogin(const char* szName)
{
CurrentUserList::iterator pos = m_LoginUserList.begin();
CurrentUserList::iterator end = m_LoginUserList.end();
for(; pos != end; ++pos)
{
ToolUser& toolUser = *pos;
if(0 == strncmp(toolUser.m_UserInfo.szID, szName, ServerManage::UserInfo::ID_LEN))
{
return true;
}
}
return false;
}
bool CToolUserManager::Logout(const char* szName)
{
CurrentUserList::iterator pos = m_LoginUserList.begin();
CurrentUserList::iterator end = m_LoginUserList.end();
int nEraseCount = 0;
for(; pos != end;)
{
ToolUser& toolUser = *pos;
if(0 == strncmp(toolUser.m_UserInfo.szID, szName, ServerManage::UserInfo::ID_LEN))
{
// Logout info¸¦ ÁØ´Ù.
ServerManage::SendUserInfo(toolUser.m_lpDispatch->GetBufferFactory(), 0,
&toolUser.m_UserInfo, 1, ServerManage::CMD::UserLogout, 0);
if(IsManageUser(toolUser.m_UserInfo))
{
memset(&m_ManageUser, 0, sizeof(ServerManage::UserInfo));
ServerManage::SendUserInfo(toolUser.m_lpDispatch->GetBufferFactory(), 0,
&m_ManageUser, 1, ServerManage::CMD::ManagerInfo, 0);
}
pos = m_LoginUserList.erase(pos);
++nEraseCount;
}
else
{
++pos;
}
}
return (0 < nEraseCount);
}
// Send packets to all users
bool CToolUserManager::SendToAllLoginUser(const char* szBuffer, unsigned short usBufferSize, unsigned char cCmd_In)
{
CurrentUserList::iterator pos = m_LoginUserList.begin();
CurrentUserList::iterator end = m_LoginUserList.end();
for(; pos != end; ++pos)
{
ToolUser& toolUser = *pos;
CManageToolServerDispatch* lpDispatch = toolUser.m_lpDispatch;
if(0 != lpDispatch)
{
lpDispatch->GetSendStream().PutBuffer(szBuffer, usBufferSize, cCmd_In);
}
}
return true;
}
bool CToolUserManager::SendAllLoginUserInfo(CSession& Session)
{
const unsigned char MAX_USER_INFO = 100;
ServerManage::UserInfo tempUserInfo[MAX_USER_INFO];
CBufferFactory& bufferFactory = Session.GetPolicy().GetBufferFactory();
CurrentUserList::iterator pos = m_LoginUserList.begin();
CurrentUserList::iterator end = m_LoginUserList.end();
unsigned char cSendNum = 0;
for(; pos != end; ++pos)
{
tempUserInfo[cSendNum] = pos->m_UserInfo;
memset(tempUserInfo[cSendNum].szPassword, 0, ServerManage::UserInfo::PASS_LEN);
++cSendNum;
if(cSendNum == MAX_USER_INFO)
{
ServerManage::SendUserInfo(bufferFactory, &Session,
tempUserInfo, cSendNum, ServerManage::CMD::UserLogin, 0);
cSendNum = 0;
}
}
if(0 < cSendNum)
{
ServerManage::SendUserInfo(bufferFactory, &Session,
tempUserInfo, cSendNum, ServerManage::CMD::UserLogin, 0);
}
return true;
}
CManageToolServerDispatch* CToolUserManager::GetUserDispatch(unsigned long dwIP)
{
CurrentUserList::iterator pos = m_LoginUserList.begin();
CurrentUserList::iterator end = m_LoginUserList.end();
for(; pos != end; ++pos)
{
ToolUser& toolUser = *pos;
if(toolUser.m_UserInfo.dwIP == dwIP)
{
return toolUser.m_lpDispatch;
}
}
return 0;
}
CManageToolServerDispatch* CToolUserManager::GetUserDispatch(const char* szID)
{
CurrentUserList::iterator pos = m_LoginUserList.begin();
CurrentUserList::iterator end = m_LoginUserList.end();
for(; pos != end; ++pos)
{
ToolUser& toolUser = *pos;
if(0 == strncmp(toolUser.m_UserInfo.szID, szID, ServerManage::UserInfo::ID_LEN))
{
return toolUser.m_lpDispatch;
}
}
return 0;
}
bool CToolUserManager::IsManageUser(const ServerManage::UserInfo& UserInfo)
{
if(0 == strncmp(m_ManageUser.szID, UserInfo.szID, ServerManage::UserInfo::ID_LEN))
{
return true;
}
return false;
}