preliminary inbound message spoofing support completed
This commit is contained in:
@@ -529,10 +529,10 @@ LLCircuitData* LLMessageSystem::findCircuit(const LLHost& host,
|
||||
}
|
||||
|
||||
// Returns TRUE if a valid, on-circuit message has been received.
|
||||
BOOL LLMessageSystem::checkMessages( S64 frame_count )
|
||||
BOOL LLMessageSystem::checkMessages( S64 frame_count, bool faked_message, U8 fake_buffer[MAX_BUFFER_SIZE], LLHost fake_host, S32 fake_size )
|
||||
{
|
||||
// Pump
|
||||
BOOL valid_packet = FALSE;
|
||||
BOOL valid_packet = FALSE;
|
||||
mMessageReader = mTemplateMessageReader;
|
||||
|
||||
LLTransferTargetVFile::updateQueue();
|
||||
@@ -559,16 +559,25 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count )
|
||||
|
||||
U8* buffer = mTrueReceiveBuffer.buffer;
|
||||
|
||||
mTrueReceiveSize = mPacketRing.receivePacket(mSocket, (char *)mTrueReceiveBuffer.buffer);
|
||||
receive_size = mTrueReceiveSize;
|
||||
mLastSender = mPacketRing.getLastSender();
|
||||
mLastReceivingIF = mPacketRing.getLastReceivingInterface();
|
||||
if(!faked_message)
|
||||
{
|
||||
mTrueReceiveSize = mPacketRing.receivePacket(mSocket, (char *)mTrueReceiveBuffer.buffer);
|
||||
receive_size = mTrueReceiveSize;
|
||||
mLastSender = mPacketRing.getLastSender();
|
||||
mLastReceivingIF = mPacketRing.getLastReceivingInterface();
|
||||
} else {
|
||||
buffer = fake_buffer; //true my ass.
|
||||
mTrueReceiveSize = fake_size;
|
||||
receive_size = mTrueReceiveSize;
|
||||
mLastSender = fake_host;
|
||||
mLastReceivingIF = mPacketRing.getLastReceivingInterface(); //don't really give two tits about the interface, just leave it
|
||||
}
|
||||
|
||||
// If you want to dump all received packets into SecondLife.log, uncomment this
|
||||
//dumpPacketToLog();
|
||||
|
||||
// <edit>
|
||||
if(mTrueReceiveSize && receive_size > (S32) LL_MINIMUM_VALID_PACKET_SIZE)
|
||||
if(mTrueReceiveSize && receive_size > (S32) LL_MINIMUM_VALID_PACKET_SIZE && !faked_message)
|
||||
{
|
||||
LLMessageLog::log(mLastSender, LLHost(16777343, mPort), buffer, mTrueReceiveSize);
|
||||
}
|
||||
@@ -593,7 +602,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count )
|
||||
LLCircuitData* cdp;
|
||||
|
||||
// note if packet acks are appended.
|
||||
if(buffer[0] & LL_ACK_FLAG)
|
||||
if(buffer[0] & LL_ACK_FLAG && !faked_message)
|
||||
{
|
||||
acks += buffer[--receive_size];
|
||||
true_rcv_size = receive_size;
|
||||
@@ -625,7 +634,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count )
|
||||
// this message came in on if it's valid, and NULL if the
|
||||
// circuit was bogus.
|
||||
|
||||
if(cdp && (acks > 0) && ((S32)(acks * sizeof(TPACKETID)) < (true_rcv_size)))
|
||||
if(cdp && (acks > 0) && ((S32)(acks * sizeof(TPACKETID)) < (true_rcv_size)) && !faked_message)
|
||||
{
|
||||
TPACKETID packet_id;
|
||||
U32 mem_id=0;
|
||||
|
||||
@@ -346,7 +346,7 @@ public:
|
||||
bool addCircuitCode(U32 code, const LLUUID& session_id);
|
||||
|
||||
BOOL poll(F32 seconds); // Number of seconds that we want to block waiting for data, returns if data was received
|
||||
BOOL checkMessages( S64 frame_count = 0 );
|
||||
BOOL checkMessages( S64 frame_count = 0, bool faked_message = false, U8 fake_buffer[MAX_BUFFER_SIZE] = NULL, LLHost fake_host = LLHost(), S32 fake_size = NULL );
|
||||
void processAcks();
|
||||
|
||||
BOOL isMessageFast(const char *msg);
|
||||
@@ -825,12 +825,16 @@ private:
|
||||
S32 mIncomingCompressedSize; // original size of compressed msg (0 if uncomp.)
|
||||
TPACKETID mCurrentRecvPacketID; // packet ID of current receive packet (for reporting)
|
||||
|
||||
//<edit>
|
||||
public:
|
||||
LLMessageBuilder* mMessageBuilder;
|
||||
LLTemplateMessageBuilder* mTemplateMessageBuilder;
|
||||
LLSDMessageBuilder* mLLSDMessageBuilder;
|
||||
LLMessageReader* mMessageReader;
|
||||
LLTemplateMessageReader* mTemplateMessageReader;
|
||||
LLSDMessageReader* mLLSDMessageReader;
|
||||
private:
|
||||
//</edit>
|
||||
|
||||
friend class LLMessageHandlerBridge;
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "llviewerparcelmgr.h" // same for parcel
|
||||
#include "llscrolllistctrl.h"
|
||||
#include "llworld.h"
|
||||
#include "lltemplatemessagebuilder.h"
|
||||
|
||||
////////////////////////////////
|
||||
// LLNetListItem
|
||||
@@ -900,54 +901,66 @@ void LLFloaterMessageBuilder::onClickSend(void* user_data)
|
||||
return;
|
||||
}
|
||||
// Build and send
|
||||
if(outgoing)
|
||||
gMessageSystem->newMessage( message.c_str() );
|
||||
for(parts_iter = parts.begin(); parts_iter != parts_end; ++parts_iter)
|
||||
{
|
||||
gMessageSystem->newMessage( message.c_str() );
|
||||
for(parts_iter = parts.begin(); parts_iter != parts_end; ++parts_iter)
|
||||
const char* block_name = (*parts_iter).name.c_str();
|
||||
gMessageSystem->nextBlock(block_name);
|
||||
std::vector<parts_var>::iterator part_var_end = (*parts_iter).vars.end();
|
||||
for(std::vector<parts_var>::iterator part_var_iter = (*parts_iter).vars.begin();
|
||||
part_var_iter != part_var_end; ++part_var_iter)
|
||||
{
|
||||
const char* block_name = (*parts_iter).name.c_str();
|
||||
gMessageSystem->nextBlock(block_name);
|
||||
std::vector<parts_var>::iterator part_var_end = (*parts_iter).vars.end();
|
||||
for(std::vector<parts_var>::iterator part_var_iter = (*parts_iter).vars.begin();
|
||||
part_var_iter != part_var_end; ++part_var_iter)
|
||||
parts_var pv = (*part_var_iter);
|
||||
if(!addField(pv.var_type, pv.name.c_str(), pv.value, pv.hex))
|
||||
{
|
||||
parts_var pv = (*part_var_iter);
|
||||
if(!addField(pv.var_type, pv.name.c_str(), pv.value, pv.hex))
|
||||
{
|
||||
LLFloaterChat::addChat(LLChat(llformat("Error adding the provided data for %s '%s' to '%s' block", mvtstr(pv.var_type).c_str(), pv.name.c_str(), block_name)));
|
||||
gMessageSystem->clearMessage();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLScrollListCtrl* scrollp = floaterp->getChild<LLScrollListCtrl>("net_list");
|
||||
LLScrollListItem* selected_itemp = scrollp->getFirstSelected();
|
||||
|
||||
//if a specific circuit is selected, send it to that, otherwise send it to the current sim
|
||||
if(selected_itemp)
|
||||
{
|
||||
LLNetListItem* itemp = findNetListItem(selected_itemp->getUUID());
|
||||
LLScrollListText* textColumn = (LLScrollListText*)selected_itemp->getColumn(1);
|
||||
|
||||
//why would you send data through a dead circuit?
|
||||
if(textColumn->getValue().asString() == "Dead")
|
||||
{
|
||||
LLFloaterChat::addChat(LLChat("No sending messages through dead circuits!"));
|
||||
LLFloaterChat::addChat(LLChat(llformat("Error adding the provided data for %s '%s' to '%s' block", mvtstr(pv.var_type).c_str(), pv.name.c_str(), block_name)));
|
||||
gMessageSystem->clearMessage();
|
||||
return;
|
||||
}
|
||||
|
||||
gMessageSystem->sendMessage(itemp->mCircuitData->getHost());
|
||||
} else {
|
||||
gMessageSystem->sendMessage(gAgent.getRegionHost());
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
LLScrollListCtrl* scrollp = floaterp->getChild<LLScrollListCtrl>("net_list");
|
||||
LLScrollListItem* selected_itemp = scrollp->getFirstSelected();
|
||||
|
||||
//if a specific circuit is selected, send it to that, otherwise send it to the current sim
|
||||
if(selected_itemp)
|
||||
{
|
||||
LLFloaterChat::addChat(LLChat("Incoming message isn't supported yet :("));
|
||||
return;
|
||||
LLNetListItem* itemp = findNetListItem(selected_itemp->getUUID());
|
||||
LLScrollListText* textColumn = (LLScrollListText*)selected_itemp->getColumn(1);
|
||||
|
||||
//why would you send data through a dead circuit?
|
||||
if(textColumn->getValue().asString() == "Dead")
|
||||
{
|
||||
LLFloaterChat::addChat(LLChat("No sending messages through dead circuits!"));
|
||||
return;
|
||||
}
|
||||
if(outgoing)
|
||||
{
|
||||
gMessageSystem->sendMessage(itemp->mCircuitData->getHost());
|
||||
} else {
|
||||
U8 builtMessageBuffer[MAX_BUFFER_SIZE];
|
||||
|
||||
S32 message_size = gMessageSystem->mTemplateMessageBuilder->buildMessage(builtMessageBuffer, MAX_BUFFER_SIZE, 0);
|
||||
gMessageSystem->clearMessage();
|
||||
gMessageSystem->checkMessages(0, true, builtMessageBuffer, itemp->mCircuitData->getHost(), message_size);
|
||||
|
||||
}
|
||||
} else {
|
||||
if(outgoing)
|
||||
{
|
||||
gMessageSystem->sendMessage(gAgent.getRegionHost());
|
||||
} else {
|
||||
U8 builtMessageBuffer[MAX_BUFFER_SIZE];
|
||||
|
||||
S32 message_size = gMessageSystem->mTemplateMessageBuilder->buildMessage(builtMessageBuffer, MAX_BUFFER_SIZE, 0);
|
||||
gMessageSystem->clearMessage();
|
||||
gMessageSystem->checkMessages(0, true, builtMessageBuffer, gAgent.getRegionHost(), message_size);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLFloaterMessageBuilder::handleKeyHere(KEY key, MASK mask)
|
||||
{
|
||||
if(key == KEY_RETURN && (mask & MASK_CONTROL))
|
||||
|
||||
Reference in New Issue
Block a user