Viewing file: class.AbstractAccessDriver.php (8.37 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php /** * @package info.ajaxplorer * * Copyright 2007-2009 Charles du Jeu * This file is part of AjaXplorer. * The latest code can be found at http://www.ajaxplorer.info/ * * This program is published under the LGPL Gnu Lesser General Public License. * You should have received a copy of the license along with AjaXplorer. * * The main conditions are as follow : * You must conspicuously and appropriately publish on each copy distributed * an appropriate copyright notice and disclaimer of warranty and keep intact * all the notices that refer to this License and to the absence of any warranty; * and give any other recipients of the Program a copy of the GNU Lesser General * Public License along with the Program. * * If you modify your copy or copies of the library or any portion of it, you may * distribute the resulting library provided you do so under the GNU Lesser * General Public License. However, programs that link to the library may be * licensed under terms of your choice, so long as the library itself can be changed. * Any translation of the GNU Lesser General Public License must be accompanied by the * GNU Lesser General Public License. * * If you copy or distribute the program, you must accompany it with the complete * corresponding machine-readable source code or with a written offer, valid for at * least three years, to furnish the complete corresponding machine-readable source code. * * Any of the above conditions can be waived if you get permission from the copyright holder. * AjaXplorer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * Description : Abstract representation of an action driver. Must be implemented. */ class AbstractAccessDriver extends AbstractDriver { /** * @var Repository */ var $repository; var $driverType = "access"; function AbstractAccessDriver($driverName, $filePath, $repository) { parent::AbstractDriver($driverName); $this->repository = $repository; $this->initXmlActionsFile($filePath); $this->actions["get_driver_info_panels"] = array(); } function initRepository(){ // To be implemented by subclasses } function applyAction($actionName, $httpVars, $filesVar) { if($actionName == "get_ajxp_info_panels" || $actionName == "get_driver_info_panels"){ $this->sendInfoPanelsDef(); return; } return parent::applyAction($actionName, $httpVars, $filesVar); } function initXmlActionsFile($filePath){ parent::initXmlActionsFile($filePath); if(isSet($this->actions["public_url"]) && !defined('PUBLIC_DOWNLOAD_FOLDER') || !is_dir(PUBLIC_DOWNLOAD_FOLDER) || !is_writable(PUBLIC_DOWNLOAD_FOLDER)){ unset($this->actions["public_url"]); } } /** * Print the XML for actions * * @param boolean $filterByRight * @param User $user */ function sendActionsToClient($filterByRight, $user){ parent::sendActionsToClient($filterByRight, $user, $this->repository); } function sendInfoPanelsDef(){ $fileData = file_get_contents($this->xmlFilePath); $matches = array(); preg_match('/<infoPanels>.*<\/infoPanels>/', str_replace("\n", "",$fileData), $matches); if(count($matches)){ AJXP_XMLWriter::header(); AJXP_XMLWriter::write($this->replaceAjxpXmlKeywords(str_replace("\n", "",$matches[0])), true); AJXP_XMLWriter::close(); exit(1); } } /** Cypher the publiclet object data and write to disk. @param $data The publiclet data array to write The data array must have the following keys: - DRIVER The driver used to get the file's content - OPTIONS The driver options to be successfully constructed (usually, the user and password) - FILE_PATH The path to the file's content - PASSWORD If set, the written publiclet will ask for this password before sending the content - ACTION If set, action to perform - EXPIRE_TIME If set, the publiclet will deny downloading after this time, and probably self destruct. @return the URL to the downloaded file */ function writePubliclet($data) { if(!defined('PUBLIC_DOWNLOAD_FOLDER') || !is_dir(PUBLIC_DOWNLOAD_FOLDER)){ return "Public URL folder does not exist!"; } $data["DRIVER_NAME"] = $this->driverName; $data["XML_FILE_PATH"] = $this->xmlFilePath; $data["REPOSITORY"] = $this->repository; if ($data["ACTION"] == "") $data["ACTION"] = "download"; // Create a random key $data["FINAL_KEY"] = md5(mt_rand().time()); // Cypher the data with a random key $outputData = serialize($data); // Hash the data to make sure it wasn't modified $hash = md5($outputData); // The initialisation vector is only required to avoid a warning, as ECB ignore IV $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND); // We have encoded as base64 so if we need to store the result in a database, it can be stored in text column $outputData = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $hash, $outputData, MCRYPT_MODE_ECB, $iv)); // Okay, write the file: $fileData = "<"."?"."php \n". ' require_once("'.str_replace("\\", "/", INSTALL_PATH).'/publicLet.inc.php"); '."\n". ' $id = str_replace(".php", "", basename(__FILE__)); '."\n". // Not using "" as php would replace $ inside ' $cypheredData = base64_decode("'.$outputData.'"); '."\n". ' $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND); '."\n". ' $inputData = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $id, $cypheredData, MCRYPT_MODE_ECB, $iv)); '."\n". ' if (md5($inputData) != $id) { header("HTTP/1.0 401 Not allowed, script was modified"); exit(); } '."\n". ' // Ok extract the data '."\n". ' $data = unserialize($inputData); AbstractAccessDriver::loadPubliclet($data); ?'.'>'; if (@file_put_contents(PUBLIC_DOWNLOAD_FOLDER."/".$hash.".php", $fileData) === FALSE){ return "Can't write to PUBLIC URL"; } if(defined('PUBLIC_DOWNLOAD_URL') && PUBLIC_DOWNLOAD_URL != ""){ return PUBLIC_DOWNLOAD_URL."/".$hash.".php"; }else{ $http_mode = (!empty($_SERVER['HTTPS'])) ? 'https://' : 'http://'; $fullUrl = $http_mode . $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI']); return str_replace("\\", "/", $fullUrl.str_replace(INSTALL_PATH, "", PUBLIC_DOWNLOAD_FOLDER)."/".$hash.".php"); } }
/** Load a uncyphered publiclet */ function loadPubliclet($data) { // create driver from $data $className = $data["DRIVER"]."AccessDriver"; if ($data["EXPIRE_TIME"] && time() > $data["EXPIRE_TIME"]) { // Remove the publiclet, it's done if (strstr(PUBLIC_DOWNLOAD_FOLDER, $_SERVER["SCRIPT_FILENAME"]) !== FALSE) unlink($_SERVER["SCRIPT_FILENAME"]); echo "Link is expired, sorry."; exit(); } // Check password if (strlen($data["PASSWORD"])) { if ($_POST['password'] != $data["PASSWORD"]) { echo "<html><body><form method='post'>This file requires a password<br><input type='password' name='password'><input type='submit' value='download'></form></body></html>"; exit(); } } $filePath = INSTALL_PATH."/plugins/access.".$data["DRIVER"]."/class.".$className.".php"; if(!is_file($filePath)){ die("Warning, cannot find driver for conf storage! ($name, $filePath)"); } require_once($filePath); $driver = new $className( $data["DRIVER_NAME"], $data["XML_FILE_PATH"], $data["REPOSITORY"], $data["OPTIONS"]); $driver->initRepository(); $driver->switchAction($data["ACTION"], array("file"=>$data["FILE_PATH"]), ""); }
/** Create a publiclet object, that will be saved in PUBLIC_DOWNLOAD_FOLDER Typically, the class will simply create a data array, and call return writePubliclet($data) @param $filePath The path to the file to share @return The full public URL to the publiclet. */ function makePubliclet($filePath) {}
}
?>
|