public function add($params) { if (MOXMAN::getConfig()->get('general.demo')) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } if (isset($params->paths) && is_array($params->paths)) { $paths = $params->paths; $files = MOXMAN_Util_Json::decode(MOXMAN::getUserStorage()->get("favorites.files", "[]")); // If files is larger then max size then crop it $max = intval(MOXMAN::getConfig()->get("favorites.max")); if (count($files) >= $max) { $files = array_slice($files, count($files) - $max); } for ($i = count($files) - 1; $i >= 0; $i--) { foreach ($files as $file) { if ($file->path == $paths[$i]) { array_splice($paths, $i, 1); $i--; } } } // Add new files foreach ($paths as $path) { $file = MOXMAN::getFile($path); $files[] = array("path" => $file->getPublicPath(), "size" => $file->getSize(), "isdir" => $file->isDirectory(), "mdate" => $file->getLastModified()); } MOXMAN::getUserStorage()->put("favorites.files", MOXMAN_Util_Json::encode($files)); } return true; }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $paths = $params->paths; $result = array(); foreach ($paths as $path) { $file = MOXMAN::getFile($path); $config = $file->getConfig(); if ($config->get('general.demo')) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } if (!$file->exists()) { throw new MOXMAN_Exception("Path doesn't exist: " . $file->getPublicPath(), MOXMAN_Exception::FILE_DOESNT_EXIST); } if (!$file->canWrite()) { throw new MOXMAN_Exception("No write access to file: " . $file->getPublicPath(), MOXMAN_Exception::NO_WRITE_ACCESS); } $filter = MOXMAN_Vfs_BasicFileFilter::createFromConfig($config); if ($filter->accept($file, $file->isFile()) !== MOXMAN_Vfs_BasicFileFilter::ACCEPTED) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } $result[] = $this->fileToJson($file); if ($file->exists()) { $file->delete(true); $this->fireFileAction(MOXMAN_Core_FileActionEventArgs::DELETE, $file); } } return $result; }
private function addVideoMeta(MOXMAN_Vfs_IFile $file, $metaData) { $fileName = $file->getName(); $ext = strtolower(MOXMAN_Util_PathUtils::getExtension($fileName)); if (preg_match('/^(mp4|ogv|webm)$/', $ext)) { $metaData->url_type = MOXMAN_Util_Mime::get($fileName); $name = substr($fileName, 0, strlen($fileName) - strlen($ext)); // Alternative video formats $altExt = array("mp4", "ogv", "webm"); foreach ($altExt as $altExt) { if ($ext != $altExt) { $altFile = MOXMAN::getFile($file->getParent(), $name . $altExt); if ($altFile->exists()) { $metaData->alt_url = $altFile->getUrl(); break; } } } // Alternative image format $altFile = MOXMAN::getFile($file->getParent(), $name . "jpg"); if ($altFile->exists()) { $metaData->alt_img = $altFile->getUrl(); } } }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { if (isset($params->path) && $params->path) { return $this->getPublicConfig(MOXMAN::getFile($params->path)); } return $this->getPublicConfig(); }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $file = MOXMAN::getFile($params->path); $config = $file->getConfig(); if ($config->get('general.demo')) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } if (!$file->canWrite()) { throw new MOXMAN_Exception("No write access to file: " . $file->getPublicPath(), MOXMAN_Exception::NO_WRITE_ACCESS); } if ($file->exists()) { throw new MOXMAN_Exception("File already exist: " . $file->getPublicPath(), MOXMAN_Exception::FILE_EXISTS); } $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "createdir"); if (!$filter->accept($file, false)) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } if (isset($params->template)) { // TODO: Security audit this $templateFile = MOXMAN::getFile($params->template); if (!$templateFile->exists()) { throw new MOXMAN_Exception("Template file doesn't exists: " . $file->getPublicPath(), MOXMAN_Exception::FILE_DOESNT_EXIST); } $args = $this->fireBeforeTargetFileAction(MOXMAN_Vfs_FileActionEventArgs::COPY, $templateFile, $file); $file = $args->getTargetFile(); $templateFile->copyTo($file); $this->fireTargetFileAction(MOXMAN_Vfs_FileActionEventArgs::COPY, $templateFile, $file); } else { $args = $this->fireBeforeFileAction(MOXMAN_Vfs_FileActionEventArgs::ADD, $file); $file = $args->getFile(); $file->mkdir(); $this->fireFileAction(MOXMAN_Vfs_FileActionEventArgs::ADD, $file); } return $this->fileToJson($file, true); }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $file = MOXMAN::getFile($params->path); $config = $file->getConfig(); $resolution = $params->resolution; if ($config->get('general.demo')) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } $content = $this->getUrlContent($params->url, $config); // Fire before file action add event $args = $this->fireBeforeFileAction("add", $file, strlen($content)); $file = $args->getFile(); if (!$file->canWrite()) { throw new MOXMAN_Exception("No write access to file: " . $file->getPublicPath(), MOXMAN_Exception::NO_WRITE_ACCESS); } $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "upload"); if (!$filter->accept($file, true)) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } if ($resolution == "rename") { $file = MOXMAN_Util_FileUtils::uniqueFile($file); } else { if ($resolution == "overwrite") { MOXMAN::getPluginManager()->get("core")->deleteFile($file); } else { throw new MOXMAN_Exception("To file already exist: " . $file->getPublicPath(), MOXMAN_Exception::FILE_EXISTS); } } $stream = $file->open(MOXMAN_Vfs_IFileStream::WRITE); $stream->write($content); $stream->close(); $args = new MOXMAN_Vfs_FileActionEventArgs("add", $file); MOXMAN::getPluginManager()->get("core")->fire("FileAction", $args); return parent::fileToJson($file, true); }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $file = MOXMAN::getFile($params->path); $config = $file->getConfig(); if ($config->get('general.demo')) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } if (!$file->canWrite()) { throw new MOXMAN_Exception("No write access to file: " . $file->getPublicPath(), MOXMAN_Exception::NO_WRITE_ACCESS); } $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "edit"); if ($filter->accept($file) !== MOXMAN_Vfs_CombinedFileFilter::ACCEPTED) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } if ($file->exists()) { $file->delete(true); } // Write contents to file $stream = $file->open(MOXMAN_Vfs_IFileStream::WRITE); if ($stream) { $stream->write($params->content); $stream->close(); } $this->fireFileAction(MOXMAN_Core_FileActionEventArgs::ADD, $file); return $this->fileToJson($file); }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { if (isset($params->paths)) { $result = array(); foreach ($params->paths as $path) { $file = MOXMAN::getFile($path); $fileInfo = $this->fileToJson($file, true); $args = $this->fireCustomInfo(MOXMAN_Core_CustomInfoEventArgs::INSERT_TYPE, $file); $fileInfo->info = (object) $args->getInfo(); if (isset($params->insert) && $params->insert) { $this->fireFileAction(MOXMAN_Core_FileActionEventArgs::INSERT, $file); } $result[] = $fileInfo; } } else { $file = MOXMAN::getFile($params->path); $fileInfo = $this->fileToJson($file, true); $args = $this->fireCustomInfo(MOXMAN_Core_CustomInfoEventArgs::INSERT_TYPE, $file); $fileInfo->info = (object) $args->getInfo(); if (isset($params->insert) && $params->insert) { $this->fireFileAction(MOXMAN_Core_FileActionEventArgs::INSERT, $file); } $result = $fileInfo; } return $result; }
/** * Process a request using the specified context. * * @param MOXMAN_Http_Context $httpContext Context instance to pass to use for the handler. */ public function processRequest(MOXMAN_Http_Context $httpContext) { $request = $httpContext->getRequest(); $response = $httpContext->getResponse(); $path = $request->get("path"); $names = explode('/', $request->get("names", "")); $zipName = $request->get("zipname", "files.zip"); if (count($names) === 1) { $file = MOXMAN::getFile(MOXMAN_Util_PathUtils::combine($path, $names[0])); $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig(MOXMAN::getFile($path)->getConfig(), "download"); if (!$filter->accept($file)) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } if ($file->isFile()) { $response->sendFile($file, true); return; } } // Download multiple files as zip $zipWriter = new MOXMAN_Zip_ZipWriter(array("compressionLevel" => 0)); // Setup download headers $response->disableCache(); $response->setHeader("Content-type", "application/octet-stream"); $response->setHeader("Content-Disposition", 'attachment; filename="' . $zipName . '"'); $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig(MOXMAN::getFile($path)->getConfig(), "download"); // Combine files to zip foreach ($names as $name) { $fromFile = MOXMAN::getFile(MOXMAN_Util_PathUtils::combine($path, $name)); $this->addZipFiles($fromFile, $fromFile->getParent(), $filter, $zipWriter); } $response->sendContent($zipWriter->toString()); }
/** * Executes the save command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ private function save($params) { $file = MOXMAN::getFile($params->path); $config = $file->getConfig(); $size = 0; if ($config->get("general.demo")) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } if (!$file->canWrite()) { throw new MOXMAN_Exception("No write access to file: " . $file->getPublicPath(), MOXMAN_Exception::NO_WRITE_ACCESS); } $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "edit"); if (!$filter->accept($file)) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } // Import temp file as target file if (isset($params->tempname)) { $tempFilePath = MOXMAN_Util_PathUtils::combine(MOXMAN_Util_PathUtils::getTempDir(), MOXMAN_Util_Sanitize::fileName($params->tempname)); $size = filesize($tempFilePath); $file->importFrom($tempFilePath); } $args = $this->fireBeforeFileAction("add", $file, $size); $file = $args->getFile(); MOXMAN::getFileSystemManager()->removeLocalTempFile($file); $this->fireFileAction(MOXMAN_Vfs_FileActionEventArgs::ADD, $file); return parent::fileToJson($file, true); }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $paths = $params->paths; $result = array(); foreach ($paths as $path) { if ($this->hasPath($result, $path)) { continue; } $file = MOXMAN::getFile($path); $config = $file->getConfig(); if ($config->get('general.demo')) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } if (!$file->exists()) { throw new MOXMAN_Exception("Path doesn't exist: " . $file->getPublicPath(), MOXMAN_Exception::FILE_DOESNT_EXIST); } $parentFile = $file->getParentFile(); if (!$parentFile || !$parentFile->canWrite()) { throw new MOXMAN_Exception("No write access to file: " . $file->getPublicPath(), MOXMAN_Exception::NO_WRITE_ACCESS); } $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "delete"); if (!$filter->accept($file)) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } $result[] = $this->fileToJson($file); if ($file->exists()) { $args = $this->fireBeforeFileAction(MOXMAN_Vfs_FileActionEventArgs::DELETE, $file); $result = array_merge($result, $this->filesToJson($args->getFileList())); $file->delete(true); $args = $this->fireFileAction(MOXMAN_Vfs_FileActionEventArgs::DELETE, $file); $result = array_merge($result, $this->filesToJson($args->getFileList())); } } return $result; }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $toPath = $params->to; $ext = MOXMAN_Util_PathUtils::getExtension($toPath); if ($ext !== 'zip') { $toPath .= '.zip'; } $toFile = MOXMAN::getFile($toPath); $config = $toFile->getConfig(); if ($config->get('general.demo')) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } if (!$toFile->canWrite()) { throw new MOXMAN_Exception("No write access to file: " . $toFile->getPublicPath(), MOXMAN_Exception::NO_WRITE_ACCESS); } $zipWriter = new MOXMAN_Zip_ZipWriter(array("compressionLevel" => 5)); $filter = MOXMAN_Vfs_BasicFileFilter::createFromConfig($config); $path = $params->path; foreach ($params->names as $name) { $fromFile = MOXMAN::getFile(MOXMAN_Util_PathUtils::combine($path, $name)); $this->addZipFiles($fromFile, $fromFile->getParent(), $filter, $zipWriter); } $stream = $toFile->open(MOXMAN_Vfs_IFileStream::WRITE); if ($stream) { $stream->write($zipWriter->toString()); $stream->close(); } $this->fireFileAction(MOXMAN_Core_FileActionEventArgs::ADD, $toFile); return $this->fileToJson($toFile); }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $file = MOXMAN::getFile($params->path); $url = parse_url($params->url); $config = $file->getConfig(); if ($config->get('general.demo')) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } if ($file->exists()) { throw new MOXMAN_Exception("To file already exist: " . $file->getPublicPath(), MOXMAN_Exception::FILE_EXISTS); } if (!$file->canWrite()) { throw new MOXMAN_Exception("No write access to file: " . $file->getPublicPath(), MOXMAN_Exception::NO_WRITE_ACCESS); } $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "upload"); if (!$filter->accept($file, true)) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } $port = ""; if (isset($url["port"])) { $port = ":" . $url["port"]; } $query = ""; if (isset($url["query"])) { $query = "?" . $url["query"]; } $path = $url["path"] . $query; $host = $url["scheme"] . "://" . $url["host"] . $port; $httpClient = new MOXMAN_Http_HttpClient($host); $request = $httpClient->createRequest($path); $response = $request->send(); // Handle redirects $location = $response->getHeader("location"); if ($location) { $httpClient->close(); $httpClient = new MOXMAN_Http_HttpClient($location); $request = $httpClient->createRequest($location); $response = $request->send(); } // Read file into ram // TODO: This should not happen if we know the file size $content = ""; while (($chunk = $response->read()) != "") { $content .= $chunk; } $httpClient->close(); // Fire before file action add event $args = $this->fireBeforeFileAction("add", $file, strlen($content)); $file = $args->getFile(); $stream = $file->open(MOXMAN_Vfs_IFileStream::WRITE); $stream->write($content); $stream->close(); $args = new MOXMAN_Vfs_FileActionEventArgs("add", $file); MOXMAN::getPluginManager()->get("core")->fire("FileAction", $args); return parent::fileToJson($file, true); }
/** * Get an unique file * * @param MOXMAN_Vfs_IFile $file File object to check against * @return MOXMAN_Vfs_IFile Unique file object. */ public static function uniqueFile(MOXMAN_Vfs_IFile $file) { $fileName = $file->getName(); $ext = MOXMAN_Util_PathUtils::getExtension($fileName); for ($i = 2; $file->exists(); $i++) { if ($file->isFile() && $ext) { $file = MOXMAN::getFile($file->getParent(), basename($fileName, '.' . $ext) . '_' . $i . '.' . $ext); } else { $file = MOXMAN::getFile($file->getParent(), $fileName . '_' . $i); } } return $file; }
/** * Sends the specified file with the correct mime type back to the browser. * This method gets called from the client side using the stream file. * * @param MOXMAN_Http_Context $httpContext Context instance to pass to use for the handler. */ public function processRequest(MOXMAN_Http_Context $httpContext) { $request = $httpContext->getRequest(); $response = $httpContext->getResponse(); try { $file = MOXMAN::getFile($request->get("path")); } catch (Exception $e) { $response->setStatus("500", "Could not resolve path: " . $request->get("path")); if (MOXMAN::getLogger()) { MOXMAN::getLogger()->debug("Could not resolve path: " . $request->get("path")); } return; } // Create thumbnail if ($request->get("thumb")) { try { $file = $this->plugin->createThumbnail($file); } catch (Exception $e) { $response->setStatus("500", "Could not generate thumbnail."); $response->sendContent("Could not generate thumbnail."); return; } } // Fire before stream event $args = new MOXMAN_Vfs_StreamEventArgs($httpContext, $file); $this->plugin->fire("BeforeStream", $args); $file = $args->getFile(); // Stream temp file if it exists if ($tempName = $request->get("tempname")) { $ext = MOXMAN_Util_PathUtils::getExtension($file->getName()); $tempName = "mcic_" . md5(session_id() . $file->getName()) . "." . $ext; $tempFilePath = MOXMAN_Util_PathUtils::combine(MOXMAN_Util_PathUtils::getTempDir(), $tempName); if (file_exists($tempFilePath)) { $response->sendLocalFile($tempFilePath); return; } } $url = $file->getUrl(); if ($url && !$request->get("stream", false)) { $response->redirect($url); } else { // Force 48h cache time $offset = 48 * 60 * 60; $response->setHeader("Cache-Control", "max-age=" . $offset); $response->setHeader("Date", gmdate("D, d M Y H:i:s", time() + $offset) . " GMT"); $response->setHeader("Expires", gmdate("D, d M Y H:i:s", time() + $offset) . " GMT"); $response->setHeader("Pragma", "public"); $response->sendFile($file); } }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $file = MOXMAN::getFile($params->path); $config = $file->getConfig(); $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "edit"); if ($filter->accept($file) !== MOXMAN_Vfs_CombinedFileFilter::ACCEPTED) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } $content = ""; $stream = $file->open(MOXMAN_Vfs_IFileStream::READ); if ($stream) { $content = $stream->readToEnd(); $stream->close(); } return (object) array("content" => $content); }
/** * Fixes filenames * * @param MOXMAN_Vfs_IFile $file File to fix name on. */ public function renameFile(MOXMAN_Vfs_IFile $file) { $config = $file->getConfig(); $autorename = $config->get("autorename.enabled", ""); $spacechar = $config->get("autorename.space", "_"); $custom = $config->get("autorename.pattern", "/[^0-9a-z\\-_]/i"); $overwrite = $config->get("upload.overwrite", false); $lowercase = $config->get("autorename.lowercase", false); $prefix = $lowercase = $config->get("autorename.prefix", ''); // @codeCoverageIgnoreStart if (!$autorename) { return $file; } // @codeCoverageIgnoreEnd $path = $file->getPath(); $name = $file->getName(); $orgname = $name; $ext = MOXMAN_Util_PathUtils::getExtension($path); $name = preg_replace("/\\." . $ext . "\$/i", "", $name); $name = str_replace(array('\'', '"'), '', $name); $name = htmlentities($name, ENT_QUOTES, 'UTF-8'); $name = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', $name); $name = preg_replace($custom, $spacechar, $name); $name = str_replace(" ", $spacechar, $name); $name = trim($name); if ($lowercase) { $ext = strtolower($ext); $name = strtolower($name); } if ($ext) { $name = $name . "." . $ext; } //add prefix if ($prefix != '') { $aa = explode("-", $name); if (count($aa) == 1) { $name = $prefix . $name; } } // If no change to name after all this, return original file. if ($name === $orgname) { return $file; } // Return new file $toFile = MOXMAN::getFile($file->getParent() . "/" . $name); return $toFile; }
public function add($path) { $files = MOXMAN_Util_Json::decode(MOXMAN::getUserStorage()->get("uploaded.files", "[]")); // If files is larger then max size then crop it $max = intval(MOXMAN::getConfig()->get("uploaded.max", 20)); if (count($files) >= $max) { $files = array_slice($files, count($files) - $max); } // Remove existing paths for ($i = 0; $i < count($files); $i++) { if ($files[$i]->path == $path) { array_splice($files, $i, 1); } } $file = MOXMAN::getFile($path); $files[] = array("path" => $file->getPublicPath(), "size" => $file->getSize(), "isdir" => $file->isDirectory(), "mdate" => $file->getLastModified()); MOXMAN::getUserStorage()->put("uploaded.files", MOXMAN_Util_Json::encode($files)); }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $file = MOXMAN::getFile($params->path); $config = $file->getConfig(); if ($config->get('general.demo')) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } if (!$file->canWrite()) { throw new MOXMAN_Exception("No write access to file: " . $file->getPublicPath(), MOXMAN_Exception::NO_WRITE_ACCESS); } $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "edit"); if (!$filter->accept($file, true)) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } if ($file->exists()) { $args = $this->fireBeforeFileAction(MOXMAN_Vfs_FileActionEventArgs::DELETE, $file); $file = $args->getFile(); $file->delete(true); $this->fireFileAction(MOXMAN_Vfs_FileActionEventArgs::DELETE, $file); } $encoding = $config->get("edit.encoding", "utf-8"); $lineEndings = $config->get("edit.line_endings", "lf"); // Normalize line endings to unix style $content = str_replace("\r\n", "\n", $params->content); // Force line endings if ($lineEndings == "crlf") { $content = str_replace("\n", "\r\n", $content); } // Encode if ($encoding != "utf-8") { $content = iconv("utf-8", $encoding, $content); } // Fire before file action add event $args = $this->fireBeforeFileAction("add", $file, strlen($content)); $file = $args->getFile(); // Write contents to file $stream = $file->open(MOXMAN_Vfs_IFileStream::WRITE); if ($stream) { $stream->write($content); $stream->close(); } $this->fireFileAction(MOXMAN_Vfs_FileActionEventArgs::ADD, $file); return $this->fileToJson($file, true); }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { if (!isset($params->template)) { throw new MOXMAN_Exception("You must specify a path to a template file to be used when creating documents"); } $templateFile = MOXMAN::getFile($params->template); $file = MOXMAN::getFile($params->path, $params->name . '.' . MOXMAN_Util_PathUtils::getExtension($templateFile->getName())); $config = $file->getConfig(); if ($config->get('general.demo')) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } if (!$file->canWrite()) { throw new MOXMAN_Exception("No write access to file: " . $file->getPublicPath(), MOXMAN_Exception::NO_WRITE_ACCESS); } if ($file->exists()) { throw new MOXMAN_Exception("File already exist: " . $file->getPublicPath(), MOXMAN_Exception::FILE_EXISTS); } $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "createdoc"); if (!$filter->accept($file, true)) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } // TODO: Security audit this $stream = $templateFile->open(MOXMAN_Vfs_IFileStream::READ); if ($stream) { $content = $stream->readToEnd(); $stream->close(); } // Replace fields if (isset($params->fields)) { foreach ($params->fields as $key => $value) { $content = str_replace('${' . $key . '}', htmlentities($value), $content); } } $args = $this->fireBeforeFileAction("add", $file, strlen($content)); $file = $args->getFile(); // Write contents to file $stream = $file->open(MOXMAN_Vfs_IFileStream::WRITE); if ($stream) { $stream->write($content); $stream->close(); } $this->fireFileAction(MOXMAN_Vfs_FileActionEventArgs::ADD, $file); return $this->fileToJson($file, true); }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $from = $params->from; $to = $params->to; // Move multiple files if (is_array($from)) { $result = array(); foreach ($from as $path) { $fromFile = MOXMAN::getFile($path); $toFile = MOXMAN::getFile($to, $fromFile->getName()); $this->moveFile($fromFile, $toFile); $result[] = parent::fileToJson($toFile); } return $result; } // Move single file $fromFile = MOXMAN::getFile($from); $toFile = MOXMAN::getFile($params->to); $this->moveFile($fromFile, $toFile); return parent::fileToJson($toFile); }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $from = $params->from; $to = $params->to; $resolution = isset($params->resolution) ? $params->resolution : ""; // Copy multiple files if (is_array($from)) { $result = array(); foreach ($from as $path) { $fromFile = MOXMAN::getFile($path); $toFile = MOXMAN::getFile($to, $fromFile->getName()); $toFile = $this->copyFile($fromFile, $toFile, $resolution); $result[] = parent::fileToJson($toFile, true); } return $result; } // Copy single file $fromFile = MOXMAN::getFile($from); $toFile = MOXMAN::getFile($params->to); $toFile = $this->copyFile($fromFile, $toFile, $resolution); return parent::fileToJson($toFile, true); }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $file = MOXMAN::getFile($params->path); $config = $file->getConfig(); $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "edit"); if (!$filter->accept($file)) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } $content = ""; $stream = $file->open(MOXMAN_Vfs_IFileStream::READ); if ($stream) { $content = $stream->readToEnd(); $stream->close(); } $encoding = $config->get("edit.encoding", "utf-8"); // Normalize line endings to unix style $content = str_replace("\r\n", "\n", $content); // Encode if ($encoding != "utf-8") { $content = iconv($encoding, "utf-8", $content); } return (object) array("content" => $content); }
/** @ignore */ private function copyFile($fromFile, $toFile) { $config = $toFile->getConfig(); if ($config->get('general.demo')) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } if (!$fromFile->exists()) { throw new MOXMAN_Exception("From file doesn't exist: " . $fromFile->getPublicPath(), MOXMAN_Exception::FILE_DOESNT_EXIST); } if (!$toFile->canWrite()) { throw new MOXMAN_Exception("No write access to file: " . $toFile->getPublicPath(), MOXMAN_Exception::NO_WRITE_ACCESS); } $filter = MOXMAN_Vfs_BasicFileFilter::createFromConfig($config); if ($filter->accept($fromFile, $fromFile->isFile()) !== MOXMAN_Vfs_BasicFileFilter::ACCEPTED) { throw new MOXMAN_Exception("Invalid file name for: " . $fromFile->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } // Fire before file action event $args = new MOXMAN_Core_FileActionEventArgs(MOXMAN_Core_FileActionEventArgs::COPY, $fromFile); $args->setTargetFile($toFile); $args->getData()->fileSize = $fromFile->getSize(); MOXMAN::getPluginManager()->get("core")->fire("BeforeFileAction", $args); $fromFile = $args->getFile(); $toFile = $args->getTargetFile(); // To file exists generate unique name $fileName = $toFile->getName(); $ext = MOXMAN_Util_PathUtils::getExtension($fileName); for ($i = 2; $toFile->exists(); $i++) { if ($toFile->isFile() && $ext) { $toFile = MOXMAN::getFile($toFile->getParent(), basename($fileName, '.' . $ext) . '_' . $i . '.' . $ext); } else { $toFile = MOXMAN::getFile($toFile->getParent(), $fileName . '_' . $i); } } $fromFile->copyTo($toFile); $this->fireTargetFileAction(MOXMAN_Core_FileActionEventArgs::COPY, $fromFile, $toFile); return $toFile; }
/** * Process a request using the specified context. * * @param MOXMAN_Http_Context $httpContext Context instance to pass to use for the handler. */ public function processRequest(MOXMAN_Http_Context $httpContext) { $tempFilePath = null; $chunkFilePath = null; $request = $httpContext->getRequest(); $response = $httpContext->getResponse(); try { // Check if the user is authenticated or not if (!MOXMAN::getAuthManager()->isAuthenticated()) { if (!isset($json->method) || !preg_match('/^(login|logout)$/', $json->method)) { $exception = new MOXMAN_Exception("Access denied by authenticator(s).", 10); $exception->setData(array("login_url" => MOXMAN::getConfig()->get("authenticator.login_page"))); throw $exception; } } $file = MOXMAN::getFile($request->get("path")); $config = $file->getConfig(); if ($config->get('general.demo')) { throw new MOXMAN_Exception("This action is restricted in demo mode.", MOXMAN_Exception::DEMO_MODE); } $maxSizeBytes = preg_replace("/[^0-9.]/", "", $config->get("upload.maxsize")); if (strpos(strtolower($config->get("upload.maxsize")), "k") > 0) { $maxSizeBytes = round(floatval($maxSizeBytes) * 1024); } if (strpos(strtolower($config->get("upload.maxsize")), "m") > 0) { $maxSizeBytes = round(floatval($maxSizeBytes) * 1024 * 1024); } function generateRandomString($length = 10) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters); $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } $filename = generateRandomString() . '.' . MOXMAN_Util_PathUtils::getExtension($request->get("name")); $id = $request->get("id"); $loaded = intval($request->get("loaded", "0")); $total = intval($request->get("total", "-1")); $file = MOXMAN::getFile($file->getPath(), $filename); // Generate unique id for first chunk // TODO: We should cleanup orphan ID:s if upload fails etc if ($loaded == 0) { $id = uniqid(); } // Setup path to temp file based on id $tempFilePath = MOXMAN_Util_PathUtils::combine(MOXMAN_Util_PathUtils::getTempDir(), "mcupload_" . $id . "." . MOXMAN_Util_PathUtils::getExtension($file->getName())); $chunkFilePath = MOXMAN_Util_PathUtils::combine(MOXMAN_Util_PathUtils::getTempDir(), "mcupload_chunk_" . $id . "." . MOXMAN_Util_PathUtils::getExtension($file->getName())); if (!$file->canWrite()) { throw new MOXMAN_Exception("No write access to path: " . $file->getPublicPath(), MOXMAN_Exception::NO_WRITE_ACCESS); } if ($total > $maxSizeBytes) { throw new MOXMAN_Exception("File size to large: " . $file->getPublicPath(), MOXMAN_Exception::FILE_SIZE_TO_LARGE); } // Operations on first chunk if ($loaded == 0) { // Fire before file action add event $args = new MOXMAN_Core_FileActionEventArgs("add", $file); $args->getData()->fileSize = $total; MOXMAN::getPluginManager()->get("core")->fire("BeforeFileAction", $args); $file = $args->getFile(); if ($file->exists()) { if (!$config->get("upload.overwrite") && !$request->get("overwrite")) { throw new MOXMAN_Exception("Target file exists: " . $file->getPublicPath(), MOXMAN_Exception::FILE_EXISTS); } else { MOXMAN::getPluginManager()->get("core")->deleteThumbnail($file); $file->delete(); } } $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "upload"); if ($filter->accept($file) !== MOXMAN_Vfs_CombinedFileFilter::ACCEPTED) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } } $blobSize = 0; $inputFile = $request->getFile("file"); if (!$inputFile) { throw new MOXMAN_Exception("No input file specified."); } if ($loaded === 0) { // Check if we should mock or not if (defined('PHPUNIT')) { if (!copy($inputFile['tmp_name'], $tempFilePath)) { throw new MOXMAN_Exception("Could not move the uploaded temp file."); } } else { if (!move_uploaded_file($inputFile['tmp_name'], $tempFilePath)) { throw new MOXMAN_Exception("Could not move the uploaded temp file."); } } $blobSize = filesize($tempFilePath); } else { // Check if we should mock or not if (defined('PHPUNIT')) { if (!copy($inputFile['tmp_name'], $chunkFilePath)) { throw new MOXMAN_Exception("Could not move the uploaded temp file."); } } else { if (!move_uploaded_file($inputFile['tmp_name'], $chunkFilePath)) { throw new MOXMAN_Exception("Could not move the uploaded temp file."); } } $in = fopen($chunkFilePath, 'r'); if ($in) { $out = fopen($tempFilePath, 'a'); if ($out) { while ($buff = fread($in, 8192)) { $blobSize += strlen($buff); fwrite($out, $buff); } fclose($out); } fclose($in); } unlink($chunkFilePath); } // Import file when all chunks are complete if ($total == -1 || $loaded + $blobSize == $total) { clearstatcache(); // Check if file is valid on last chunk we also check on first chunk but not in the onces in between $filter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "upload"); if ($filter->accept($file) !== MOXMAN_Vfs_CombinedFileFilter::ACCEPTED) { throw new MOXMAN_Exception("Invalid file name for: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_NAME); } // Resize the temporary blob if ($config->get("upload.autoresize") && preg_match('/gif|jpe?g|png/i', MOXMAN_Util_PathUtils::getExtension($tempFilePath)) === 1) { $size = getimagesize($tempFilePath); $maxWidth = $config->get('upload.max_width'); $maxHeight = $config->get('upload.max_height'); if ($size[0] > $maxWidth || $size[1] > $maxHeight) { $imageAlter = new MOXMAN_Media_ImageAlter(); $imageAlter->load($tempFilePath); $imageAlter->resize($maxWidth, $maxHeight, true); $imageAlter->save($tempFilePath, $config->get("upload.autoresize_jpeg_quality")); } } // Create thumbnail and upload then import local blob MOXMAN::getPluginManager()->get("core")->createThumbnail($file, $tempFilePath); $file->importFrom($tempFilePath); unlink($tempFilePath); $args = new MOXMAN_Core_FileActionEventArgs("add", $file); MOXMAN::getPluginManager()->get("core")->fire("FileAction", $args); // In case file is modified $file = $args->getFile(); $result = MOXMAN_Core_Plugin::fileToJson($file, true); } else { $result = $id; } $response->sendJson(array("jsonrpc" => "2.0", "result" => $result, "id" => null)); } catch (Exception $e) { if ($tempFilePath && file_exists($tempFilePath)) { unlink($tempFilePath); } if ($chunkFilePath && file_exists($chunkFilePath)) { unlink($chunkFilePath); } MOXMAN::dispose(); // Closes any open file systems/connections $message = $e->getMessage(); $data = null; // Add file and line number when running in debug mode // @codeCoverageIgnoreStart if (MOXMAN::getConfig()->get("general.debug")) { $message .= " " . $e->getFile() . " (" . $e->getLine() . ")"; } // @codeCoverageIgnoreEnd // Grab the data from the exception if ($e instanceof MOXMAN_Exception && !$data) { $data = $e->getData(); } // Json encode error response $response->sendJson((object) array("jsonrpc" => "2.0", "error" => array("code" => $e->getCode(), "message" => $message, "data" => $data), "id" => null)); } }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $url = isset($params->url) ? $params->url : ''; $path = isset($params->path) ? $params->path : '{default}'; // Result URL to closest file $file = null; if ($url) { try { $file = MOXMAN::getFile($url); } catch (MOXMAN_Exception $e) { // Might throw exception ignore it $file = null; } if ($file) { if ($file->exists()) { $urlFile = $file; } while (!$file->exists() || !$file->isDirectory()) { $file = $file->getParentFile(); } } } $file = $file ? $file : MOXMAN::getFile($path); if (!$file->isDirectory()) { throw new MOXMAN_Exception("Path isn't a directory: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_TYPE); } $config = $file->getConfig(); // Setup input file filter $paramsFileFilter = new MOXMAN_Vfs_BasicFileFilter(); if (isset($params->include_directory_pattern) && $params->include_directory_pattern) { $paramsFileFilter->setIncludeDirectoryPattern($params->include_directory_pattern); } if (isset($params->exclude_directory_pattern) && $params->exclude_directory_pattern) { $paramsFileFilter->setExcludeDirectoryPattern($params->exclude_directory_pattern); } if (isset($params->include_file_pattern) && $params->include_file_pattern) { $paramsFileFilter->setIncludeFilePattern($params->include_file_pattern); } if (isset($params->exclude_file_pattern) && $params->exclude_file_pattern) { $paramsFileFilter->setExcludeFilePattern($params->exclude_file_pattern); } if (isset($params->extensions) && $params->extensions) { $paramsFileFilter->setIncludeExtensions($params->extensions); } if (isset($params->filter) && $params->filter != null) { $paramsFileFilter->setIncludeWildcardPattern($params->filter); } if (isset($params->only_dirs) && $params->only_dirs === true) { $paramsFileFilter->setOnlyDirs(true); } if (isset($params->only_files) && $params->only_files === true) { $paramsFileFilter->setOnlyFiles(true); } // Setup file filter $configuredFilter = new MOXMAN_Vfs_BasicFileFilter(); $configuredFilter->setIncludeDirectoryPattern($config->get('filesystem.include_directory_pattern')); $configuredFilter->setExcludeDirectoryPattern($config->get('filesystem.exclude_directory_pattern')); $configuredFilter->setIncludeFilePattern($config->get('filesystem.include_file_pattern')); $configuredFilter->setExcludeFilePattern($config->get('filesystem.exclude_file_pattern')); $configuredFilter->setIncludeExtensions($config->get('filesystem.extensions')); // Setup combined filter $combinedFilter = new MOXMAN_Vfs_CombinedFileFilter(); $combinedFilter->addFilter($paramsFileFilter); $combinedFilter->addFilter($configuredFilter); $files = $file->listFilesFiltered($combinedFilter); $args = $this->fireFilesAction(MOXMAN_Core_FileActionEventArgs::LIST_FILES, $file, $files); $files = $args->getFileList(); $renameFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($file->getConfig(), "rename"); $editFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($file->getConfig(), "edit"); $viewFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($file->getConfig(), "view"); $result = (object) array("columns" => array("name", "size", "modified", "attrs", "info"), "config" => $this->getPublicConfig($file), "file" => $this->fileToJson($file, true), "urlFile" => isset($urlFile) ? $this->fileToJson($urlFile, true) : null, "data" => array()); foreach ($files as $subFile) { $attrs = $subFile->isDirectory() ? "d" : "-"; $attrs .= $subFile->canRead() ? "r" : "-"; $attrs .= $subFile->canWrite() ? "w" : "-"; $attrs .= $renameFilter->accept($subFile) === MOXMAN_Vfs_CombinedFileFilter::ACCEPTED ? "r" : "-"; $attrs .= $subFile->isFile() && $editFilter->accept($subFile) === MOXMAN_Vfs_CombinedFileFilter::ACCEPTED ? "e" : "-"; $attrs .= $subFile->isFile() && $viewFilter->accept($subFile) === MOXMAN_Vfs_CombinedFileFilter::ACCEPTED ? "v" : "-"; $attrs .= $subFile->isFile() && MOXMAN_Media_ImageAlter::canEdit($subFile) ? "p" : "-"; $args = $this->fireCustomInfo(MOXMAN_Core_CustomInfoEventArgs::LIST_TYPE, $subFile); $custom = (object) $args->getInfo(); if ($subFile->getPublicLinkPath()) { $custom->link = $subFile->getPublicLinkPath(); } $result->data[] = array($subFile->getName(), $subFile->isDirectory() ? 0 : $subFile->getSize(), $subFile->getLastModified(), $attrs, $custom); } return $result; }
/** * Converts a file instance to a JSON serializable object. * * @param MOXMAN_Vfs_IFile $file File to convert into JSON format. * @param Boolean $meta State if the meta data should be returned or not. * @return stdClass JSON serializable object. */ public static function fileToJson($file, $meta = false) { $config = $file->getConfig(); $renameFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "rename"); $editFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "edit"); $viewFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "view"); $configuredFilter = new MOXMAN_Vfs_BasicFileFilter(); $configuredFilter->setIncludeDirectoryPattern($config->get('filesystem.include_directory_pattern')); $configuredFilter->setExcludeDirectoryPattern($config->get('filesystem.exclude_directory_pattern')); $configuredFilter->setIncludeFilePattern($config->get('filesystem.include_file_pattern')); $configuredFilter->setExcludeFilePattern($config->get('filesystem.exclude_file_pattern')); $configuredFilter->setIncludeExtensions($config->get('filesystem.extensions')); $result = (object) array("path" => $file->getPublicPath(), "size" => $file->getSize(), "lastModified" => $file->getLastModified(), "isFile" => $file->isFile(), "canRead" => $file->canRead(), "canWrite" => $file->canWrite(), "canEdit" => $file->isFile() && $editFilter->accept($file), "canRename" => $renameFilter->accept($file), "canView" => $file->isFile() && $viewFilter->accept($file), "canPreview" => $file->isFile() && MOXMAN_Media_ImageAlter::canEdit($file), "visible" => $configuredFilter->accept($file), "exists" => $file->exists()); if ($meta) { $args = new MOXMAN_Vfs_CustomInfoEventArgs(MOXMAN_Vfs_CustomInfoEventArgs::INSERT_TYPE, $file); MOXMAN::getPluginManager()->get("core")->fire("CustomInfo", $args); $metaData = (object) array_merge($file->getMetaData()->getAll(), $args->getInfo()); if (MOXMAN_Media_ImageAlter::canEdit($file)) { $thumbnailFolderPath = MOXMAN_Util_PathUtils::combine($file->getParent(), $config->get('thumbnail.folder')); $thumbnailFile = MOXMAN::getFile($thumbnailFolderPath, $config->get('thumbnail.prefix') . $file->getName()); // TODO: Implement stat info cache layer here if ($file instanceof MOXMAN_Vfs_Local_File) { $info = MOXMAN_Media_MediaInfo::getInfo($file->getPath()); $metaData->width = $info["width"]; $metaData->height = $info["height"]; } if ($thumbnailFile->exists()) { $metaData->thumb_url = $thumbnailFile->getUrl(); // Get image size server side only on local filesystem if ($file instanceof MOXMAN_Vfs_Local_File) { $info = MOXMAN_Media_MediaInfo::getInfo($thumbnailFile->getPath()); $metaData->thumb_width = $info["width"]; $metaData->thumb_height = $info["height"]; } } } $metaData->url = $file->getUrl(); $result->meta = $metaData; } return $result; }
/** @ignore */ private function mkdirs(MOXMAN_Vfs_IFile $file, $isFile = false) { $parents = array(); $orgFile = $file; if ($isFile) { $file = $file->getParentFile(); } $pathChunks = explode("/", $file->getPublicPath()); // Ignore first slash array_shift($pathChunks); $path = ""; $chunkFile = null; foreach ($pathChunks as $chunk) { $path .= "/" . $chunk; $chunkFile = MOXMAN::getFile($path); // Ignore root if (!$chunkFile->getParent()) { continue; } $args = new MOXMAN_Core_FileActionEventArgs("add", $chunkFile); MOXMAN::getPluginManager()->get("core")->fire("BeforeFileAction", $args); $chunkFile = $args->getFile(); $path = $chunkFile->getPublicPath(); if (!$chunkFile->exists()) { $chunkFile->mkdir(); $this->fireFileAction(MOXMAN_Core_FileActionEventArgs::ADD, $chunkFile); } } if ($chunkFile) { if ($isFile) { return MOXMAN::getFile($chunkFile->getPath(), $orgFile->getName()); } return $chunkFile; } return $orgFile; }
/** * Converts a file instance to a JSON serializable object. * * @param MOXMAN_Vfs_IFile $file File to convert into JSON format. * @param Boolean $meta State if the meta data should be returned or not. * @return stdClass JSON serializable object. */ public static function fileToJson($file, $meta = false) { $config = $file->getConfig(); $renameFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "rename"); $editFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "edit"); $viewFilter = MOXMAN_Vfs_CombinedFileFilter::createFromConfig($config, "view"); $result = (object) array("path" => $file->getPublicPath(), "size" => $file->getSize(), "lastModified" => $file->getLastModified(), "isFile" => $file->isFile(), "canRead" => $file->canRead(), "canWrite" => $file->canWrite(), "canEdit" => $file->isFile() && $editFilter->accept($file) === MOXMAN_Vfs_IFileFilter::ACCEPTED, "canRename" => $renameFilter->accept($file) === MOXMAN_Vfs_IFileFilter::ACCEPTED, "canView" => $file->isFile() && $viewFilter->accept($file) === MOXMAN_Vfs_IFileFilter::ACCEPTED, "canPreview" => $file->isFile() && MOXMAN_Media_ImageAlter::canEdit($file), "exists" => $file->exists()); if ($meta) { $metaData = $file->getMetaData(); //$args = $this->fireCustomInfo(MOXMAN_Core_CustomInfoEventArgs::INSERT_TYPE, $file); $metaData = (object) $metaData->getAll(); if ($file instanceof MOXMAN_Vfs_Local_File && MOXMAN_Media_ImageAlter::canEdit($file)) { $thumbnailFolderPath = MOXMAN_Util_PathUtils::combine($file->getParent(), $config->get('thumbnail.folder')); $thumbnailFile = MOXMAN::getFile($thumbnailFolderPath, $config->get('thumbnail.prefix') . $file->getName()); // TODO: Implement stat info cache layer here $info = MOXMAN_Media_MediaInfo::getInfo($file); $metaData->width = $info["width"]; $metaData->height = $info["height"]; if ($thumbnailFile->exists()) { $metaData->thumb_url = $thumbnailFile->getUrl(); $info = MOXMAN_Media_MediaInfo::getInfo($thumbnailFile); $metaData->thumb_width = $info["width"]; $metaData->thumb_height = $info["height"]; } } $metaData->url = $file->getUrl(); $result->meta = $metaData; } return $result; }
/** * Executes the command logic with the specified RPC parameters. * * @param Object $params Command parameters sent from client. * @return Object Result object to be passed back to client. */ public function execute($params) { $url = isset($params->url) ? $params->url : ""; $path = isset($params->path) ? $params->path : "{default}"; $lastPath = isset($params->lastPath) ? $params->lastPath : ""; $offset = isset($params->offset) ? $params->offset : 0; $length = isset($params->length) ? $params->length : null; $orderBy = isset($params->orderBy) ? $params->orderBy : "name"; $desc = isset($params->desc) ? $params->desc : false; // Result URL to closest file $file = null; if ($url) { try { $file = MOXMAN::getFile($url); } catch (MOXMAN_Exception $e) { // Might throw exception ignore it $file = null; } if ($file) { if ($file->exists()) { $urlFile = $file; } while (!$file->exists() || !$file->isDirectory()) { $file = $file->getParentFile(); } } } // Resolve lastPath input if ($lastPath && !$file) { try { $file = MOXMAN::getFile($lastPath); } catch (MOXMAN_Exception $e) { // Might throw exception ignore it $file = null; } if ($file) { while (!$file->exists() || !$file->isDirectory()) { $file = $file->getParentFile(); } } } $file = $file ? $file : MOXMAN::getFile($path); // Force update on cached file info if (isset($params->force) && $params->force) { MOXMAN_Vfs_Cache_FileInfoStorage::getInstance()->updateFileList($file); } if (!$file->isDirectory()) { throw new MOXMAN_Exception("Path isn't a directory: " . $file->getPublicPath(), MOXMAN_Exception::INVALID_FILE_TYPE); } $config = $file->getConfig(); // Setup input file filter $paramsFileFilter = new MOXMAN_Vfs_BasicFileFilter(); if (isset($params->include_directory_pattern) && $params->include_directory_pattern) { $paramsFileFilter->setIncludeDirectoryPattern($params->include_directory_pattern); } if (isset($params->exclude_directory_pattern) && $params->exclude_directory_pattern) { $paramsFileFilter->setExcludeDirectoryPattern($params->exclude_directory_pattern); } if (isset($params->include_file_pattern) && $params->include_file_pattern) { $paramsFileFilter->setIncludeFilePattern($params->include_file_pattern); } if (isset($params->exclude_file_pattern) && $params->exclude_file_pattern) { $paramsFileFilter->setExcludeFilePattern($params->exclude_file_pattern); } if (isset($params->extensions) && $params->extensions) { $paramsFileFilter->setIncludeExtensions($params->extensions); } if (isset($params->filter) && $params->filter != null) { $paramsFileFilter->setIncludeWildcardPattern($params->filter); } if (isset($params->only_dirs) && $params->only_dirs === true) { $paramsFileFilter->setOnlyDirs(true); } if (isset($params->only_files) && $params->only_files === true) { $paramsFileFilter->setOnlyFiles(true); } // Setup file filter $configuredFilter = new MOXMAN_Vfs_BasicFileFilter(); $configuredFilter->setIncludeDirectoryPattern($config->get('filesystem.include_directory_pattern')); $configuredFilter->setExcludeDirectoryPattern($config->get('filesystem.exclude_directory_pattern')); $configuredFilter->setIncludeFilePattern($config->get('filesystem.include_file_pattern')); $configuredFilter->setExcludeFilePattern($config->get('filesystem.exclude_file_pattern')); $configuredFilter->setIncludeExtensions($config->get('filesystem.extensions')); // Setup combined filter $combinedFilter = new MOXMAN_Vfs_CombinedFileFilter(); $combinedFilter->addFilter($paramsFileFilter); $combinedFilter->addFilter($configuredFilter); $files = $file->listFilesFiltered($combinedFilter)->limit($offset, $length)->orderBy($orderBy, $desc); $args = $this->fireFilesAction(MOXMAN_Vfs_FileActionEventArgs::LIST_FILES, $file, $files); $files = $args->getFileList(); $renameFilter = MOXMAN_Vfs_BasicFileFilter::createFromConfig($file->getConfig(), "rename"); $editFilter = MOXMAN_Vfs_BasicFileFilter::createFromConfig($file->getConfig(), "edit"); $viewFilter = MOXMAN_Vfs_BasicFileFilter::createFromConfig($file->getConfig(), "view"); // List thumbnails and make lookup table $thumbnails = array(); $thumbnailFolder = $config->get("thumbnail.folder"); $thumbnailPrefix = $config->get("thumbnail.prefix"); if ($config->get('thumbnail.enabled')) { $thumbFolderFile = MOXMAN::getFile($file->getPath(), $thumbnailFolder); // Force update on cached file info if (isset($params->force) && $params->force) { MOXMAN_Vfs_Cache_FileInfoStorage::getInstance()->updateFileList($thumbFolderFile); } if ($file instanceof MOXMAN_Vfs_Local_File === false) { $hasThumbnails = false; foreach ($files as $subFile) { if (MOXMAN_Media_ImageAlter::canEdit($subFile)) { $hasThumbnails = true; break; } } if ($hasThumbnails) { $thumbFiles = $thumbFolderFile->listFilesFiltered($combinedFilter)->limit($offset, $length)->orderBy($orderBy, $desc); foreach ($thumbFiles as $thumbFile) { $thumbnails[$thumbFile->getName()] = true; } } } else { // Stat individual files on local fs faster than listing 1000 files $fileSystem = $thumbFolderFile->getFileSystem(); foreach ($files as $subFile) { if (MOXMAN_Media_ImageAlter::canEdit($subFile)) { $thumbFile = $fileSystem->getFile(MOXMAN_Util_PathUtils::combine($thumbFolderFile->getPath(), $thumbnailPrefix . $subFile->getName())); if ($thumbFile->exists()) { $thumbnails[$thumbFile->getName()] = true; } } } } } $result = (object) array("columns" => array("name", "size", "modified", "attrs", "info"), "config" => $this->getPublicConfig($file), "file" => $this->fileToJson($file, true), "urlFile" => isset($urlFile) ? $this->fileToJson($urlFile, true) : null, "data" => array(), "url" => $file->getUrl(), "thumbnailFolder" => $thumbnailFolder, "thumbnailPrefix" => $thumbnailPrefix, "total" => $files->getCount()); foreach ($files as $subFile) { $attrs = $subFile->isDirectory() ? "d" : "-"; $attrs .= $subFile->canRead() ? "r" : "-"; $attrs .= $subFile->canWrite() ? "w" : "-"; $attrs .= $renameFilter->accept($subFile) ? "r" : "-"; $attrs .= $subFile->isFile() && $editFilter->accept($subFile) ? "e" : "-"; $attrs .= $subFile->isFile() && $viewFilter->accept($subFile) ? "v" : "-"; $attrs .= $subFile->isFile() && MOXMAN_Media_ImageAlter::canEdit($subFile) ? "p" : "-"; $attrs .= isset($thumbnails[$thumbnailPrefix . $subFile->getName()]) ? "t" : "-"; $args = $this->fireCustomInfo(MOXMAN_Vfs_CustomInfoEventArgs::LIST_TYPE, $subFile); $custom = (object) $args->getInfo(); if ($subFile->getPublicLinkPath()) { $custom->link = $subFile->getPublicLinkPath(); } $result->data[] = array($subFile->getName(), $subFile->isDirectory() ? 0 : $subFile->getSize(), $subFile->getLastModified(), $attrs, $custom); } return $result; }