Portable Half-Life SDK. GoldSource and Xash3D. Crossplatform.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

262 lines
6.0 KiB

//++ BulliT
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "player.h"
#include "agadmin.h"
#include "agadmincache.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
DLL_GLOBAL AgAdminCache AdminCache; //The one and only
AgAdminCache::AgAdminCache()
{
}
AgAdminCache::~AgAdminCache()
{
//Delete all.
for (AgAdminList::iterator itrAdmins = m_lstAdmins.begin() ;itrAdmins != m_lstAdmins.end(); ++itrAdmins)
delete *itrAdmins;
m_lstAdmins.clear();
}
void AgAdminCache::RestoreAdmin(CBasePlayer* pPlayer)
{
ASSERT(NULL != pPlayer);
if (!pPlayer)
return;
ASSERT(NULL != pPlayer->pev);
if (!pPlayer->pev)
return;
if (g_bLangame)
return;
for (AgAdminList::iterator itrAdmins = m_lstAdmins.begin() ;itrAdmins != m_lstAdmins.end(); ++itrAdmins)
{
if ((*itrAdmins)->m_sAuthID == pPlayer->GetAuthID())
{
//Set admin flag.
pPlayer->SetIsAdmin(true);
break;
}
}
}
void AgAdminCache::Load()
{
if (0 != m_lstAdmins.size())
return; //Already loaded.
char szFile[MAX_PATH];
char szData[4096];
sprintf(szFile, "%s/admin.txt", AgGetDirectory());
FILE* pFile = fopen(szFile,"r");
if (!pFile)
{
return;
}
enum enumParseState { User, Pass, AuthID };
enumParseState ParseState = User;
AgAdmin* pAdmin = new AgAdmin;
int iRead = fread(szData,sizeof(char),sizeof(szData)-2,pFile);
if (0 >= iRead)
return;
szData[iRead] = '\0';
char* pszParse = NULL;
pszParse = strtok(szData, "#");
if (pszParse)
{
while (pszParse)
{
if (User == ParseState)
{
pAdmin->m_sAdmin = pszParse;
ParseState = Pass;
}
else if (Pass == ParseState)
{
pAdmin->m_sPassword = pszParse;
ParseState = AuthID;
}
else if (AuthID == ParseState)
{
pAdmin->m_sAuthID = pszParse;
m_lstAdmins.push_back(pAdmin);
pAdmin = new AgAdmin;
ParseState = User;
}
pszParse = strtok(NULL, "#");
}
}
delete pAdmin;
fclose(pFile);
}
void AgAdminCache::Save(CBasePlayer* pPlayer)
{
if (0 == m_lstAdmins.size())
return;
char szFile[MAX_PATH];
sprintf(szFile, "%s/admin.txt", AgGetDirectory());
FILE* pFile = fopen(szFile,"wb");
if (!pFile)
{
AgConsole(UTIL_VarArgs("Couldn't create/save %s.",szFile),pPlayer);
return;
}
//Loop and write the file.
for (AgAdminList::iterator itrAdmins = m_lstAdmins.begin() ;itrAdmins != m_lstAdmins.end(); ++itrAdmins)
{
//Append.
AgAdmin* pAdmin = *itrAdmins;
fprintf(pFile,"%s#%s#%s#",pAdmin->m_sAdmin.c_str(),pAdmin->m_sPassword.c_str(),pAdmin->m_sAuthID.c_str());
}
fflush(pFile);
fclose(pFile);
}
void AgAdminCache::AddAdmin(const AgString& sAdmin, const AgString& sPassword, CBasePlayer* pPlayer)
{
AgAdmin* pAdmin = NULL;
//Check if same name is used before.
bool bNameAlreadyInUse = false;
for (AgAdminList::iterator itrAdmins = m_lstAdmins.begin() ;itrAdmins != m_lstAdmins.end(); ++itrAdmins)
{
if ((*itrAdmins)->m_sAdmin == sAdmin)
{
bNameAlreadyInUse = true;
break;
}
}
if (bNameAlreadyInUse)
{
AgConsole(UTIL_VarArgs("Admin \"%s\" already exist.",sAdmin.c_str()),pPlayer);
}
else
{
//Name was ok.
pAdmin = new AgAdmin;
pAdmin->m_sAdmin = sAdmin;
pAdmin->m_sPassword = sPassword;
pAdmin->m_sAuthID = "";
m_lstAdmins.push_back(pAdmin);
AgConsole(UTIL_VarArgs("Added admin %s/%s.",pAdmin->m_sAdmin.c_str(),pAdmin->m_sPassword.c_str()),pPlayer);
Save(pPlayer);
}
}
void AgAdminCache::ListAdmins(CBasePlayer* pPlayer)
{
if (0 == m_lstAdmins.size())
{
AgConsole("There are no admins.",pPlayer);
}
else
{
for (AgAdminList::iterator itrAdmins = m_lstAdmins.begin() ;itrAdmins != m_lstAdmins.end(); ++itrAdmins)
{
AgConsole(UTIL_VarArgs("%s",(*itrAdmins)->m_sAdmin.c_str()),pPlayer);
}
}
}
void AgAdminCache::DelAdmin(const AgString& sAdmin,CBasePlayer* pPlayer)
{
if (0 == m_lstAdmins.size())
{
AgConsole("There are no admins.",pPlayer);
}
else
{
for (AgAdminList::iterator itrAdmins = m_lstAdmins.begin() ;itrAdmins != m_lstAdmins.end(); ++itrAdmins)
{
AgAdmin* pAdmin = *itrAdmins;
if (pAdmin->m_sAdmin == sAdmin)
{
AgConsole(UTIL_VarArgs("Deleted admin %s.",sAdmin.c_str()),pPlayer);
m_lstAdmins.erase(itrAdmins);
delete pAdmin;
Save(pPlayer);
break;
}
}
}
}
void AgAdminCache::Auth(const AgString& sAdmin, const AgString& sPassword, CBasePlayer* pPlayer)
{
ASSERT(NULL != pPlayer);
if (!pPlayer)
return;
ASSERT(NULL != pPlayer->pev);
if (!pPlayer->pev)
return;
for (AgAdminList::iterator itrAdmins = m_lstAdmins.begin() ;itrAdmins != m_lstAdmins.end(); ++itrAdmins)
{
AgAdmin* pAdmin = *itrAdmins;
if (pAdmin->m_sAdmin == sAdmin && pAdmin->m_sPassword == sPassword)
{
//Set as admin
pPlayer->SetIsAdmin(true);
//Save autoid - used for auto authentication.
pAdmin->m_sAuthID = pPlayer->GetAuthID();
AgConsole("You are now authenticated as an admin.",pPlayer);
Save(pPlayer);
break;
}
}
}
void AgAdminCache::Newpass(const AgString& sOldpass, const AgString& sPassword, CBasePlayer* pPlayer)
{
ASSERT(NULL != pPlayer);
if (!pPlayer)
return;
ASSERT(NULL != pPlayer->pev);
if (!pPlayer->pev)
return;
if (!pPlayer->IsAdmin() || 0 == sPassword.size())
return;
for (AgAdminList::iterator itrAdmins = m_lstAdmins.begin() ;itrAdmins != m_lstAdmins.end(); ++itrAdmins)
{
AgAdmin* pAdmin = *itrAdmins;
if (pAdmin->m_sAuthID == pPlayer->GetAuthID() && pAdmin->m_sPassword == sOldpass)
{
//Set new pass
pAdmin->m_sPassword = sPassword;
//Save auth - used for auto authentication.
pAdmin->m_sAuthID = pPlayer->GetAuthID();
AgConsole("Changed password.",pPlayer);
Save(pPlayer);
break;
}
}
}
//-- Martin Webrant