AccountOpResult AccountMgr::CreateAccount(std::string username, std::string password) { if(utf8length(username) > MAX_ACCOUNT_STR) return AOR_NAME_TOO_LONG; // username's too long normalizeString(username); normalizeString(password); if(GetId(username)) { return AOR_NAME_ALREDY_EXIST; // username does already exist } if(!LoginDatabase.PExecute("INSERT INTO account(username,sha_pass_hash,joindate) VALUES('%s','%s',NOW())", username.c_str(), CalculateShaPassHash(username, password).c_str())) return AOR_DB_INTERNAL_ERROR; // unexpected error LoginDatabase.Execute("INSERT INTO realmcharacters (realmid, acctid, numchars) SELECT realmlist.id, account.id, 0 FROM realmlist,account LEFT JOIN realmcharacters ON acctid=account.id WHERE acctid IS NULL"); return AOR_OK; // everything's fine }
bool AccountMgr::CheckPassword(uint32 accid, std::string passwd) { std::string username; if(!GetName(accid, username)) return false; normalizeString(passwd); QueryResult *result = LoginDatabase.PQuery("SELECT 1 FROM account WHERE id='%u' AND sha_pass_hash='%s'", accid, CalculateShaPassHash(username, passwd).c_str()); if (result) { delete result; return true; } return false; }
AccountOpResult AccountMgr::ChangePassword(uint32 accountId, std::string newPassword) { std::string username; if (!GetName(accountId, username)) return AOR_NAME_NOT_EXIST; // account doesn't exist if (utf8length(newPassword) > MAX_ACCOUNT_STR) return AOR_PASS_TOO_LONG; normalizeString(username); normalizeString(newPassword); // also reset s and v to force update at next realmd login LoginDatabase.PExecute("UPDATE account SET v = '0', s = '0', sha_pass_hash = '%s' WHERE id = '%d'", CalculateShaPassHash(username, newPassword).c_str(), accountId); return AOR_OK; }
AccountOpResult AccountMgr::ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword) { QueryResult result = LoginDatabase.PQuery("SELECT 1 FROM account WHERE id = '%d'", accountId); if (!result) return AOR_NAME_NOT_EXIST; // account doesn't exist if (utf8length(newUsername) > MAX_ACCOUNT_STR) return AOR_NAME_TOO_LONG; if (utf8length(newPassword) > MAX_ACCOUNT_STR) return AOR_PASS_TOO_LONG; normalizeString(newUsername); normalizeString(newPassword); std::string safeNewUsername = newUsername; LoginDatabase.EscapeString(safeNewUsername); LoginDatabase.PExecute("UPDATE account SET v='0', s='0', username='******', sha_pass_hash='%s' WHERE id='%d'", safeNewUsername.c_str(), CalculateShaPassHash(newUsername, newPassword).c_str(), accountId); return AOR_OK; }
bool CheckPassword(uint32 accountId, std::string password) { std::string username; if (!GetName(accountId, username)) return false; normalizeString(username); normalizeString(password); QueryResult result = LoginDatabase.PQuery("SELECT 1 FROM account WHERE id='%d' AND sha_pass_hash='%s'", accountId, CalculateShaPassHash(username, password).c_str()); return (result) ? true : false; }