diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Accounts/RBAC.h | 1 | ||||
| -rw-r--r-- | src/server/game/Miscellaneous/Language.h | 6 | ||||
| -rw-r--r-- | src/server/scripts/Commands/cs_misc.cpp | 112 | ||||
| -rw-r--r-- | src/server/shared/Database/Implementation/CharacterDatabase.cpp | 2 | 
4 files changed, 73 insertions, 48 deletions
| diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 5a6514e5356..35024fc4152 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -95,6 +95,7 @@ enum RBACPermissions      RBAC_PERM_SILENTLY_JOIN_CHANNEL                          = 45,
      RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR                   = 46,
      RBAC_PERM_CHECK_FOR_LOWER_SECURITY                       = 47,
 +    RBAC_PERM_COMMANDS_PINFO_CHECK_PERSONAL_DATA             = 48,
      RBAC_PERM_MAX
  };
 diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 15673ffd0c5..0da63a61b43 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -812,7 +812,7 @@ enum TrinityStrings      LANG_PINFO_ACC_LASTLOGIN            = 716,      LANG_PINFO_ACC_OS                   = 749,      LANG_PINFO_ACC_IP                   = 752, -    LANG_PINFO_CHR_LEVEL                = 843, +    LANG_PINFO_CHR_LEVEL_LOW            = 843,      LANG_PINFO_CHR_RACE                 = 844,      LANG_PINFO_CHR_ALIVE                = 845,      LANG_PINFO_CHR_PHASE                = 846, @@ -824,6 +824,7 @@ enum TrinityStrings      LANG_PINFO_CHR_GUILD_ONOTE          = 852,      LANG_PINFO_CHR_PLAYEDTIME           = 853,      LANG_PINFO_CHR_MAILS                = 854, +    LANG_PINFO_CHR_LEVEL_HIGH           = 871,      LANG_CHARACTER_GENDER_MALE          = 855,      LANG_CHARACTER_GENDER_FEMALE        = 856, @@ -842,7 +843,8 @@ enum TrinityStrings      LANG_ARENA_INFO_HEADER              = 868,      LANG_ARENA_INFO_MEMBERS             = 869,      LANG_ARENA_LOOKUP                   = 870, -    // Room for in-game strings           870-999 not used +    //                                  = 871, see LANG_PINFO_CHR_LEVEL_HIGH +    // Room for in-game strings           872-999 not used      // Level 4 (CLI only commands)      LANG_COMMAND_EXIT                   = 1000, diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 3051580a933..c49514cacc4 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1587,7 +1587,12 @@ public:          std::string areaName    = "<unknown>";          std::string zoneName    = "<unknown>"; -        // Guild data print is only defined if part of Guild +        // Guild data print variables defined so that they exist, but are not necessarily used +        uint32 guildId           = 0; +        std::string guildName; +        std::string guildRank; +        std::string note; +        std::string officeNote;          // Mail data print is only defined if you have a mail @@ -1626,18 +1631,19 @@ public:              if (!result)                  return false; -            Field* fields     = result->Fetch(); -            totalPlayerTime   = fields[0].GetUInt32(); -            level             = fields[1].GetUInt8(); -            money             = fields[2].GetUInt32(); -            accId             = fields[3].GetUInt32(); -            raceid            = fields[4].GetUInt8(); -            classid           = fields[5].GetUInt8(); -            mapId             = fields[6].GetUInt16(); -            areaId            = fields[7].GetUInt16(); -            gender            = fields[8].GetUInt8(); -            uint32 health = fields[9].GetUInt32(); +            Field* fields      = result->Fetch(); +            totalPlayerTime    = fields[0].GetUInt32(); +            level              = fields[1].GetUInt8(); +            money              = fields[2].GetUInt32(); +            accId              = fields[3].GetUInt32(); +            raceid             = fields[4].GetUInt8(); +            classid            = fields[5].GetUInt8(); +            mapId              = fields[6].GetUInt16(); +            areaId             = fields[7].GetUInt16(); +            gender             = fields[8].GetUInt8(); +            uint32 health      = fields[9].GetUInt32();              uint32 playerFlags = fields[10].GetUInt32(); +              if (!health || playerFlags & PLAYER_FLAGS_GHOST)                  alive = "No";              else @@ -1655,13 +1661,13 @@ public:              Field* fields = result->Fetch();              userName      = fields[0].GetString();              security      = fields[1].GetUInt8(); -            eMail         = fields[2].GetString(); -            // Only fetch these fields if commander has sufficient rights AND is online (prevent cheating) -            /// @TODO: Add RBAC for "Can query ip and login data" -            if (!handler->GetSession() || handler->GetSession()->GetSecurity() >= AccountTypes(security)) +            // Only fetch these fields if commander has sufficient rights) +            if (handler->HasPermission(RBAC_PERM_COMMANDS_PINFO_CHECK_PERSONAL_DATA) && // RBAC Perm. 48, Role 39 +               (!handler->GetSession() || handler->GetSession()->GetSecurity() >= security))              { -                lastIp = fields[3].GetString(); +                eMail     = fields[2].GetString(); +                lastIp    = fields[3].GetString();                  lastLogin = fields[4].GetString();                  uint32 ip = inet_addr(lastIp.c_str()); @@ -1678,6 +1684,12 @@ public:                      lastIp.append(")");                  }              } +            else +            { +                eMail     = "Unauthorized"; +                lastIp    = "Unauthorized"; +                lastLogin = "Unauthorized"; +            }              muteTime      = fields[5].GetUInt64();              muteReason    = fields[6].GetString();              muteBy        = fields[7].GetString(); @@ -1728,7 +1740,25 @@ public:          if (result4)          {              Field* fields = result4->Fetch(); -            xp            = fields[0].GetUInt32(); +            xp            = fields[0].GetUInt32(); // Used for "current xp" output and "%u XP Left" calculation +            uint32 gguid  = fields[1].GetUInt32(); // We check if have a guild for the person, so we might not require to query it at all + +            if (gguid != 0) +            { +                // Guild Data - an own query, because it may not happen. +                PreparedStatement* stmt3 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_MEMBER_EXTENDED); +                stmt3->setUInt32(0, lowguid); +                PreparedQueryResult result5 = CharacterDatabase.Query(stmt3); +                if (result5) +                { +                    Field* fields  = result5->Fetch(); +                    guildId        = fields[0].GetUInt32(); +                    guildName      = fields[1].GetString(); +                    guildRank      = fields[2].GetString(); +                    note           = fields[3].GetString(); +                    officeNote     = fields[4].GetString(); +                } +            }          }          // Initiate output @@ -1760,7 +1790,10 @@ public:          handler->PSendSysMessage(LANG_PINFO_ACC_IP, lastIp.c_str(), locked ? "Yes" : "No");          // Output X. LANG_PINFO_CHR_LEVEL -        handler->PSendSysMessage(LANG_PINFO_CHR_LEVEL, level, xp, xptotal, (xptotal - xp)); +        if (level != sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) +            handler->PSendSysMessage(LANG_PINFO_CHR_LEVEL_LOW, level, xp, xptotal, (xptotal - xp)); +        else +            handler->PSendSysMessage(LANG_PINFO_CHR_LEVEL_HIGH, level);          // Output XI. LANG_PINFO_CHR_RACE          raceStr  = GetRaceName(raceid, locale); @@ -1795,27 +1828,15 @@ public:          if (target)              handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name[locale], (!zoneName.empty() ? zoneName.c_str() : "<Unknown>"), (!areaName.empty() ? areaName.c_str() : "<Unknown>")); -        // Guild Data - an own query, because it may not happen. -        PreparedStatement* stmt3 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_MEMBER_EXTENDED); -        stmt3->setUInt32(0, lowguid); -        PreparedQueryResult result5 = CharacterDatabase.Query(stmt3); -        if (result5) -        { -            Field* fields = result5->Fetch(); -            uint32 guildId         = fields[0].GetUInt32(); -            std::string guildName  = fields[1].GetString(); -            std::string guildRank  = fields[2].GetString(); -            std::string note       = fields[3].GetString(); -            std::string officeNote = fields[4].GetString(); - -        // Output XVII. - XX. -        handler->PSendSysMessage(LANG_PINFO_CHR_GUILD, guildName.c_str(), guildId); -        handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_RANK, guildRank.c_str()); -        // Only output XIX and XX if they are not empty -        if (!note.empty()) -            handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_NOTE, note.c_str()); -        if (!officeNote.empty()) -            handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_ONOTE, officeNote.c_str()); +        // Output XVII. - XX. if they are not empty +        if (!guildName.empty()) +        { +            handler->PSendSysMessage(LANG_PINFO_CHR_GUILD, guildName.c_str(), guildId); +            handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_RANK, guildRank.c_str()); +            if (!note.empty()) +                handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_NOTE, note.c_str()); +            if (!officeNote.empty()) +                handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_ONOTE, officeNote.c_str());          }          // Output XXI. LANG_PINFO_CHR_PLAYEDTIME @@ -1823,23 +1844,24 @@ public:          // Mail Data - an own query, because it may or may not be useful.          // SQL: "SELECT SUM(CASE WHEN (checked & 1) THEN 1 ELSE 0 END) AS 'readmail', COUNT(*) AS 'totalmail' FROM mail WHERE `receiver` = ?" -        stmt3 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_MAILS); -        stmt3->setUInt32(0, lowguid); -        PreparedQueryResult result6 = CharacterDatabase.Query(stmt3); +        PreparedStatement* stmt4 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_MAILS); +        stmt4->setUInt32(0, lowguid); +        PreparedQueryResult result6 = CharacterDatabase.Query(stmt4);          if (result6)          {              // Define the variables, so the compiler knows they exist              uint32 rmailint = 0;              // Fetch the fields - readmail is a SUM(x) and given out as char! Thus... +            // ... while totalmail is a COUNT(x), which is given out as INt64, which we just convert on fetch...              Field* fields         = result6->Fetch();              std::string readmail  = fields[0].GetString(); -            uint64 totalmail      = fields[1].GetUInt64(); +            uint32 totalmail      = uint32(fields[1].GetUInt64());              // ... we have to convert it from Char to int. We can use totalmail as it is              rmailint = atol(readmail.c_str()); -            // Output XXII. LANG_INFO_CHR_MAILS if at least one mails is given +            // Output XXII. LANG_INFO_CHR_MAILS if at least one mail is given              if (totalmail >= 1)                 handler->PSendSysMessage(LANG_PINFO_CHR_MAILS, rmailint, totalmail);          } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 069f2127a72..fce78638414 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -427,7 +427,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()      //0: lowGUID      PrepareStatement(CHAR_SEL_PINFO_MAILS, "SELECT SUM(CASE WHEN (checked & 1) THEN 1 ELSE 0 END) AS 'readmail', COUNT(*) AS 'totalmail' FROM mail WHERE `receiver` = ?", CONNECTION_SYNCH);      //0: lowGUID -    PrepareStatement(CHAR_SEL_PINFO_XP, "SELECT xp FROM characters WHERE guid = ?", CONNECTION_SYNCH); +    PrepareStatement(CHAR_SEL_PINFO_XP, "SELECT a.xp, b.guid FROM characters a LEFT JOIN guild_member b ON a.guid = b.guid WHERE a.guid = ?", CONNECTION_SYNCH);      PrepareStatement(CHAR_SEL_CHAR_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_SYNCH);      PrepareStatement(CHAR_SEL_CHAR_GUID_NAME_BY_ACC, "SELECT guid, name FROM characters WHERE account = ?", CONNECTION_SYNCH);      PrepareStatement(CHAR_SEL_POOL_QUEST_SAVE, "SELECT quest_id FROM pool_quest_save WHERE pool_id = ?", CONNECTION_SYNCH); | 
