From 6673c89791f0d939de24e5045edb680a3bf64475 Mon Sep 17 00:00:00 2001 From: Ruby Date: Thu, 19 Jul 2012 16:36:39 -0400 Subject: [PATCH] Add Antispam code from NaCl (Chalice Yao) Amended by: Lirusaito --- indra/newview/CMakeLists.txt | 2 + indra/newview/NACLantispam.cpp | 390 ++++++++++++++++++++++++ indra/newview/NACLantispam.h | 90 ++++++ indra/newview/app_settings/settings.xml | 68 ++++- indra/newview/llagent.cpp | 6 + indra/newview/llstartup.cpp | 8 + indra/newview/llviewercontrol.cpp | 27 ++ indra/newview/llviewermessage.cpp | 137 ++++++++- 8 files changed, 726 insertions(+), 2 deletions(-) create mode 100644 indra/newview/NACLantispam.cpp create mode 100644 indra/newview/NACLantispam.h diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index c41698c34..66e02cfca 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -115,6 +115,7 @@ set(viewer_SOURCE_FILES jcfloaterareasearch.cpp chatbar_as_cmdline.cpp qtoolalign.cpp + NACLantispam.cpp llaccountingcostmanager.cpp llagent.cpp llagentaccess.cpp @@ -574,6 +575,7 @@ set(viewer_HEADER_FILES CMakeLists.txt ViewerInstall.cmake + NACLantispam.h sgmemstat.h sgversion.h llviewerobjectbackup.h diff --git a/indra/newview/NACLantispam.cpp b/indra/newview/NACLantispam.cpp new file mode 100644 index 000000000..5e6be5d9d --- /dev/null +++ b/indra/newview/NACLantispam.cpp @@ -0,0 +1,390 @@ +#include "llviewerprecompiledheaders.h" +#include "NACLantispam.h" +#include "llviewercontrol.h" +#include "llnotificationsutil.h" +#include "llviewerobjectlist.h" +#include "llagent.h" +#include + +U32 NACLAntiSpamRegistry::globalAmount; +U32 NACLAntiSpamRegistry::globalTime; +bool NACLAntiSpamRegistry::bGlobalQueue; +NACLAntiSpamQueue* NACLAntiSpamRegistry::queues[NACLAntiSpamRegistry::QUEUE_MAX] = {0}; +std::tr1::unordered_map NACLAntiSpamRegistry::globalEntries; +std::tr1::unordered_map::iterator NACLAntiSpamRegistry::it2; + +const std::string COLLISION_SOUNDS[] ={"dce5fdd4-afe4-4ea1-822f-dd52cac46b08","51011582-fbca-4580-ae9e-1a5593f094ec","68d62208-e257-4d0c-bbe2-20c9ea9760bb","75872e8c-bc39-451b-9b0b-042d7ba36cba","6a45ba0b-5775-4ea8-8513-26008a17f873","992a6d1b-8c77-40e0-9495-4098ce539694","2de4da5a-faf8-46be-bac6-c4d74f1e5767","6e3fb0f7-6d9c-42ca-b86b-1122ff562d7d","14209133-4961-4acc-9649-53fc38ee1667","bc4a4348-cfcc-4e5e-908e-8a52a8915fe6","9e5c1297-6eed-40c0-825a-d9bcd86e3193","e534761c-1894-4b61-b20c-658a6fb68157","8761f73f-6cf9-4186-8aaa-0948ed002db1","874a26fd-142f-4173-8c5b-890cd846c74d","0e24a717-b97e-4b77-9c94-b59a5a88b2da","75cf3ade-9a5b-4c4d-bb35-f9799bda7fb2","153c8bf7-fb89-4d89-b263-47e58b1b4774","55c3e0ce-275a-46fa-82ff-e0465f5e8703","24babf58-7156-4841-9a3f-761bdbb8e237","aca261d8-e145-4610-9e20-9eff990f2c12","0642fba6-5dcf-4d62-8e7b-94dbb529d117","25a863e8-dc42-4e8a-a357-e76422ace9b5","9538f37c-456e-4047-81be-6435045608d4","8c0f84c3-9afd-4396-b5f5-9bca2c911c20","be582e5d-b123-41a2-a150-454c39e961c8","c70141d4-ba06-41ea-bcbc-35ea81cb8335","7d1826f4-24c4-4aac-8c2e-eff45df37783","063c97d3-033a-4e9b-98d8-05c8074922cb","00000000-0000-0000-0000-000000000120"}; +const int COLLISION_SOUNDS_SIZE=29; + +// NaClAntiSpamQueueEntry + +NACLAntiSpamQueueEntry::NACLAntiSpamQueueEntry() +{ + entryTime=0; + entryAmount=0; + blocked=false; +} +void NACLAntiSpamQueueEntry::clearEntry() +{ + entryTime=0; + entryAmount=0; + blocked=false; +} +U32 NACLAntiSpamQueueEntry::getEntryAmount() +{ + return entryAmount; +} +U32 NACLAntiSpamQueueEntry::getEntryTime() +{ + return entryTime; +} +void NACLAntiSpamQueueEntry::updateEntryAmount() +{ + entryAmount++; +} +void NACLAntiSpamQueueEntry::updateEntryTime() +{ + entryTime=time(0); +} +void NACLAntiSpamQueueEntry::setBlocked() +{ + blocked=true; +} +bool NACLAntiSpamQueueEntry::getBlocked() +{ + return blocked; +} + +// NaClAntiSpamQueue + +NACLAntiSpamQueue::NACLAntiSpamQueue(U32 time, U32 amount) +{ + queueTime=time; + queueAmount=amount; +} +void NACLAntiSpamQueue::setAmount(U32 amount) +{ + queueAmount=amount; +} +void NACLAntiSpamQueue::setTime(U32 time) +{ + queueTime=time; +} +void NACLAntiSpamQueue::clearEntries() +{ + for(it = entries.begin(); it != entries.end(); it++) + { + it->second->clearEntry(); + } +} +void NACLAntiSpamQueue::purgeEntries() +{ + for(it = entries.begin(); it != entries.end(); it++) + { + delete it->second; + } + entries.clear(); +} +void NACLAntiSpamQueue::blockEntry(LLUUID& source) +{ + it=entries.find(source.asString()); + if(it == entries.end()) + { + entries[source.asString()]=new NACLAntiSpamQueueEntry(); + } + entries[source.asString()]->setBlocked(); +} +int NACLAntiSpamQueue::checkEntry(LLUUID& name, U32 multiplier) +{ + it=entries.find(name.asString()); + if(it != entries.end()) + { + if(it->second->getBlocked()) return 2; + U32 eTime=it->second->getEntryTime(); + U32 currentTime=time(0); + if((currentTime-eTime) <= queueTime) + { + it->second->updateEntryAmount(); + U32 eAmount=it->second->getEntryAmount(); + if(eAmount > (queueAmount*multiplier)) + { + it->second->setBlocked(); + return 1; + } + else + return 0; + } + else + { + it->second->clearEntry(); + it->second->updateEntryAmount(); + it->second->updateEntryTime(); + return 0; + } + } + else + { + entries[name.asString()]=new NACLAntiSpamQueueEntry(); + entries[name.asString()]->updateEntryAmount(); + entries[name.asString()]->updateEntryTime(); + return 0; + } +} + +// NaClAntiSpamRegistry + +static const char* QUEUE_NAME[NACLAntiSpamRegistry::QUEUE_MAX] = { +"Chat", +"Inventory", +"Instant Message", +"Calling Card", +"Sound", +"Sound Preload", +"Script Dialog", +"Teleport"}; + +NACLAntiSpamRegistry::NACLAntiSpamRegistry(U32 time, U32 amount) +{ + globalTime=time; + globalAmount=amount; + static LLCachedControl _NACL_AntiSpamGlobalQueue(gSavedSettings,"_NACL_AntiSpamGlobalQueue"); + bGlobalQueue=_NACL_AntiSpamGlobalQueue; + for(int queue = 0; queue < QUEUE_MAX; ++queue) + { + queues[queue] = new NACLAntiSpamQueue(time,amount); + } +} +const char* NACLAntiSpamRegistry::getQueueName(U32 queue_id) +{ + if(queue_id >= QUEUE_MAX) + return "Unknown"; + return QUEUE_NAME[queue_id]; +} +void NACLAntiSpamRegistry::registerQueues(U32 time, U32 amount) +{ + globalTime=time; + globalAmount=amount; + static LLCachedControl _NACL_AntiSpamGlobalQueue(gSavedSettings,"_NACL_AntiSpamGlobalQueue"); + bGlobalQueue=_NACL_AntiSpamGlobalQueue; + for(int queue = 0; queue < QUEUE_MAX; ++queue) + { + queues[queue] = new NACLAntiSpamQueue(time,amount); + } +} +void NACLAntiSpamRegistry::registerQueue(U32 name, U32 time, U32 amount) +{ + /* + it=queues.find(name); + if(it == queues.end()) + { + queues[name]=new NACLAntiSpamQueue(time,amount); + } + */ +} +void NACLAntiSpamRegistry::setRegisteredQueueTime(U32 name, U32 time) +{ + if(name >= QUEUE_MAX || queues[name] == 0) + { + LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(name) << llendl; + return; + } + + queues[name]->setTime(time); +} +void NACLAntiSpamRegistry::setRegisteredQueueAmount(U32 name, U32 amount) +{ + if(name >= QUEUE_MAX || queues[name] == 0) + { + LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(name) << llendl; + return; + } + + queues[name]->setAmount(amount); +} +void NACLAntiSpamRegistry::setAllQueueTimes(U32 time) +{ + globalTime=time; + for(int queue = 0; queue < QUEUE_MAX; ++queue) + queues[queue]->setTime(time); +} +void NACLAntiSpamRegistry::setAllQueueAmounts(U32 amount) +{ + globalAmount=amount; + for(int queue = 0; queue < QUEUE_MAX; ++queue) + { + if(queue == QUEUE_SOUND || queue == QUEUE_SOUND_PRELOAD) + queues[queue]->setAmount(amount*5); + else + queues[queue]->setAmount(amount); + } +} +void NACLAntiSpamRegistry::clearRegisteredQueue(U32 name) +{ + if(name >= QUEUE_MAX || queues[name] == 0) + { + LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(name) << llendl; + return; + } + + queues[name]->clearEntries(); +} +void NACLAntiSpamRegistry::purgeRegisteredQueue(U32 name) +{ + if(name >= QUEUE_MAX || queues[name] == 0) + { + LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(name) << llendl; + return; + } + + queues[name]->purgeEntries(); +} +void NACLAntiSpamRegistry::blockOnQueue(U32 name, LLUUID& source) +{ + if(bGlobalQueue) + { + NACLAntiSpamRegistry::blockGlobalEntry(source); + } + else + { + if(name >= QUEUE_MAX || queues[name] == 0) + { + LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(name) << llendl; + return; + } + queues[name]->blockEntry(source); + } +} +void NACLAntiSpamRegistry::blockGlobalEntry(LLUUID& source) +{ + it2=globalEntries.find(source.asString()); + if(it2 == globalEntries.end()) + { + globalEntries[source.asString()]=new NACLAntiSpamQueueEntry(); + } + globalEntries[source.asString()]->setBlocked(); +} +bool NACLAntiSpamRegistry::checkQueue(U32 name, LLUUID& source, U32 multiplier, bool silent) +{ + if(source.isNull()) return false; + if(gAgent.getID() == source) return false; + LLViewerObject *obj=gObjectList.findObject(source); + if(obj) + if(obj->permYouOwner()) return false; + + int result; + if(bGlobalQueue) + { + result=NACLAntiSpamRegistry::checkGlobalEntry(source,multiplier); + } + else + { + if(name >= QUEUE_MAX || queues[name] == 0) + { + LL_ERRS("AntiSpam") << "CODE BUG: Attempting to use a antispam queue that was not created or was outside of the reasonable range of queues. Queue: " << getQueueName(name) << llendl; + return false; + } + result=queues[name]->checkEntry(source,multiplier); + } + if(result==0) + { + return false; + } + else if(result==2) + { + return true; + } + else + { + if(!silent) + { + LLSD args; + args["MESSAGE"] = std::string(getQueueName(name))+": Blocked object "+source.asString(); + LLNotificationsUtil::add("SystemMessageTip", args); + } + return true; + } +} + +// Global queue stoof +void NACLAntiSpamRegistry::setGlobalQueue(bool value) +{ + NACLAntiSpamRegistry::purgeAllQueues(); + bGlobalQueue=value; +} +void NACLAntiSpamRegistry::setGlobalAmount(U32 amount) +{ + globalAmount=amount; +} +void NACLAntiSpamRegistry::setGlobalTime(U32 time) +{ + globalTime=time; +} +void NACLAntiSpamRegistry::clearAllQueues() +{ + if(bGlobalQueue) + NACLAntiSpamRegistry::clearGlobalEntries(); + else + for(int queue = 0; queue < QUEUE_MAX; ++queue) + { + queues[queue]->clearEntries(); + } +} +void NACLAntiSpamRegistry::purgeAllQueues() +{ + if(bGlobalQueue) + NACLAntiSpamRegistry::purgeGlobalEntries(); + else + for(int queue = 0; queue < QUEUE_MAX; ++queue) + { + queues[queue]->purgeEntries(); + } +} +int NACLAntiSpamRegistry::checkGlobalEntry(LLUUID& name, U32 multiplier) +{ + it2=globalEntries.find(name.asString()); + if(it2 != globalEntries.end()) + { + if(it2->second->getBlocked()) return 2; + U32 eTime=it2->second->getEntryTime(); + U32 currentTime=time(0); + if((currentTime-eTime) <= globalTime) + { + it2->second->updateEntryAmount(); + U32 eAmount=it2->second->getEntryAmount(); + if(eAmount > (globalAmount*multiplier)) + return 1; + else + return 0; + } + else + { + it2->second->clearEntry(); + it2->second->updateEntryAmount(); + it2->second->updateEntryTime(); + return 0; + } + } + else + { + globalEntries[name.asString()]=new NACLAntiSpamQueueEntry(); + globalEntries[name.asString()]->updateEntryAmount(); + globalEntries[name.asString()]->updateEntryTime(); + return 0; + } +} +void NACLAntiSpamRegistry::clearGlobalEntries() +{ + for(it2 = globalEntries.begin(); it2 != globalEntries.end(); it2++) + { + it2->second->clearEntry(); + } +} +void NACLAntiSpamRegistry::purgeGlobalEntries() +{ + for(it2 = globalEntries.begin(); it2 != globalEntries.end(); it2++) + { + delete it2->second; + it2->second = 0; + } + globalEntries.clear(); +} \ No newline at end of file diff --git a/indra/newview/NACLantispam.h b/indra/newview/NACLantispam.h new file mode 100644 index 000000000..8706aa124 --- /dev/null +++ b/indra/newview/NACLantispam.h @@ -0,0 +1,90 @@ +#ifndef NACLANTISPAM_H +#define NACLANTISPAM_H +#include +#include "stdtypes.h" +#include "lluuid.h" +class NACLAntiSpamQueueEntry +{ + friend class NACLAntiSpamQueue; + friend class NACLAntiSpamRegistry; +protected: + NACLAntiSpamQueueEntry(); + void clearEntry(); + U32 getEntryAmount(); + U32 getEntryTime(); + void updateEntryAmount(); + void updateEntryTime(); + bool getBlocked(); + void setBlocked(); +private: + U32 entryAmount; + U32 entryTime; + bool blocked; +}; +class NACLAntiSpamQueue +{ + friend class NACLAntiSpamRegistry; +protected: + NACLAntiSpamQueue(U32 time, U32 amount); + void setAmount(U32 amount); + void setTime(U32 time); + void clearEntries(); + void purgeEntries(); + void blockEntry(LLUUID& source); + int checkEntry(LLUUID& source, U32 multiplier); +private: + std::tr1::unordered_map entries; + std::tr1::unordered_map::iterator it; + U32 queueAmount; + U32 queueTime; +}; +class NACLAntiSpamRegistry +{ +public: + NACLAntiSpamRegistry(U32 time=2, U32 amount=10); + static void registerQueues(U32 time=2, U32 amount=10); + static void registerQueue(U32 name, U32 time, U32 amount); + static void setRegisteredQueueTime(U32 name, U32 time); + static void setRegisteredQueueAmount(U32 name,U32 amount); + static void setAllQueueTimes(U32 amount); + static void setAllQueueAmounts(U32 time); + static bool checkQueue(U32 name, LLUUID& source, U32 multiplier=1, bool silent=false); + static void clearRegisteredQueue(U32 name); + static void purgeRegisteredQueue(U32 name); + static void clearAllQueues(); + static void purgeAllQueues(); + static void setGlobalQueue(bool value); + static void setGlobalAmount(U32 amount); + static void setGlobalTime(U32 time); + static void blockOnQueue(U32 name,LLUUID& owner_id); + enum { + QUEUE_CHAT, + QUEUE_INVENTORY, + QUEUE_IM, + QUEUE_CALLING_CARD, + QUEUE_SOUND, + QUEUE_SOUND_PRELOAD, + QUEUE_SCRIPT_DIALOG, + QUEUE_TELEPORT, + QUEUE_MAX + }; +private: + static const char* getQueueName(U32 queue_id); + static NACLAntiSpamQueue* queues[QUEUE_MAX]; + static std::tr1::unordered_map globalEntries; + static std::tr1::unordered_map::iterator it2; + static U32 globalTime; + static U32 globalAmount; + static bool bGlobalQueue; + + static int checkGlobalEntry(LLUUID& source, U32 multiplier); + static void clearGlobalEntries(); + static void purgeGlobalEntries(); + static void blockGlobalEntry(LLUUID& source); +}; + + +extern const std::string COLLISION_SOUNDS[]; +extern const int COLLISION_SOUNDS_SIZE; + +#endif //NACLANTISPAM_H diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5dc30d0c3..f6a4526fe 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8,7 +8,6 @@ settings_sh.xml settings_rlv.xml - SianaRenderDeferredInvisiprim Comment @@ -895,6 +894,72 @@ Value 1 + _NACL_AntiSpamGlobalQueue + + Comment + + Persist + 1 + Type + Boolean + Value + 0 + + _NACL_AntiSpamTime + + Comment + + Persist + 1 + Type + U32 + Value + 2 + + _NACL_AntiSpamAmount + + Comment + + Persist + 1 + Type + U32 + Value + 10 + + _NACL_AntiSpamSoundMulti + + Comment + + Persist + 1 + Type + U32 + Value + 4 + + _NACL_AntiSpamNewlines + + Comment + How many newlines a message can have before it's considered spam. + Persist + 1 + Type + U32 + Value + 30 + + _NACL_AntiSpamSoundPreloadMulti + + Comment + + Persist + 1 + Type + U32 + Value + 4 + AgentChatColor @@ -15097,3 +15162,4 @@ + diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index d0ba0a140..ac99480f0 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -100,6 +100,8 @@ #include "llattachmentsmgr.h" // [/RLVa:KB] +#include "NACLantispam.h" // for NaCl Antispam Registry + using namespace LLVOAvatarDefines; const BOOL ANIMATE = TRUE; @@ -665,6 +667,10 @@ void LLAgent::setRegion(LLViewerRegion *regionp) << " located at " << ip << llendl; if (mRegionp) { + // NaCl - Antispam Registry + NACLAntiSpamRegistry::purgeAllQueues(); + // NaCl End + // We've changed regions, we're now going to change our agent coordinate frame. mAgentOriginGlobal = regionp->getOriginGlobal(); LLVector3d agent_offset_global = mRegionp->getOriginGlobal(); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 18aaabef4..856b6d43b 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -233,6 +233,8 @@ #include "lldxhardware.h" #endif +#include "NACLantispam.h" // for NaCl Antispam Registry + // // exported globals // @@ -1057,6 +1059,12 @@ bool idle_startup() LLFile::mkdir(gDirUtilp->getChatLogsDir()); LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir()); + // NaCl - Antispam + U32 antispam_time = gSavedSettings.getU32("_NACL_AntiSpamTime"); + U32 antispam_amount = gSavedSettings.getU32("_NACL_AntiSpamAmount"); + NACLAntiSpamRegistry::registerQueues(antispam_time, antispam_amount); + // NaCl End + //good as place as any to create user windlight directories std::string user_windlight_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", "")); LLFile::mkdir(user_windlight_path_name.c_str()); diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 755e97e1c..d884029ab 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -83,6 +83,8 @@ #include "lldrawpoolbump.h" #include "emeraldboobutils.h" +#include "NACLantispam.h" // for NaCl Antispam Registry + #ifdef TOGGLE_HACKED_GODLIKE_VIEWER BOOL gHackGodmode = FALSE; #endif @@ -572,6 +574,25 @@ bool handleVoiceClientPrefsChanged(const LLSD& newvalue) return true; } +// NaCl - Antispam Registry +bool handleNaclAntiSpamGlobalQueueChanged(const LLSD& newvalue) +{ + NACLAntiSpamRegistry::setGlobalQueue(newvalue.asBoolean()); + return true; +} +bool handleNaclAntiSpamTimeChanged(const LLSD& newvalue) +{ + NACLAntiSpamRegistry::setAllQueueTimes(newvalue.asInteger()); + return true; +} +bool handleNaclAntiSpamAmountChanged(const LLSD& newvalue) +{ + NACLAntiSpamRegistry::setAllQueueAmounts(newvalue.asInteger()); + return true; +} +// NaCl End + + bool handleTranslateChatPrefsChanged(const LLSD& newvalue) { LLFloaterChat* floaterp = LLFloaterChat::getInstance(); @@ -794,6 +815,12 @@ void settings_setup_listeners() // [/Ansariel: Display name support] gSavedSettings.getControl("AllowLargeSounds")->getSignal()->connect(boost::bind(&handleAllowLargeSounds, _2)); + + // NaCl - Antispam Registry + gSavedSettings.getControl("_NACL_AntiSpamGlobalQueue")->getSignal()->connect(boost::bind(&handleNaclAntiSpamGlobalQueueChanged, _2)); + gSavedSettings.getControl("_NACL_AntiSpamTime")->getSignal()->connect(boost::bind(&handleNaclAntiSpamTimeChanged, _2)); + gSavedSettings.getControl("_NACL_AntiSpamAmount")->getSignal()->connect(boost::bind(&handleNaclAntiSpamAmountChanged, _2)); + // NaCl End } void onCommitControlSetting_gSavedSettings(LLUICtrl* ctrl, void* name) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 00ec70cd1..45b33e1cb 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -179,6 +179,13 @@ #include "llwindebug.h" // For the invalid message handler #endif +// NaCl - Antispam Registry +#include "NACLantispam.h" +// NaCl - Newline flood protection +#include +static const boost::regex NEWLINES("\\n{1}"); +// NaCl End + // [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) #include "llfloateravatarinfo.h" extern LLMap< const LLUUID, LLFloaterAvatarInfo* > gAvatarInfoInstances; // Only defined in llfloateravatarinfo.cpp @@ -1698,6 +1705,11 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& void inventory_offer_handler(LLOfferInfo* info, BOOL from_task) { + // NaCl - Antispam Registry + if(NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_INVENTORY,info->mFromID)) + return; + // NaCl End + //Until throttling is implmented, busy mode should reject inventory instead of silently //accepting it. SEE SL-39554 if (gAgent.getBusy()) @@ -1987,6 +1999,24 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) //msg->getData("MessageBlock", "Count", &count); msg->getStringFast(_PREHASH_MessageBlock, _PREHASH_FromAgentName, name); msg->getStringFast(_PREHASH_MessageBlock, _PREHASH_Message, message); + // NaCl - Newline flood protection + LLViewerObject* obj=gObjectList.findObject(from_id); + if(!from_id.isNull() //Not from nothing. + && gAgent.getID() != from_id //Not from self. + && !(obj && obj->permYouOwner())) //Not from own object. + { + static LLCachedControl SpamNewlines(gSavedSettings,"_NACL_AntiSpamNewlines"); + boost::sregex_iterator iter(message.begin(), message.end(), NEWLINES); + if(std::abs(std::distance(iter, boost::sregex_iterator())) > SpamNewlines) + { + NACLAntiSpamRegistry::blockOnQueue((U32)NACLAntiSpamRegistry::QUEUE_IM,from_id); + LLSD args; + args["MESSAGE"] = "Message: Blocked newline flood from "+from_id.asString(); + LLNotificationsUtil::add("SystemMessageTip", args); + return; + } + } + // NaCl End msg->getU32Fast(_PREHASH_MessageBlock, _PREHASH_ParentEstateID, parent_estate_id); msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_RegionID, region_id); msg->getVector3Fast(_PREHASH_MessageBlock, _PREHASH_Position, position); @@ -1994,6 +2024,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) binary_bucket_size = msg->getSizeFast(_PREHASH_MessageBlock, _PREHASH_BinaryBucket); EInstantMessage dialog = (EInstantMessage)d; + // NaCl - Antispam Registry + if((dialog != IM_TYPING_START && dialog != IM_TYPING_STOP) + && NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_IM,from_id)) + return; + // NaCl End + // make sure that we don't have an empty or all-whitespace name LLStringUtil::trim(name); if (name.empty()) @@ -3196,6 +3232,12 @@ void process_offer_callingcard(LLMessageSystem* msg, void**) LLUUID source_id; msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, source_id); + + // NaCl - Antispam Registry + if(NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_CALLING_CARD,source_id)) + return; + // NaCl End + LLUUID tid; msg->getUUIDFast(_PREHASH_AgentBlock, _PREHASH_TransactionID, tid); @@ -3385,6 +3427,14 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) msg->getU8("ChatData", "ChatType", type_temp); chat.mChatType = (EChatType)type_temp; + + // NaCL - Antispam Registry + if((chat.mChatType != CHAT_TYPE_START && chat.mChatType != CHAT_TYPE_STOP) //Chat type isn't typing + &&((owner_id.isNull() && NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_CHAT,from_id)) //Spam from an object? + ||(NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_CHAT,owner_id)))) //Spam from a resident? + return; + // NaCl End + msg->getU8Fast(_PREHASH_ChatData, _PREHASH_Audible, audible_temp); chat.mAudible = (EChatAudible)audible_temp; @@ -3509,6 +3559,25 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) if (is_audible) { msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg); + + // NaCl - Newline flood protection + LLViewerObject* obj=gObjectList.findObject(from_id); + if(!(from_id.isNull()) //Not from nothing. + || !(gAgent.getID() != from_id) //Not from self. + || !(obj && obj->permYouOwner())) //Not from own object. + { + static LLCachedControl SpamNewlines(gSavedSettings,"_NACL_AntiSpamNewlines"); + boost::sregex_iterator iter(mesg.begin(), mesg.end(), NEWLINES); + if(std::abs(std::distance(iter, boost::sregex_iterator())) > SpamNewlines) + { + NACLAntiSpamRegistry::blockOnQueue((U32)NACLAntiSpamRegistry::QUEUE_CHAT,owner_id); + LLSD args; + args["MESSAGE"] = "Chat: Blocked newline flood from "+owner_id.asString(); + LLNotificationsUtil::add("SystemMessageTip", args); + return; + } + } + // NaCl End static std::map sChatObjectAuth; @@ -4840,6 +4909,23 @@ void process_sound_trigger(LLMessageSystem *msg, void **) msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_SoundID, sound_id); msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_OwnerID, owner_id); msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_ObjectID, object_id); + + // NaCl - Antispam Registry + /*if(owner_id.isNull()) + {*/ + bool bDoSpamCheck=1; + std::string sSound=sound_id.asString(); + static LLCachedControl _NACL_AntiSpamSoundMulti(gSavedSettings,"_NACL_AntiSpamSoundMulti"); + for(int i=0;i< COLLISION_SOUNDS_SIZE;i++) + if(COLLISION_SOUNDS[i] == sSound) + bDoSpamCheck=0; + if(bDoSpamCheck) + if(NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_SOUND,object_id, _NACL_AntiSpamSoundMulti,true)) return; + /*} + else + if(NACLAntiSpamRegistry::checkQueue("Soundspam",owner_id)) return;*/ + // NaCl End + msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_ParentID, parent_id); msg->getU64Fast(_PREHASH_SoundData, _PREHASH_Handle, region_handle); msg->getVector3Fast(_PREHASH_SoundData, _PREHASH_Position, pos_local); @@ -4903,6 +4989,14 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data) msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_ObjectID, object_id); msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_OwnerID, owner_id); + // NaCl - Antispam Registry + static LLCachedControl _NACL_AntiSpamSoundPreloadMulti(gSavedSettings,"_NACL_AntiSpamSoundPreloadMulti"); + if((owner_id.isNull() + && NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_SOUND_PRELOAD,object_id,_NACL_AntiSpamSoundPreloadMulti)) + || NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_SOUND_PRELOAD,owner_id,_NACL_AntiSpamSoundPreloadMulti)) + return; + // NaCl End + LLViewerObject *objectp = gObjectList.findObject(object_id); if (!objectp) return; @@ -4938,6 +5032,14 @@ void process_attached_sound(LLMessageSystem *msg, void **user_data) msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_SoundID, sound_id); msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_ObjectID, object_id); msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_OwnerID, owner_id); + + // NaCl - Antispam Registry + if(/*owner_id.isNull() + &&*/ NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_SOUND,object_id)) + /*|| (NACLAntiSpamRegistry::checkQueue("Soundspam",owner_id))*/ + return; + // NaCl End + msg->getF32Fast(_PREHASH_DataBlock, _PREHASH_Gain, gain); msg->getU8Fast(_PREHASH_DataBlock, _PREHASH_Flags, flags); @@ -6030,6 +6132,12 @@ void process_economy_data(LLMessageSystem *msg, void** /*user_data*/) void notify_cautioned_script_question(const LLSD& notification, const LLSD& response, S32 orig_questions, BOOL granted) { + + // NaCl - Antispam Registry + if(NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_SCRIPT_DIALOG, notification["payload"]["task_id"].asUUID())) + return; + // NaCl End + // only continue if at least some permissions were requested if (orig_questions) { @@ -6210,6 +6318,14 @@ void process_script_question(LLMessageSystem *msg, void **user_data) msg->getUUIDFast(_PREHASH_Data, _PREHASH_TaskID, taskid ); // itemid -> script asset key of script requesting permissions msg->getUUIDFast(_PREHASH_Data, _PREHASH_ItemID, itemid ); + + // NaCl - Antispam Registry + if((taskid.isNull() + && NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_SCRIPT_DIALOG,itemid)) + || NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_SCRIPT_DIALOG,taskid)) + return; + // NaCl End + msg->getStringFast(_PREHASH_Data, _PREHASH_ObjectName, object_name); msg->getStringFast(_PREHASH_Data, _PREHASH_ObjectOwner, owner_name); msg->getS32Fast(_PREHASH_Data, _PREHASH_Questions, questions ); @@ -6874,11 +6990,22 @@ void process_script_dialog(LLMessageSystem* msg, void**) LLUUID object_id; msg->getUUID("Data", "ObjectID", object_id); -// For compability with OS grids first check for presence of extended packet before fetching data. + // NaCl - Antispam Registry + if(NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_SCRIPT_DIALOG,object_id)) + return; + // NaCl End + + // For compability with OS grids first check for presence of extended packet before fetching data. LLUUID owner_id; if (gMessageSystem->getNumberOfBlocks("OwnerData") > 0) { msg->getUUID("OwnerData", "OwnerID", owner_id); + + // NaCl - Antispam Registry + if(NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_SCRIPT_DIALOG,owner_id)) + return; + // NaCl End + } if (LLMuteList::getInstance()->isMuted(object_id) || LLMuteList::getInstance()->isMuted(owner_id)) @@ -7048,6 +7175,14 @@ void process_load_url(LLMessageSystem* msg, void**) msg->getString("Data", "ObjectName", 256, object_name); msg->getUUID( "Data", "ObjectID", object_id); msg->getUUID( "Data", "OwnerID", owner_id); + + // NaCl - Antispam Registry + if((owner_id.isNull() + && NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_SCRIPT_DIALOG,object_id)) + || NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_SCRIPT_DIALOG,owner_id)) + return; + // NaCl End + msg->getBOOL( "Data", "OwnerIsGroup", owner_is_group); msg->getString("Data", "Message", 256, message); msg->getString("Data", "URL", 256, url);