function _processFile($dir, $f, &$xmlStructure) { $filepath = "{$dir}/{$f}"; // $fileURL = "http://".$_SERVER[SERVER_NAME].dirname($_SERVER[SCRIPT_NAME]).substr($dir, 1)."/$f"; // what level are we at? $depth = strlen(preg_replace("/[^\\/]/", "", $dir)); // for directories (including symbolic links) if (is_link($filepath) || is_dir($filepath)) { // we don't examine some certain folders if (preg_match(IGNORE_FOLDERS, $filepath)) { return; } $name = "subfolder"; switch ($depth) { case 1: $name = "group"; break; case 2: $name = "project"; break; } $subnode = $xmlStructure->addChild($name); $subnode->addAttribute("name", $f); $subnode->addAttribute("depth", $depth); $subnode->addAttribute("path", $filepath); // resolve the link if (is_link($filepath)) { $filepath = resolvePath("{$dir}/" . readlink($filepath)); } scanDirectory($filepath, $subnode); // for text contents, e.g. contact } else { if (preg_match("/\\.(txt|md)\$/", $f)) { if (is_readable($filepath)) { $text = trim(file_get_contents($filepath)); if (strlen($text)) { $subnode = $xmlStructure->addChild("text", htmlentities($text)); $subnode->addAttribute("type", preg_replace("/\\.(txt|md)/", "", $f)); } } // content files } else { $subnode = $xmlStructure->addChild("file"); $subnode->addAttribute("path", $filepath); $subnode->addAttribute("name", preg_replace("/\\.[^.]+\$/", "", $f)); } } }
private function getFileexplorerPath($paramName = 'node') { $path = preg_replace("/^\\/fileexplorer/", "", $this->getParam($paramName)); $path = resolvePath(PIMCORE_DOCUMENT_ROOT . $path); if (strpos($path, PIMCORE_DOCUMENT_ROOT) !== 0) { throw new \Exception('operation permitted, permission denied'); } return $path; }
/** * Scan all files from Magento root * * @param $path * @param array $ignorePath * @return array */ function scanFiles($path, $ignorePath = []) { global $sampleDataSource; $results = []; foreach (glob($path . DIRECTORY_SEPARATOR . '*') as $filename) { $target = preg_replace('#^' . preg_quote($sampleDataSource) . "#", '', $filename); if (!in_array(resolvePath($target), $ignorePath)) { $results[] = $filename; if (is_dir($filename)) { $results = array_merge($results, scanFiles($filename, $ignorePath)); } } } return $results; }
protected function addAsset() { $success = false; if (array_key_exists("Filedata", $_FILES)) { $filename = $_FILES["Filedata"]["name"]; $sourcePath = $_FILES["Filedata"]["tmp_name"]; } else { if ($this->getParam("type") == "base64") { $filename = $this->getParam("filename"); $sourcePath = PIMCORE_SYSTEM_TEMP_DIRECTORY . "/upload-base64" . uniqid() . ".tmp"; $data = preg_replace("@^data:[^,]+;base64,@", "", $this->getParam("data")); File::put($sourcePath, base64_decode($data)); } } if ($this->getParam("dir") && $this->getParam("parentId")) { // this is for uploading folders with Drag&Drop // param "dir" contains the relative path of the file $parent = Asset::getById($this->getParam("parentId")); $newPath = $parent->getFullPath() . "/" . trim($this->getParam("dir"), "/ "); // check if the path is outside of the asset directory $newRealPath = PIMCORE_ASSET_DIRECTORY . $newPath; $newRealPath = resolvePath($newRealPath); if (strpos($newRealPath, PIMCORE_ASSET_DIRECTORY) !== 0) { throw new \Exception("not allowed"); } $maxRetries = 5; for ($retries = 0; $retries < $maxRetries; $retries++) { try { $newParent = Asset\Service::createFolderByPath($newPath); break; } catch (\Exception $e) { if ($retries < $maxRetries - 1) { $waitTime = rand(100000, 900000); // microseconds usleep($waitTime); // wait specified time until we restart the transaction } else { // if the transaction still fail after $maxRetries retries, we throw out the exception throw $e; } } } $this->setParam("parentId", $newParent->getId()); } else { if (!$this->getParam("parentId") && $this->getParam("parentPath")) { $parent = Asset::getByPath($this->getParam("parentPath")); if ($parent instanceof Asset\Folder) { $this->setParam("parentId", $parent->getId()); } else { $this->setParam("parentId", 1); } } else { if (!$this->getParam("parentId")) { // set the parent to the root folder $this->setParam("parentId", 1); } } } $filename = File::getValidFilename($filename); if (empty($filename)) { throw new \Exception("The filename of the asset is empty"); } $parentAsset = Asset::getById(intval($this->getParam("parentId"))); // check for duplicate filename $filename = $this->getSafeFilename($parentAsset->getFullPath(), $filename); if ($parentAsset->isAllowed("create")) { if (!is_file($sourcePath) || filesize($sourcePath) < 1) { throw new \Exception("Something went wrong, please check upload_max_filesize and post_max_size in your php.ini and write permissions of /website/var/"); } $asset = Asset::create($this->getParam("parentId"), array("filename" => $filename, "sourcePath" => $sourcePath, "userOwner" => $this->user->getId(), "userModification" => $this->user->getId())); $success = true; @unlink($sourcePath); } else { \Logger::debug("prevented creating asset because of missing permissions, parent asset is " . $parentAsset->getFullPath()); } return array("success" => $success, "asset" => $asset); }
function getSftpListing($directory, $host, $port, $username, $password) { $directory = resolvePath($directory); $dir = $directory; // Parse directory to parts $parsed_dir = trim($dir, '/'); $parts = empty($parsed_dir) ? array() : explode('/', $parsed_dir); // Find the path to the parent directory if (!empty($parts)) { $copy_of_parts = $parts; array_pop($copy_of_parts); if (!empty($copy_of_parts)) { $parent_directory = '/' . implode('/', $copy_of_parts); } else { $parent_directory = '/'; } } else { $parent_directory = ''; } // Initialise $connection = null; $sftphandle = null; // Open a connection if (!function_exists('ssh2_connect')) { return array('error' => AKText::_('SFTP_NO_SSH2')); } $connection = ssh2_connect($host, $port); if ($connection === false) { return array('error' => AKText::_('SFTP_WRONG_USER')); } if (!ssh2_auth_password($connection, $username, $password)) { return array('error' => AKText::_('SFTP_WRONG_USER')); } $sftphandle = ssh2_sftp($connection); if ($sftphandle === false) { return array('error' => AKText::_('SFTP_NO_FTP_SUPPORT')); } // Get a raw directory listing (hoping it's a UNIX server!) $list = array(); $dir = ltrim($dir, '/'); $handle = opendir("ssh2.sftp://{$sftphandle}/{$dir}"); if (!is_resource($handle)) { return array('error' => AKText::_('SFTPBROWSER_ERROR_NOACCESS')); } while (($entry = readdir($handle)) !== false) { if (!is_dir("ssh2.sftp://{$sftphandle}/{$dir}/{$entry}")) { continue; } $list[] = $entry; } closedir($handle); if (!empty($list)) { asort($list); } return array('error' => '', 'list' => $list, 'breadcrumbs' => $parts, 'directory' => $directory, 'parent' => $parent_directory); }
/** * Returns the wwwroot or null string if it was impossible to get. * * @return String wwwroot or null string if it was impossible to get. */ function getWWWRoot($config) { if (isset($config['preview.wwwroot']) && $config['preview.wwwroot']) { return getRealPath($config, 'preview.wwwroot'); } // Check document root if (isset($_SERVER['DOCUMENT_ROOT'])) { return resolvePath($_SERVER['DOCUMENT_ROOT']); } // Try script file if (isset($_SERVER["SCRIPT_NAME"]) && isset($_SERVER["SCRIPT_FILENAME"])) { $path = str_replace(toUnixPath($_SERVER["SCRIPT_NAME"]), "", toUnixPath($_SERVER["SCRIPT_FILENAME"])); if (is_dir($path)) { return toOSPath($path); } } // If all else fails, try this. if (isset($_SERVER["SCRIPT_NAME"]) && isset($_SERVER["PATH_TRANSLATED"])) { $path = str_replace(toUnixPath($_SERVER["SCRIPT_NAME"]), "", str_replace("//", "/", toUnixPath($_SERVER["PATH_TRANSLATED"]))); if (is_dir($path)) { return toOSPath($path); } } die("Could not resolve WWWROOT path, please set an absolute path in preview.wwwroot config option."); return null; }