aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/authserver/Realms/RealmList.cpp46
-rw-r--r--src/server/authserver/Realms/RealmList.h4
-rw-r--r--src/server/authserver/Server/AuthSession.cpp49
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp13
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp7
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Guilds/GuildFinderMgr.h11
-rw-r--r--src/server/game/Server/WorldSocket.cpp3
-rw-r--r--src/server/game/Server/WorldSocket.h2
-rw-r--r--src/server/worldserver/RemoteAccess/RASession.cpp8
10 files changed, 53 insertions, 92 deletions
diff --git a/src/server/authserver/Realms/RealmList.cpp b/src/server/authserver/Realms/RealmList.cpp
index 181bee31185..519d54c1c59 100644
--- a/src/server/authserver/Realms/RealmList.cpp
+++ b/src/server/authserver/Realms/RealmList.cpp
@@ -16,35 +16,51 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <boost/asio/ip/tcp.hpp>
#include "Common.h"
#include "RealmList.h"
#include "BattlenetManager.h"
#include "Database/DatabaseEnv.h"
#include "Util.h"
-namespace boost { namespace asio { namespace ip { class address; } } }
-ACE_INET_Addr const& Realm::GetAddressForClient(ACE_INET_Addr const& clientAddr) const
+tcp::endpoint Realm::GetAddressForClient(ip::address const& clientAddr) const
{
+ ip::address realmIp;
+
// Attempt to send best address for client
if (clientAddr.is_loopback())
- // Assume that user connecting from the machine that authserver is located on
- // has all realms available in his local network
- return LocalAddress;
+ {
+ // Try guessing if realm is also connected locally
+ if (LocalAddress.is_loopback() || ExternalAddress.is_loopback())
+ realmIp = clientAddr;
+ else
+ {
+ // Assume that user connecting from the machine that authserver is located on
+ // has all realms available in his local network
+ realmIp = LocalAddress;
+ }
+ }
+ else
+ {
+ if (clientAddr.is_v4() &&
+ (clientAddr.to_v4().to_ulong() & LocalSubnetMask.to_v4().to_ulong()) ==
+ (LocalAddress.to_v4().to_ulong() & LocalSubnetMask.to_v4().to_ulong()))
+ {
+ realmIp = LocalAddress;
+ }
+ else
+ realmIp = ExternalAddress;
+ }
- // Check if connecting client is in the same network
- if (IsIPAddrInNetwork(LocalAddress, clientAddr, LocalSubnetMask))
- return LocalAddress;
+ tcp::endpoint endpoint(realmIp, port);
// Return external IP
- return ExternalAddress;
+ return endpoint;
}
-RealmList::RealmList() : m_UpdateInterval(0), m_NextUpdateTime(time(NULL))
+RealmList::RealmList() : m_UpdateInterval(0), m_NextUpdateTime(time(NULL)), _resolver(nullptr)
{
}
-RealmList::RealmList() : m_UpdateInterval(0), m_NextUpdateTime(time(NULL)), _resolver(nullptr) { }
RealmList::~RealmList()
{
delete _resolver;
@@ -60,7 +76,7 @@ void RealmList::Initialize(boost::asio::io_service& ioService, uint32 updateInte
UpdateRealms(true);
}
-void RealmList::UpdateRealm(uint32 id, const std::string& name, ip::address const& address, ip::address const& localAddr,
+void RealmList::UpdateRealm(uint32 id, const std::string& name, ip::address const& address, ip::address const& localAddr,
ip::address const& localSubmask, uint16 port, uint8 icon, RealmFlags flag, uint8 timezone, AccountTypes allowedSecurityLevel, float population, uint32 build, uint8 region, uint8 battlegroup)
{
// Create new if not exist or update existed
@@ -156,8 +172,8 @@ void RealmList::UpdateRealms(bool init)
uint8 allowedSecurityLevel = fields[9].GetUInt8();
float pop = fields[10].GetFloat();
uint32 build = fields[11].GetUInt32();
- uint8 region = fields[12].GetUInt8();
- uint8 battlegroup = fields[13].GetUInt8();
+ uint8 region = fields[12].GetUInt8();
+ uint8 battlegroup = fields[13].GetUInt8();
UpdateRealm(realmId, name, externalAddress, localAddress, localSubmask, port, icon, flag, timezone,
(allowedSecurityLevel <= SEC_ADMINISTRATOR ? AccountTypes(allowedSecurityLevel) : SEC_ADMINISTRATOR), pop, build, region, battlegroup);
diff --git a/src/server/authserver/Realms/RealmList.h b/src/server/authserver/Realms/RealmList.h
index 7426d5b3f32..beb520df25a 100644
--- a/src/server/authserver/Realms/RealmList.h
+++ b/src/server/authserver/Realms/RealmList.h
@@ -57,7 +57,7 @@ struct Realm
uint8 Region;
uint8 Battlegroup;
- ACE_INET_Addr const& GetAddressForClient(ACE_INET_Addr const& clientAddr) const;
+ ip::tcp::endpoint GetAddressForClient(ip::address const& clientAddr) const;
};
namespace Battlenet
@@ -76,7 +76,7 @@ public:
static RealmList *instance = new RealmList();
return *instance;
}
-
+
~RealmList();
void Initialize(boost::asio::io_service& ioService, uint32 updateInterval);
diff --git a/src/server/authserver/Server/AuthSession.cpp b/src/server/authserver/Server/AuthSession.cpp
index b426b82e44d..3bc51ace67b 100644
--- a/src/server/authserver/Server/AuthSession.cpp
+++ b/src/server/authserver/Server/AuthSession.cpp
@@ -739,41 +739,6 @@ bool AuthSession::_HandleReconnectProof()
}
}
-tcp::endpoint const GetAddressForClient(Realm const& realm, ip::address const& clientAddr)
-{
- ip::address realmIp;
-
- // Attempt to send best address for client
- if (clientAddr.is_loopback())
- {
- // Try guessing if realm is also connected locally
- if (realm.LocalAddress.is_loopback() || realm.ExternalAddress.is_loopback())
- realmIp = clientAddr;
- else
- {
- // Assume that user connecting from the machine that authserver is located on
- // has all realms available in his local network
- realmIp = realm.LocalAddress;
- }
- }
- else
- {
- if (clientAddr.is_v4() &&
- (clientAddr.to_v4().to_ulong() & realm.LocalSubnetMask.to_v4().to_ulong()) ==
- (realm.LocalAddress.to_v4().to_ulong() & realm.LocalSubnetMask.to_v4().to_ulong()))
- {
- realmIp = realm.LocalAddress;
- }
- else
- realmIp = realm.ExternalAddress;
- }
-
- tcp::endpoint endpoint(realmIp, realm.port);
-
- // Return external IP
- return endpoint;
-}
-
bool AuthSession::_HandleRealmList()
{
TC_LOG_DEBUG("server.authserver", "Entering _HandleRealmList");
@@ -843,7 +808,7 @@ bool AuthSession::_HandleRealmList()
pkt << lock; // if 1, then realm locked
pkt << uint8(flag); // RealmFlags
pkt << name;
- pkt << boost::lexical_cast<std::string>(GetAddressForClient(realm, _socket.remote_endpoint().address()));
+ pkt << boost::lexical_cast<std::string>(realm.GetAddressForClient(_socket.remote_endpoint().address()));
pkt << realm.populationLevel;
pkt << AmountOfCharacters;
pkt << realm.timezone; // realm category
@@ -918,17 +883,9 @@ void AuthSession::SetVSFields(const std::string& rI)
x.SetBinary(sha.GetDigest(), sha.GetLength());
v = g.ModExp(x, N);
- // No SQL injection (username escaped)
- char *v_hex, *s_hex;
- v_hex = v.AsHexStr();
- s_hex = s.AsHexStr();
-
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_VS);
- stmt->setString(0, v_hex);
- stmt->setString(1, s_hex);
+ stmt->setString(0, v.AsHexStr());
+ stmt->setString(1, s.AsHexStr());
stmt->setString(2, _login);
LoginDatabase.Execute(stmt);
-
- OPENSSL_free(v_hex);
- OPENSSL_free(s_hex);
}
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 48724dfe53d..17db09eedfb 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -390,19 +390,6 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un
}
case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID:
return source->GetMapId() == map_id.mapId;
- case ACHIEVEMENT_CRITERIA_DATA_TYPE_NTH_BIRTHDAY:
- {
- time_t birthday_start = time_t(sWorld->getIntConfig(CONFIG_BIRTHDAY_TIME));
- tm birthday_tm;
- localtime_r(&birthday_start, &birthday_tm);
-
- // exactly N birthday
- birthday_tm.tm_year += birthday_login.nth_birthday;
-
- time_t birthday = mktime(&birthday_tm);
- time_t now = sWorld->GetGameTime();
- return now <= birthday + DAY && now >= birthday;
- }
case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_KNOWN_TITLE:
{
if (CharTitlesEntry const* titleInfo = sCharTitlesStore.LookupEntry(known_title.title_id))
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index 4034bd0c1c2..f1436dd90e3 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -76,9 +76,10 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D
// sort problematic db2 to (1) non compatible and (2) nonexistent
if (FILE* f = fopen(db2_filename.c_str(), "rb"))
{
- char buf[100];
- snprintf(buf, 100,"(exist, but have %d fields instead " SIZEFMTD ") Wrong client version DBC file?", storage.GetFieldCount(), strlen(storage.GetFormat()));
- errlist.push_back(db2_filename + buf);
+ std::ostringstream stream;
+ stream << db2_filename << " exists, and has " << storage.GetFieldCount() << " field(s) (expected " << strlen(storage.GetFormat()) << "). Extracted file might be from wrong client version.";
+ std::string buf = stream.str();
+ errlist.push_back(buf);
fclose(f);
}
else
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 241bc452706..c4a6e1e473b 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -22498,7 +22498,7 @@ void Player::AddSpellAndCategoryCooldowns(SpellInfo const* spellInfo, uint32 ite
if (categoryEntry->Flags & SPELL_CATEGORY_FLAG_COOLDOWN_EXPIRES_AT_MIDNIGHT)
{
tm date;
- ACE_OS::localtime_r(&curTime, &date);
+ localtime_r(&curTime, &date);
catrec = catrec * DAY - (date.tm_hour * HOUR + date.tm_min * MINUTE + date.tm_sec) * IN_MILLISECONDS;
}
}
diff --git a/src/server/game/Guilds/GuildFinderMgr.h b/src/server/game/Guilds/GuildFinderMgr.h
index 3bf7840b4ec..9fc62d43935 100644
--- a/src/server/game/Guilds/GuildFinderMgr.h
+++ b/src/server/game/Guilds/GuildFinderMgr.h
@@ -18,7 +18,6 @@
#ifndef __TRINITY_GUILDFINDER_H
#define __TRINITY_GUILDFINDER_H
-#include <ace/Singleton.h>
#include "Common.h"
#include "World.h"
#include "GuildMgr.h"
@@ -188,8 +187,6 @@ typedef std::map<uint32 /* guildGuid */, std::vector<MembershipRequest> > Member
class GuildFinderMgr
{
- friend class ACE_Singleton<GuildFinderMgr, ACE_Null_Mutex>;
-
private:
GuildFinderMgr();
~GuildFinderMgr();
@@ -267,8 +264,14 @@ class GuildFinderMgr
void SendApplicantListUpdate(Guild& guild);
void SendMembershipRequestListUpdate(Player& player);
+
+ static GuildFinderMgr* instance()
+ {
+ static GuildFinderMgr instance;
+ return &instance;
+ }
};
-#define sGuildFinderMgr ACE_Singleton<GuildFinderMgr, ACE_Null_Mutex>::instance()
+#define sGuildFinderMgr GuildFinderMgr::instance()
#endif // __TRINITY_GUILDFINDER_H
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 2aa24e10d9d..a46c03ac092 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -270,7 +270,6 @@ void WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
recvPacket.ReadBit();
uint32 accountNameLength = recvPacket.ReadBits(12);
account = recvPacket.ReadString(accountNameLength);
-
if (sWorld->IsClosed())
{
SendAuthResponseError(AUTH_REJECT);
@@ -463,7 +462,7 @@ void WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
_worldSession->LoadGlobalAccountData();
_worldSession->LoadTutorialsData();
- _worldSession->ReadAddonsInfo(recvPacket);
+ _worldSession->ReadAddonsInfo(addonsData);
_worldSession->LoadPermissions();
// At this point, we can safely hook a successful login
diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h
index e46c6b3fe5c..fb0522021d9 100644
--- a/src/server/game/Server/WorldSocket.h
+++ b/src/server/game/Server/WorldSocket.h
@@ -74,7 +74,7 @@ private:
char _readBuffer[4096];
uint32 _authSeed;
- AuthCrypt _authCrypt;
+ WorldPacketCrypt _authCrypt;
std::chrono::steady_clock::time_point _LastPingTime;
uint32 _OverSpeedPings;
diff --git a/src/server/worldserver/RemoteAccess/RASession.cpp b/src/server/worldserver/RemoteAccess/RASession.cpp
index 846a4eb39e3..bc15952cb37 100644
--- a/src/server/worldserver/RemoteAccess/RASession.cpp
+++ b/src/server/worldserver/RemoteAccess/RASession.cpp
@@ -121,7 +121,7 @@ bool RASession::CheckAccessLevel(const std::string& user)
{
std::string safeUser = user;
- AccountMgr::normalizeString(safeUser);
+ Utf8ToUpperOnlyLatin(safeUser);
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_ACCESS);
stmt->setString(0, safeUser);
@@ -152,12 +152,10 @@ bool RASession::CheckAccessLevel(const std::string& user)
bool RASession::CheckPassword(const std::string& user, const std::string& pass)
{
std::string safe_user = user;
- std::transform(safe_user.begin(), safe_user.end(), safe_user.begin(), ::toupper);
- AccountMgr::normalizeString(safe_user);
+ Utf8ToUpperOnlyLatin(safe_user);
std::string safe_pass = pass;
- AccountMgr::normalizeString(safe_pass);
- std::transform(safe_pass.begin(), safe_pass.end(), safe_pass.begin(), ::toupper);
+ Utf8ToUpperOnlyLatin(safe_pass);
std::string hash = AccountMgr::CalculateShaPassHash(safe_user, safe_pass);