Whitespace-only changes.

- Remove CR before LF to allow Git to use system-specific line terminators.
- Expand tabs to spaces.
- Remove spaces at end of line.
This commit is contained in:
Sei Lisa 2017-08-31 12:08:57 +02:00
parent eb0164ff0a
commit f97f8c5a5b
2 changed files with 577 additions and 577 deletions

View file

@ -1,293 +1,293 @@
/* /*
* This Source Code Form is subject to the terms of the Mozilla Public * This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
* *
* Copyright (c) the AVsitter Contributors (http://avsitter.github.io) * Copyright (c) the AVsitter Contributors (http://avsitter.github.io)
* AVsitter™ is a trademark. For trademark use policy see: * AVsitter™ is a trademark. For trademark use policy see:
* https://avsitter.github.io/TRADEMARK.mediawiki * https://avsitter.github.io/TRADEMARK.mediawiki
* *
* Please consider supporting continued development of AVsitter and * Please consider supporting continued development of AVsitter and
* receive automatic updates and other benefits! All details and user * receive automatic updates and other benefits! All details and user
* instructions can be found at http://avsitter.github.io * instructions can be found at http://avsitter.github.io
*/ */
/* /*
* Things not implemented: * Things not implemented:
* ~ perms of the object * ~ perms of the object
* ~ creator of the object * ~ creator of the object
* ~ which platform/world (OpenSim/SL) * ~ which platform/world (OpenSim/SL)
*/ */
integer sendToSupport=FALSE; integer sendToSupport=FALSE;
integer sendItems = TRUE; integer sendItems = TRUE;
string support_avi = ""; string support_avi = "";
string disclaimer = "This script will inspect your object and create a link you can share with others.\n\nClick OK to proceed."; string disclaimer = "This script will inspect your object and create a link you can share with others.\n\nClick OK to proceed.";
string start_message = "Preparing info, please wait..."; string start_message = "Preparing info, please wait...";
string end_message = "Inspection complete! Script removed."; string end_message = "Inspection complete! Script removed.";
string product = "Noob Detector"; string product = "Noob Detector";
string version = "1.3"; string version = "1.3";
list allowed_products = ["AVpos","[AV]menu","[AV]object"]; list allowed_products = ["AVpos","[AV]menu","[AV]object"];
string out; string out;
string next_out; string next_out;
list notecards_to_read; list notecards_to_read;
key notecard_query; key notecard_query;
integer notecard_index; integer notecard_index;
integer notecard_line; integer notecard_line;
list item_types = ["TEXTURE","SOUND","LANDMARK","CLOTHING","OBJECT","NOTECARD","SCRIPT","BODYPART","ANIMATION","GESTURE","ALL TYPES"]; list item_types = ["TEXTURE","SOUND","LANDMARK","CLOTHING","OBJECT","NOTECARD","SCRIPT","BODYPART","ANIMATION","GESTURE","ALL TYPES"];
list item_ints = [0,1,3,5,6,7,10,13,20,21]; list item_ints = [0,1,3,5,6,7,10,13,20,21];
integer menu_channel; integer menu_channel;
string url = "https://avsitter.com/settings.php"; string url = "https://avsitter.com/settings.php";
string cache; string cache;
string webkey; string webkey;
integer webcount; integer webcount;
add_out(string say, integer force){ add_out(string say, integer force){
cache+=say; cache+=say;
if(!force){ if(!force){
cache+="\n"; cache+="\n";
} }
if(llStringLength(llEscapeURL(cache))>1024 || force){ if(llStringLength(llEscapeURL(cache))>1024 || force){
webcount++; webcount++;
llHTTPRequest(url, [HTTP_METHOD,"POST",HTTP_MIMETYPE,"application/x-www-form-urlencoded",HTTP_VERIFY_CERT,FALSE], "w="+webkey+"&c="+(string)webcount+"&t="+llEscapeURL(cache)); llHTTPRequest(url, [HTTP_METHOD,"POST",HTTP_MIMETYPE,"application/x-www-form-urlencoded",HTTP_VERIFY_CERT,FALSE], "w="+webkey+"&c="+(string)webcount+"&t="+llEscapeURL(cache));
cache=""; cache="";
} }
} }
remove_script(){ remove_script(){
llOwnerSay("Diagnostic script removed."); llOwnerSay("Diagnostic script removed.");
llRemoveInventory(llGetScriptName()); llRemoveInventory(llGetScriptName());
} }
default { default {
state_entry(){ state_entry(){
integer i; integer i;
for(i=0;i<llGetListLength(allowed_products);i++){ for(i=0;i<llGetListLength(allowed_products);i++){
if (llGetInventoryType(llList2String(allowed_products,i))!= INVENTORY_NONE){ if (llGetInventoryType(llList2String(allowed_products,i))!= INVENTORY_NONE){
state permission; state permission;
} }
} }
llOwnerSay("Sorry, could not find correct product for this script."); llOwnerSay("Sorry, could not find correct product for this script.");
remove_script(); remove_script();
} }
} }
state permission { state permission {
state_entry(){ state_entry(){
llSetTimerEvent(120); llSetTimerEvent(120);
llListen(menu_channel=((integer)llFrand(0x7FFFFF80)+1)*-1,"","",""); llListen(menu_channel=((integer)llFrand(0x7FFFFF80)+1)*-1,"","","");
llDialog(llGetOwner(),product+" "+version+"\n\n"+disclaimer,["OK"],menu_channel);//RLV llDialog(llGetOwner(),product+" "+version+"\n\n"+disclaimer,["OK"],menu_channel);//RLV
} }
timer(){ timer(){
remove_script(); remove_script();
} }
listen(integer listen_channel, string name, key id, string message){ listen(integer listen_channel, string name, key id, string message){
if(message=="OK"){ if(message=="OK"){
state running; state running;
} }
else{ else{
remove_script(); remove_script();
} }
} }
} }
state running { state running {
http_response(key request_id, integer status, list metadata, string body){ http_response(key request_id, integer status, list metadata, string body){
llOwnerSay(body); llOwnerSay(body);
} }
state_entry(){ state_entry(){
webkey=(string)llGenerateKey(); webkey=(string)llGenerateKey();
llDialog(llGetOwner(),product+" "+version+"\n\n"+start_message,["OK"],menu_channel); llDialog(llGetOwner(),product+" "+version+"\n\n"+start_message,["OK"],menu_channel);
llOwnerSay(start_message); llOwnerSay(start_message);
add_out("Share this info to get help with your AVsitter build!\n",FALSE); add_out("Share this info to get help with your AVsitter build!\n",FALSE);
add_out("----START----",FALSE); add_out("----START----",FALSE);
add_out("user: "+llKey2Name(llGetOwner())+" ("+(string)llGetOwner()+")",FALSE); add_out("user: "+llKey2Name(llGetOwner())+" ("+(string)llGetOwner()+")",FALSE);
list object_perms_owner; list object_perms_owner;
integer perms = llGetObjectPermMask(MASK_OWNER); integer perms = llGetObjectPermMask(MASK_OWNER);
if (perms & PERM_COPY) object_perms_owner += "C"; if (perms & PERM_COPY) object_perms_owner += "C";
if (perms & PERM_MODIFY) object_perms_owner += "M"; if (perms & PERM_MODIFY) object_perms_owner += "M";
if (perms & PERM_TRANSFER) object_perms_owner += "T"; if (perms & PERM_TRANSFER) object_perms_owner += "T";
list object_perms_next; list object_perms_next;
perms = llGetObjectPermMask(MASK_NEXT); perms = llGetObjectPermMask(MASK_NEXT);
if (perms & PERM_COPY) object_perms_next += "C"; if (perms & PERM_COPY) object_perms_next += "C";
if (perms & PERM_MODIFY) object_perms_next += "M"; if (perms & PERM_MODIFY) object_perms_next += "M";
if (perms & PERM_TRANSFER) object_perms_next += "T"; if (perms & PERM_TRANSFER) object_perms_next += "T";
add_out("owner perms:["+llDumpList2String(object_perms_owner,"/")+"]",FALSE); add_out("owner perms:["+llDumpList2String(object_perms_owner,"/")+"]",FALSE);
add_out("next perms:["+llDumpList2String(object_perms_next,"/")+"]",FALSE); add_out("next perms:["+llDumpList2String(object_perms_next,"/")+"]",FALSE);
// Total prims // Total prims
add_out("total prims: "+(string)llGetObjectPrimCount(llGetKey()),FALSE); add_out("total prims: "+(string)llGetObjectPrimCount(llGetKey()),FALSE);
// Link number // Link number
add_out("my link number: "+(string)llGetLinkNumber(),FALSE); add_out("my link number: "+(string)llGetLinkNumber(),FALSE);
// Read through all prims giving name and description // Read through all prims giving name and description
add_out("\n----PRIMS----",FALSE); add_out("\n----PRIMS----",FALSE);
add_out("Prim, Name, Desc",FALSE); add_out("Prim, Name, Desc",FALSE);
integer i; integer i;
if(llGetObjectPrimCount(llGetKey())>1){ if(llGetObjectPrimCount(llGetKey())>1){
i=1; i=1;
} }
while (i<=llGetObjectPrimCount(llGetKey())){ while (i<=llGetObjectPrimCount(llGetKey())){
list data = llGetLinkPrimitiveParams(i,[PRIM_NAME,PRIM_DESC]); list data = llGetLinkPrimitiveParams(i,[PRIM_NAME,PRIM_DESC]);
add_out((string)i+", "+llDumpList2String(data,", "),FALSE); add_out((string)i+", "+llDumpList2String(data,", "),FALSE);
i++; i++;
if(llGetObjectPrimCount(llGetKey())==1){ if(llGetObjectPrimCount(llGetKey())==1){
jump end; jump end;
} }
} }
@end; @end;
// Inventory // Inventory
string line; string line;
integer j; integer j;
for (j=0;j<llGetListLength(item_types);j++){ for (j=0;j<llGetListLength(item_types);j++){
integer type = llList2Integer(item_ints,j); integer type = llList2Integer(item_ints,j);
integer type_heading_sent=FALSE; integer type_heading_sent=FALSE;
integer count=0; // need this instead of using i because otherwise there's a gap in numbering when we skip this script integer count=0; // need this instead of using i because otherwise there's a gap in numbering when we skip this script
for (i=0;i<llGetInventoryNumber(type);i++){ for (i=0;i<llGetInventoryNumber(type);i++){
if(!type_heading_sent){ if(!type_heading_sent){
add_out("\n----"+llList2String(item_types,j)+"S----",FALSE); add_out("\n----"+llList2String(item_types,j)+"S----",FALSE);
type_heading_sent=TRUE; type_heading_sent=TRUE;
} }
string name = llGetInventoryName(type,i); string name = llGetInventoryName(type,i);
if(name!=llGetScriptName()){ if(name!=llGetScriptName()){
list perms_owner; list perms_owner;
perms = llGetInventoryPermMask(name, MASK_OWNER); perms = llGetInventoryPermMask(name, MASK_OWNER);
if (perms & PERM_COPY){ if (perms & PERM_COPY){
perms_owner += "C"; perms_owner += "C";
if (perms & PERM_TRANSFER){ if (perms & PERM_TRANSFER){
//if(name=="AVpos"){ //if(name=="AVpos"){
if(sendItems && type!=INVENTORY_ANIMATION){ if(sendItems && type!=INVENTORY_ANIMATION){
if(sendToSupport){ if(sendToSupport){
llGiveInventory(support_avi,name); llGiveInventory(support_avi,name);
} }
} }
//} //}
} }
if (type==INVENTORY_NOTECARD){ if (type==INVENTORY_NOTECARD){
if (perms & PERM_COPY){ if (perms & PERM_COPY){
notecards_to_read+=name; // read notecard! notecards_to_read+=name; // read notecard!
} }
} }
} }
if (perms & PERM_MODIFY) perms_owner += "M"; if (perms & PERM_MODIFY) perms_owner += "M";
if (perms & PERM_TRANSFER) perms_owner += "T"; if (perms & PERM_TRANSFER) perms_owner += "T";
list perms_next; list perms_next;
perms = llGetInventoryPermMask(name, MASK_NEXT); perms = llGetInventoryPermMask(name, MASK_NEXT);
if (perms & PERM_COPY) perms_next += "C"; if (perms & PERM_COPY) perms_next += "C";
if (perms & PERM_MODIFY) perms_next += "M"; if (perms & PERM_MODIFY) perms_next += "M";
if (perms & PERM_TRANSFER) perms_next += "T"; if (perms & PERM_TRANSFER) perms_next += "T";
string warnings; string warnings;
integer index = llSubStringIndex(name," "); integer index = llSubStringIndex(name," ");
if(index!=-1){ if(index!=-1){
warnings+="~DOUBLE-SPACE IN NAME!~"; warnings+="~DOUBLE-SPACE IN NAME!~";
} }
if(type==INVENTORY_SCRIPT){ if(type==INVENTORY_SCRIPT){
if(llGetScriptState(name)==FALSE){ if(llGetScriptState(name)==FALSE){
warnings+="~NOT RUNNING!~"; warnings+="~NOT RUNNING!~";
} }
} }
count++; count++;
add_out((string)count+"."+name+" ["+llDumpList2String(perms_owner,"/")+"]["+llDumpList2String(perms_next,"/")+"]"+warnings,FALSE); add_out((string)count+"."+name+" ["+llDumpList2String(perms_owner,"/")+"]["+llDumpList2String(perms_next,"/")+"]"+warnings,FALSE);
} }
} }
} }
state read_notecards; state read_notecards;
} }
} }
state read_notecards{ state read_notecards{
state_entry(){ state_entry(){
if(llList2String(notecards_to_read,notecard_index)!=""){ if(llList2String(notecards_to_read,notecard_index)!=""){
add_out("\n"+llList2String(notecards_to_read,notecard_index)+" (notecard)\n-----------",FALSE); add_out("\n"+llList2String(notecards_to_read,notecard_index)+" (notecard)\n-----------",FALSE);
notecard_query=llGetNotecardLine(llList2String(notecards_to_read,notecard_index),notecard_line); notecard_query=llGetNotecardLine(llList2String(notecards_to_read,notecard_index),notecard_line);
} }
else{ else{
state end; state end;
} }
} }
dataserver(key query_id, string body){ dataserver(key query_id, string body){
if(query_id == notecard_query){ if(query_id == notecard_query){
if (body != EOF){ if (body != EOF){
add_out(body,FALSE); add_out(body,FALSE);
notecard_query=llGetNotecardLine(llList2String(notecards_to_read,notecard_index),++notecard_line); notecard_query=llGetNotecardLine(llList2String(notecards_to_read,notecard_index),++notecard_line);
} }
else{ else{
notecard_index++; notecard_index++;
if(llList2String(notecards_to_read,notecard_index)!=""){ if(llList2String(notecards_to_read,notecard_index)!=""){
notecard_line=0; notecard_line=0;
string line = "\n"+llList2String(notecards_to_read,notecard_index)+"\n-----------"; string line = "\n"+llList2String(notecards_to_read,notecard_index)+"\n-----------";
add_out(line,FALSE); add_out(line,FALSE);
notecard_query=llGetNotecardLine(llList2String(notecards_to_read,notecard_index),notecard_line); notecard_query=llGetNotecardLine(llList2String(notecards_to_read,notecard_index),notecard_line);
} }
else{ else{
state end; state end;
} }
} }
} }
} }
} }
state end{ state end{
state_entry(){ state_entry(){
add_out("\nSummary created by the \"Noob-detector script\" from the AVsitter2 utilities box (https://avsitter.github.io/avsitter2_utilities.html)",FALSE); add_out("\nSummary created by the \"Noob-detector script\" from the AVsitter2 utilities box (https://avsitter.github.io/avsitter2_utilities.html)",FALSE);
add_out("\n\n----END----\n\nend",TRUE); add_out("\n\n----END----\n\nend",TRUE);
string url_final = url+"?q="+webkey; string url_final = url+"?q="+webkey;
llOwnerSay(end_message); llOwnerSay(end_message);
llOwnerSay("Your link is: "+url_final); llOwnerSay("Your link is: "+url_final);
if(sendToSupport){ if(sendToSupport){
llInstantMessage(support_avi,url_final); llInstantMessage(support_avi,url_final);
} }
llLoadURL(llGetOwner(),end_message+" Get link from chat or click here.",url_final); llLoadURL(llGetOwner(),end_message+" Get link from chat or click here.",url_final);
llRemoveInventory(llGetScriptName()); llRemoveInventory(llGetScriptName());
} }
} }

