Merge commit 'origin/master' into 310

This commit is contained in:
VladimirMangos 2009-05-23 01:55:33 +04:00
commit f72a8bc6dc
21 changed files with 161 additions and 62 deletions

1
NEWS
View file

@ -17,6 +17,7 @@ Version 0.13
* Under discussion. * Under discussion.
* OpenSSL lib upgrade to OpenSSL 0.9.8k * OpenSSL lib upgrade to OpenSSL 0.9.8k
* ZThread replaced by similar ACE framework functionality. ZThread use dropped. * ZThread replaced by similar ACE framework functionality. ZThread use dropped.
* Visual Studio 2003 (VC71) support dropped
* Upgrade to client version 3.0.9 (build 9551). * Upgrade to client version 3.0.9 (build 9551).
Version 0.12 Version 0.12

View file

@ -21,7 +21,7 @@
DROP TABLE IF EXISTS `realmd_db_version`; DROP TABLE IF EXISTS `realmd_db_version`;
CREATE TABLE `realmd_db_version` ( CREATE TABLE `realmd_db_version` (
`required_7546_02_realmd_uptime` bit(1) default NULL `required_7867_01_realmd_account` bit(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB'; ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
-- --
@ -50,7 +50,7 @@ CREATE TABLE `account` (
`s` longtext, `s` longtext,
`email` text, `email` text,
`joindate` timestamp NOT NULL default CURRENT_TIMESTAMP, `joindate` timestamp NOT NULL default CURRENT_TIMESTAMP,
`last_ip` varchar(30) NOT NULL default '127.0.0.1', `last_ip` varchar(30) NOT NULL default '0.0.0.0',
`failed_logins` int(11) unsigned NOT NULL default '0', `failed_logins` int(11) unsigned NOT NULL default '0',
`locked` tinyint(3) unsigned NOT NULL default '0', `locked` tinyint(3) unsigned NOT NULL default '0',
`last_login` timestamp NOT NULL default '0000-00-00 00:00:00', `last_login` timestamp NOT NULL default '0000-00-00 00:00:00',
@ -107,7 +107,7 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `ip_banned`; DROP TABLE IF EXISTS `ip_banned`;
CREATE TABLE `ip_banned` ( CREATE TABLE `ip_banned` (
`ip` varchar(32) NOT NULL default '127.0.0.1', `ip` varchar(32) NOT NULL default '0.0.0.0',
`bandate` bigint(40) NOT NULL, `bandate` bigint(40) NOT NULL,
`unbandate` bigint(40) NOT NULL, `unbandate` bigint(40) NOT NULL,
`bannedby` varchar(50) NOT NULL default '[Console]', `bannedby` varchar(50) NOT NULL default '[Console]',

View file

@ -0,0 +1,4 @@
ALTER TABLE realmd_db_version CHANGE COLUMN required_7546_02_realmd_uptime required_7867_01_realmd_account bit;
ALTER TABLE `account` CHANGE COLUMN `last_ip` `last_ip` varchar(30) NOT NULL default '0.0.0.0';
ALTER TABLE `ip_banned` CHANGE COLUMN `ip` `ip` varchar(32) NOT NULL default '0.0.0.0';

View file

@ -190,6 +190,7 @@ pkgdata_DATA = \
7839_02_mangos_command.sql \ 7839_02_mangos_command.sql \
7850_01_mangos_command.sql \ 7850_01_mangos_command.sql \
7855_01_mangos_pools.sql \ 7855_01_mangos_pools.sql \
7867_01_realmd_account.sql \
README README
## Additional files to include when running 'make dist' ## Additional files to include when running 'make dist'
@ -360,4 +361,5 @@ EXTRA_DIST = \
7839_02_mangos_command.sql \ 7839_02_mangos_command.sql \
7850_01_mangos_command.sql \ 7850_01_mangos_command.sql \
7855_01_mangos_pools.sql \ 7855_01_mangos_pools.sql \
7867_01_realmd_account.sql \
README README

View file

@ -1297,7 +1297,7 @@ bool Creature::CreateFromProto(uint32 guidlow, uint32 Entry, uint32 team, const
Map *map = MapManager::Instance().FindMap(GetMapId(), GetInstanceId()); Map *map = MapManager::Instance().FindMap(GetMapId(), GetInstanceId());
if(map && map->IsDungeon() && ((InstanceMap*)map)->GetInstanceData()) if(map && map->IsDungeon() && ((InstanceMap*)map)->GetInstanceData())
{ {
((InstanceMap*)map)->GetInstanceData()->OnCreatureCreate(this, Entry); ((InstanceMap*)map)->GetInstanceData()->OnCreatureCreate(this);
} }
return true; return true;

View file

@ -946,7 +946,7 @@ struct ItemEntry
{ {
uint32 ID; // 0 uint32 ID; // 0
uint32 Class; // 1 uint32 Class; // 1
//uint32 SubClass; // 2 some items have strnage subclasses uint32 SubClass; // 2 some items have strnage subclasses
int32 Unk0; // 3 int32 Unk0; // 3
int32 Material; // 4 int32 Material; // 4
uint32 DisplayId; // 5 uint32 DisplayId; // 5

View file

@ -60,7 +60,7 @@ const char GtOCTRegenHPfmt[]="f";
const char GtRegenHPPerSptfmt[]="f"; const char GtRegenHPPerSptfmt[]="f";
const char GtRegenMPPerSptfmt[]="f"; const char GtRegenMPPerSptfmt[]="f";
const char Holidaysfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char Holidaysfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char Itemfmt[]="nixiiiii"; const char Itemfmt[]="niiiiiii";
const char ItemBagFamilyfmt[]="nxxxxxxxxxxxxxxxxx"; const char ItemBagFamilyfmt[]="nxxxxxxxxxxxxxxxxx";
//const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx"; //const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx";
//const char ItemCondExtCostsEntryfmt[]="xiii"; //const char ItemCondExtCostsEntryfmt[]="xiii";

View file

@ -61,7 +61,7 @@ class MANGOS_DLL_SPEC InstanceData
virtual void OnObjectCreate(GameObject *) {} virtual void OnObjectCreate(GameObject *) {}
//called on creature creation //called on creature creation
virtual void OnCreatureCreate(Creature * /*creature*/, uint32 /*creature_entry*/) {} virtual void OnCreatureCreate(Creature * /*creature*/) {}
//All-purpose data storage 64 bit //All-purpose data storage 64 bit
virtual uint64 GetData64(uint32 /*Data*/) { return 0; } virtual uint64 GetData64(uint32 /*Data*/) { return 0; }

View file

@ -4599,7 +4599,7 @@ bool ChatHandler::HandleResetSpellsCommand(const char * args)
else else
{ {
CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u' WHERE guid = '%u'",uint32(AT_LOGIN_RESET_SPELLS), GUID_LOPART(target_guid)); CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u' WHERE guid = '%u'",uint32(AT_LOGIN_RESET_SPELLS), GUID_LOPART(target_guid));
PSendSysMessage(LANG_RESET_SPELLS_OFFLINE,target_name); PSendSysMessage(LANG_RESET_SPELLS_OFFLINE,target_name.c_str());
} }
return true; return true;

View file

@ -788,8 +788,8 @@ void ObjectMgr::LoadEquipmentTemplates()
sLog.outString( ">> Loaded %u equipment template", sEquipmentStorage.RecordCount ); sLog.outString( ">> Loaded %u equipment template", sEquipmentStorage.RecordCount );
sLog.outString(); sLog.outString();
// This DBC is currently only used for item templates and creature equipments checks. // Creature items can be not listed in item_template
sItemStore.Clear(); //sItemStore.Clear(); -- so used in spell casting
} }
CreatureModelInfo const* ObjectMgr::GetCreatureModelInfo(uint32 modelid) CreatureModelInfo const* ObjectMgr::GetCreatureModelInfo(uint32 modelid)

View file

@ -211,6 +211,9 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
sLog.outError("Pet have incorrect type (%u) for pet loading.", getPetType()); sLog.outError("Pet have incorrect type (%u) for pet loading.", getPetType());
} }
if(owner->IsPvP())
SetPvP(true);
InitStatsForLevel(petlevel); InitStatsForLevel(petlevel);
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, time(NULL)); SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, time(NULL));
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, fields[5].GetUInt32()); SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, fields[5].GetUInt32());

View file

@ -2079,6 +2079,11 @@ void Player::SetGameMaster(bool on)
pet->getHostilRefManager().setOnlineOfflineState(false); pet->getHostilRefManager().setOnlineOfflineState(false);
} }
for (int8 i = 0; i < MAX_TOTEM; ++i)
if(m_TotemSlot[i])
if(Creature *totem = GetMap()->GetCreature(m_TotemSlot[i]))
totem->setFaction(35);
RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP); RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
ResetContestedPvP(); ResetContestedPvP();
@ -2103,6 +2108,11 @@ void Player::SetGameMaster(bool on)
pet->getHostilRefManager().setOnlineOfflineState(true); pet->getHostilRefManager().setOnlineOfflineState(true);
} }
for (int8 i = 0; i < MAX_TOTEM; ++i)
if(m_TotemSlot[i])
if(Creature *totem = GetMap()->GetCreature(m_TotemSlot[i]))
totem->setFaction(getFaction());
// restore FFA PvP Server state // restore FFA PvP Server state
if(sWorld.IsFFAPvPRealm()) if(sWorld.IsFFAPvPRealm())
SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP); SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
@ -17311,11 +17321,6 @@ void Player::UpdatePvP(bool state, bool ovrride)
if(!state || ovrride) if(!state || ovrride)
{ {
SetPvP(state); SetPvP(state);
if(Pet* pet = GetPet())
pet->SetPvP(state);
if(Unit* charmed = GetCharm())
charmed->SetPvP(state);
pvpInfo.endTimer = 0; pvpInfo.endTimer = 0;
} }
else else
@ -17323,14 +17328,7 @@ void Player::UpdatePvP(bool state, bool ovrride)
if(pvpInfo.endTimer != 0) if(pvpInfo.endTimer != 0)
pvpInfo.endTimer = time(NULL); pvpInfo.endTimer = time(NULL);
else else
{
SetPvP(state); SetPvP(state);
if(Pet* pet = GetPet())
pet->SetPvP(state);
if(Unit* charmed = GetCharm())
charmed->SetPvP(state);
}
} }
} }

