305 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| /* 
 | |
| ------------------------------------------------------------------------------------
 | |
| 	IT IS NOT NECESSARY TO MODIFY THIS SCRIPT TO USE EASY SAVE 3 CLOUD
 | |
| ------------------------------------------------------------------------------------
 | |
| */
 | |
| 	
 | |
| 	
 | |
| $tableName 		= 	"es3cloud";		// The name of the table used to store file names.
 | |
| $filenameField 		= 	"filename";		// The name of the field where we save our file name.
 | |
| $fileDataField 		= 	"data";			// The name of the field containing the data relating to.
 | |
| $userField	  	=	"user";			// The name of the field containing the name of the user this file relates to, if any.
 | |
| $lastUpdatedField 	= 	"lastUpdated"; 	// The name of the field containing the last updated timestamp.
 | |
| 	
 | |
| // Handles installation of the database tables and variables script.
 | |
| if(!file_exists("ES3Variables.php"))
 | |
| {
 | |
| 	if(!isset($_POST["dbHost"]))
 | |
| 		PreInstall();
 | |
| 	else
 | |
| 		Install($_POST["dbHost"], $_POST["dbUser"], $_POST["dbPassword"], $_POST["dbName"], $tableName, $filenameField, $fileDataField, $userField, $lastUpdatedField);
 | |
| 	exit();
 | |
| }
 | |
| 
 | |
| include_once "ES3Variables.php";
 | |
| 
 | |
| // Check connection to database.
 | |
| try
 | |
| {
 | |
| 	$db = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
 | |
| }
 | |
| catch(PDOException $e)
 | |
| {
 | |
| 	Error("Could not connect to database.", $e->getMessage(), 501);
 | |
| }
 | |
| 
 | |
| if(!isset($_POST["apiKey"]))
 | |
| {
 | |
| 	echo "ES3Cloud is functioning correctly.";
 | |
| 	exit();
 | |
| }
 | |
| 
 | |
| if($_POST["apiKey"] != $api_key)
 | |
| 	Error("Incorrect API Key", "Incorrect API Key", 403);
 | |
| 
 | |
| // ----- GET FILE -----
 | |
| if(isset($_POST["getFile"]))
 | |
