Add Antispam code from NaCl (Chalice Yao)
Amended by: Lirusaito <inusaito@gmail.com>
This commit is contained in:
@@ -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
|
||||
|
||||
390
indra/newview/NACLantispam.cpp
Normal file
390
indra/newview/NACLantispam.cpp
Normal file
@@ -0,0 +1,390 @@
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
#include "NACLantispam.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llagent.h"
|
||||
#include <time.h>
|
||||
|
||||
U32 NACLAntiSpamRegistry::globalAmount;
|
||||
U32 NACLAntiSpamRegistry::globalTime;
|
||||
bool NACLAntiSpamRegistry::bGlobalQueue;
|
||||
NACLAntiSpamQueue* NACLAntiSpamRegistry::queues[NACLAntiSpamRegistry::QUEUE_MAX] = {0};
|
||||
std::tr1::unordered_map<std::string,NACLAntiSpamQueueEntry*> NACLAntiSpamRegistry::globalEntries;
|
||||
std::tr1::unordered_map<std::string,NACLAntiSpamQueueEntry*>::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<bool> _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<bool> _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();
|
||||
}
|
||||
90
indra/newview/NACLantispam.h
Normal file
90
indra/newview/NACLantispam.h
Normal file
@@ -0,0 +1,90 @@
|
||||
#ifndef NACLANTISPAM_H
|
||||
#define NACLANTISPAM_H
|
||||
#include <boost/tr1/unordered_map.hpp>
|
||||
#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<std::string,NACLAntiSpamQueueEntry*> entries;
|
||||
std::tr1::unordered_map<std::string,NACLAntiSpamQueueEntry*>::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<std::string,NACLAntiSpamQueueEntry*> globalEntries;
|
||||
static std::tr1::unordered_map<std::string,NACLAntiSpamQueueEntry*>::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
|
||||
@@ -8,7 +8,6 @@
|
||||
<string>settings_sh.xml</string>
|
||||
<string>settings_rlv.xml</string>
|
||||
</array>
|
||||
|
||||
<key>SianaRenderDeferredInvisiprim</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
@@ -895,6 +894,72 @@
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>_NACL_AntiSpamGlobalQueue</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string> </string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>_NACL_AntiSpamTime</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string> </string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>2</integer>
|
||||
</map>
|
||||
<key>_NACL_AntiSpamAmount</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string> </string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>10</integer>
|
||||
</map>
|
||||
<key>_NACL_AntiSpamSoundMulti</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string> </string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>4</integer>
|
||||
</map>
|
||||
<key>_NACL_AntiSpamNewlines</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>How many newlines a message can have before it's considered spam.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>30</integer>
|
||||
</map>
|
||||
<key>_NACL_AntiSpamSoundPreloadMulti</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string> </string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>4</integer>
|
||||
</map>
|
||||
<!-- Vanilla SL settings that are now optionally Account-Specific -->
|
||||
<key>AgentChatColor</key>
|
||||
<map>
|
||||
@@ -15097,3 +15162,4 @@
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -179,6 +179,13 @@
|
||||
#include "llwindebug.h" // For the invalid message handler
|
||||
#endif
|
||||
|
||||
// NaCl - Antispam Registry
|
||||
#include "NACLantispam.h"
|
||||
// NaCl - Newline flood protection
|
||||
#include <boost/regex.hpp>
|
||||
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<U32> 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<U32> 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<LLUUID, bool> 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<U32> _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<U32> _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);
|
||||
|
||||
Reference in New Issue
Block a user