View file

@ -1737,6 +1737,33 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,UnitList& TagUnitMap)
TagUnitMap.push_back(pet); TagUnitMap.push_back(pet);
} }
} }
if (m_spellInfo->Id==52759) //Ancestral Awakening (special target selection)
{
float lowestPerc = (float)m_caster->GetHealth() / (float)m_caster->GetMaxHealth();
Unit* lowestTarget = m_caster;
if (pGroup)
{
Group::MemberSlotList const& members = pGroup->GetMemberSlots();
Group::MemberSlotList::const_iterator itr = members.begin();
for(; itr != members.end(); ++itr)
{
if (Unit* member = ObjectAccessor::GetPlayer(*m_caster, (*itr).guid))
{
if (member == m_caster || member->isDead() || m_caster->IsHostileTo(member) || !m_caster->IsWithinDistInMap(member, radius))
continue;
float perc = (float)member->GetHealth() / (float)member->GetMaxHealth();
if (perc <= lowestPerc)
{
lowestPerc = perc;
lowestTarget = member;
}
}
}
}
TagUnitMap.push_back(lowestTarget);
}
else else
{ {
if(pGroup) if(pGroup)
@ -3048,7 +3075,40 @@ void Spell::WriteAmmoToPacket( WorldPacket * data )
} }
} }
} }
// TODO: implement selection ammo data based at ranged weapon stored in equipmodel/equipinfo/equipslot fields else
{
for (uint8 i = 0; i < 3; ++i)
{
if(uint32 item_id = m_caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i))
{
if(ItemEntry const * itemEntry = sItemStore.LookupEntry(item_id))
{
if(itemEntry->Class==ITEM_CLASS_WEAPON)
{
switch(itemEntry->SubClass)
{
case ITEM_SUBCLASS_WEAPON_THROWN:
ammoDisplayID = itemEntry->DisplayId;
ammoInventoryType = itemEntry->InventoryType;
break;
case ITEM_SUBCLASS_WEAPON_BOW:
case ITEM_SUBCLASS_WEAPON_CROSSBOW:
ammoDisplayID = 5996; // is this need fixing?
ammoInventoryType = INVTYPE_AMMO;
break;
case ITEM_SUBCLASS_WEAPON_GUN:
ammoDisplayID = 5998; // is this need fixing?
ammoInventoryType = INVTYPE_AMMO;
break;
}
if(ammoDisplayID)
break;
}
}
}
}
}
*data << uint32(ammoDisplayID); *data << uint32(ammoDisplayID);
*data << uint32(ammoInventoryType); *data << uint32(ammoInventoryType);