| {
 | |
| 	$stmt = $db->prepare("SELECT $fileDataField FROM $tableName WHERE $filenameField = :filename AND $userField = :user AND $lastUpdatedField > :timestamp LIMIT 1");
 | |
| 	$stmt->bindParam(":filename", $_POST["getFile"]);
 | |
| 	$postUser = GetPOSTUser();
 | |
| 	$stmt->bindParam(":user", $postUser);
 | |
| 	$postTimestamp = GetPOSTTimestamp();
 | |
| 	$stmt->bindParam(":timestamp", $postTimestamp);
 | |
| 	$stmt->execute();
 | |
| 	if($stmt->rowCount() > 0)
 | |
| 	{
 | |
| 		$data = $stmt->fetchColumn();
 | |
| 		// Manually set the content length so WWW.progress works.
 | |
| 		header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
 | |
| 		header("Cache-Control: public");
 | |
| 		header("Content-Type: application/octet-stream");
 | |
| 		header("Content-Transfer-Encoding: Binary");
 | |
| 		header("Content-Length:".strlen($data));
 | |
| 		echo $data;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // ----- PUT FILE -----
 | |
| else if(isset($_POST["putFile"]))
 | |
| {
 | |
| 	// Get uploaded data.
 | |
| 	$filePath = $_FILES["data"]["tmp_name"];
 | |
| 	
 | |
| 	// If file doesn't exist or it contains no data, throw an error.
 | |
| 	if(!file_exists($filePath) || filesize($filePath) == 0)
 | |
| 		Error("Uploaded file does not exist or is empty.", "Uploaded file does not exist or is empty.", 400);
 | |
| 	
 | |
| 	$fp = fopen($filePath, 'rb');
 | |
| 	
 | |
| 	$stmt = $db->prepare("INSERT INTO $tableName ($filenameField, $fileDataField, $userField, $lastUpdatedField) VALUES (:filename, :data, :user, :timestamp) ON DUPLICATE KEY UPDATE $fileDataField = VALUES($fileDataField), $lastUpdatedField = VALUES($lastUpdatedField)");
 | |
| 	$stmt->bindParam(":filename", $_POST["putFile"]);
 | |
| 	$stmt->bindParam(":data", $fp, PDO::PARAM_LOB);
 | |
| 	$postUser = GetPOSTUser();
 | |
| 	$stmt->bindParam(":user", $postUser);
 | |
| 	$postTimestamp = GetPOSTTimestamp();
 | |
| 	$stmt->bindParam(":timestamp", $postTimestamp);
 | |
| 
 | |
| 	$stmt->execute();
 | |
| }
 | |
| 
 | |
| // ----- RENAME FILE -----
 | |
| else if(isset($_POST["renameFile"]))
 | |
| {
 | |
| 	$stmt = $db->prepare("UPDATE $tableName SET $filenameField = :newFilename WHERE $filenameField = :filename AND $userField = :user");
 | |
| 	$stmt->bindParam(":filename", $_POST["renameFile"]);
 | |
| 	$stmt->bindParam(":newFilename", $_POST["newFilename"]);
 | |
| 	$postUser = GetPOSTUser();
 | |
| 	$stmt->bindParam(":user", $postUser);
 | |
| 	$stmt->execute();
 | |
| }
 | |
| 
 | |
| // ----- DELETE FILE -----
 | |
| else if(isset($_POST["deleteFile"]))
 | |
| {
 | |
| 	
 | |
| 	$stmt = $db->prepare("DELETE FROM $tableName WHERE $filenameField = :filename AND $userField = :user");
 | |
| 	$stmt->bindParam(":filename", $_POST["deleteFile"]);
 | |
| 	$postUser = GetPOSTUser();
 | |
| 	$stmt->bindParam(":user", $postUser);
 | |
| 	$stmt->execute();
 | |
| }
 | |
| 
 | |
| // ----- GET FILENAMES WITH PATTERN -----
 | |
| else if(isset($_POST["getFilenames"]) && isset($_POST["pattern"]))
 | |
| {
 | |
| 	echo "Here";
 | |
| 	$stmt = $db->prepare("SELECT $filenameField FROM $tableName WHERE $userField = :user AND $filenameField LIKE :pattern");
 | |
| 	$postUser = GetPOSTUser();
 | |
| 	$stmt->bindParam(":user", $postUser);
 | |
| 	$stmt->bindParam(":pattern", $_POST["pattern"]);
 | |
| 	$stmt->execute();
 | |
| 	$rows = $stmt->fetchAll();
 | |
| 	foreach($rows as $row)
 | |
| 		echo $row[$filenameField] . ";";
 | |
| }
 | |
| 
 | |
| // ----- GET FILENAMES -----
 | |
| else if(isset($_POST["getFilenames"]))
 | |
| {
 | |
| 	$stmt = $db->prepare("SELECT $filenameField FROM $tableName WHERE $userField = :user");
 | |
| 	$postUser = GetPOSTUser();
 | |
| 	$stmt->bindParam(":user", $postUser);
 | |
| 	$stmt->execute();
 | |
| 	$rows = $stmt->fetchAll();
 | |
| 	foreach($rows as $row)
 | |
| 		echo $row[$filenameField] . ";";
 | |
| }
 | |
| 
 | |
| // ----- GET TIMESTAMP -----
 | |
| else if(isset($_POST["getTimestamp"]))
 | |
| {
 | |
| 	$stmt = $db->prepare("SELECT $lastUpdatedField FROM $tableName WHERE $filenameField = :filename AND $userField = :user LIMIT 1");
 | |
| 	$stmt->bindParam(":filename", $_POST["getTimestamp"]);
 | |
| 	$postUser = GetPOSTUser();
 | |
| 	$stmt->bindParam(":user", $postUser);
 | |
| 	$stmt->execute();
 | |
| 	if($stmt->rowCount() > 0)
 | |
| 		echo $stmt->fetchColumn();
 | |
| 	else
 | |
| 		Error("Could not get timestamp as file does not exist.", "Could not get timestamp as file does not exist.", 400);
 | |
| }
 | |
| 
 | |
| else
 | |
| 	Error("No valid operation was specified", "No valid operation was specified", 400);
 | |
| 	
 | |
| // Close the connection to the database by nullifying the variable.
 | |
| $db = null;
 | |
| 
 | |
| function GetPOSTUser()
 | |
| {
 | |
| 	return isset($_POST["user"]) ? $_POST["user"] : "";
 | |
| }
 | |
| 
 | |
| function GetPOSTTimestamp()
 | |
| {
 | |
| 	return isset($_POST["timestamp"]) ? $_POST["timestamp"] : 0;
 | |
| }
 | |
| 
 | |
| function Error($headerMsg, $msg, $code)
 | |
| {
 | |
| 	header($headerMsg, true, $code);
 | |
| 	print_r($msg);
 | |
| 	if(isset($GLOBALS['db']))
 | |
| 		$GLOBALS['db'] = null;
 | |
| 	exit();
 | |
| }
 | |
| 
 | |
| // ------- INSTALL METHODS -------
 | |
| 
 | |
| function PreInstall()
 | |
| {
 | |
| 	echo '	<div style="font-family:Arial, Helvetica, sans-serif">
 | |
| 			<h1>ES3 Cloud Installation</h1>
 | |
| 			<p>This will install the ES3 Cloud tables on your MySQL database, and add the required <em>ES3Variables.php</em> file to your server.</p>
 | |
| 			<p><strong>Please enter your database details below:</strong></p>
 | |
| 			<p>
 | |
| 				<form method="post">
 | |
| 					Database Host:<br>
 | |
| 					<input type="text" name="dbHost">
 | |
| 					<br>
 | |
| 					<br>
 | |
| 					Database User:<br>
 | |
| 					<input type="text" name="dbUser">
 | |
| 					<br>
 | |
| 					<br>
 | |
| 					Database Password:<br>
 | |
| 					<input type="password" name="dbPassword">
 | |
| 					<br>
 | |
| 					<br>
 | |
| 					Database Name:<br>
 | |
| 					<input type="text" name="dbName">
 | |
| 					<br>
 | |
| 					<br>
 | |
| 					<button type="submit" style="font-size:14pt; font-weight:bold;">Install ES3Cloud</button>
 | |
| 				</form>
 | |
| 			</p>
 | |
| 			</div>';
 | |
| }
 | |
| 
 | |
| function Install($dbHost, $dbUser, $dbPassword, $dbName, $tableName, $filenameField, $fileDataField, $userField, $lastUpdatedField)
 | |
| {
 | |
| 	try
 | |
| 	{
 | |
| 		$db = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPassword, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 5));
 | |
| 		
 | |
| 		$tableExists = $db->query("SELECT * FROM information_schema.tables WHERE table_schema = '$dbName' AND table_name = '$tableName' LIMIT 1;");
 | |
| 		if($tableExists->rowCount() == 0)
 | |
| 		{
 | |
| 				
 | |
| 			// Create the table if it doesn't already exist.
 | |
| 			try 
 | |
| 			{
 | |
| 					$createTableQuery = 
 | |
| "CREATE TABLE IF NOT EXISTS `$tableName` (
 | |
| `$filenameField` varchar(200) NOT NULL,
 | |
| `$fileDataField` longblob NOT NULL,
 | |
| `$userField` varchar(64) NOT NULL,
 | |
| `$lastUpdatedField` int(11) unsigned NOT NULL DEFAULT '0',
 | |
| PRIMARY KEY (`$filenameField`,`$userField`)
 | |
| ) ENGINE=InnoDB COLLATE=utf8_unicode_ci CHARSET=utf8;";
 | |
| 	        		$db->query($createTableQuery);
 | |
| 	    	} 
 | |
| 	    	catch (PDOException $e) 
 | |
| 	    	{
 | |
| 	        	echo "	<p>Could not create tables on database. Database threw error:</p><p>".$e->getMessage()."</p>
 | |
| 						<p>To manually install the MySQL tables, please run the following SQL code on your database:</p>
 | |
| 						<pre>$createTableQuery</pre>";
 | |
| 	        	exit();
 | |
| 	    	}
 | |
| 	    }
 | |
|     	
 | |
|     	
 | |
|     	try
 | |
|     	{
 | |
| 	    	$apiKey = substr(md5(microtime()),rand(0,26),12);
 | |
| 	    	$phpScript = 
 | |
| "<?php
 | |
| \$api_key		=	'$apiKey';		// The API key you need to specify to use when accessing this API.
 | |
| \$db_host		= 	'$dbHost';			// MySQL Host Name.
 | |
| \$db_user		= 	'$dbUser';			// MySQL User Name.
 | |
| \$db_password		= 	'$dbPassword';			// MySQL Password.
 | |
| \$db_name		= 	'$dbName';			// MySQL Database Name.
 | |
| ?>";
 | |
| 	    	
 | |
| 	    	// Check that path is writable or file_put_contents is supported.
 | |
| 	    	if(!function_exists("file_put_contents"))
 | |
| 	    	{
 | |
| 		    	ManuallyInstall($phpScript);
 | |
| 		    	exit();
 | |
| 	    	}
 | |
| 	    	else
 | |
| 	    	{
 | |
| 	    		file_put_contents("ES3Variables.php", $phpScript);
 | |
| 	    	}
 | |
|     	}
 | |
|     	catch(Exception $e)
 | |
|     	{
 | |
| 	    	ManuallyInstall($phpScript);
 | |
| 	    	exit();
 | |
|     	}
 | |
|     	
 | |
|     	if(!file_exists("ES3Variables.php"))
 | |
|     	{
 | |
| 	    	ManuallyInstall($phpScript);
 | |
| 	    	exit();
 | |
|     	}
 | |
|     	
 | |
|     	echo 
 | |
|     	"
 | |
|     		<div style='font-family:Arial, Helvetica, sans-serif'>
 | |
|     		<h1>Successfully installed ES3Cloud</h1>
 | |
| 			<p><strong>IMPORTANT:</strong><br>Please take note of your API key below. You will need to use it whenever using the API.</p>
 | |
| 			<p>Your API key can also be found in the <em>ES3Variables.php</em> file which has just been installed.</p>
 | |
| 			<p style='font-size:16pt'><strong>API Key:</strong> $apiKey</p>
 | |
| 			</div>
 | |
|     	";
 | |
| 	}
 | |
| 	catch(PDOException $e)
 | |
| 	{
 | |
| 		echo "<p><b>Database could not be accessed with these details</b>. The database returned the following error:</p><p>" . $e->getMessage() . "</p>";
 | |
| 		PreInstall();
 | |
| 		exit();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| function ManuallyInstall($phpScript)
 | |
| {
 | |
| 		    	echo "	<p>Couldn't create PHP file on your server. This could be because file_put_contents is not supported on your server, or you do not have permission to write files to this folder on your server.</p>
 | |
| 	    			<p>To manually install the PHP file, please create a file named <em>ES3Variables.php</em> in the same directory as your ES3.php file with the following contents:</p>
 | |
| 					<pre>$phpScript</pre>
 | |
| 					<p>After creating this file, installation will be complete.</p>";
 | |
| }
 | |
| 	
 | |
| ?>
 |