public function __get($name) { if ($name == "extension") { return "." . General::getExtension($this->file); } if ($name == "mimetype") { return mime_content_type($this->location); } if ($name == "size") { return $this->file->getSize(); } if ($name == "rawname") { return $this->file->getFilename(); } if ($name == "errors") { return $this->errors; } return $this->{$name}; }
private static function __sniffMIMEType($file) { $imageMimeTypes = array('image/gif', 'image/jpg', 'image/jpeg', 'image/png'); if (in_array('image/' . General::getExtension($file), $imageMimeTypes)) { return 'image/' . General::getExtension($file); } return 'unknown'; }
public function processRawFieldData($data, &$status, &$message = null, $simulate = false, $entry_id = null) { $status = self::__OK__; // No file given, save empty data: if ($data === null) { return array('file' => null, 'mimetype' => null, 'size' => null, 'meta' => null); } // Its not an array, so just retain the current data and return: if (is_array($data) === false) { $file = $this->getFilePath(basename($data)); $result = array('file' => $data, 'mimetype' => null, 'size' => null, 'meta' => null); // Grab the existing entry data to preserve the MIME type and size information if (isset($entry_id)) { $row = Symphony::Database()->fetchRow(0, sprintf("SELECT `file`, `mimetype`, `size`, `meta` FROM `tbl_entries_data_%d` WHERE `entry_id` = %d", $this->get('id'), $entry_id)); if (empty($row) === false) { $result = $row; } } // Found the file, add any missing meta information: if (file_exists($file) && is_readable($file)) { if (empty($result['mimetype'])) { $result['mimetype'] = General::getMimeType($file); } if (empty($result['size'])) { $result['size'] = filesize($file); } if (empty($result['meta'])) { $result['meta'] = serialize(self::getMetaInfo($file, $result['mimetype'])); } // The file was not found, or is unreadable: } else { $message = __('The file uploaded is no longer available. Please check that it exists, and is readable.'); $status = self::__INVALID_FIELDS__; } return $result; } if ($simulate && is_null($entry_id)) { return $data; } // Check to see if the entry already has a file associated with it: if (is_null($entry_id) === false) { $row = Symphony::Database()->fetchRow(0, sprintf("SELECT *\n FROM `tbl_entries_data_%s`\n WHERE `entry_id` = %d\n LIMIT 1", $this->get('id'), $entry_id)); $existing_file = isset($row['file']) ? $this->getFilePath($row['file']) : null; // File was removed: if ($data['error'] == UPLOAD_ERR_NO_FILE && !is_null($existing_file) && is_file($existing_file)) { General::deleteFile($existing_file); } } // Do not continue on upload error: if ($data['error'] == UPLOAD_ERR_NO_FILE || $data['error'] != UPLOAD_ERR_OK) { return false; } // Where to upload the new file? $abs_path = DOCROOT . '/' . trim($this->get('destination'), '/'); $rel_path = str_replace('/workspace', '', $this->get('destination')); // Sanitize the filename $data['name'] = Lang::createFilename($data['name']); // If a file already exists, then rename the file being uploaded by // adding `_1` to the filename. If `_1` already exists, the logic // will keep adding 1 until a filename is available (#672) if (file_exists($abs_path . '/' . $data['name'])) { $extension = General::getExtension($data['name']); $new_file = substr($abs_path . '/' . $data['name'], 0, -1 - strlen($extension)); $renamed_file = $new_file; $count = 1; do { $renamed_file = $new_file . '_' . $count . '.' . $extension; $count++; } while (file_exists($renamed_file)); // Extract the name filename from `$renamed_file`. $data['name'] = str_replace($abs_path . '/', '', $renamed_file); } $file = $this->getFilePath($data['name']); // Attempt to upload the file: $uploaded = General::uploadFile($abs_path, $data['name'], $data['tmp_name'], Symphony::Configuration()->get('write_mode', 'file')); if ($uploaded === false) { $message = __('There was an error while trying to upload the file %1$s to the target directory %2$s.', array('<code>' . $data['name'] . '</code>', '<code>workspace/' . ltrim($rel_path, '/') . '</code>')); $status = self::__ERROR_CUSTOM__; return false; } // File has been replaced: if (isset($existing_file) && $existing_file !== $file && is_file($existing_file)) { General::deleteFile($existing_file); } // Get the mimetype, don't trust the browser. RE: #1609 $data['type'] = General::getMimeType($file); return array('file' => basename($file), 'size' => $data['size'], 'mimetype' => $data['type'], 'meta' => serialize(self::getMetaInfo($file, $data['type']))); }
public function run() { // Initialize log if (is_null(Symphony::Log())) { self::__render(new UpdaterPage('missing-log')); } // Get available migrations. This will only contain the migrations // that are applicable to the current install. $migrations = array(); foreach (new DirectoryIterator(INSTALL . '/migrations') as $m) { if ($m->isDot() || $m->isDir() || General::getExtension($m->getFilename()) !== 'php') { continue; } $version = str_replace('.php', '', $m->getFilename()); // Include migration so we can see what the version is include_once $m->getPathname(); $classname = 'migration_' . str_replace('.', '', $version); $m = new $classname(); if (version_compare(Symphony::Configuration()->get('version', 'symphony'), call_user_func(array($m, 'getVersion')), '<')) { $migrations[call_user_func(array($m, 'getVersion'))] = $m; } } // The DirectoryIterator may return files in a sporatic order // on different servers. This will ensure the array is sorted // correctly using `version_compare` uksort($migrations, 'version_compare'); // If there are no applicable migrations then this is up to date if (empty($migrations)) { Symphony::Log()->pushToLog(sprintf('Updater - Already up-to-date'), E_ERROR, true); self::__render(new UpdaterPage('uptodate')); } else { if (!isset($_POST['action']['update'])) { $notes = array(); // Loop over all available migrations showing there // pre update notes. foreach ($migrations as $version => $m) { $n = call_user_func(array($m, 'preUpdateNotes')); if (!empty($n)) { $notes[$version] = $n; } } // Show the update ready page, which will display the // version and release notes of the most recent migration self::__render(new UpdaterPage('ready', array('pre-notes' => $notes, 'version' => call_user_func(array($m, 'getVersion')), 'release-notes' => call_user_func(array($m, 'getReleaseNotes'))))); } else { $notes = array(); $canProceed = true; // Loop over all the available migrations incrementally applying // the upgrades. If any upgrade throws an uncaught exception or // returns false, this will break and the failure page shown foreach ($migrations as $version => $m) { $n = call_user_func(array($m, 'postUpdateNotes')); if (!empty($n)) { $notes[$version] = $n; } $canProceed = call_user_func(array($m, 'run'), 'upgrade', Symphony::Configuration()->get('version', 'symphony')); Symphony::Log()->pushToLog(sprintf('Updater - Migration to %s was %s', $version, $canProceed ? 'successful' : 'unsuccessful'), E_NOTICE, true); if (!$canProceed) { break; } } if (!$canProceed) { self::__render(new UpdaterPage('failure')); } else { self::__render(new UpdaterPage('success', array('post-notes' => $notes, 'version' => call_user_func(array($m, 'getVersion')), 'release-notes' => call_user_func(array($m, 'getReleaseNotes'))))); } } } }
public function getMimeType($file) { if (in_array('image/' . General::getExtension($file), $this->_mimes['image'])) { return 'image/' . General::getExtension($file); } return 'application/octet-stream'; }
private static function __sniffMIMEType($file) { $ext = strtolower(General::getExtension($file)); $imageMimeTypes = array('image/gif', 'image/jpg', 'image/jpeg', 'image/png'); if (General::in_iarray("image/{$ext}", $imageMimeTypes)) { return "image/{$ext}"; } return 'unknown'; }
function listStructureFlat($dir = ".", $filters = array(), $recurse = true, $sort = "asc", $strip_root = NULL, $exclude = array(), $ignore_hidden = true) { $files = array(); if (!($handle = @opendir($dir))) { return array(); } while (($file = @readdir($handle)) != false) { if ($file != '.' && $file != '..' && (!$ignore_hidden || $ignore_hidden && $file[0] != '.')) { if (@is_dir("{$dir}/{$file}")) { if ($recurse) { $files = array_merge($files, General::listStructureFlat("{$dir}/{$file}", $filters, $recurse, $sort, $strip_root, $exclude, $ignore_hidden)); } } else { $can_include = true; if (!empty($filters)) { $can_include = in_array(General::getExtension($file), $filters); } if (!empty($exclude)) { $can_include = !in_array(General::getExtension($file), $exclude); } if ($can_include) { $files[] = array("name" => $file, "path" => $dir); } } } } @closedir($handle); if ($sort == 'desc') { usort($files, array('General', 'fileSortR')); } elseif ($sort == 'mtime') { usort($files, array('General', 'filemtimeSort')); } else { usort($files, array('General', 'fileSort')); } if ($strip_root) { for ($ii = 0; $ii < count($files); $ii++) { $files[$ii]['path'] = str_replace($strip_root, "", $files[$ii]['path']); } } return $files; }
public function processRawFieldData($data, &$status, &$message = null, $simulate = false, $entry_id = NULL) { $status = self::__OK__; //fixes bug where files are deleted, but their database entries are not. if ($data === NULL) { return array('file' => NULL, 'mimetype' => NULL, 'size' => NULL, 'meta' => NULL); } // It's not an array, so just retain the current data and return if (!is_array($data)) { // Ensure the file exists in the `WORKSPACE` directory // @link http://symphony-cms.com/discuss/issues/view/610/ $file = WORKSPACE . preg_replace(array('%/+%', '%(^|/)\\.\\./%'), '/', $data); $result = array('file' => $data, 'mimetype' => NULL, 'size' => NULL, 'meta' => NULL); // Grab the existing entry data to preserve the MIME type and size information if (isset($entry_id) && !is_null($entry_id)) { $row = Symphony::Database()->fetchRow(0, sprintf("SELECT `file`, `mimetype`, `size`, `meta` FROM `tbl_entries_data_%d` WHERE `entry_id` = %d", $this->get('id'), $entry_id)); if (!empty($row)) { $result = $row; } } if (!file_exists($file) || !is_readable($file)) { $message = __('The file uploaded is no longer available. Please check that it exists, and is readable.'); $status = self::__INVALID_FIELDS__; return $result; } else { if (empty($result['mimetype'])) { $result['mimetype'] = function_exists('mime_content_type') ? mime_content_type($file) : 'application/octet-stream'; } if (empty($result['size'])) { $result['size'] = filesize($file); } if (empty($result['meta'])) { $result['meta'] = serialize(self::getMetaInfo($file, $result['mimetype'])); } } return $result; } if ($simulate && is_null($entry_id)) { return $data; } //My special Select box alteration :P //var_dump($_POST['fields']['enhanced_upload_field'][$this->get('element_name')]['directory'],$_POST);die; //var_dump($_POST); // Upload the new file $override_path = $this->get('override') == 'yes' ? $_POST['fields']['enhanced_upload_field'][$this->get('element_name')]['directory'] : trim($this->get('destination')); $abs_path = DOCROOT . $override_path . '/'; $rel_path = str_replace('/workspace', '', $override_path); $existing_file = NULL; if (!is_null($entry_id)) { $row = Symphony::Database()->fetchRow(0, sprintf("SELECT * FROM `tbl_entries_data_%s` WHERE `entry_id` = %d LIMIT 1", $this->get('id'), $entry_id)); $existing_file = '/' . trim($row['file'], '/'); // File was removed if ($data['error'] == UPLOAD_ERR_NO_FILE && !is_null($existing_file) && is_file(WORKSPACE . $existing_file)) { General::deleteFile(WORKSPACE . $existing_file); } } if ($data['error'] == UPLOAD_ERR_NO_FILE || $data['error'] != UPLOAD_ERR_OK) { return false; } // If a file already exists, then rename the file being uploaded by // adding `_1` to the filename. If `_1` already exists, the logic // will keep adding 1 until a filename is available (#672) $new_file = $abs_path . '/' . $data['name']; if (file_exists($new_file)) { $i = 1; $extension = General::getExtension($data['name']); $renamed_file = $new_file; do { $renamed_file = General::left($new_file, -strlen($extension) - 1) . '_' . $i . '.' . $extension; $i++; } while (file_exists($renamed_file)); // Extract the name filename from `$renamed_file`. $data['name'] = str_replace($abs_path . '/', '', $renamed_file); } // Sanitize the filename $data['name'] = Lang::createFilename($data['name']); // Actually upload the file, moving it from PHP's temporary store to the desired destination if (!General::uploadFile($abs_path, $data['name'], $data['tmp_name'], Symphony::Configuration()->get('write_mode', 'file'))) { $message = __('There was an error while trying to upload the file %1$s to the target directory %2$s.', array('<code>' . $data['name'] . '</code>', '<code>workspace/' . ltrim($rel_path, '/') . '</code>')); $status = self::__ERROR_CUSTOM__; return false; } $file = rtrim($rel_path, '/') . '/' . trim($data['name'], '/'); // File has been replaced if (!is_null($existing_file) && strtolower($existing_file) != strtolower($file) && is_file(WORKSPACE . $existing_file)) { General::deleteFile(WORKSPACE . $existing_file); } // If browser doesn't send MIME type (e.g. .flv in Safari) if (strlen(trim($data['type'])) == 0) { $data['type'] = function_exists('mime_content_type') ? mime_content_type($file) : 'application/octet-stream'; } //var_dump($_POST); return array('file' => $file, 'size' => $data['size'], 'mimetype' => $data['type'], 'meta' => serialize(self::getMetaInfo(WORKSPACE . $file, $data['type']))); }
/*** * * Symphony web publishing system * * Copyright 2004–2006 Twenty One Degrees Pty. Ltd. * * @version 1.7 * @licence https://github.com/symphonycms/symphony-1.7/blob/master/LICENCE * ***/ if (!@is_file(WORKSPACE . $_REQUEST['file'])) { General::redirect(URL . "/symphony/?page=/blueprint/assets/new/"); } $Admin->addScriptToHead('assets/editor.js'); $type = General::getExtension($_REQUEST['file']); $GLOBALS['pageTitle'] = 'Assets > ' . basename($_REQUEST['file']); $fields = General::getFileMeta(WORKSPACE . $_REQUEST['file']); $fields["name"] = basename($_REQUEST['file']); $ignore = array("events", "data-sources", "text-formatters", "pages", "masters", "utilities"); $fields["location"] = "/workspace" . dirname($_REQUEST['file']) . "/"; $fields["type"] = $type; $fields["body"] = @file_get_contents(WORKSPACE . $_REQUEST['file']); if (defined("__SYM_ENTRY_MISSINGFIELDS__")) { $Admin->pageAlert("required", array(@implode(", ", $required)), false, 'error'); } $date = $Admin->getDateObj(); if (isset($_GET['_f'])) { switch ($_GET['_f']) { case "saved": $Admin->pageAlert("saved-time", array("Asset", date("h:i:sa", $date->get(true, false))));
public function appendFormattedElement(XMLElement &$wrapper, $data, $encode = false, $mode = null, $entry_id = null) { $data = $this->buildFileItems($data); $field = new XMLElement($this->get('element_name')); foreach ($data as $file_item) { // It is possible an array of NULL data will be passed in. Check for this. if (!is_array($file_item) || !isset($file_item['file']) || is_null($file_item['file'])) { return; } $file = $this->getFilePath(basename($file_item['file'])); $item = new XMLElement('file'); $item->setAttributeArray(array('size' => file_exists($file) && is_readable($file) ? General::formatFilesize(filesize($file)) : 'unknown', 'path' => General::sanitize(str_replace(WORKSPACE, NULL, dirname($file))), 'type' => $file_item['mimetype'], 'extension' => General::getExtension($file))); $item->appendChild(new XMLElement('filename', General::sanitize(basename($file)))); $m = unserialize($file_item['meta']); if (is_array($m) && !empty($m)) { $item->appendChild(new XMLElement('meta', NULL, $m)); } $field->appendChild($item); } $wrapper->appendChild($field); return $wrapper; }
public function processRawFieldData($data, &$status, &$message = null, $simulate = false, $entry_id = null) { $status = self::__OK__; // No file given, save empty data: if ($data === null) { return array('file' => null, 'mimetype' => null, 'size' => null, 'meta' => null); } // Its not an array, so just retain the current data and return: if (is_array($data) === false) { // Ensure the file exists in the `WORKSPACE` directory // @link http://symphony-cms.com/discuss/issues/view/610/ $file = WORKSPACE . preg_replace(array('%/+%', '%(^|/)\\.\\./%'), '/', $data); $result = array('file' => $data, 'mimetype' => null, 'size' => null, 'meta' => null); // Grab the existing entry data to preserve the MIME type and size information if (isset($entry_id)) { $row = Symphony::Database()->fetchRow(0, sprintf("SELECT `file`, `mimetype`, `size`, `meta` FROM `tbl_entries_data_%d` WHERE `entry_id` = %d", $this->get('id'), $entry_id)); if (empty($row) === false) { $result = $row; } } // Found the file, add any missing meta information: if (file_exists($file) && is_readable($file)) { if (empty($result['mimetype'])) { $result['mimetype'] = function_exists('mime_content_type') ? mime_content_type($file) : 'application/octet-stream'; } if (empty($result['size'])) { $result['size'] = filesize($file); } if (empty($result['meta'])) { $result['meta'] = serialize(self::getMetaInfo($file, $result['mimetype'])); } } else { $message = __('The file uploaded is no longer available. Please check that it exists, and is readable.'); $status = self::__INVALID_FIELDS__; } return $result; } if ($simulate && is_null($entry_id)) { return $data; } // Check to see if the entry already has a file associated with it: if (is_null($entry_id) === false) { $row = Symphony::Database()->fetchRow(0, sprintf("SELECT * FROM `tbl_entries_data_%s` WHERE `entry_id` = %d LIMIT 1", $this->get('id'), $entry_id)); $existing_file = '/' . trim($row['file'], '/'); // File was removed: if ($data['error'] == UPLOAD_ERR_NO_FILE && !is_null($existing_file) && is_file(WORKSPACE . $existing_file)) { General::deleteFile(WORKSPACE . $existing_file); } } // Do not continue on upload error: if ($data['error'] == UPLOAD_ERR_NO_FILE || $data['error'] != UPLOAD_ERR_OK) { return false; } // Where to upload the new file? $abs_path = DOCROOT . '/' . trim($this->get('destination'), '/'); $rel_path = str_replace('/workspace', '', $this->get('destination')); // If a file already exists, then rename the file being uploaded by // adding `_1` to the filename. If `_1` already exists, the logic // will keep adding 1 until a filename is available (#672) if (file_exists($abs_path . '/' . $data['name'])) { $extension = General::getExtension($data['name']); $new_file = substr($abs_path . '/' . $data['name'], 0, -1 - strlen($extension)); $renamed_file = $new_file; $count = 1; do { $renamed_file = $new_file . '_' . $count . '.' . $extension; $count++; } while (file_exists($renamed_file)); // Extract the name filename from `$renamed_file`. $data['name'] = str_replace($abs_path . '/', '', $renamed_file); } // Sanitize the filename $data['name'] = Lang::createFilename($data['name']); $file = rtrim($rel_path, '/') . '/' . trim($data['name'], '/'); // Attempt to upload the file: $uploaded = General::uploadFile($abs_path, $data['name'], $data['tmp_name'], Symphony::Configuration()->get('write_mode', 'file')); if ($uploaded === false) { $message = __('There was an error while trying to upload the file %1$s to the target directory %2$s.', array('<code>' . $data['name'] . '</code>', '<code>workspace/' . ltrim($rel_path, '/') . '</code>')); $status = self::__ERROR_CUSTOM__; return false; } // File has been replaced: if (isset($existing_file) && strtolower($existing_file) != strtolower($file) && is_file(WORKSPACE . $existing_file)) { General::deleteFile(WORKSPACE . $existing_file); } // If browser doesn't send MIME type (e.g. .flv in Safari) if (strlen(trim($data['type'])) == 0) { $data['type'] = function_exists('mime_content_type') ? mime_content_type($file) : 'application/octet-stream'; } return array('file' => $file, 'size' => $data['size'], 'mimetype' => $data['type'], 'meta' => serialize(self::getMetaInfo(WORKSPACE . $file, $data['type']))); }