View file

@ -3968,12 +3968,6 @@ void Aura::HandleAuraModUseNormalSpeed(bool /*apply*/, bool Real)
void Aura::HandleModMechanicImmunity(bool apply, bool /*Real*/) void Aura::HandleModMechanicImmunity(bool apply, bool /*Real*/)
{ {
uint32 mechanic = 1 << m_modifier.m_miscvalue;
//immune movement impairment and loss of control
if(GetId() == 42292 || GetId() == 59752)
mechanic=IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK;
// cache values in local vars for prevent access to possible deleted aura data // cache values in local vars for prevent access to possible deleted aura data
SpellEntry const* spellInfo = GetSpellProto(); SpellEntry const* spellInfo = GetSpellProto();
uint32 misc = m_modifier.m_miscvalue; uint32 misc = m_modifier.m_miscvalue;
@ -3981,6 +3975,12 @@ void Aura::HandleModMechanicImmunity(bool apply, bool /*Real*/)
if(apply && spellInfo->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY) if(apply && spellInfo->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY)
{ {
uint32 mechanic = 1 << m_modifier.m_miscvalue;
//immune movement impairment and loss of control
if(GetId()==42292 || GetId()==59752)
mechanic=IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK;
Unit::AuraMap& Auras = target->GetAuras(); Unit::AuraMap& Auras = target->GetAuras();
for(Unit::AuraMap::iterator iter = Auras.begin(), next; iter != Auras.end(); iter = next) for(Unit::AuraMap::iterator iter = Auras.begin(), next; iter != Auras.end(); iter = next)
{ {

View file

@ -1141,6 +1141,11 @@ void Spell::EffectDummy(uint32 i)
} }
return; return;
} }
case 52759: // Ancestral Awakening
if (!unitTarget)
return;
m_caster->CastCustomSpell(unitTarget, 52752, &damage, NULL, NULL, true);
return;
case 53341: case 53341:
case 53343: case 53343:
{ {
@ -1690,6 +1695,12 @@ void Spell::EffectDummy(uint32 i)
} }
return; return;
} }
// Cleansing Totem
if(m_spellInfo->SpellFamilyFlags & 0x0000000004000000LL && m_spellInfo->SpellIconID==1673)
{
m_caster->CastSpell(unitTarget, 52025, true);
return;
}
// Healing Stream Totem // Healing Stream Totem
if(m_spellInfo->SpellFamilyFlags & 0x0000000000002000LL) if(m_spellInfo->SpellFamilyFlags & 0x0000000000002000LL)
{ {
@ -4173,6 +4184,9 @@ void Spell::EffectSummonPet(uint32 i)
if(m_caster->GetTypeId() == TYPEID_PLAYER) if(m_caster->GetTypeId() == TYPEID_PLAYER)
NewSummon->SetUInt32Value(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE); NewSummon->SetUInt32Value(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
if(m_caster->IsPvP())
NewSummon->SetPvP(true);
NewSummon->InitStatsForLevel(petlevel); NewSummon->InitStatsForLevel(petlevel);
NewSummon->InitPetCreateSpells(); NewSummon->InitPetCreateSpells();
NewSummon->InitLevelupSpellsForLevel(); NewSummon->InitLevelupSpellsForLevel();
@ -5511,6 +5525,9 @@ void Spell::EffectSummonTotem(uint32 i)
if(m_caster->GetTypeId() == TYPEID_PLAYER) if(m_caster->GetTypeId() == TYPEID_PLAYER)
pTotem->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); pTotem->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
if(m_caster->IsPvP())
pTotem->SetPvP(true);
pTotem->Summon(m_caster); pTotem->Summon(m_caster);
if(slot < MAX_TOTEM && m_caster->GetTypeId() == TYPEID_PLAYER) if(slot < MAX_TOTEM && m_caster->GetTypeId() == TYPEID_PLAYER)

View file

@ -5765,7 +5765,6 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
// Ancestral Awakening // Ancestral Awakening
if (dummySpell->SpellIconID == 3065) if (dummySpell->SpellIconID == 3065)
{ {
// TODO: frite dummy fot triggered spell
triggered_spell_id = 52759; triggered_spell_id = 52759;
basepoints0 = triggerAmount * damage / 100; basepoints0 = triggerAmount * damage / 100;
target = this; target = this;
@ -11353,6 +11352,9 @@ Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id)
if(GetTypeId()==TYPEID_PLAYER) if(GetTypeId()==TYPEID_PLAYER)
pet->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); pet->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
if(IsPvP())
pet->SetPvP(true);
uint32 level = (creatureTarget->getLevel() < (getLevel() - 5)) ? (getLevel() - 5) : creatureTarget->getLevel(); uint32 level = (creatureTarget->getLevel() < (getLevel() - 5)) ? (getLevel() - 5) : creatureTarget->getLevel();
if(!pet->InitStatsForLevel(level)) if(!pet->InitStatsForLevel(level))
@ -11557,3 +11559,21 @@ void Unit::NearTeleportTo( float x, float y, float z, float orientation, bool ca
SendMessageToSet(&data, false); SendMessageToSet(&data, false);
} }
} }
void Unit::SetPvP( bool state )
{
if(state)
SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
else
RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
if(Pet* pet = GetPet())
pet->SetPvP(state);
if(Unit* charmed = GetCharm())
charmed->SetPvP(state);
for (int8 i = 0; i < MAX_TOTEM; ++i)
if(m_TotemSlot[i])
if(Creature *totem = GetMap()->GetCreature(m_TotemSlot[i]))
totem->SetPvP(state);
}

