LSL Protocol/Restrained Life Relay/How to Test/Relay Test 05
< LSL Protocol | Restrained Life Relay | How to Test
Jump to navigation
Jump to search
Revision as of 16:36, 28 February 2009 by Maike Short (talk | contribs) (New page: == Objective == Ensure that an attacker cannot force an agent to say an unprefixed text of the attackers choice on any channel) == Instructions == # Rez the object and click it # Wait ...)
Objective
Ensure that an attacker cannot force an agent to say an unprefixed text of the attackers choice on any channel)
Instructions
- Rez the object and click it
- Wait
Code
<lsl> integer CHANNEL_RELAY = -1812221819; // Relay Channel integer CHANNEL_VIEWER_QUERY = 123; integer CHANNEL_VIEWER_ATTACK = 124;
integer success;
// converts the first letter into upper case string upperCaseFirstLetter(string param) {
integer length = llStringLength(param); if (length <= 1) { return llToUpper(param); }
return llToUpper(llGetSubString(param, 0, 0)) + llGetSubString(param, 1, -1);
}
// looks for the confirmation of the last command handleRelayResponse(string message) {
list tokens = llParseString2List(message, [","], []); string question = llList2String(tokens, 2); string response = llList2String(tokens, 3); if (response == "") { return; } if (question == "@end=n") { llSay(CHANNEL_RELAY, "relaytest," + (string) llGetOwner() + ",!release"); } else if (question == "!release") { // wait a little bit after "!release,ok" to take // network lag from the viewer into account llSetTimerEvent(10); }
}
// handles response of additional status messages handleAvatarQueryResponse(string message) {
list tokens = llParseString2List(message, ["/"], []); integer count = llGetListLength(tokens); integer i; for (i = 0; i < count; i++) { string restriction = llList2String(tokens, i); if (restriction != "crmwqfxdkjfsakdfh") { string restrictionUpper = upperCaseFirstLetter(restriction); llSay(CHANNEL_RELAY, "relaytest," + (string) llGetOwner() + ",@" + restriction + "=y|@" + restriction + ":=y" + "|@" + restrictionUpper + "=y|@" + restrictionUpper + ":=y"); } } llSay(CHANNEL_RELAY, "relaytest," + (string) llGetOwner() + ",@getstatus=124|@end=n");
}
// analyse attack response. handleAvatarAttackResponse(string message) {
integer pos = llSubStringIndex(message, "crmwqfxdkjfsakdfh"); if (pos < 0) { llSay(0, "FAIL: Pseudo restriction was not part of response (broken test?): " + message); success = FALSE; } else if (pos < 2) { llSay(0, "FAIL: Avatar said: " + message); success = FALSE; }
}
default {
state_entry() { llListen(CHANNEL_RELAY, "", "", ""); llListen(CHANNEL_VIEWER_QUERY, "", "", ""); llListen(CHANNEL_VIEWER_ATTACK, "", "", ""); }
on_rez(integer ignored) { llSetText(llGetObjectName(), <1, 1, 1>, 1); }
listen(integer channel, string name, key id, string message) { llOwnerSay(name + ": " + message);
if ((llGetOwnerKey(id) == id) && (channel == CHANNEL_VIEWER_QUERY)) { handleAvatarQueryResponse(message); }
if ((llGetOwnerKey(id) == id) && (channel == CHANNEL_VIEWER_ATTACK)) { handleAvatarAttackResponse(message); }
if ((llGetOwnerKey(id) == llGetOwner()) && (channel == CHANNEL_RELAY)) { handleRelayResponse(message); } }
touch_start(integer ignored) { if (llDetectedKey(0) != llGetOwner()) { llSay(0, "Hey, " + llDetectedName(0) + " don't mess with me!"); return; }
llSetTimerEvent(0); success = TRUE;
llSay(0, "Trying to cause unprefixed chat on channel 124, please wait...");
llSay(CHANNEL_RELAY, "relaytest," + (string) llGetOwner() + ",@crmwqfxdkjfsakdfh=n|@getstatus=123"); }
timer() { if (success) { llSay(0, "PASS: All avatar chat was prefixed."); } llSetTimerEvent(0); }
} </lsl>