From 783e28e87491c5d4a25f3faefb673be53f74c11b Mon Sep 17 00:00:00 2001 From: Aokromes Date: Thu, 12 Sep 2013 10:19:05 +0100 Subject: Core/Groups: Allow to configure the way in which instance reset message is sent, to the whole party (not blizzlike) or not. Signed-off-by: Machiavelli --- src/server/game/Groups/Group.cpp | 18 +++++++++++++++--- src/server/game/World/World.cpp | 3 +++ src/server/game/World/World.h | 1 + src/server/worldserver/worldserver.conf.dist | 10 +++++++--- 4 files changed, 26 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index f43e49a3440..8ec6aac9d4e 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1943,10 +1943,22 @@ void Group::ResetInstances(uint8 method, bool isRaid, Player* SendMsgTo) if (SendMsgTo) { - if (isEmpty) - SendMsgTo->SendResetInstanceSuccess(instanceSave->GetMapId()); - else + if (!isEmpty) SendMsgTo->SendResetInstanceFailed(0, instanceSave->GetMapId()); + else if (sWorld->getBoolConfig(CONFIG_INSTANCES_RESET_ANNOUNCE)) + { + if (Group* group = SendMsgTo->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + if (Player* player = itr->GetSource()) + player->SendResetInstanceSuccess(instanceSave->GetMapId()); + } + + else + SendMsgTo->SendResetInstanceSuccess(instanceSave->GetMapId()); + } + else + SendMsgTo->SendResetInstanceSuccess(instanceSave->GetMapId()); } if (isEmpty || method == INSTANCE_RESET_GROUP_DISBAND || method == INSTANCE_RESET_CHANGE_DIFFICULTY) diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index bfc512bc9a6..9e7b1f2f2b5 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1206,6 +1206,9 @@ void World::LoadConfigSettings(bool reload) // Max instances per hour m_int_configs[CONFIG_MAX_INSTANCES_PER_HOUR] = sConfigMgr->GetIntDefault("AccountInstancesPerHour", 5); + // Anounce reset of instance to whole party + m_bool_configs[CONFIG_INSTANCES_RESET_ANNOUNCE] = sConfigMgr->GetBoolDefault("InstancesResetAnnounce", false); + // AutoBroadcast m_bool_configs[CONFIG_AUTOBROADCAST] = sConfigMgr->GetBoolDefault("AutoBroadcast.On", false); m_int_configs[CONFIG_AUTOBROADCAST_CENTER] = sConfigMgr->GetIntDefault("AutoBroadcast.Center", 0); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index edcabf71095..9435fa8aa94 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -160,6 +160,7 @@ enum WorldBoolConfigs CONFIG_UI_QUESTLEVELS_IN_DIALOGS, // Should we add quest levels to the title in the NPC dialogs? CONFIG_EVENT_ANNOUNCE, CONFIG_STATS_LIMITS_ENABLE, + CONFIG_INSTANCES_RESET_ANNOUNCE, BOOL_CONFIG_VALUE_COUNT }; diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index cd9c475c5a2..62008a3eb38 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -906,6 +906,13 @@ Instance.ResetTimeHour = 4 Instance.UnloadDelay = 1800000 +# +# InstancesResetAnnounce +# Description: Announce the reset of one instance to whole party. +# Default: false - (Disabled, don't show, blizzlike) +# true - (Enabled, show) + +InstancesResetAnnounce = false # # Quests.LowLevelHideDiff # Description: Level difference between player and quest level at which quests are @@ -1213,7 +1220,6 @@ Warden.BanDuration = 86400 ################################################################################################### # PLAYER INTERACTION # -# # AllowTwoSide.Interaction.Calendar # Description: Allow calendar invites between factions. # Default: 0 - (Disabled) @@ -2639,7 +2645,6 @@ UI.ShowQuestLevelsInDialogs = 0 ################################################################################################### ################################################################################################### -# # LOGGING SYSTEM SETTINGS # # Appender config values: Given a appender "name" @@ -2828,7 +2833,6 @@ Log.Async.Enable = 0 ################################################################################################### ################################################################################################### -# # PACKET SPOOF PROTECTION SETTINGS # # These settings determine which action to take when harmful packet spoofing is detected. -- cgit v1.2.3 From 8c596b97bf16341c8dc07585961d88c363fb4621 Mon Sep 17 00:00:00 2001 From: Ascathor Date: Thu, 12 Sep 2013 16:39:41 +0200 Subject: Core/Command: Fixing .account password to no longer crash And add some comments to it. --- src/server/scripts/Commands/cs_account.cpp | 33 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp index c48eba50f72..cad45f828d8 100644 --- a/src/server/scripts/Commands/cs_account.cpp +++ b/src/server/scripts/Commands/cs_account.cpp @@ -438,6 +438,7 @@ public: static bool HandleAccountPasswordCommand(ChatHandler* handler, char const* args) { + // If no args are given at all, we can return false right away. if (!*args) { handler->SendSysMessage(LANG_CMD_SYNTAX); @@ -445,13 +446,18 @@ public: return false; } + // First, we check config. What security type (sec type) is it ? Depending on it, the command branches out uint32 pwConfig = sWorld->getIntConfig(CONFIG_ACC_PASSCHANGESEC); // 0 - PW_NONE, 1 - PW_EMAIL, 2 - PW_RBAC - char* oldPassword = strtok((char*)args, " "); - char* newPassword = strtok(NULL, " "); - char* passwordConfirmation = strtok(NULL, " "); - char* emailConfirmation = strtok(NULL, " "); + // Command is supposed to be: .account password [$oldpassword] [$newpassword] [$newpasswordconfirmation] [$emailconfirmation] + char* oldPassword = strtok((char*)args, " "); // This extracts [$oldpassword] + char* newPassword = strtok(NULL, " "); // This extracts [$newpassword] + char* passwordConfirmation = strtok(NULL, " "); // This extracts [$newpasswordconfirmation] + char* emailConfirmation; // This defines the emailConfirmation variable, which is optional depending on sec type. + if (!(emailConfirmation = strtok(NULL, " "))) // This extracts [$emailconfirmation]. If it doesn't exist, however... + emailConfirmation = ""; // ... it's simply "" for emailConfirmation. + //Is any of those variables missing for any reason ? We return false. if (!oldPassword || !newPassword || !passwordConfirmation) { handler->SendSysMessage(LANG_CMD_SYNTAX); @@ -459,17 +465,7 @@ public: return false; } - if ((pwConfig == PW_EMAIL || (pwConfig == PW_RBAC && handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE))) && !emailConfirmation) - { - handler->SendSysMessage(LANG_CMD_SYNTAX); - handler->SetSentErrorMessage(true); - TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change password, but entered no email at all. Has Perm: [%s]", - handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), - handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), - handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE) ? "Yes" : "No"); - return false; - } - + // We compare the old, saved password to the entered old password - no chance for the unauthorized. if (!AccountMgr::CheckPassword(handler->GetSession()->GetAccountId(), std::string(oldPassword))) { handler->SendSysMessage(LANG_COMMAND_WRONGOLDPASSWORD); @@ -480,8 +476,9 @@ public: return false; } - if ((pwConfig == PW_EMAIL || (pwConfig == PW_RBAC && handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE))) // Either PW_EMAIL or PW_RBAC with the Permission - && !AccountMgr::CheckEmail(handler->GetSession()->GetAccountId(), std::string(emailConfirmation))) + // This compares the old, current email to the entered email - however, only... + if ((pwConfig == PW_EMAIL || (pwConfig == PW_RBAC && handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE))) // ...if either PW_EMAIL or PW_RBAC with the Permission is active... + && !AccountMgr::CheckEmail(handler->GetSession()->GetAccountId(), std::string(emailConfirmation))) // ... and returns false if the comparison fails. { handler->SendSysMessage(LANG_COMMAND_WRONGEMAIL); handler->SetSentErrorMessage(true); @@ -492,6 +489,7 @@ public: return false; } + // Making sure that newly entered password is correctly entered. if (strcmp(newPassword, passwordConfirmation) != 0) { handler->SendSysMessage(LANG_NEW_PASSWORDS_NOT_MATCH); @@ -499,6 +497,7 @@ public: return false; } + // Changes password and prints result. AccountOpResult result = AccountMgr::ChangePassword(handler->GetSession()->GetAccountId(), std::string(newPassword)); switch (result) { -- cgit v1.2.3 From bd8d0cfbce9a38e0f2fc8b6903434c3553faf143 Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Thu, 12 Sep 2013 16:42:22 +0100 Subject: Fix build --- src/server/scripts/Commands/cs_account.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp index cad45f828d8..6fcf9dfdbec 100644 --- a/src/server/scripts/Commands/cs_account.cpp +++ b/src/server/scripts/Commands/cs_account.cpp @@ -453,9 +453,9 @@ public: char* oldPassword = strtok((char*)args, " "); // This extracts [$oldpassword] char* newPassword = strtok(NULL, " "); // This extracts [$newpassword] char* passwordConfirmation = strtok(NULL, " "); // This extracts [$newpasswordconfirmation] - char* emailConfirmation; // This defines the emailConfirmation variable, which is optional depending on sec type. + char* emailConfirmation = NULL; // This defines the emailConfirmation variable, which is optional depending on sec type. if (!(emailConfirmation = strtok(NULL, " "))) // This extracts [$emailconfirmation]. If it doesn't exist, however... - emailConfirmation = ""; // ... it's simply "" for emailConfirmation. + emailConfirmation = '\0'; // ... it's simply "" for emailConfirmation. //Is any of those variables missing for any reason ? We return false. if (!oldPassword || !newPassword || !passwordConfirmation) -- cgit v1.2.3 From 1b3575ba772124d2e7a8173a5d35dc9d2d271a8a Mon Sep 17 00:00:00 2001 From: jackpoz Date: Thu, 12 Sep 2013 22:54:05 +0200 Subject: Core/Logs: Fix race condition in Log Fix race condition in Log by using atomic operators. Helgrind log: Possible data race during read of size 8 at 0x7379D98 by thread #1 Locks held: none at 0x15AE9C7: AppenderFile::_write(LogMessage const&) (AppenderFile.cpp:59) by 0x15ADFF8: Appender::write(LogMessage&) (Appender.cpp:106) by 0x159F14E: Logger::write(LogMessage&) (Logger.cpp:83) by 0x15A215B: Log::write(LogMessage*) (Log.cpp:290) by 0x15A200F: Log::vlog(LogFilterType, LogLevel, char const*, __va_list_tag*) (Log.cpp:272) by 0x15A2682: Log::outInfo(LogFilterType, char const*, ...) (Log.cpp:364) by 0xF7DA28: Master::Run() (Master.cpp:296) by 0xF835E8: main (Main.cpp:142) This conflicts with a previous write of size 8 by thread #10 Locks held: none at 0x15AE9D7: AppenderFile::_write(LogMessage const&) (AppenderFile.cpp:59) by 0x15ADFF8: Appender::write(LogMessage&) (Appender.cpp:106) by 0x159F14E: Logger::write(LogMessage&) (Logger.cpp:83) by 0x15A215B: Log::write(LogMessage*) (Log.cpp:290) by 0x15A200F: Log::vlog(LogFilterType, LogLevel, char const*, __va_list_tag*) (Log.cpp:272) by 0x15A2682: Log::outInfo(LogFilterType, char const*, ...) (Log.cpp:364) by 0xF7EC1F: FreezeDetectorRunnable::run() (Master.cpp:98) by 0x15A5B3E: ACE_Based::Thread::ThreadTask(void*) (Threading.cpp:186) Address 0x7379D98 is 88 bytes inside a block of size 96 alloc'd at 0x4C2C857: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so) by 0x15A0FE3: Log::CreateAppenderFromConfig(char const*) (Log.cpp:150) by 0x15A1AED: Log::ReadAppendersFromConfig() (Log.cpp:244) by 0x15A31B4: Log::LoadFromConfig() (Log.cpp:469) by 0x15A053B: Log::Log() (Log.cpp:35) by 0xF75CD1: ACE_Singleton::ACE_Singleton() (Singleton.inl:13) by 0xF754A4: ACE_Singleton::instance() (Singleton.cpp:91) by 0xF8351A: main (Main.cpp:135) --- src/server/shared/Logging/AppenderFile.cpp | 4 ++-- src/server/shared/Logging/AppenderFile.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/server/shared/Logging/AppenderFile.cpp b/src/server/shared/Logging/AppenderFile.cpp index 93d53bcc30d..54458346bb9 100644 --- a/src/server/shared/Logging/AppenderFile.cpp +++ b/src/server/shared/Logging/AppenderFile.cpp @@ -40,7 +40,7 @@ AppenderFile::~AppenderFile() void AppenderFile::_write(LogMessage const& message) { - bool exceedMaxSize = maxFileSize > 0 && (fileSize + message.Size()) > maxFileSize; + bool exceedMaxSize = maxFileSize > 0 && (fileSize.value() + message.Size()) > maxFileSize; if (dynamicName) { @@ -56,7 +56,7 @@ void AppenderFile::_write(LogMessage const& message) fprintf(logfile, "%s%s", message.prefix.c_str(), message.text.c_str()); fflush(logfile); - fileSize += message.Size(); + fileSize += uint64(message.Size()); if (dynamicName) CloseFile(); diff --git a/src/server/shared/Logging/AppenderFile.h b/src/server/shared/Logging/AppenderFile.h index c15974799e1..de94a46d692 100644 --- a/src/server/shared/Logging/AppenderFile.h +++ b/src/server/shared/Logging/AppenderFile.h @@ -19,6 +19,7 @@ #define APPENDERFILE_H #include "Appender.h" +#include "ace/Atomic_Op.h" class AppenderFile: public Appender { @@ -37,7 +38,7 @@ class AppenderFile: public Appender bool dynamicName; bool backup; uint64 maxFileSize; - uint64 fileSize; + ACE_Atomic_Op fileSize; }; #endif -- cgit v1.2.3 From 6581d7db85987970ff3bec57fa81aa76ce39c038 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Fri, 13 Sep 2013 20:56:32 +0200 Subject: Core/Commands: Fix NULL dereference crash in .account password Fix NULL dereference crash in .account password added in bd8d0cfbce9a38e0f2fc8b6903434c3553faf143 Fixes #10791 --- src/server/scripts/Commands/cs_account.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp index 6fcf9dfdbec..f0d27104035 100644 --- a/src/server/scripts/Commands/cs_account.cpp +++ b/src/server/scripts/Commands/cs_account.cpp @@ -453,9 +453,9 @@ public: char* oldPassword = strtok((char*)args, " "); // This extracts [$oldpassword] char* newPassword = strtok(NULL, " "); // This extracts [$newpassword] char* passwordConfirmation = strtok(NULL, " "); // This extracts [$newpasswordconfirmation] - char* emailConfirmation = NULL; // This defines the emailConfirmation variable, which is optional depending on sec type. + const char* emailConfirmation; // This defines the emailConfirmation variable, which is optional depending on sec type. if (!(emailConfirmation = strtok(NULL, " "))) // This extracts [$emailconfirmation]. If it doesn't exist, however... - emailConfirmation = '\0'; // ... it's simply "" for emailConfirmation. + emailConfirmation = ""; // ... it's simply "" for emailConfirmation. //Is any of those variables missing for any reason ? We return false. if (!oldPassword || !newPassword || !passwordConfirmation) -- cgit v1.2.3