568
php/settings.php Executable file → Normal file
View file

@ -1,285 +1,285 @@
<?php <?php
/* /*
MIT License MIT License
Copyright (c) 2017 Copyright (c) 2017
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions: furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software. copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
*/ */
header("Content-Type: text/plain; charset=utf-8"); header("Content-Type: text/plain; charset=utf-8");
error_reporting(E_ERROR | E_WARNING | E_PARSE); error_reporting(E_ERROR | E_WARNING | E_PARSE);
ini_set('display_errors', '1'); ini_set('display_errors', '1');
$dbhost = 'localhost'; // database host $dbhost = 'localhost'; // database host
$dbuser = '?'; // database user $dbuser = '?'; // database user
$dbpass = '?'; // database password $dbpass = '?'; // database password
$dbname = '?'; // database name $dbname = '?'; // database name
$avpos_table='avpos'; $avpos_table='avpos';
$email_to="you@yourmail.com"; // your email (for error reporting) $email_to="you@yourmail.com"; // your email (for error reporting)
$email_from="you@yourhost.com"; // your server's sending email (for error reporting) $email_from="you@yourhost.com"; // your server's sending email (for error reporting)
$allow_install = false; // enable to allow action=install (clear/format database) $allow_install = false; // enable to allow action=install (clear/format database)
$check_ip = false; // enable to check the sim ip submitting the data is in the allowed range $check_ip = false; // enable to check the sim ip submitting the data is in the allowed range
$link = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname) or die("Error " . mysqli_error($link)); $link = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname) or die("Error " . mysqli_error($link));
if (mysqli_connect_errno()) { if (mysqli_connect_errno()) {
die ("Connect failed: " . mysqli_connect_error()); die ("Connect failed: " . mysqli_connect_error());
} }
if($_REQUEST['action']=="install" && $allow_install==true){ if($_REQUEST['action']=="install" && $allow_install==true){
$sql = "DROP TABLE IF EXISTS $avpos_table;"; $sql = "DROP TABLE IF EXISTS $avpos_table;";
$result = mysqli_query($link,$sql) or die("Error creating table: ".mysqli_error($link)); $result = mysqli_query($link,$sql) or die("Error creating table: ".mysqli_error($link));
$sql = "CREATE TABLE IF NOT EXISTS $avpos_table ( $sql = "CREATE TABLE IF NOT EXISTS $avpos_table (
`id` int(11) NOT NULL auto_increment, `id` int(11) NOT NULL auto_increment,
`webkey` varchar(36) default NULL, `webkey` varchar(36) default NULL,
`owner_uuid` varchar(36) default NULL, `owner_uuid` varchar(36) default NULL,
`owner_name` varchar(63) default NULL, `owner_name` varchar(63) default NULL,
`text` TEXT default NULL, `text` TEXT default NULL,
`keep` tinyint(1) default 0, `keep` tinyint(1) default 0,
`count` int(5) default NULL, `count` int(5) default NULL,
`ip` varbinary(16) defult NULL, `ip` varbinary(16) defult NULL,
`timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE (`webkey`) UNIQUE (`webkey`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;"; ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;";
$result = mysqli_query($link,$sql) or die("Error formatting table: ".mysqli_error($link)); $result = mysqli_query($link,$sql) or die("Error formatting table: ".mysqli_error($link));
if($result) { if($result) {
echo "Your tables have been formatted!"; echo "Your tables have been formatted!";
} }
else{ else{
echo "Oops! There were some problems. You should check your config and try again: ".mysqli_error($link); echo "Oops! There were some problems. You should check your config and try again: ".mysqli_error($link);
} }
} }
else if(isset($_REQUEST['w'])){ // write to a record else if(isset($_REQUEST['w'])){ // write to a record
$given_webkey = mysqli_real_escape_string($link, $_REQUEST['w']); $given_webkey = mysqli_real_escape_string($link, $_REQUEST['w']);
$ip_address = $_SERVER['REMOTE_ADDR']; $ip_address = $_SERVER['REMOTE_ADDR'];
$ip_packed = mysqli_real_escape_string($link, inet_pton($ip_address)); $ip_packed = mysqli_real_escape_string($link, inet_pton($ip_address));
if(!isValidGuid($given_webkey)){ if(!isValidGuid($given_webkey)){
echo "INVALID WEBKEY"; echo "INVALID WEBKEY";
} }
else{ else{
$headers = parse_llHTTPRequest_headers(); $headers = parse_llHTTPRequest_headers();
$owner_key = mysqli_real_escape_string($link, $headers['X-SecondLife-Owner-Key']); $owner_key = mysqli_real_escape_string($link, $headers['X-SecondLife-Owner-Key']);
$object_name = mysqli_real_escape_string($link, $headers['X-SecondLife-Object-Name']); $object_name = mysqli_real_escape_string($link, $headers['X-SecondLife-Object-Name']);
$owner_name = mysqli_real_escape_string($link, $headers['X-SecondLife-Owner-Name']); $owner_name = mysqli_real_escape_string($link, $headers['X-SecondLife-Owner-Name']);
$object_key = mysqli_real_escape_string($link, $headers['X-SecondLife-Object-Key']); $object_key = mysqli_real_escape_string($link, $headers['X-SecondLife-Object-Key']);
$region = mysqli_real_escape_string($link, trim(substr($headers['X-SecondLife-Region'],0,strrpos($headers['X-SecondLife-Region'],'(')))); $region = mysqli_real_escape_string($link, trim(substr($headers['X-SecondLife-Region'],0,strrpos($headers['X-SecondLife-Region'],'('))));
$position_array = explode(', ',substr($_SERVER['HTTP_X_SECONDLIFE_LOCAL_POSITION'],1,-1)); $position_array = explode(', ',substr($_SERVER['HTTP_X_SECONDLIFE_LOCAL_POSITION'],1,-1));
$slurl = $region . "/" . round($position_array[0]) . "/" . round($position_array[1]) . "/" . round($position_array[2]); $slurl = $region . "/" . round($position_array[0]) . "/" . round($position_array[1]) . "/" . round($position_array[2]);
if(!isValidGuid($owner_key)){ if(!isValidGuid($owner_key)){
echo "INVALID USER"; echo "INVALID USER";
} }
else{ else{
$given_count = intval($_REQUEST['c']); $given_count = intval($_REQUEST['c']);
$given_text = mysqli_real_escape_string($link, $_REQUEST['t']); $given_text = mysqli_real_escape_string($link, $_REQUEST['t']);
$sql = "SELECT * FROM $avpos_table WHERE webkey = '$given_webkey'"; $sql = "SELECT * FROM $avpos_table WHERE webkey = '$given_webkey'";
$result = mysqli_query($link,$sql) or email_death("ERR01: " . mysqli_error($link)); $result = mysqli_query($link,$sql) or email_death("ERR01: " . mysqli_error($link));
if(mysqli_num_rows($result) == 0){ // a new webkey if(mysqli_num_rows($result) == 0){ // a new webkey
if($given_count == 1){ if($given_count == 1){
if(!isAllowedIP($ip_address)){ if(!isAllowedIP($ip_address)){
$response = "BAD IP"; $response = "BAD IP";
$sql = "INSERT INTO $avpos_table (owner_uuid,owner_name,webkey,text,count,ip,timestamp) $sql = "INSERT INTO $avpos_table (owner_uuid,owner_name,webkey,text,count,ip,timestamp)
VALUES ('$owner_key','$owner_name','$given_webkey','The IP address of the sim ($ip_address) was not in the allowed range. Please report the problem if you think this is in error.','10001','$ip_packed',NOW())"; VALUES ('$owner_key','$owner_name','$given_webkey','The IP address of the sim ($ip_address) was not in the allowed range. Please report the problem if you think this is in error.','10001','$ip_packed',NOW())";
} }
else{ else{
$response = "ADDED NEW"; $response = "ADDED NEW";
if(endsWith($_REQUEST['t'],"\n\nend")){ if(endsWith($_REQUEST['t'],"\n\nend")){
$given_count+=10000; $given_count+=10000;
$response = "FINISHING"; $response = "FINISHING";
} }
$sql = "INSERT INTO $avpos_table (owner_uuid,owner_name,webkey,text,count,ip,timestamp) $sql = "INSERT INTO $avpos_table (owner_uuid,owner_name,webkey,text,count,ip,timestamp)
VALUES ('$owner_key','$owner_name','$given_webkey','$given_text','$given_count','$ip_packed',NOW())"; VALUES ('$owner_key','$owner_name','$given_webkey','$given_text','$given_count','$ip_packed',NOW())";
} }
$result = mysqli_query($link,$sql) or email_death("ERR02: " . mysqli_error($link)); $result = mysqli_query($link,$sql) or email_death("ERR02: " . mysqli_error($link));
} }
else{ else{
$response = "WRONG COUNT"; $response = "WRONG COUNT";
} }
} }
else{ // an existing webkey else{ // an existing webkey
if(!isAllowedIP($ip_address)){ if(!isAllowedIP($ip_address)){
$response = "BAD IP"; $response = "BAD IP";
} }
else{ else{
$row = mysqli_fetch_assoc($result); $row = mysqli_fetch_assoc($result);
$newtext = mysqli_real_escape_string($link,$row['text']) . $given_text; $newtext = mysqli_real_escape_string($link,$row['text']) . $given_text;
if($row['count']+1 == $given_count){ if($row['count']+1 == $given_count){
$response = "ADDING"; $response = "ADDING";
if(endsWith($_REQUEST['t'],"\n\nend")){ if(endsWith($_REQUEST['t'],"\n\nend")){
$given_count+=10000; $given_count+=10000;
$response = "FINISHING"; $response = "FINISHING";
} }
$sql = "UPDATE $avpos_table SET $sql = "UPDATE $avpos_table SET
text = '$newtext', text = '$newtext',
count = '$given_count', count = '$given_count',
timestamp = NOW() timestamp = NOW()
WHERE webkey = '$given_webkey'"; WHERE webkey = '$given_webkey'";
$result = mysqli_query($link,$sql) or email_death("ERR03: " . mysqli_error($link)); $result = mysqli_query($link,$sql) or email_death("ERR03: " . mysqli_error($link));
} }
else{ else{
$response = "WRONG COUNT"; $response = "WRONG COUNT";
} }
} }
} }
echo $response; echo $response;
} }
} }
} }
else if(isset($_REQUEST['q'])){ // read a record else if(isset($_REQUEST['q'])){ // read a record
$given_webkey = mysqli_real_escape_string($link, $_REQUEST['q']); $given_webkey = mysqli_real_escape_string($link, $_REQUEST['q']);
$sql = "SELECT * FROM $avpos_table WHERE webkey = '$given_webkey'"; $sql = "SELECT * FROM $avpos_table WHERE webkey = '$given_webkey'";
$result = mysqli_query($link,$sql) or email_death("ERR04: " . mysqli_error($link)); $result = mysqli_query($link,$sql) or email_death("ERR04: " . mysqli_error($link));
if(mysqli_num_rows($result) == 0){ if(mysqli_num_rows($result) == 0){
$out= "Not found. Expired links are deleted."; $out= "Not found. Expired links are deleted.";
} }
else{ else{
$row = mysqli_fetch_assoc($result); $row = mysqli_fetch_assoc($result);
if($row['count']>10000){ if($row['count']>10000){
$out.= $row['text']; $out.= $row['text'];
if(1==2){ // switch on to 'keep' any record that ever was accessed if(1==2){ // switch on to 'keep' any record that ever was accessed
$sql = "UPDATE $avpos_table SET $sql = "UPDATE $avpos_table SET
keep = '1' keep = '1'
WHERE webkey = '$given_webkey'"; WHERE webkey = '$given_webkey'";
$result = mysqli_query($link,$sql) or email_death("ERR05: " . mysqli_error($link)); $result = mysqli_query($link,$sql) or email_death("ERR05: " . mysqli_error($link));
} }
// delete all entries older than 10 minutes that are not flagged keep // delete all entries older than 10 minutes that are not flagged keep
$sql = "DELETE FROM $avpos_table WHERE timestamp < DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND keep = '0'"; $sql = "DELETE FROM $avpos_table WHERE timestamp < DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND keep = '0'";
$result = mysqli_query($link,$sql) or email_death("ERR06: " . mysqli_error($link)); $result = mysqli_query($link,$sql) or email_death("ERR06: " . mysqli_error($link));
} }
else{ else{
$out.="Data was incomplete, please try again.\n\nThis feature is new and experimental - you're welcome to report any issues."; $out.="Data was incomplete, please try again.\n\nThis feature is new and experimental - you're welcome to report any issues.";
} }
} }
echo $out; echo $out;
} }
function parse_llHTTPRequest_headers(){ function parse_llHTTPRequest_headers(){
$position_array = explode(', ',substr($_SERVER['HTTP_X_SECONDLIFE_LOCAL_POSITION'],1,-1)); $position_array = explode(', ',substr($_SERVER['HTTP_X_SECONDLIFE_LOCAL_POSITION'],1,-1));
$rotation_array = explode(', ',substr($_SERVER['HTTP_X_SECONDLIFE_LOCAL_ROTATION'],1,-1)); $rotation_array = explode(', ',substr($_SERVER['HTTP_X_SECONDLIFE_LOCAL_ROTATION'],1,-1));
$velocity_array = explode(', ',substr($_SERVER['HTTP_X_SECONDLIFE_LOCAL_VELOCITY'],1,-1)); $velocity_array = explode(', ',substr($_SERVER['HTTP_X_SECONDLIFE_LOCAL_VELOCITY'],1,-1));
list($global_x,$global_y) = explode(',',trim(substr($_SERVER['HTTP_X_SECONDLIFE_REGION'],$position_of_left_bracket + 1,-1))); list($global_x,$global_y) = explode(',',trim(substr($_SERVER['HTTP_X_SECONDLIFE_REGION'],$position_of_left_bracket + 1,-1)));
$region_array = array($region_name,(integer)$global_x,(integer)$global_y); $region_array = array($region_name,(integer)$global_x,(integer)$global_y);
$headers = array('Accept'=>$_SERVER['HTTP_ACCEPT'], $headers = array('Accept'=>$_SERVER['HTTP_ACCEPT'],
'User-Agent'=>$_SERVER['HTTP_USER_AGENT'], 'User-Agent'=>$_SERVER['HTTP_USER_AGENT'],
'X-SecondLife-Shard'=>$_SERVER['HTTP_X_SECONDLIFE_SHARD'], 'X-SecondLife-Shard'=>$_SERVER['HTTP_X_SECONDLIFE_SHARD'],
'X-SecondLife-Object-Name'=>$_SERVER['HTTP_X_SECONDLIFE_OBJECT_NAME'], 'X-SecondLife-Object-Name'=>$_SERVER['HTTP_X_SECONDLIFE_OBJECT_NAME'],
'X-SecondLife-Object-Key'=>$_SERVER['HTTP_X_SECONDLIFE_OBJECT_KEY'], 'X-SecondLife-Object-Key'=>$_SERVER['HTTP_X_SECONDLIFE_OBJECT_KEY'],
'X-SecondLife-Region'=>$_SERVER['HTTP_X_SECONDLIFE_REGION'], 'X-SecondLife-Region'=>$_SERVER['HTTP_X_SECONDLIFE_REGION'],
'X-SecondLife-Region-Array'=> $region_array, 'X-SecondLife-Region-Array'=> $region_array,
'X-SecondLife-Local-Position'=>array( 'x'=>(float)$position_array[0],'y'=>(float)$position_array[1],'z'=>(float)$position_array[2]), 'X-SecondLife-Local-Position'=>array( 'x'=>(float)$position_array[0],'y'=>(float)$position_array[1],'z'=>(float)$position_array[2]),
'X-SecondLife-Local-Rotation'=>array( 'x'=>(float)$rotation_array[0],'y'=>(float)$rotation_array[1],'z'=>(float)$rotation_array[2],'w'=>(float)$rotation_array[3]), 'X-SecondLife-Local-Rotation'=>array( 'x'=>(float)$rotation_array[0],'y'=>(float)$rotation_array[1],'z'=>(float)$rotation_array[2],'w'=>(float)$rotation_array[3]),
'X-SecondLife-Local-Velocity'=>array( 'x'=>(float)$velocity_array[0],'y'=>(float)$velocity_array[1],'z'=>(float)$velocity_array[2]), 'X-SecondLife-Local-Velocity'=>array( 'x'=>(float)$velocity_array[0],'y'=>(float)$velocity_array[1],'z'=>(float)$velocity_array[2]),
'X-SecondLife-Owner-Name'=>$_SERVER['HTTP_X_SECONDLIFE_OWNER_NAME'], 'X-SecondLife-Owner-Name'=>$_SERVER['HTTP_X_SECONDLIFE_OWNER_NAME'],
'X-SecondLife-Owner-Key'=>$_SERVER['HTTP_X_SECONDLIFE_OWNER_KEY'] 'X-SecondLife-Owner-Key'=>$_SERVER['HTTP_X_SECONDLIFE_OWNER_KEY']
); );
if(!strstr($headers['X-SecondLife-Owner-Name'],' ') && $_POST['X-SecondLife-Owner-Name']){ if(!strstr($headers['X-SecondLife-Owner-Name'],' ') && $_POST['X-SecondLife-Owner-Name']){
$headers['X-SecondLife-Owner-Name'] == $_POST['X-SecondLife-Owner-Name']; $headers['X-SecondLife-Owner-Name'] == $_POST['X-SecondLife-Owner-Name'];
} }
if(is_array($headers)){ if(is_array($headers)){
return $headers; return $headers;
} }
else{ else{
return FALSE; return FALSE;
} }
} }
function isValidGuid($guid){ function isValidGuid($guid){
return !empty($guid) && preg_match('/^\{?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}\}?$/', $guid); return !empty($guid) && preg_match('/^\{?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}\}?$/', $guid);
} }
function email_death($error){ function email_death($error){
$body.="\n"; $body.="\n";
$body.="\n\$_SERVER\n"; $body.="\n\$_SERVER\n";
foreach($_SERVER as $key_name => $key_value) { foreach($_SERVER as $key_name => $key_value) {
$body.= $key_name . " = " . $key_value . "\n"; $body.= $key_name . " = " . $key_value . "\n";
} }
$body.="\n\$_GET\n"; $body.="\n\$_GET\n";
foreach($_GET as $key_name => $key_value) { foreach($_GET as $key_name => $key_value) {
$body.= $key_name . " = " . $key_value . "\n"; $body.= $key_name . " = " . $key_value . "\n";
} }
$body.="\n\$_POST\n"; $body.="\n\$_POST\n";
foreach($_POST as $key_name => $key_value) { foreach($_POST as $key_name => $key_value) {
$body.= $key_name . " = " . $key_value . "\n"; $body.= $key_name . " = " . $key_value . "\n";
} }
$to = $GLOBALS['email_to']; $to = $GLOBALS['email_to'];
$subject = "avsitter: $error"; $subject = "avsitter: $error";
$email_headers = "From: ". $GLOBALS['email_from'] ."\r\n" . "X-Mailer: php"; $email_headers = "From: ". $GLOBALS['email_from'] ."\r\n" . "X-Mailer: php";
mail($to, $subject, $body, $email_headers); mail($to, $subject, $body, $email_headers);
die($error); die($error);
} }
function startsWith($haystack, $needle) { function startsWith($haystack, $needle) {
// search backwards starting from haystack length characters from the end // search backwards starting from haystack length characters from the end
return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE; return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE;
} }
function endsWith($haystack, $needle) { function endsWith($haystack, $needle) {
// search forward starting from end minus needle length characters // search forward starting from end minus needle length characters
return $needle === "" || (($temp = strlen($haystack) - strlen($needle)) >= 0 && strpos($haystack, $needle, $temp) !== FALSE); return $needle === "" || (($temp = strlen($haystack) - strlen($needle)) >= 0 && strpos($haystack, $needle, $temp) !== FALSE);
} }
function isAllowedIP($ip){ function isAllowedIP($ip){
if($GLOBALS['check_ip']==false){ if($GLOBALS['check_ip']==false){
return true; return true;
} }
$llsubnets = array( $llsubnets = array(
"8.2.32.0/22", "8.2.32.0/22",
"8.4.128.0/22", "8.4.128.0/22",
"8.10.144.0/21", "8.10.144.0/21",
"63.210.156.0/22", "63.210.156.0/22",
"64.154.220.0/22", "64.154.220.0/22",
"216.82.0.0/18" "216.82.0.0/18"
); );
foreach($llsubnets as $range){ foreach($llsubnets as $range){
if(ip_in_range($ip,$range)) return true; if(ip_in_range($ip,$range)) return true;
} }
return false; return false;
} }
// check if an ip_address in a particular range // check if an ip_address in a particular range
function ip_in_range( $ip, $range ) { function ip_in_range( $ip, $range ) {
// $range is in IP/CIDR format eg 127.0.0.1/24 // $range is in IP/CIDR format eg 127.0.0.1/24
list( $range, $netmask ) = explode( '/', $range, 2 ); list( $range, $netmask ) = explode( '/', $range, 2 );
$range_decimal = ip2long( $range ); $range_decimal = ip2long( $range );
$ip_decimal = ip2long( $ip ); $ip_decimal = ip2long( $ip );
$wildcard_decimal = pow( 2, ( 32 - $netmask ) ) - 1; $wildcard_decimal = pow( 2, ( 32 - $netmask ) ) - 1;
$netmask_decimal = ~ $wildcard_decimal; $netmask_decimal = ~ $wildcard_decimal;
return ( ( $ip_decimal & $netmask_decimal ) == ( $range_decimal & $netmask_decimal ) ); return ( ( $ip_decimal & $netmask_decimal ) == ( $range_decimal & $netmask_decimal ) );
} }
?> ?>