From 6673c89791f0d939de24e5045edb680a3bf64475 Mon Sep 17 00:00:00 2001 From: Ruby Date: Thu, 19 Jul 2012 16:36:39 -0400 Subject: [PATCH 1/2] 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); From f3f8bee83b275f6a1fbb179c0e97c9ae2cdfb9a8 Mon Sep 17 00:00:00 2001 From: Lirusaito Date: Thu, 19 Jul 2012 23:40:07 -0400 Subject: [PATCH 2/2] Remove old spam stuffs, Clean up new spam stuffs to compile, UI new spam stuffs. --- indra/newview/NACLantispam.cpp | 18 +- indra/newview/NACLantispam.h | 3 + indra/newview/app_settings/settings.xml | 11 ++ indra/newview/app_settings/settings_sh.xml | 88 ---------- indra/newview/ascentprefschat.cpp | 43 +++-- indra/newview/ascentprefschat.h | 11 +- indra/newview/llstartup.cpp | 4 + indra/newview/llviewercontrol.cpp | 25 --- indra/newview/llviewermessage.cpp | 166 +++++++----------- .../en-us/panel_preferences_ascent_chat.xml | 22 +-- 10 files changed, 138 insertions(+), 253 deletions(-) diff --git a/indra/newview/NACLantispam.cpp b/indra/newview/NACLantispam.cpp index 5e6be5d9d..95aad581b 100644 --- a/indra/newview/NACLantispam.cpp +++ b/indra/newview/NACLantispam.cpp @@ -387,4 +387,20 @@ void NACLAntiSpamRegistry::purgeGlobalEntries() it2->second = 0; } globalEntries.clear(); -} \ No newline at end of file +} +bool NACLAntiSpamRegistry::handleNaclAntiSpamGlobalQueueChanged(const LLSD& newvalue) +{ + setGlobalQueue(newvalue.asBoolean()); + return true; +} +bool NACLAntiSpamRegistry::handleNaclAntiSpamTimeChanged(const LLSD& newvalue) +{ + setAllQueueTimes(newvalue.asInteger()); + return true; +} +bool NACLAntiSpamRegistry::handleNaclAntiSpamAmountChanged(const LLSD& newvalue) +{ + setAllQueueAmounts(newvalue.asInteger()); + return true; +} + diff --git a/indra/newview/NACLantispam.h b/indra/newview/NACLantispam.h index 8706aa124..2f65fc423 100644 --- a/indra/newview/NACLantispam.h +++ b/indra/newview/NACLantispam.h @@ -49,6 +49,9 @@ public: static void setAllQueueTimes(U32 amount); static void setAllQueueAmounts(U32 time); static bool checkQueue(U32 name, LLUUID& source, U32 multiplier=1, bool silent=false); + static bool handleNaclAntiSpamGlobalQueueChanged(const LLSD& newvalue); + static bool handleNaclAntiSpamTimeChanged(const LLSD& newvalue); + static bool handleNaclAntiSpamAmountChanged(const LLSD& newvalue); static void clearRegisteredQueue(U32 name); static void purgeRegisteredQueue(U32 name); static void clearAllQueues(); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f6a4526fe..45121a899 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -893,6 +893,17 @@ Boolean Value 1 + + _NACL_Antispam + + Comment + When true, all dialogs will be blocked, resets on restart. + Persist + 0 + Type + Boolean + Value + 0 _NACL_AntiSpamGlobalQueue diff --git a/indra/newview/app_settings/settings_sh.xml b/indra/newview/app_settings/settings_sh.xml index feae4cb77..81659467c 100644 --- a/indra/newview/app_settings/settings_sh.xml +++ b/indra/newview/app_settings/settings_sh.xml @@ -141,94 +141,6 @@ 1.0 - SGBlockGeneralSpam - - Comment - Enable automatic general spam blocking - Persist - 1 - Type - Boolean - Value - 0 - - SGBlockCardSpam - - Comment - Enable automatic calling card spam blocking - Persist - 1 - Type - Boolean - Value - 1 - - SGBlockChatSpam - - Comment - Enable automatic chat spam blocking - Persist - 1 - Type - Boolean - Value - 0 - - SGBlockDialogSpam - - Comment - Enable automatic dialog spam blocking - Persist - 1 - Type - Boolean - Value - 1 - - SGSpamTime - - Comment - Time of Evalulating spam. (Default: 1.000) - Persist - 1 - Type - F32 - Value - 1.0 - - SGSpamCount - - Comment - Number of items spammed per time period in SGSpamTime. (Default: 4) - Persist - 1 - Type - U32 - Value - 4 - - SGChatSpamTime - - Comment - Time of Evalulating spam. (Default: 1.000) - Persist - 1 - Type - F32 - Value - 1.0 - - SGChatSpamCount - - Comment - Number of items spammed per time set in SGSpamTime. (Default: 10) - Persist - 1 - Type - U32 - Value - 10.0 - ShyotlUseLegacyTextureBatching Comment diff --git a/indra/newview/ascentprefschat.cpp b/indra/newview/ascentprefschat.cpp index 0410ce2aa..29e5d3ff0 100644 --- a/indra/newview/ascentprefschat.cpp +++ b/indra/newview/ascentprefschat.cpp @@ -40,6 +40,7 @@ #include "llradiogroup.h" #include "lluictrlfactory.h" #include "llviewercontrol.h" +#include "NACLantispam.h" #include "lgghunspell_wrapper.h" #include "llstartup.h" @@ -78,7 +79,8 @@ LLPrefsAscentChat::LLPrefsAscentChat() addChild(mObjectDropTarget); } - if (LLStartUp::getStartupState() == STATE_STARTED) + bool started = LLStartUp::getStartupState() == STATE_STARTED; + if (started) { LLUUID itemid = (LLUUID)gSavedPerAccountSettings.getString("AscentInstantMessageResponseItemData"); LLViewerInventoryItem* item = gInventory.getItem(itemid); @@ -91,6 +93,9 @@ LLPrefsAscentChat::LLPrefsAscentChat() childSetCommitCallback("im_response", onCommitAutoResponse, this); + childSetEnabled("reset_antispam", started); + childSetCommitCallback("reset_antispam", onCommitResetAS, this); + childSetCommitCallback("KeywordsOn", onCommitKeywords, this); childSetCommitCallback("KeywordsList", onCommitKeywords, this); childSetCommitCallback("KeywordsSound", onCommitKeywords, this); @@ -218,7 +223,7 @@ void LLPrefsAscentChat::onCommitTimeDate(LLUICtrl* ctrl, void* userdata) //static void LLPrefsAscentChat::onCommitAutoResponse(LLUICtrl* ctrl, void* user_data) { - LLPrefsAscentChat* self = (LLPrefsAscentChat*)user_data; + LLPrefsAscentChat* self = (LLPrefsAscentChat*)user_data; gSavedPerAccountSettings.setBOOL("AscentInstantMessageResponseAnyone", self->childGetValue("AscentInstantMessageResponseAnyone")); gSavedPerAccountSettings.setBOOL("AscentInstantMessageResponseFriends", self->childGetValue("AscentInstantMessageResponseFriends")); @@ -237,6 +242,12 @@ void LLPrefsAscentChat::SinguIMResponseItemDrop(LLViewerInventoryItem* item) sInst->childSetValue("im_give_disp_rect_txt","Currently set to: "+item->getName()); } +//static +void LLPrefsAscentChat::onCommitResetAS(LLUICtrl*, void*) +{ + NACLAntiSpamRegistry::purgeAllQueues(); +} + //static void LLPrefsAscentChat::onCommitKeywords(LLUICtrl* ctrl, void* user_data) { @@ -316,13 +327,13 @@ void LLPrefsAscentChat::refreshValues() mIMResponseText = gSavedPerAccountSettings.getString("AscentInstantMessageResponse"); //Spam -------------------------------------------------------------------------------- - mBlockChatSpam = gSavedSettings.getBOOL("SGBlockChatSpam"); - mChatSpamCount = gSavedSettings.getU32("SGChatSpamCount"); - mChatSpamTime = gSavedSettings.getF32("SGChatSpamTime"); - mBlockDialogSpam = gSavedSettings.getBOOL("SGBlockDialogSpam"); - mBlockCardSpam = gSavedSettings.getBOOL("SGBlockCardSpam"); - mSpamCount = gSavedSettings.getU32("SGSpamCount"); - mSpamTime = gSavedSettings.getF32("SGSpamTime"); + mGlobalQueue = gSavedSettings.getBOOL("_NACL_AntiSpamGlobalQueue"); + mChatSpamCount = gSavedSettings.getU32("_NACL_AntiSpamAmount"); + mChatSpamTime = gSavedSettings.getU32("_NACL_AntiSpamTime"); + mBlockDialogSpam = gSavedSettings.getBOOL("_NACL_Antispam"); + mSoundMulti = gSavedSettings.getU32("_NACL_AntiSpamSoundMulti"); + mNewLines = gSavedSettings.getU32("_NACL_AntiSpamNewlines"); + mPreloadMulti = gSavedSettings.getU32("_NACL_AntiSpamSoundPreloadMulti"); //Text Options ------------------------------------------------------------------------ mSpellDisplay = gSavedSettings.getBOOL("SpellDisplay"); @@ -503,13 +514,13 @@ void LLPrefsAscentChat::cancel() gSavedPerAccountSettings.setString("AscentInstantMessageResponse", mIMResponseText); //Spam -------------------------------------------------------------------------------- - gSavedSettings.setBOOL("SGBlockChatSpam", mBlockChatSpam); - gSavedSettings.setU32("SGChatSpamCount", mChatSpamCount); - gSavedSettings.setF32("SGChatSpamTime", mChatSpamTime); - gSavedSettings.setBOOL("SGBlockDialogSpam", mBlockDialogSpam); - gSavedSettings.setBOOL("SGBlockCardSpam", mBlockCardSpam); - gSavedSettings.setU32("SGSpamCount", mSpamCount); - gSavedSettings.setF32("SGSpamTime", mSpamTime); + gSavedSettings.setBOOL("_NACL_AntiSpamGlobalQueue", mGlobalQueue); + gSavedSettings.setU32("_NACL_AntiSpamAmount", mChatSpamCount); + gSavedSettings.setU32("_NACL_AntiSpamTime", mChatSpamTime); + gSavedSettings.setBOOL("_NACL_Antispam", mBlockDialogSpam); + gSavedSettings.setU32("_NACL_AntiSpamSoundMulti", mSoundMulti); + gSavedSettings.setU32("_NACL_AntiSpamNewlines", mNewLines); + gSavedSettings.setU32("_NACL_AntiSpamSoundPreloadMulti", mPreloadMulti); //Text Options ------------------------------------------------------------------------ gSavedSettings.setBOOL("SpellDisplay", mSpellDisplay); diff --git a/indra/newview/ascentprefschat.h b/indra/newview/ascentprefschat.h index 15c7a44be..d83b5b2d9 100644 --- a/indra/newview/ascentprefschat.h +++ b/indra/newview/ascentprefschat.h @@ -56,6 +56,7 @@ protected: static void onSpellBaseComboBoxCommit(LLUICtrl* ctrl, void* userdata); static void onCommitTimeDate(LLUICtrl* ctrl, void *userdata); static void onCommitAutoResponse(LLUICtrl* ctrl, void* user_data); + static void onCommitResetAS(LLUICtrl*,void*); static void onCommitKeywords(LLUICtrl* ctrl, void* user_data); //Chat/IM ----------------------------------------------------------------------------- @@ -84,13 +85,13 @@ protected: std::string mIMResponseText; //Spam -------------------------------------------------------------------------------- - BOOL mBlockChatSpam; + BOOL mGlobalQueue; U32 mChatSpamCount; - F32 mChatSpamTime; + U32 mChatSpamTime; BOOL mBlockDialogSpam; - BOOL mBlockCardSpam; - U32 mSpamCount; - F32 mSpamTime; + BOOL mSoundMulti; + U32 mNewLines; + U32 mPreloadMulti; //Text Options ------------------------------------------------------------------------ BOOL mSpellDisplay; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 856b6d43b..26773586c 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1063,6 +1063,9 @@ bool idle_startup() U32 antispam_time = gSavedSettings.getU32("_NACL_AntiSpamTime"); U32 antispam_amount = gSavedSettings.getU32("_NACL_AntiSpamAmount"); NACLAntiSpamRegistry::registerQueues(antispam_time, antispam_amount); + gSavedSettings.getControl("_NACL_AntiSpamGlobalQueue")->getSignal()->connect(boost::bind(&NACLAntiSpamRegistry::handleNaclAntiSpamGlobalQueueChanged, _2)); + gSavedSettings.getControl("_NACL_AntiSpamTime")->getSignal()->connect(boost::bind(&NACLAntiSpamRegistry::handleNaclAntiSpamTimeChanged, _2)); + gSavedSettings.getControl("_NACL_AntiSpamAmount")->getSignal()->connect(boost::bind(&NACLAntiSpamRegistry::handleNaclAntiSpamAmountChanged, _2)); // NaCl End //good as place as any to create user windlight directories @@ -4362,3 +4365,4 @@ bool process_login_success_response(std::string& password) } return success; } + diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index d884029ab..b6c442c6e 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -574,25 +574,6 @@ 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(); @@ -815,12 +796,6 @@ 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 45b33e1cb..ca174d71a 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -246,75 +246,6 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] = FALSE // ControlYourCamera }; -template -class SH_SpamHandler -{ -public: - SH_SpamHandler(const char *pToggleCtrl, const char *pDurCtrl, const char *pFreqCtrl) : - mDuration(pDurCtrl, 1.f), - mFrequency(pFreqCtrl, 5), - mEnabled(false) - { - gSavedSettings.getControl(pToggleCtrl)->getSignal()->connect(boost::bind(&SH_SpamHandler::CtrlToggle, this, _2)); - CtrlToggle(gSavedSettings.getBOOL(pToggleCtrl)); - } - bool CtrlToggle(const LLSD& newvalue) - { - bool on = newvalue.asBoolean(); - if(on == mEnabled) - return true; - mEnabled = on; - mTimer.stop(); - mActiveList.clear(); - mBlockedList.clear(); - return true; - } - bool isBlocked(const T &owner, const LLUUID &source_id, const char *pNotification, LLSD args=LLSD()) - { - if(!mEnabled || isAgent(owner)) - return false; - if(mBlockedList.find(owner) != mBlockedList.end()) - return true; - if(mTimer.getStarted() && mTimer.getElapsedTimeF32() < mDuration) - { - typename std::map::iterator it = mActiveList.insert(std::pair(owner,0)).first; - if(++(it->second)>=mFrequency) - { - mBlockedList.insert(owner); - if(pNotification) - { - args["OWNER"] = owner; - args["SOURCE"] = source_id; - LLNotifications::getInstance()->add(pNotification,args); - } - return true; - } - } - else - { - mActiveList.clear(); - mTimer.start(); - } - return false; - } -private: - //Owner is either a key, or a name. Do not look up perms since object may be unknown. - static bool isAgent(const T &owner); - bool mEnabled; - LLFrameTimer mTimer; - const LLCachedControl mDuration; - const LLCachedControl mFrequency; - std::map mActiveList; - std::set mBlockedList; -}; -template<> bool SH_SpamHandler::isAgent(const LLUUID &owner) { return gAgent.getID() == owner; } -template<> bool SH_SpamHandler::isAgent(const std::string &owner) -{ - std::string str; - gAgent.getName(str); - return str == owner; -} - bool friendship_offer_callback(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -1705,11 +1636,6 @@ 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()) @@ -1717,7 +1643,12 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task) info->forceResponse(IOR_BUSY); return; } - + + // NaCl - Antispam Registry + static LLCachedControl antispam(gSavedSettings,"_NACL_Antispam"); + if(antispam || NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_INVENTORY,info->mFromID)) + return; + // NaCl End //If muted, don't even go through the messaging stuff. Just curtail the offer here. if (LLMuteList::getInstance()->isMuted(info->mFromID, info->mFromName)) { @@ -1971,6 +1902,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) { return; } + static LLCachedControl antispam(gSavedSettings,"_NACL_Antispam"); LLUUID from_id; BOOL from_group; LLUUID to_id; @@ -2059,15 +1991,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) { LLSD args; args["NAME"] = name; - static SH_SpamHandler avatar_spam_check("SGBlockGeneralSpam","SGSpamTime","SGSpamCount"); - static SH_SpamHandler object_spam_check("SGBlockGeneralSpam","SGSpamTime","SGSpamCount"); - if(d==IM_FROM_TASK||d==IM_GOTO_URL||d==IM_FROM_TASK_AS_ALERT||d==IM_TASK_INVENTORY_OFFERED||d==IM_TASK_INVENTORY_ACCEPTED||d==IM_TASK_INVENTORY_DECLINED) - { - if(object_spam_check.isBlocked(from_id,session_id,"BlockedGeneralObjects",args)) - return; - } - else if(avatar_spam_check.isBlocked(from_id,from_id,"BlockedGeneralAvatar",args)) - return; } LLViewerObject *source = gObjectList.findObject(session_id); //Session ID is probably the wrong thing. @@ -2501,6 +2424,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) case IM_GROUP_NOTICE: case IM_GROUP_NOTICE_REQUESTED: { + // NaCl - Antispam + if(antispam) + return; + // NaCl End LL_INFOS("Messaging") << "Received IM_GROUP_NOTICE message." << LL_ENDL; // Read the binary bucket for more information. struct notice_bucket_header_t @@ -2596,6 +2523,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) break; case IM_GROUP_INVITATION: { + // NaCl - Antispam + if(antispam) + return; + // NaCl End //if (!is_linden && (is_busy || is_muted)) if ((is_busy || is_muted)) { @@ -2640,6 +2571,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) case IM_TASK_INVENTORY_OFFERED: // Someone has offered us some inventory. { + // NaCl - Antispam + if(antispam) + return; + // NaCl End LLOfferInfo* info = new LLOfferInfo; if (IM_INVENTORY_OFFERED == dialog) @@ -2892,6 +2827,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } break; case IM_FROM_TASK_AS_ALERT: + // NaCl - Antispam + if(antispam) + return; + // NaCl End if (is_busy && !is_owned_by_me) { return; @@ -2929,6 +2868,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) case IM_LURE_USER: { + if(antispam) return; //NaCl Antispam // [RLVa:KB] - Checked: 2010-12-11 (RLVa-1.2.2c) | Added: RLVa-1.2.2c // If the lure sender is a specific @accepttp exception they will override muted and busy status bool fRlvSummon = (rlv_handler_t::isEnabled()) && (gRlvHandler.isException(RLV_BHVR_ACCEPTTP, from_id)); @@ -3069,6 +3009,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) case IM_GOTO_URL: { + // NaCl - Antispam + if(antispam) + return; + // NaCl End LLSD args; // n.b. this is for URLs sent by the system, not for // URLs sent by scripts (i.e. llLoadURL) @@ -3093,6 +3037,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) case IM_FRIENDSHIP_OFFERED: { + // NaCl - Antispam + if(antispam) + return; + // NaCl End LLSD payload; payload["from_id"] = from_id; payload["session_id"] = session_id;; @@ -3227,6 +3175,11 @@ static LLNotificationFunctorRegistration callingcard_offer_cb_reg("OfferCallingC void process_offer_callingcard(LLMessageSystem* msg, void**) { + // NaCl - Antispam + static LLCachedControl antispam(gSavedSettings,"_NACL_Antispam"); + if(antispam) + return; + // NaCl End // someone has offered to form a friendship LL_DEBUGS("Messaging") << "callingcard offer" << LL_ENDL; @@ -3270,9 +3223,6 @@ void process_offer_callingcard(LLMessageSystem* msg, void**) } else { - static SH_SpamHandler spam_check("SGBlockCardSpam","SHSpamTime","SGSpamCount"); - if(spam_check.isBlocked(source_id,source_id,"BlockedCards",args)) - return; LLNotificationsUtil::add("OfferCallingCard", args, payload); } } @@ -3482,12 +3432,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) { LLSD args; args["NAME"] = from_name; - static SH_SpamHandler avatar_spam_check("SGBlockChatSpam","SGChatSpamTime","SGChatSpamCount"); - static SH_SpamHandler object_spam_check("SGBlockChatSpam","SGChatSpamTime","SGChatSpamCount"); - if( (chatter->isAvatar() && avatar_spam_check.isBlocked(from_id,from_id,"BlockedChatterAvatar",args)) || - (!chatter->isAvatar() && object_spam_check.isBlocked(owner_id,from_id,"BlockedChatterObjects",args)) ) - return; - chat.mPosAgent = chatter->getPositionAgent(); // Make swirly things only for talking objects. (not script debug messages, though) @@ -6132,12 +6076,10 @@ 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 - + // NaCl - Antispam Registry + LLUUID task_id = notification["payload"]["task_id"].asUUID(); + if(NACLAntiSpamRegistry::checkQueue((U32)NACLAntiSpamRegistry::QUEUE_SCRIPT_DIALOG,task_id)) return; + // NaCl End // only continue if at least some permissions were requested if (orig_questions) { @@ -6304,7 +6246,12 @@ static LLNotificationFunctorRegistration script_question_cb_reg_2("ScriptQuestio void process_script_question(LLMessageSystem *msg, void **user_data) { - // *TODO:translate owner name -> [FIRST] [LAST] + // NaCl - Antispam + static LLCachedControl antispam(gSavedSettings,"_NACL_Antispam"); + if(antispam) + return; + // NaCl End + // *TODO: Translate owner name -> [FIRST] [LAST] LLHost sender = msg->getSender(); @@ -6984,6 +6931,11 @@ static LLNotificationFunctorRegistration callback_script_dialog_reg_2("ScriptDia void process_script_dialog(LLMessageSystem* msg, void**) { + // NaCl - Antispam + static LLCachedControl antispam(gSavedSettings,"_NACL_Antispam"); + if(antispam) + return; + // NaCl End S32 i; LLSD payload; @@ -7078,10 +7030,6 @@ void process_script_dialog(LLMessageSystem* msg, void**) { args["NAME"] = LLCacheName::buildFullName(first_name, last_name); - static SH_SpamHandler spam_check("SGBlockDialogSpam","SGSpamTime","SGSpamCount"); - if(spam_check.isBlocked(first_name + " " + last_name,object_id,"BlockedDialogs",args)) - return; - if (is_text_box) { args["DEFAULT"] = default_text; @@ -7165,6 +7113,11 @@ void callback_load_url_name(const LLUUID& id, const std::string& full_name, bool void process_load_url(LLMessageSystem* msg, void**) { + // NaCl - Antispam + static LLCachedControl antispam(gSavedSettings,"_NACL_Antispam"); + if(antispam) + return; + // NaCl End LLUUID object_id; LLUUID owner_id; BOOL owner_is_group; @@ -7255,6 +7208,11 @@ void process_initiate_download(LLMessageSystem* msg, void**) void process_script_teleport_request(LLMessageSystem* msg, void**) { + // NaCl - Antispam + static LLCachedControl antispam(gSavedSettings,"_NACL_Antispam"); + if(antispam) + return; + // NaCl End if (!gSavedSettings.getBOOL("ScriptsCanShowUI")) return; std::string object_name; diff --git a/indra/newview/skins/default/xui/en-us/panel_preferences_ascent_chat.xml b/indra/newview/skins/default/xui/en-us/panel_preferences_ascent_chat.xml index 62d8c0cd3..0d5167818 100644 --- a/indra/newview/skins/default/xui/en-us/panel_preferences_ascent_chat.xml +++ b/indra/newview/skins/default/xui/en-us/panel_preferences_ascent_chat.xml @@ -68,20 +68,14 @@ - - - - seconds - - - - - seconds + +