View file

@ -960,13 +960,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
return false; return false;
} }
bool IsPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP); } bool IsPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP); }
void SetPvP(bool state) void SetPvP(bool state);
{
if(state)
SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
else
RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
}
uint32 GetCreatureType() const; uint32 GetCreatureType() const;
uint32 GetCreatureTypeMask() const uint32 GetCreatureTypeMask() const
{ {

View file

@ -34,7 +34,7 @@
extern RealmList m_realmList; extern RealmList m_realmList;
extern DatabaseType dbRealmServer; extern DatabaseType loginDatabase;
#define ChunkSize 2048 #define ChunkSize 2048
@ -323,7 +323,7 @@ void AuthSocket::_SetVSFields(const std::string& rI)
const char *v_hex, *s_hex; const char *v_hex, *s_hex;
v_hex = v.AsHexStr(); v_hex = v.AsHexStr();
s_hex = s.AsHexStr(); s_hex = s.AsHexStr();
dbRealmServer.PExecute("UPDATE account SET v = '%s', s = '%s' WHERE username = '%s'",v_hex,s_hex, _safelogin.c_str() ); loginDatabase.PExecute("UPDATE account SET v = '%s', s = '%s' WHERE username = '%s'",v_hex,s_hex, _safelogin.c_str() );
OPENSSL_free((void*)v_hex); OPENSSL_free((void*)v_hex);
OPENSSL_free((void*)s_hex); OPENSSL_free((void*)s_hex);
} }
@ -379,18 +379,18 @@ bool AuthSocket::_HandleLogonChallenge()
//Escape the user login to avoid further SQL injection //Escape the user login to avoid further SQL injection
//Memory will be freed on AuthSocket object destruction //Memory will be freed on AuthSocket object destruction
_safelogin=_login; _safelogin=_login;
dbRealmServer.escape_string(_safelogin); loginDatabase.escape_string(_safelogin);
pkt << (uint8) AUTH_LOGON_CHALLENGE; pkt << (uint8) AUTH_LOGON_CHALLENGE;
pkt << (uint8) 0x00; pkt << (uint8) 0x00;
///- Verify that this IP is not in the ip_banned table ///- Verify that this IP is not in the ip_banned table
// No SQL injection possible (paste the IP address as passed by the socket) // No SQL injection possible (paste the IP address as passed by the socket)
dbRealmServer.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate"); loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
std::string address = GetRemoteAddress(); std::string address = GetRemoteAddress();
dbRealmServer.escape_string(address); loginDatabase.escape_string(address);
QueryResult *result = dbRealmServer.PQuery( "SELECT * FROM ip_banned WHERE ip = '%s'",address.c_str()); QueryResult *result = loginDatabase.PQuery( "SELECT * FROM ip_banned WHERE ip = '%s'",address.c_str());
if(result) if(result)
{ {
pkt << (uint8)REALM_AUTH_ACCOUNT_BANNED; pkt << (uint8)REALM_AUTH_ACCOUNT_BANNED;
@ -402,7 +402,7 @@ bool AuthSocket::_HandleLogonChallenge()
///- Get the account details from the account table ///- Get the account details from the account table
// No SQL injection (escaped user name) // No SQL injection (escaped user name)
result = dbRealmServer.PQuery("SELECT sha_pass_hash,id,locked,last_ip,gmlevel FROM account WHERE username = '%s'",_safelogin.c_str ()); result = loginDatabase.PQuery("SELECT sha_pass_hash,id,locked,last_ip,gmlevel FROM account WHERE username = '%s'",_safelogin.c_str ());
if( result ) if( result )
{ {
///- If the IP is 'locked', check that the player comes indeed from the correct IP address ///- If the IP is 'locked', check that the player comes indeed from the correct IP address
@ -430,9 +430,9 @@ bool AuthSocket::_HandleLogonChallenge()
if (!locked) if (!locked)
{ {
//set expired bans to inactive //set expired bans to inactive
dbRealmServer.Execute("UPDATE account_banned SET active = 0 WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate"); loginDatabase.Execute("UPDATE account_banned SET active = 0 WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
///- If the account is banned, reject the logon attempt ///- If the account is banned, reject the logon attempt
QueryResult *banresult = dbRealmServer.PQuery("SELECT bandate,unbandate FROM account_banned WHERE id = %u AND active = 1", (*result)[1].GetUInt32()); QueryResult *banresult = loginDatabase.PQuery("SELECT bandate,unbandate FROM account_banned WHERE id = %u AND active = 1", (*result)[1].GetUInt32());
if(banresult) if(banresult)
{ {
if((*banresult)[0].GetUInt64() == (*banresult)[1].GetUInt64()) if((*banresult)[0].GetUInt64() == (*banresult)[1].GetUInt64())
@ -651,7 +651,7 @@ bool AuthSocket::_HandleLogonProof()
///- Update the sessionkey, last_ip, last login time and reset number of failed logins in the account table for this account ///- Update the sessionkey, last_ip, last login time and reset number of failed logins in the account table for this account
// No SQL injection (escaped user name) and IP address as received by socket // No SQL injection (escaped user name) and IP address as received by socket
const char* K_hex = K.AsHexStr(); const char* K_hex = K.AsHexStr();
dbRealmServer.PExecute("UPDATE account SET sessionkey = '%s', last_ip = '%s', last_login = NOW(), locale = '%u', failed_logins = 0 WHERE username = '%s'", K_hex, GetRemoteAddress().c_str(), GetLocaleByName(_localizationName), _safelogin.c_str() ); loginDatabase.PExecute("UPDATE account SET sessionkey = '%s', last_ip = '%s', last_login = NOW(), locale = '%u', failed_logins = 0 WHERE username = '%s'", K_hex, GetRemoteAddress().c_str(), GetLocaleByName(_localizationName), _safelogin.c_str() );
OPENSSL_free((void*)K_hex); OPENSSL_free((void*)K_hex);
///- Finish SRP6 and send the final result to the client ///- Finish SRP6 and send the final result to the client
@ -682,9 +682,9 @@ bool AuthSocket::_HandleLogonProof()
if(MaxWrongPassCount > 0) if(MaxWrongPassCount > 0)
{ {
//Increment number of failed logins by one and if it reaches the limit temporarily ban that account or IP //Increment number of failed logins by one and if it reaches the limit temporarily ban that account or IP
dbRealmServer.PExecute("UPDATE account SET failed_logins = failed_logins + 1 WHERE username = '%s'",_safelogin.c_str()); loginDatabase.PExecute("UPDATE account SET failed_logins = failed_logins + 1 WHERE username = '%s'",_safelogin.c_str());
if(QueryResult *loginfail = dbRealmServer.PQuery("SELECT id, failed_logins FROM account WHERE username = '%s'", _safelogin.c_str())) if(QueryResult *loginfail = loginDatabase.PQuery("SELECT id, failed_logins FROM account WHERE username = '%s'", _safelogin.c_str()))
{ {
Field* fields = loginfail->Fetch(); Field* fields = loginfail->Fetch();
uint32 failed_logins = fields[1].GetUInt32(); uint32 failed_logins = fields[1].GetUInt32();
@ -697,7 +697,7 @@ bool AuthSocket::_HandleLogonProof()
if(WrongPassBanType) if(WrongPassBanType)
{ {
uint32 acc_id = fields[0].GetUInt32(); uint32 acc_id = fields[0].GetUInt32();
dbRealmServer.PExecute("INSERT INTO account_banned VALUES ('%u',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+'%u','MaNGOS realmd','Failed login autoban',1)", loginDatabase.PExecute("INSERT INTO account_banned VALUES ('%u',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+'%u','MaNGOS realmd','Failed login autoban',1)",
acc_id, WrongPassBanTime); acc_id, WrongPassBanTime);
sLog.outBasic("[AuthChallenge] account %s got banned for '%u' seconds because it failed to authenticate '%u' times", sLog.outBasic("[AuthChallenge] account %s got banned for '%u' seconds because it failed to authenticate '%u' times",
_login.c_str(), WrongPassBanTime, failed_logins); _login.c_str(), WrongPassBanTime, failed_logins);
@ -705,8 +705,8 @@ bool AuthSocket::_HandleLogonProof()
else else
{ {
std::string current_ip = GetRemoteAddress(); std::string current_ip = GetRemoteAddress();
dbRealmServer.escape_string(current_ip); loginDatabase.escape_string(current_ip);
dbRealmServer.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+'%u','MaNGOS realmd','Failed login autoban')", loginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+'%u','MaNGOS realmd','Failed login autoban')",
current_ip.c_str(), WrongPassBanTime); current_ip.c_str(), WrongPassBanTime);
sLog.outBasic("[AuthChallenge] IP %s got banned for '%u' seconds because account %s failed to authenticate '%u' times", sLog.outBasic("[AuthChallenge] IP %s got banned for '%u' seconds because account %s failed to authenticate '%u' times",
current_ip.c_str(), WrongPassBanTime, _login.c_str(), failed_logins); current_ip.c_str(), WrongPassBanTime, _login.c_str(), failed_logins);
@ -752,7 +752,7 @@ bool AuthSocket::_HandleReconnectChallenge()
_login = (const char*)ch->I; _login = (const char*)ch->I;
_safelogin = _login; _safelogin = _login;
QueryResult *result = dbRealmServer.PQuery ("SELECT sessionkey FROM account WHERE username = '%s'", _safelogin.c_str ()); QueryResult *result = loginDatabase.PQuery ("SELECT sessionkey FROM account WHERE username = '%s'", _safelogin.c_str ());
// Stop if the account is not found // Stop if the account is not found
if (!result) if (!result)
@ -832,7 +832,7 @@ bool AuthSocket::_HandleRealmList()
///- Get the user id (else close the connection) ///- Get the user id (else close the connection)
// No SQL injection (escaped user name) // No SQL injection (escaped user name)
QueryResult *result = dbRealmServer.PQuery("SELECT id,sha_pass_hash FROM account WHERE username = '%s'",_safelogin.c_str()); QueryResult *result = loginDatabase.PQuery("SELECT id,sha_pass_hash FROM account WHERE username = '%s'",_safelogin.c_str());
if(!result) if(!result)
{ {
sLog.outError("[ERROR] user %s tried to login and we cannot find him in the database.",_login.c_str()); sLog.outError("[ERROR] user %s tried to login and we cannot find him in the database.",_login.c_str());
@ -857,7 +857,7 @@ bool AuthSocket::_HandleRealmList()
uint8 AmountOfCharacters; uint8 AmountOfCharacters;
// No SQL injection. id of realm is controlled by the database. // No SQL injection. id of realm is controlled by the database.
result = dbRealmServer.PQuery( "SELECT numchars FROM realmcharacters WHERE realmid = '%d' AND acctid='%u'",i->second.m_ID,id); result = loginDatabase.PQuery( "SELECT numchars FROM realmcharacters WHERE realmid = '%d' AND acctid='%u'",i->second.m_ID,id);
if( result ) if( result )
{ {
Field *fields = result->Fetch(); Field *fields = result->Fetch();

View file

@ -54,7 +54,7 @@ void HookSignals();
bool stopEvent = false; ///< Setting it to true stops the server bool stopEvent = false; ///< Setting it to true stops the server
RealmList m_realmList; ///< Holds the list of realms for this server RealmList m_realmList; ///< Holds the list of realms for this server
DatabaseType dbRealmServer; ///< Accessor to the realm server database DatabaseType loginDatabase; ///< Accessor to the realm server database
/// Print out the usage string for this program on the console. /// Print out the usage string for this program on the console.
void usage(const char *prog) void usage(const char *prog)
@ -262,7 +262,7 @@ extern int main(int argc, char **argv)
{ {
loopCounter = 0; loopCounter = 0;
sLog.outDetail("Ping MySQL to keep connection alive"); sLog.outDetail("Ping MySQL to keep connection alive");
delete dbRealmServer.Query("SELECT 1 FROM realmlist LIMIT 1"); delete loginDatabase.Query("SELECT 1 FROM realmlist LIMIT 1");
} }
#ifdef WIN32 #ifdef WIN32
if (m_ServiceStatus == 0) stopEvent = true; if (m_ServiceStatus == 0) stopEvent = true;
@ -271,7 +271,7 @@ extern int main(int argc, char **argv)
} }
///- Wait for the delay thread to exit ///- Wait for the delay thread to exit
dbRealmServer.HaltDelayThread(); loginDatabase.HaltDelayThread();
///- Remove signal handling before leaving ///- Remove signal handling before leaving
UnhookSignals(); UnhookSignals();
@ -310,7 +310,7 @@ bool StartDB(std::string &dbstring)
} }
sLog.outString("Database: %s", dbstring.c_str() ); sLog.outString("Database: %s", dbstring.c_str() );
if(!dbRealmServer.Initialize(dbstring.c_str())) if(!loginDatabase.Initialize(dbstring.c_str()))
{ {
sLog.outError("Cannot connect to database"); sLog.outError("Cannot connect to database");
return false; return false;

View file

@ -27,7 +27,7 @@
INSTANTIATE_SINGLETON_1( RealmList ); INSTANTIATE_SINGLETON_1( RealmList );
extern DatabaseType dbRealmServer; extern DatabaseType loginDatabase;
RealmList::RealmList( ) : m_UpdateInterval(0), m_NextUpdateTime(time(NULL)) RealmList::RealmList( ) : m_UpdateInterval(0), m_NextUpdateTime(time(NULL))
{ {
@ -79,7 +79,7 @@ void RealmList::UpdateRealms(bool init)
{ {
sLog.outDetail("Updating Realm List..."); sLog.outDetail("Updating Realm List...");
QueryResult *result = dbRealmServer.Query( "SELECT id, name, address, port, icon, color, timezone, allowedSecurityLevel, population FROM realmlist WHERE color <> 3 ORDER BY name" ); QueryResult *result = loginDatabase.Query( "SELECT id, name, address, port, icon, color, timezone, allowedSecurityLevel, population FROM realmlist WHERE color <> 3 ORDER BY name" );
///- Circle through results and add them to the realm map ///- Circle through results and add them to the realm map
if(result) if(result)

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "7866" #define REVISION_NR "7877"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__