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.
261 lines
6.0 KiB
261 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
|
|
|