User:Jana Kamachi/WebDB
Jump to navigation
Jump to search
If you like this script, or any script I've released, please post on my Talk page, or I'll most likely never see it o: If you want to improve a script, just go for it!
This first part is a PHP script. It requires a webserver with PHP 4+ & MYSQL. TODO
- Add SQLLite for flat filesystem storage where a database is not available. - MSSQL - Finish commands: - - list - - mkdir - - rmdir - - temp - - commit - Make it secure against SQL injections & Junk
<?php
/////////////////////////////////////
//Examples:
// core.php?mode=list&path=_info <---------Shows System Files.
// core.php?mode=list&path=_info&pass=rofl <---------Shows Admin Level System Files
$settings["db"]["host"] = "localhost";
$settings["db"]["prefix"] = "public_";
$settings["db"]["database"] = "<database name>";
$settings["db"]["username"] = "<database username>";
$settings["db"]["password"] = "<database password>";
////////////////////////////////////
//Don't edit below here if you don't know what your doing!!!
///////////////////////////////////
mysql_connect($settings["db"]["host"],$settings["db"]["username"],$settings["db"]["password"]) or die("Invalid Host/Username/Password");
mysql_select_db($settings["db"]["database"]) or die("Database not found.");
init();
$headers = apache_request_headers();
$obj["name"] = $headers["X-SecondLife-Object-Name"];
$obj["key"] = $headers["X-SecondLife-Object-Name"];
$obj["oname"] = $headers["X-SecondLife-Owner-Name"];
$obj["okey"] = $headers["X-SecondLife-Owner-Key"];
$obj["region"] = $headers["X-SecondLife-Region"];
if(empty($obj["key"])) { //Should check IP's, but whatever.
die("At the moment only in-world access is allowed. This WILL be changed soon!");
}
//////////////////////////////////////
//Take all possible inputs and create a common var for all of them
/////////////////////////////////////
$qry["path"] = mysql_real_escape_string(($_GET["path"] ? strtolower($_GET["path"]) : strtolower($_POST["path"])));
$qry["mode"] = mysql_real_escape_string(($_GET["mode"] ? $_GET["mode"] : $_POST["mode"]));
$qry["data"] = mysql_real_escape_string(($_GET["data"] ? $_GET["data"] : $_POST["data"]));
$qry["pass"] = mysql_real_escape_string(($_GET["pass"] ? $_GET["pass"] : $_POST["pass"]));
$qry["rpass"] = mysql_real_escape_string(($_GET["rpass"] ? $_GET["rpass"] : $_POST["rpass"]));
$qry["flags"] = mysql_real_escape_string(($_GET["flags"] ? $_GET["flags"] : $_POST["flags"]));
switch(strtolower($qry["mode"])){
case "get": //<------------Gets a path's contents
getPath($qry["path"],$qry["rpass"]);
break;
case "set": //<------------Sets a path's contents
setPath($qry["path"],$qry["pass"],$qry["rpass"],$qry["data"]);
break;
case "list": //<------------Lists a path's contents
break;
case "info": //<-----------Gets info on a path
getPathInfo($qry["path"],$qry["rpass"]);
break;
case "app": //<-----------Append to a path
break;
case "part": //<----------Gets only part of a path's contents
break;
case "delete": //<---------Delete a path
deletePath($qry["path"],$qry["pass"]);
break;
}
function getPathInfo($path,$rpass){
global $settings;
if(!pathExists($path)){
die("BAD:NO PATH");
}
$sql = "SELECT * FROM `" . $settings["db"]["prefix"] . "values` WHERE `path` = '$path'";
$row = mysql_fetch_array(mysql_query($sql));
if(md5($rpass) == $row["read_pwd"]){
die("OK:" . strlen($row["data"]) . ":" . $row["modified"]);
}else{
die("BAD:INVALID PASSWORD");
}
}
function deletePath($path,$pass){
global $settings;
if(!pathExists($path)){
die("BAD:NO PATH");
}
$sql = "SELECT * FROM `" . $settings["db"]["prefix"] . "values` WHERE `path` = '$path'";
$row = mysql_fetch_array(mysql_query($sql));
if(md5($pass) == $row["write_pwd"]){
$sql = "DELETE FROM `" . $settings["db"]["prefix"] . "values` WHERE `path` = '$path' LIMIT 1";
mysql_query($sql);
die("OK:DELETED");
}else{
die("BAD:INVALID PASSWORD");
}
}
function setPath($path, $pass, $rpass, $content){
global $settings;
if(pathExists($path)){
$sql = "SELECT * FROM `" . $settings["db"]["prefix"] . "values` WHERE `path` = '$path'";
$row = mysql_fetch_array(mysql_query($sql));
if(md5($pass) == $row["write_pwd"]){
$sql = "UPDATE `" . $settings["db"]["prefix"] . "values` SET `data` = '$content',`modified` = NOW( ) WHERE `path` ='$path' LIMIT 1;";
mysql_query($sql);
die("OK:UPDATED");
}else{
die("BAD:INVALID PASSWORD");
}
}else{
$sql = "INSERT INTO `" . $settings["db"]["prefix"] . "values` (`id` , `path` , `data` , `read_pwd` , `write_pwd` ) VALUES ( NULL , '$path', '$content', MD5('$rpass'), MD5( '$pass' ) );";
mysql_query($sql);
die("OK:CREATED");
}
}
function getPath($path,$rpass){
global $settings;
if(!pathExists($path)){
die("BAD:NO PATH");
}else{
$sql = "SELECT * FROM `" . $settings["db"]["prefix"] . "values` WHERE `path` = '$path'";
$row = mysql_fetch_array(mysql_query($sql));
if(md5($rpass) == $row["read_pwd"]){
die("OK:" . $row["data"]);
}else{
die("BAD:INVALID PASSWORD");
}
}
}
function pathExists($path){
global $settings;
$sql = "SELECT * FROM `" . $settings["db"]["prefix"] . "values` WHERE `path` = '" . $path . "'";
if(mysql_num_rows(mysql_query($sql))>0) return 1;
}
function init(){
global $settings;
$sql = "CREATE TABLE IF NOT EXISTS `" . $settings["db"]["prefix"] . "values` (
`id` int(11) NOT NULL auto_increment,
`path` varchar(1000) NOT NULL,
`data` varchar(1000) NOT NULL,
`read_pwd` varchar(1000) NOT NULL,
`write_pwd` varchar(1000) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;";
mysql_query($sql);
}
?>
The next part is an example LSL script calling some of the functions.
string url = "http://world.janashell.com/index.php?";
list queries;
// Requests can return in different ways:
// All requests that succeded, return as "OK:"<data>
// - For getInfo an example response is "OK:<length of the field>:<time stamp of last modified>"
// - An example getFile is "OK:" <content>
// All requests that fail return as "BAD:" <reason>
// - BAD PATH -> The path you requested doesn't exist.
// - INVALID PASSWORD -> either the read or write password was invalid.
// - SYSTEM RESERVED -> Touche pas! Me only.
appnd(key req, string path, string mode){
queries = (queries = []) + queries + [req,mode,path];
}
integer getPos(key req){
return llListFindList(queries,[req]);
}
getFile(string path, string password){
appnd(llHTTPRequest(url + "path=" + path + "&rpass=" + password + "&mode=get",[],""),"get",path);
}
setFile(string path, string pass, string rpass, string content){
appnd(llHTTPRequest(url + "path=" + path + "&pass=" + pass + "&rpass=" + rpass + "&mode=set&data=" + llEscapeURL(content),[],""),"set",path);
}
deleteFile(string path, string pass){
appnd(llHTTPRequest(url + "path=" + path + "&pass=" + pass + "&mode=delete",[],""),"delete",path);
}
getInfo(string path, string rpass){
appnd(llHTTPRequest(url + "path=" + path + "&rpass=" + rpass + "&mode=info",[],""),"info",path);
}
default
{
state_entry(){
setFile("_sandbox/test2","<example>","<example>","This is a systems test. Test 4.");
setFile("_sandbox/test3","<example>","<example>","This is a systems test. Test 5.");
getInfo("_sandbox/test3","<example>");
deleteFile("_sandbox/test3","<example>");
getFile("_sandbox/test2","<example>");
}
http_response(key req, integer stat, list meta, string body){
integer pos = llListFindList(queries,[req]);
llSay(0,llList2CSV([llList2String(queries,pos+1),llList2String(queries,pos+2),body]));
}
}