diff --git a/ChangeLog b/ChangeLog index 7a29eaaba..200f35e7d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,7 +3,7 @@ phpMyAdmin - ChangeLog ---------------------- $Id$ -$HeadURL$ +$HeadURL: https://phpmyadmin.svn.sourceforge.net/svnroot/phpmyadmin/trunk/phpMyAdmin/ChangeLog $ + [import] support handling of DELIMITER to mimic mysql CLI, thanks to fb1 - bug #1674914 [structure] changing definition of a TIMESTAMP field diff --git a/config.sample.inc.php b/config.sample.inc.php index 1fb577399..161a31f58 100644 --- a/config.sample.inc.php +++ b/config.sample.inc.php @@ -1,60 +1,60 @@ -. - */ - -/* - * This is needed for cookie based authentication to encrypt password in - * cookie - */ -$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */ - -/* - * Servers configuration - */ -$i = 0; - -/* - * First server - */ -$i++; -/* Authentication type */ -$cfg['Servers'][$i]['auth_type'] = 'cookie'; -/* Server parameters */ -$cfg['Servers'][$i]['host'] = 'localhost'; -$cfg['Servers'][$i]['connect_type'] = 'tcp'; -$cfg['Servers'][$i]['compress'] = false; -/* Select mysqli if your server has it */ -$cfg['Servers'][$i]['extension'] = 'mysql'; -/* User for advanced features */ -// $cfg['Servers'][$i]['controluser'] = 'pma'; -// $cfg['Servers'][$i]['controlpass'] = 'pmapass'; -/* Advanced phpMyAdmin features */ -// $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin'; -// $cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark'; -// $cfg['Servers'][$i]['relation'] = 'pma_relation'; -// $cfg['Servers'][$i]['table_info'] = 'pma_table_info'; -// $cfg['Servers'][$i]['table_coords'] = 'pma_table_coords'; -// $cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages'; -// $cfg['Servers'][$i]['column_info'] = 'pma_column_info'; -// $cfg['Servers'][$i]['history'] = 'pma_history'; -// $cfg['Servers'][$i]['designer_coords'] = 'pma_designer_coords'; - -/* - * End of servers configuration - */ - -/* - * Directories for saving/loading files from server - */ -$cfg['UploadDir'] = ''; -$cfg['SaveDir'] = ''; - -?> +. + */ + +/* + * This is needed for cookie based authentication to encrypt password in + * cookie + */ +$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */ + +/* + * Servers configuration + */ +$i = 0; + +/* + * First server + */ +$i++; +/* Authentication type */ +$cfg['Servers'][$i]['auth_type'] = 'cookie'; +/* Server parameters */ +$cfg['Servers'][$i]['host'] = 'localhost'; +$cfg['Servers'][$i]['connect_type'] = 'tcp'; +$cfg['Servers'][$i]['compress'] = false; +/* Select mysqli if your server has it */ +$cfg['Servers'][$i]['extension'] = 'mysql'; +/* User for advanced features */ +// $cfg['Servers'][$i]['controluser'] = 'pma'; +// $cfg['Servers'][$i]['controlpass'] = 'pmapass'; +/* Advanced phpMyAdmin features */ +// $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin'; +// $cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark'; +// $cfg['Servers'][$i]['relation'] = 'pma_relation'; +// $cfg['Servers'][$i]['table_info'] = 'pma_table_info'; +// $cfg['Servers'][$i]['table_coords'] = 'pma_table_coords'; +// $cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages'; +// $cfg['Servers'][$i]['column_info'] = 'pma_column_info'; +// $cfg['Servers'][$i]['history'] = 'pma_history'; +// $cfg['Servers'][$i]['designer_coords'] = 'pma_designer_coords'; + +/* + * End of servers configuration + */ + +/* + * Directories for saving/loading files from server + */ +$cfg['UploadDir'] = ''; +$cfg['SaveDir'] = ''; + +?> diff --git a/libraries/PMA_File.class.php b/libraries/PMA_File.class.php index 6c212da80..098cac9d8 100644 --- a/libraries/PMA_File.class.php +++ b/libraries/PMA_File.class.php @@ -1,507 +1,835 @@ -__construct($name); - } - - /** - * constructor - * - * @access public - * @uses PMA_File::setName() - * @param string $name file name - */ - function __construct($name = false) - { - if ($name) { - $this->setName($name); - } - } - - /** - * destructor - * - * @see PMA_File::cleanUp() - * @uses PMA_File::cleanUp() - */ - function __destruct() - { - $this->cleanUp(); - } - - /** - * deletes temp file from upload - */ - function cleanUp() - { - if ($this->isTemp()) { - return $this->delete(); - } - - return true; - } - - /** - * deletes the file - * - * @uses PMA_File::getName() - * @uses unlink() - * @return boolean success - */ - function delete() - { - return unlink($this->getName()); - } - - /** - * checks or sets the temp flag for this file - * file objects with temp flags are deleted with object destruction - * - * @uses PMA_File::$_is_temp to set and read it - * @param boolean sets the temp flag - * @return boolean PMA_File::$_is_temp - */ - function isTemp($is_temp = null) - { - if (null !== $is_temp) { - $this->_is_temp = (bool) $is_temp; - } - - return $this->_is_temp; - } - - /** - * accessor - * - * @uses PMA_File::$_name - * @param string $name file name - * @access public - */ - function setName($name) - { - $this->_name = trim($name); - } - - /** - * @access public - * @uses PMA_File::getName() - * @uses PMA_File::isUploaded() - * @uses PMA_File::checkUploadedFile() - * @uses PMA_File::isReadable() - * @uses PMA_File::$_content - * @uses function_exists() - * @uses file_get_contents() - * @uses filesize() - * @uses fread() - * @uses fopen() - * @uses bin2hex() - * @return string binary file content - */ - function getContent() - { - if (null !== $this->_content) { - return $this->_content; - } - - if ($this->isUploaded() && ! $this->checkUploadedFile()) { - return false; - } - - if (! $this->isReadable()) { - return false; - } - - // check if file is not empty - if (function_exists('file_get_contents')) { - $this->_content = file_get_contents($this->getName()); - } elseif ($size = filesize($this->getName())) { - $this->_content = fread(fopen($this->getName(), 'rb'), $size); - } - - if (! empty($this->_content)) { - $this->_content = '0x' . bin2hex($this->_content); - } - - return $this->_content; - } - - /** - * @uses PMA_File::getName() - * @uses is_uploaded_file() - */ - function isUploaded() - { - return is_uploaded_file($this->getName()); - } - - /** - * accessor - * - * @uses PMA_File::$name as return value - * @return string PMA_File::$_name - */ - function getName() - { - return $this->_name; - } - - /** - * @todo replace error message with localized string - * @uses PMA_File::isUploaded() - * @uses PMA_File::setName() - * @uses PMA_File::$_error_message - * @param string name of file uploaded - * @return boolean success - */ - function setUploadedFile($name) - { - $this->setName($name); - - if (! $this->isUploaded()) { - $this->setName(null); - $this->_error_message = 'not an uploaded file'; - return false; - } - - return true; - } - - /** - * @uses PMA_File::fetchUploadedFromTblChangeRequestMultiple() - * @uses PMA_File::setUploadedFile() - * @uses PMA_File::$_error_message - * @uses $GLOBALS['strUploadErrorIniSize'] - * @uses $GLOBALS['strUploadErrorFormSize'] - * @uses $GLOBALS['strUploadErrorPartial'] - * @uses $GLOBALS['strUploadErrorNoTempDir'] - * @uses $GLOBALS['strUploadErrorCantWrite'] - * @uses $GLOBALS['strUploadErrorExtension'] - * @uses $GLOBALS['strUploadErrorUnknown'] - * @uses $_FILES - * @param string $key a numeric key used to identify the different rows - * @param string $primary_key - * @return boolean success - */ - function setUploadedFromTblChangeRequest($key, $primary = null) - { - if (! isset($_FILES['fields_upload_' . $key])) { - return false; - } - - $file = $_FILES['fields_upload_' . $key]; - if (null !== $primary) { - $file = PMA_File::fetchUploadedFromTblChangeRequestMultiple($file, $primary); - } - - // check for file upload errors - switch ($file['error']) { - // cybot_tm: we do not use the PHP constants here cause not all constants - // are defined in all versions of PHP - but the correct constants names - // are given as comment - case 0: //UPLOAD_ERR_OK: - return $this->setUploadedFile($file['tmp_name']); - break; - case 4: //UPLOAD_ERR_NO_FILE: - break; - case 1: //UPLOAD_ERR_INI_SIZE: - $this->_error_message = $GLOBALS['strUploadErrorIniSize']; - break; - case 2: //UPLOAD_ERR_FORM_SIZE: - $this->_error_message = $GLOBALS['strUploadErrorFormSize']; - break; - case 3: //UPLOAD_ERR_PARTIAL: - $this->_error_message = $GLOBALS['strUploadErrorPartial']; - break; - case 6: //UPLOAD_ERR_NO_TMP_DIR: - $this->_error_message = $GLOBALS['strUploadErrorNoTempDir']; - break; - case 7: //UPLOAD_ERR_CANT_WRITE: - $this->_error_message = $GLOBALS['strUploadErrorCantWrite']; - break; - case 8: //UPLOAD_ERR_EXTENSION: - $this->_error_message = $GLOBALS['strUploadErrorExtension']; - break; - default: - $this->_error_message = $GLOBALS['strUploadErrorUnknown']; - } // end switch - - return false; - } - - /** - * strips some dimension from the multi-dimensional array from $_FILES - * - * - * $file['name']['multi_edit'][$primary] = [value] - * $file['type']['multi_edit'][$primary] = [value] - * $file['size']['multi_edit'][$primary] = [value] - * $file['tmp_name']['multi_edit'][$primary] = [value] - * $file['error']['multi_edit'][$primary] = [value] - * - * // becomes: - * - * $file['name'] = [value] - * $file['type'] = [value] - * $file['size'] = [value] - * $file['tmp_name'] = [value] - * $file['error'] = [value] - * - * - * @todo re-check if requirements changes to PHP >= 4.2.0 - * @param array $file the array - * @param string $primary - * @return array - */ - function fetchUploadedFromTblChangeRequestMultiple($file, $primary) - { - $new_file = array( - 'name' => $file['name']['multi_edit'][$primary], - 'type' => $file['type']['multi_edit'][$primary], - 'size' => $file['size']['multi_edit'][$primary], - 'tmp_name' => $file['tmp_name']['multi_edit'][$primary], - //'error' => $file['error']['multi_edit'][$primary], - ); - - // ['error'] exists since PHP 4.2.0 - if (isset($file['error'])) { - $new_file['error'] = $file['error']['multi_edit'][$primary]; - } - - return $new_file; - } - - /** - * sets the name if the file to the one selected in the tbl_change form - * - * @uses $_REQUEST - * @uses PMA_File::setLocalSelectedFile() - * @uses is_string() - * @param string $key a numeric key used to identify the different rows - * @param string $primary_key - * @return boolean success - */ - function setSelectedFromTblChangeRequest($key, $primary = null) - { - if (null !== $primary) { - if (! empty($_REQUEST['fields_uploadlocal_' . $key]['multi_edit'][$primary]) - && is_string($_REQUEST['fields_uploadlocal_' . $key]['multi_edit'][$primary])) { - // ... whether with multiple rows ... - return $this->setLocalSelectedFile($_REQUEST['fields_uploadlocal_' . $key]['multi_edit'][$primary]); - } else { - return false; - } - } elseif (! empty($_REQUEST['fields_uploadlocal_' . $key]) - && is_string($_REQUEST['fields_uploadlocal_' . $key])) { - return $this->setLocalSelectedFile($_REQUEST['fields_uploadlocal_' . $key]); - } - - return false; - } - - /** - * @uses PMA_File->$_error_message as return value - * @return string error message - */ - function getError() - { - return $this->_error_message; - } - - /** - * @uses PMA_File->$_error_message to check it - * @return boolean whether an error occured or not - */ - function isError() - { - return ! empty($this->_error_message); - } - - /** - * chacks the supergloabls provided if the tbl_change form is submitted - * and uses the submitted/selected file - * - * @uses PMA_File::setUploadedFromTblChangeRequest() - * @uses PMA_File::setSelectedFromTblChangeRequest() - * @param string $key a numeric key used to identify the different rows - * @param string $primary_key - * @return boolean success - */ - function checkTblChangeForm($key, $primary_key) - { - if ($this->setUploadedFromTblChangeRequest($key, $primary_key)) { - // well done ... - return true; - } elseif ($this->setUploadedFromTblChangeRequest($key)) { - // well done ... - return true; - } elseif ($this->setSelectedFromTblChangeRequest($key, $primary_key)) { - // well done ... - return true; - } elseif ($this->setSelectedFromTblChangeRequest($key)) { - // well done ... - return true; - } - // all failed, whether just no file uploaded/selected or an error - - return false; - } - - /** - * - * @uses PMA_File::setName() - * @uses preg_replace() - * @uses PMA_userDir() - * @uses $GLOBALS['cfg']['UploadDir'] - * @param string $name - */ - function setLocalSelectedFile($name) - { - $this->setName(PMA_userDir($GLOBALS['cfg']['UploadDir']) . preg_replace('@\.\.*@', '.', $name)); - } - - /** - * @uses PMA_File::getName() - * @uses is_readable() - * @uses ob_start() - * @uses ob_end_clean() - * @return boolean whether the file is readable or not - */ - function isReadable() - { - // surprees warnings form beeing displayed, but not from beeing logged - // any file access outside of open_basedir will issue a warning - ob_start(); - $is_readable = is_readable($this->getName()); - ob_end_clean(); - return $is_readable; - } - - /** - * If we are on a server with open_basedir, we must move the file - * before opening it. The FAQ 1.11 explains how to create the "./tmp" - * directory - if needed - * - * @todo replace error message with localized string - * @todo move check of $cfg['TempDir'] into PMA_Config? - * @uses $cfg['TempDir'] - * @uses $GLOBALS['strFieldInsertFromFileTempDirNotExists'] - * @uses PMA_File::isReadable() - * @uses PMA_File::getName() - * @uses PMA_File::setName() - * @uses PMA_File::isTemp() - * @uses PMA_File::$_error_message - * @uses is_dir() - * @uses mkdir() - * @uses chmod() - * @uses is_writable() - * @uses basename() - * @uses move_uploaded_file() - * @uses ob_start() - * @uses ob_end_clean() - * @return boolean whether uploaded fiel is fine or not - */ - function checkUploadedFile() - { - if ($this->isReadable()) { - return true; - } - - /** - * it is not important if open_basedir is set - we just cannot read the file - * so we try to move it - if ('' != ini_get('open_basedir')) { - */ - - // check tmp dir config - if (empty($GLOBALS['cfg']['TempDir'])) { - $GLOBALS['cfg']['TempDir'] = 'tmp/'; - } - - // surprees warnings form beeing displayed, but not from beeing logged - ob_start(); - // check tmp dir - if (! is_dir($GLOBALS['cfg']['TempDir'])) { - // try to create the tmp directory - if (@mkdir($GLOBALS['cfg']['TempDir'], 0777)) { - chmod($GLOBALS['cfg']['TempDir'], 0777); - } else { - // create tmp dir failed - $this->_error_message = $GLOBALS['strFieldInsertFromFileTempDirNotExists']; - ob_end_clean(); - return false; - } - } - ob_end_clean(); - - if (! is_writable($GLOBALS['cfg']['TempDir'])) { - // cannot create directory or access, point user to FAQ 1.11 - $this->_error_message = $GLOBALS['strFieldInsertFromFileTempDirNotExists']; - return false; - } - - $new_file_to_upload = $GLOBALS['cfg']['TempDir'] . '/' . basename($this->getName()); - - // surprees warnings form beeing displayed, but not from beeing logged - // any file access outside of open_basedir will issue a warning - ob_start(); - $move_uploaded_file_result = move_uploaded_file($this->getName(), $new_file_to_upload); - ob_end_clean(); - if (! $move_uploaded_file_result) { - $this->_error_message = 'error while moving uploaded file'; - return false; - } - - $this->setName($new_file_to_upload); - $this->isTemp(true); - - if (! $this->isReadable()) { - $this->_error_message = 'cannot read (moved) upload file'; - return false; - } - - return true; - } -} +__construct($name); + } + + /** + * constructor + * + * @access public + * @uses PMA_File::setName() + * @param string $name file name + */ + function __construct($name = false) + { + if ($name) { + $this->setName($name); + } + } + + /** + * destructor + * + * @see PMA_File::cleanUp() + * @access public + * @uses PMA_File::cleanUp() + */ + function __destruct() + { + $this->cleanUp(); + } + + /** + * deletes file if it is temporary, usally from a moved upload file + * + * @access public + * @uses PMA_File::delet() + * @uses PMA_File::isTemp() + * @return boolean success + */ + function cleanUp() + { + if ($this->isTemp()) { + return $this->delete(); + } + + return true; + } + + /** + * deletes the file + * + * @access public + * @uses PMA_File::getName() + * @uses unlink() + * @return boolean success + */ + function delete() + { + return unlink($this->getName()); + } + + /** + * checks or sets the temp flag for this file + * file objects with temp flags are deleted with object destruction + * + * @access public + * @uses PMA_File::$_is_temp to set and read it + * @param boolean sets the temp flag + * @return boolean PMA_File::$_is_temp + */ + function isTemp($is_temp = null) + { + if (null !== $is_temp) { + $this->_is_temp = (bool) $is_temp; + } + + return $this->_is_temp; + } + + /** + * accessor + * + * @access public + * @uses PMA_File::$_name + * @param string $name file name + * @access public + */ + function setName($name) + { + $this->_name = trim($name); + } + + /** + * @access public + * @uses PMA_File::getName() + * @uses PMA_File::isUploaded() + * @uses PMA_File::checkUploadedFile() + * @uses PMA_File::isReadable() + * @uses PMA_File::$_content + * @uses function_exists() + * @uses file_get_contents() + * @uses filesize() + * @uses fread() + * @uses fopen() + * @uses bin2hex() + * @return string binary file content + */ + function getContent($as_binary = true, $offset = 0, $length = null) + { + if (null === $this->_content) { + if ($this->isUploaded() && ! $this->checkUploadedFile()) { + return false; + } + + if (! $this->isReadable()) { + return false; + } + + if (function_exists('file_get_contents')) { + $this->_content = file_get_contents($this->getName()); + } elseif ($size = filesize($this->getName())) { + $this->_content = fread(fopen($this->getName(), 'rb'), $size); + } + } + + if (! empty($this->_content) && $as_binary) { + return '0x' . bin2hex($this->_content); + } + + if (null !== $length) { + return substr($this->_content, $offset, $length); + } elseif ($offset > 0) { + return substr($this->_content, $offset); + } + + return $this->_content; + } + + /** + * @access public + * @uses PMA_File::getName() + * @uses is_uploaded_file() + */ + function isUploaded() + { + return is_uploaded_file($this->getName()); + } + + /** + * accessor + * + * @access public + * @uses PMA_File::$name as return value + * @return string PMA_File::$_name + */ + function getName() + { + return $this->_name; + } + + /** + * @todo replace error message with localized string + * @access public + * @uses PMA_File::isUploaded() + * @uses PMA_File::setName() + * @uses PMA_File::$_error_message + * @param string name of file uploaded + * @return boolean success + */ + function setUploadedFile($name) + { + $this->setName($name); + + if (! $this->isUploaded()) { + $this->setName(null); + $this->_error_message = 'not an uploaded file'; + return false; + } + + return true; + } + + /** + * @access public + * @uses PMA_File::fetchUploadedFromTblChangeRequestMultiple() + * @uses PMA_File::setUploadedFile() + * @uses PMA_File::$_error_message + * @uses $GLOBALS['strUploadErrorIniSize'] + * @uses $GLOBALS['strUploadErrorFormSize'] + * @uses $GLOBALS['strUploadErrorPartial'] + * @uses $GLOBALS['strUploadErrorNoTempDir'] + * @uses $GLOBALS['strUploadErrorCantWrite'] + * @uses $GLOBALS['strUploadErrorExtension'] + * @uses $GLOBALS['strUploadErrorUnknown'] + * @uses $_FILES + * @param string $key a numeric key used to identify the different rows + * @param string $primary_key + * @return boolean success + */ + function setUploadedFromTblChangeRequest($key, $primary = null) + { + if (! isset($_FILES['fields_upload_' . $key])) { + return false; + } + + $file = $_FILES['fields_upload_' . $key]; + if (null !== $primary) { + $file = PMA_File::fetchUploadedFromTblChangeRequestMultiple($file, $primary); + } + + // check for file upload errors + switch ($file['error']) { + // cybot_tm: we do not use the PHP constants here cause not all constants + // are defined in all versions of PHP - but the correct constants names + // are given as comment + case 0: //UPLOAD_ERR_OK: + return $this->setUploadedFile($file['tmp_name']); + break; + case 4: //UPLOAD_ERR_NO_FILE: + break; + case 1: //UPLOAD_ERR_INI_SIZE: + $this->_error_message = $GLOBALS['strUploadErrorIniSize']; + break; + case 2: //UPLOAD_ERR_FORM_SIZE: + $this->_error_message = $GLOBALS['strUploadErrorFormSize']; + break; + case 3: //UPLOAD_ERR_PARTIAL: + $this->_error_message = $GLOBALS['strUploadErrorPartial']; + break; + case 6: //UPLOAD_ERR_NO_TMP_DIR: + $this->_error_message = $GLOBALS['strUploadErrorNoTempDir']; + break; + case 7: //UPLOAD_ERR_CANT_WRITE: + $this->_error_message = $GLOBALS['strUploadErrorCantWrite']; + break; + case 8: //UPLOAD_ERR_EXTENSION: + $this->_error_message = $GLOBALS['strUploadErrorExtension']; + break; + default: + $this->_error_message = $GLOBALS['strUploadErrorUnknown']; + } // end switch + + return false; + } + + /** + * strips some dimension from the multi-dimensional array from $_FILES + * + * + * $file['name']['multi_edit'][$primary] = [value] + * $file['type']['multi_edit'][$primary] = [value] + * $file['size']['multi_edit'][$primary] = [value] + * $file['tmp_name']['multi_edit'][$primary] = [value] + * $file['error']['multi_edit'][$primary] = [value] + * + * // becomes: + * + * $file['name'] = [value] + * $file['type'] = [value] + * $file['size'] = [value] + * $file['tmp_name'] = [value] + * $file['error'] = [value] + * + * + * @todo re-check if requirements changes to PHP >= 4.2.0 + * @access public + * @static + * @param array $file the array + * @param string $primary + * @return array + */ + function fetchUploadedFromTblChangeRequestMultiple($file, $primary) + { + $new_file = array( + 'name' => $file['name']['multi_edit'][$primary], + 'type' => $file['type']['multi_edit'][$primary], + 'size' => $file['size']['multi_edit'][$primary], + 'tmp_name' => $file['tmp_name']['multi_edit'][$primary], + //'error' => $file['error']['multi_edit'][$primary], + ); + + // ['error'] exists since PHP 4.2.0 + if (isset($file['error'])) { + $new_file['error'] = $file['error']['multi_edit'][$primary]; + } + + return $new_file; + } + + /** + * sets the name if the file to the one selected in the tbl_change form + * + * @access public + * @uses $_REQUEST + * @uses PMA_File::setLocalSelectedFile() + * @uses is_string() + * @param string $key a numeric key used to identify the different rows + * @param string $primary_key + * @return boolean success + */ + function setSelectedFromTblChangeRequest($key, $primary = null) + { + if (null !== $primary) { + if (! empty($_REQUEST['fields_uploadlocal_' . $key]['multi_edit'][$primary]) + && is_string($_REQUEST['fields_uploadlocal_' . $key]['multi_edit'][$primary])) { + // ... whether with multiple rows ... + return $this->setLocalSelectedFile($_REQUEST['fields_uploadlocal_' . $key]['multi_edit'][$primary]); + } else { + return false; + } + } elseif (! empty($_REQUEST['fields_uploadlocal_' . $key]) + && is_string($_REQUEST['fields_uploadlocal_' . $key])) { + return $this->setLocalSelectedFile($_REQUEST['fields_uploadlocal_' . $key]); + } + + return false; + } + + /** + * @access public + * @uses PMA_File->$_error_message as return value + * @return string error message + */ + function getError() + { + return $this->_error_message; + } + + /** + * @access public + * @uses PMA_File->$_error_message to check it + * @return boolean whether an error occured or not + */ + function isError() + { + return ! empty($this->_error_message); + } + + /** + * checks the superglobals provided if the tbl_change form is submitted + * and uses the submitted/selected file + * + * @access public + * @uses PMA_File::setUploadedFromTblChangeRequest() + * @uses PMA_File::setSelectedFromTblChangeRequest() + * @param string $key a numeric key used to identify the different rows + * @param string $primary_key + * @return boolean success + */ + function checkTblChangeForm($key, $primary_key) + { + if ($this->setUploadedFromTblChangeRequest($key, $primary_key)) { + // well done ... + return true; + } elseif ($this->setUploadedFromTblChangeRequest($key)) { + // well done ... + return true; + } elseif ($this->setSelectedFromTblChangeRequest($key, $primary_key)) { + // well done ... + return true; + } elseif ($this->setSelectedFromTblChangeRequest($key)) { + // well done ... + return true; + } + // all failed, whether just no file uploaded/selected or an error + + return false; + } + + /** + * + * @access public + * @uses $GLOBALS['strFileCouldNotBeRead'] + * @uses PMA_File::setName() + * @uses PMA_securePath() + * @uses PMA_userDir() + * @uses $GLOBALS['cfg']['UploadDir'] + * @param string $name + * @return boolean success + */ + function setLocalSelectedFile($name) + { + $this->setName(PMA_userDir($GLOBALS['cfg']['UploadDir']) . PMA_securePath($name)); + if (! $this->isReadable()) { + $this->_error_message = $GLOBALS['strFileCouldNotBeRead']; + $this->setName(null); + return false; + } + + return true; + } + + /** + * @access public + * @uses PMA_File::getName() + * @uses is_readable() + * @uses ob_start() + * @uses ob_end_clean() + * @return boolean whether the file is readable or not + */ + function isReadable() + { + // surpress warnings from beeing displayed, but not from beeing logged + // any file access outside of open_basedir will issue a warning + ob_start(); + $is_readable = is_readable($this->getName()); + ob_end_clean(); + return $is_readable; + } + + /** + * If we are on a server with open_basedir, we must move the file + * before opening it. The FAQ 1.11 explains how to create the "./tmp" + * directory - if needed + * + * @todo replace error message with localized string + * @todo move check of $cfg['TempDir'] into PMA_Config? + * @access public + * @uses $cfg['TempDir'] + * @uses $GLOBALS['strFieldInsertFromFileTempDirNotExists'] + * @uses PMA_File::isReadable() + * @uses PMA_File::getName() + * @uses PMA_File::setName() + * @uses PMA_File::isTemp() + * @uses PMA_File::$_error_message + * @uses is_dir() + * @uses mkdir() + * @uses chmod() + * @uses is_writable() + * @uses basename() + * @uses move_uploaded_file() + * @uses ob_start() + * @uses ob_end_clean() + * @return boolean whether uploaded fiel is fine or not + */ + function checkUploadedFile() + { + if ($this->isReadable()) { + return true; + } + + /** + * it is not important if open_basedir is set - we just cannot read the file + * so we try to move it + if ('' != ini_get('open_basedir')) { + */ + + // check tmp dir config + if (empty($GLOBALS['cfg']['TempDir'])) { + $GLOBALS['cfg']['TempDir'] = 'tmp/'; + } + + // surpress warnings from beeing displayed, but not from beeing logged + ob_start(); + // check tmp dir + if (! is_dir($GLOBALS['cfg']['TempDir'])) { + // try to create the tmp directory + if (@mkdir($GLOBALS['cfg']['TempDir'], 0777)) { + chmod($GLOBALS['cfg']['TempDir'], 0777); + } else { + // create tmp dir failed + $this->_error_message = $GLOBALS['strFieldInsertFromFileTempDirNotExists']; + ob_end_clean(); + return false; + } + } + ob_end_clean(); + + if (! is_writable($GLOBALS['cfg']['TempDir'])) { + // cannot create directory or access, point user to FAQ 1.11 + $this->_error_message = $GLOBALS['strFieldInsertFromFileTempDirNotExists']; + return false; + } + + $new_file_to_upload = $GLOBALS['cfg']['TempDir'] . '/' . basename($this->getName()); + + // surpress warnings from beeing displayed, but not from beeing logged + // any file access outside of open_basedir will issue a warning + ob_start(); + $move_uploaded_file_result = move_uploaded_file($this->getName(), $new_file_to_upload); + ob_end_clean(); + if (! $move_uploaded_file_result) { + $this->_error_message = 'error while moving uploaded file'; + return false; + } + + $this->setName($new_file_to_upload); + $this->isTemp(true); + + if (! $this->isReadable()) { + $this->_error_message = 'cannot read (moved) upload file'; + return false; + } + + return true; + } + + /** + * Detects what compression filse uses + * + * @todo move file read part into readChunk() or getChunk() + * @todo add support for compression plugins + * @uses $GLOBALS['strFileCouldNotBeRead'] + * @uses PMA_File::$_compression to set it + * @uses PMA_File::getName() + * @uses fopen() + * @uses fread() + * @uses strlen() + * @uses fclose() + * @uses chr() + * @uses substr() + * @access protected + * @return string MIME type of compression, none for none + */ + function _detectCompression() + { + // surpress warnings from beeing displayed, but not from beeing logged + // f.e. any file access outside of open_basedir will issue a warning + ob_start(); + $file = fopen($this->getName(), 'rb'); + ob_end_clean(); + + if (! $file) { + $this->_error_message = $GLOBALS['strFileCouldNotBeRead']; + return false; + } + + /** + * @todo + * get registered plugins for file compression + + foreach (PMA_getPlugins($type = 'compression') as $plugin) { + if (call_user_func_array(array($plugin['classname'], 'canHandle'), array($this->getName()))) { + $this->setCompressionPlugin($plugin); + break; + } + } + */ + + $test = fread($file, 4); + $len = strlen($test); + fclose($file); + + if ($len >= 2 && $test[0] == chr(31) && $test[1] == chr(139)) { + $this->_compression = 'application/gzip'; + } elseif ($len >= 3 && substr($test, 0, 3) == 'BZh') { + $this->_compression = 'application/bzip2'; + } elseif ($len >= 4 && $test == "PK\003\004") { + $this->_compression = 'application/zip'; + } + + $this->_compression = 'none'; + return $this->_compression; + } + + /** + * whether the content should be decompressed before returned + */ + function setDecompressContent($decompress) + { + $this->_decompress = (bool) $decompress; + } + + function getHandle() + { + return $this->_handle; + } + + function setHandle($handle) + { + $this->_handle = $handle; + } + + /** + * + */ + function open() + { + if (! $this->_decompress) { + $this->_handle = @fopen($this->getName(), 'r'); + } + + switch ($this->getCompression()) { + case false: + return false; + case 'application/bzip2': + if ($GLOBALS['cfg']['BZipDump'] && @function_exists('bzopen')) { + $this->_handle = @bzopen($this->getName(), 'r'); + } else { + $this->_error_message = sprintf($GLOBALS['strUnsupportedCompressionDetected'], $this->getCompression()); + return false; + } + break; + case 'application/gzip': + if ($GLOBALS['cfg']['GZipDump'] && @function_exists('gzopen')) { + $this->_handle = @gzopen($this->getName(), 'r'); + } else { + $this->_error_message = sprintf($GLOBALS['strUnsupportedCompressionDetected'], $this->getCompression()); + return false; + } + break; + case 'application/zip': + if ($GLOBALS['cfg']['GZipDump'] && @function_exists('gzinflate')) { + include_once './libraries/unzip.lib.php'; + $this->_handle = new SimpleUnzip(); + $this->_handle->ReadFile($this->getName()); + if ($this->_handle->Count() == 0) { + $this->_error_message = $GLOBALS['strNoFilesFoundInZip']; + return false; + } elseif ($this->_handle->GetError(0) != 0) { + $this->_error_message = $GLOBALS['strErrorInZipFile'] . ' ' . $this->_handle->GetErrorMsg(0); + return false; + } else { + $this->content_uncompressed = $this->_handle->GetData(0); + } + // We don't need to store it further + $this->_handle = null; + } else { + $this->_error_message = sprintf($GLOBALS['strUnsupportedCompressionDetected'], $this->getCompression()); + return false; + } + break; + case 'none': + $this->_handle = @fopen($this->getName(), 'r'); + break; + default: + $this->_error_message = sprintf($GLOBALS['strUnsupportedCompressionDetected'], $this->getCompression()); + return false; + break; + } + + + } + + function getCharset() + { + return $this->_charset; + } + + function setCharset($charset) + { + $this->_charset = $charset; + } + + /** + * @uses PMA_File::$_compression as return value + * @uses PMA_File::detectCompression() + * @return string MIME type of compression, none for none + * @access public + */ + function getCompression() + { + if (null === $this->_compression) { + return $this->_detectCompression(); + } + + return $this->_compression; + } + + /** + * advances the file pointer in the file handle by $length bytes/chars + * + * @param integer $length numbers of chars/bytes to skip + * @return boolean + */ + function advanceFilePointer($length) + { + while ($length > 0) { + // Disable read progresivity, otherwise we eat all memory! + $read_multiply = 1; // required? + $this->getNextChunk($length); + $length -= $this->getChunkSize(); + } + } + + function getNextChunk($max_size = null) + { + if (null !== $max_size) { + $size = min($max_size, $this->getChunkSize()); + } else { + $size = $this->getChunkSize(); + } + + // $result = $this->handler->getNextChunk($size); + + switch ($this->getCompression()) { + case 'application/bzip2': + $result = bzread($this->getHandle(), $size); + break; + case 'application/gzip': + $result = gzread($this->getHandle(), $size); + break; + case 'application/zip': + $result = $this->getContent($this->getOffset(), $this->_offset, $size); + break; + case 'none': + $result = fread($this->getHandle(), $size); + break; + } + + if ($GLOBALS['charset_conversion']) { + $result = PMA_convert_string($this->getCharset(), $GLOBALS['charset'], $result); + } else { + /** + * Skip possible byte order marks (I do not think we need more + * charsets, but feel free to add more, you can use wikipedia for + * reference: ) + * + * @todo BOM could be used for charset autodetection + */ + if ($this->getOffset() === 0) { + // UTF-8 + if (strncmp($result, "\xEF\xBB\xBF", 3) == 0) { + $result = substr($result, 3); + // UTF-16 BE, LE + } elseif (strncmp($result, "\xFE\xFF", 2) == 0 + || strncmp($result, "\xFF\xFE", 2) == 0) { + $result = substr($result, 2); + } + } + } + + $this->_offset += $size; + + return $result; + } + + function getOffset() + { + return $this->_offset; + } + + function getChunkSize() + { + return $this->_chunk_size; + } + + function setChunkSize($chunk_size) + { + $this->_chunk_size = (int) $chunk_size; + } + + function getContentLength() + { + return strlen($this->_content); + } + + function eof() + { + if ($this->getHandle()) { + return feof($this->getHandle()); + } else { + return ($this->getOffset() >= $this->getContentLength()); + } + + } +} ?> \ No newline at end of file diff --git a/libraries/cleanup.lib.php b/libraries/cleanup.lib.php index 7ca559951..824c48364 100644 --- a/libraries/cleanup.lib.php +++ b/libraries/cleanup.lib.php @@ -1,6 +1,6 @@ and closing tags. - -1.53.0.TC018 (2006-05-18) - - fixed font names bug - -1.53.0.TC017 (2006-05-18) - - the TTF2UFM utility to convert True Type fonts for TCPDF were included on fonts folder. - - new free unicode fonts were included on /fonts/freefont. - - test_unicode.php example were exended. - - parameter $fill were added on Write, writeHTML and writeHTMLCell functions. - - documentation were updated. - -1.53.0.TC016 (2006-03-09) - - fixed closing tag on html parser. - -1.53.0.TC016 (2005-08-28) - - fpdf.php and tcpdf.php files were joined in one single class (you can still extend TCPDF with your own class). - - fixed problem when mb_internal_encoding is set. - -1.53.0.TC014 (2005-05-29) - - fixed WriteHTMLCell new page issue. - -1.53.0.TC013 (2005-05-29) - - fixed WriteHTMLCell across pages. - -1.53.0.TC012 (2005-05-29) - - font color attribute bug were fixed. - -1.53.0.TC011 (2005-03-31) - - SetFont function were fixed (thank Sjaak Lauwers for bug notice). - -1.53.0.TC010 (2005-03-22) - - the html functions were improved (thanks to Manfred Vervuert for bug reporting). - -1.53.0.TC009 (2005-03-19) - - a wrong reference to convertColorHexToDec were fixed. - -1.53.0.TC008 (2005-02-07) - - removed some extra bytes from PHP files. - -1.53.0.TC007 (2005-01-08) - - fill attribute were removed from writeHTMLCell method. - -1.53.0.TC006 (2005-01-08) - - the documentation were updated. - -1.53.0.TC005 (2005-01-05) - - Steven Wittens's unicode methods were removed. - - All unicode methods were rewritten from scratch. - - TCPDF is now licensed as LGPL. - -1.53.0.TC004 (2005-01-04) - - this changelog were added. - - removed comercial fonts for licensing issue. - - Bitstream Vera Fonts were added (http://www.bitstream.com/font_rendering/products/dev_fonts/vera.html). - - Now the AddFont and SetFont functions returns the basic font if the styled version do not exist. - +1.53.0.TC026_PHP4 (2006-10-28) + - writeHTML function call were fixed on examples. + +1.53.0.TC025_PHP4 (2006-10-27) + - Bugs item #1421290 were fixed (0D - 0A substitution in some characters) + - Bugs item #1573174 were fixed (MultiCell documentation) + +1.53.0.TC024_PHP4 (2006-09-26) + - getPageHeight() function were fixed (bug 1543476). + - fixed missing breaks on closedHTMLTagHandler function (bug 1535263). + - fixed extra spaces on Write function (bug 1535262). + +1.53.0.TC023_PHP4 (2006-08-04) + - second parameter were removed from class_exists function. + - paths to barcode directory were fixed. + - documentation were updated. + +1.53.0.TC022_PHP4 (2006-07-16) + - fixed bug: [ 1516858 ] Probs with PHP autoloader and class_exists() + +1.53.0.TC021_PHP4 (2006-07-01) + - HTML attributes with whitespaces are now supported (thanks to Nelson Benitez for his support) + +1.53.0.TC020_PHP4 (2006-06-23) + - this version fixes the MBCS error on html_entity_decode + +1.53.0.TC019_PHP4 (2006-06-08) + - this version were backported to PHP4 + +1.53.0.TC019 (2006-05-21) + - fixed and closing tags. + +1.53.0.TC018 (2006-05-18) + - fixed font names bug + +1.53.0.TC017 (2006-05-18) + - the TTF2UFM utility to convert True Type fonts for TCPDF were included on fonts folder. + - new free unicode fonts were included on /fonts/freefont. + - test_unicode.php example were exended. + - parameter $fill were added on Write, writeHTML and writeHTMLCell functions. + - documentation were updated. + +1.53.0.TC016 (2006-03-09) + - fixed closing tag on html parser. + +1.53.0.TC016 (2005-08-28) + - fpdf.php and tcpdf.php files were joined in one single class (you can still extend TCPDF with your own class). + - fixed problem when mb_internal_encoding is set. + +1.53.0.TC014 (2005-05-29) + - fixed WriteHTMLCell new page issue. + +1.53.0.TC013 (2005-05-29) + - fixed WriteHTMLCell across pages. + +1.53.0.TC012 (2005-05-29) + - font color attribute bug were fixed. + +1.53.0.TC011 (2005-03-31) + - SetFont function were fixed (thank Sjaak Lauwers for bug notice). + +1.53.0.TC010 (2005-03-22) + - the html functions were improved (thanks to Manfred Vervuert for bug reporting). + +1.53.0.TC009 (2005-03-19) + - a wrong reference to convertColorHexToDec were fixed. + +1.53.0.TC008 (2005-02-07) + - removed some extra bytes from PHP files. + +1.53.0.TC007 (2005-01-08) + - fill attribute were removed from writeHTMLCell method. + +1.53.0.TC006 (2005-01-08) + - the documentation were updated. + +1.53.0.TC005 (2005-01-05) + - Steven Wittens's unicode methods were removed. + - All unicode methods were rewritten from scratch. + - TCPDF is now licensed as LGPL. + +1.53.0.TC004 (2005-01-04) + - this changelog were added. + - removed comercial fonts for licensing issue. + - Bitstream Vera Fonts were added (http://www.bitstream.com/font_rendering/products/dev_fonts/vera.html). + - Now the AddFont and SetFont functions returns the basic font if the styled version do not exist. + diff --git a/libraries/tcpdf/font/LICENSE b/libraries/tcpdf/font/LICENSE index 635e609c8..56db9c0dd 100644 --- a/libraries/tcpdf/font/LICENSE +++ b/libraries/tcpdf/font/LICENSE @@ -95,4 +95,4 @@ dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. -$Id: LICENSE 778 2006-04-20 18:14:24Z moyogo $ +$Id$ diff --git a/pmd_display_field.php b/pmd_display_field.php index 7c04c8d03..bb46fa909 100644 --- a/pmd_display_field.php +++ b/pmd_display_field.php @@ -1,6 +1,6 @@ addTestSuite('FailTest'); - $suite->addTestSuite('Environment_test'); - $suite->addTestSuite('PMA_get_real_size_test'); - $suite->addTestSuite('PMA_sanitize_test'); - $suite->addTestSuite('PMA_pow_test'); - $suite->addTestSuite('PMA_escapeJsString_test'); - return $suite; - } -} - -if (PMA_MAIN_METHOD == 'AllTests::main') { - echo '
';
-    AllTests::main();
-    echo '
'; -} +addTestSuite('FailTest'); + $suite->addTestSuite('Environment_test'); + $suite->addTestSuite('PMA_get_real_size_test'); + $suite->addTestSuite('PMA_sanitize_test'); + $suite->addTestSuite('PMA_pow_test'); + $suite->addTestSuite('PMA_escapeJsString_test'); + return $suite; + } +} + +if (PMA_MAIN_METHOD == 'AllTests::main') { + echo '
';
+    AllTests::main();
+    echo '
'; +} ?> \ No newline at end of file diff --git a/test/Environment_test.php b/test/Environment_test.php index 25b265b70..4f0fe3bfa 100644 --- a/test/Environment_test.php +++ b/test/Environment_test.php @@ -1,33 +1,33 @@ -assertTrue(version_compare('4.1', phpversion(), '<='), - 'phpMyAdmin requires PHP 4.1 or above'); - } - - public function testMySQL() - { - $this->markTestIncomplete(); - } - - public function testSession() - { - $this->markTestIncomplete(); - } -} +assertTrue(version_compare('4.1', phpversion(), '<='), + 'phpMyAdmin requires PHP 4.1 or above'); + } + + public function testMySQL() + { + $this->markTestIncomplete(); + } + + public function testSession() + { + $this->markTestIncomplete(); + } +} ?> \ No newline at end of file diff --git a/test/FailTest.php b/test/FailTest.php index cc9a249a1..0035b099a 100644 --- a/test/FailTest.php +++ b/test/FailTest.php @@ -1,23 +1,23 @@ -assertEquals(0, 1); - } -} +assertEquals(0, 1); + } +} ?> \ No newline at end of file diff --git a/test/PMA_get_real_size_test.php b/test/PMA_get_real_size_test.php index 040e3dece..b2bf63817 100644 --- a/test/PMA_get_real_size_test.php +++ b/test/PMA_get_real_size_test.php @@ -1,43 +1,43 @@ -assertEquals(0, PMA_get_real_size('0')); - } - - public function testKilobyte() - { - $this->assertEquals(1024, PMA_get_real_size('1kb')); - } - - public function testKilobyte2() - { - $this->assertEquals(1024 * 1024, PMA_get_real_size('1024k')); - } - - public function testMegabyte() - { - $this->assertEquals(8 * 1024 * 1024, PMA_get_real_size('8m')); - } - - public function testGigabyte() - { - $this->assertEquals(12 * 1024 * 1024 * 1024, PMA_get_real_size('12gb')); - } -} +assertEquals(0, PMA_get_real_size('0')); + } + + public function testKilobyte() + { + $this->assertEquals(1024, PMA_get_real_size('1kb')); + } + + public function testKilobyte2() + { + $this->assertEquals(1024 * 1024, PMA_get_real_size('1024k')); + } + + public function testMegabyte() + { + $this->assertEquals(8 * 1024 * 1024, PMA_get_real_size('8m')); + } + + public function testGigabyte() + { + $this->assertEquals(12 * 1024 * 1024 * 1024, PMA_get_real_size('12gb')); + } +} ?> \ No newline at end of file diff --git a/test/PMA_pow_test.php b/test/PMA_pow_test.php index 1b63f24e7..e9424d54a 100644 --- a/test/PMA_pow_test.php +++ b/test/PMA_pow_test.php @@ -1,50 +1,50 @@ -assertEquals('1267650600228229401496703205376', - PMA_pow(2, 100)); - } - - public function testBcpow() - { - if (function_exists('bcpow')) { - $this->assertEquals('1267650600228229401496703205376', - PMA_pow(2, 100, 'bcpow')); - } else { - $this->markTestSkipped('function bcpow() does not exist'); - } - } - - public function testGmppow() - { - if (function_exists('gmp_pow')) { - $this->assertEquals('1267650600228229401496703205376', - PMA_pow(2, 100, 'gmp_pow')); - } else { - $this->markTestSkipped('function gmp_pow() does not exist'); - } - } - - public function testNegativeExp() - { - $this->assertEquals(false, - PMA_pow(2, -1)); - } -} +assertEquals('1267650600228229401496703205376', + PMA_pow(2, 100)); + } + + public function testBcpow() + { + if (function_exists('bcpow')) { + $this->assertEquals('1267650600228229401496703205376', + PMA_pow(2, 100, 'bcpow')); + } else { + $this->markTestSkipped('function bcpow() does not exist'); + } + } + + public function testGmppow() + { + if (function_exists('gmp_pow')) { + $this->assertEquals('1267650600228229401496703205376', + PMA_pow(2, 100, 'gmp_pow')); + } else { + $this->markTestSkipped('function gmp_pow() does not exist'); + } + } + + public function testNegativeExp() + { + $this->assertEquals(false, + PMA_pow(2, -1)); + } +} ?> \ No newline at end of file diff --git a/test/PMA_sanitize_test.php b/test/PMA_sanitize_test.php index b39c90ded..091f7b095 100644 --- a/test/PMA_sanitize_test.php +++ b/test/PMA_sanitize_test.php @@ -1,42 +1,42 @@ -assertEquals('[a@javascript:alert(\'XSS\');@target]link', - PMA_sanitize('[a@javascript:alert(\'XSS\');@target]link[/a]')); - } - - public function testLink() - { - $this->assertEquals('link', - PMA_sanitize('[a@http://www.phpmyadmin.net/@target]link[/a]')); - } - - public function testHtmlTags() - { - $this->assertEquals('<div onclick="">', - PMA_sanitize('
')); - } - - public function testBbcoe() - { - $this->assertEquals('strong', - PMA_sanitize('[b]strong[/b]')); - } -} +assertEquals('[a@javascript:alert(\'XSS\');@target]link', + PMA_sanitize('[a@javascript:alert(\'XSS\');@target]link[/a]')); + } + + public function testLink() + { + $this->assertEquals('link', + PMA_sanitize('[a@http://www.phpmyadmin.net/@target]link[/a]')); + } + + public function testHtmlTags() + { + $this->assertEquals('<div onclick="">', + PMA_sanitize('
')); + } + + public function testBbcoe() + { + $this->assertEquals('strong', + PMA_sanitize('[b]strong[/b]')); + } +} ?> \ No newline at end of file diff --git a/test/escape_js_string.php b/test/escape_js_string.php index 092784363..a170cbe3a 100644 --- a/test/escape_js_string.php +++ b/test/escape_js_string.php @@ -5,7 +5,7 @@ * * @author Michal Čihař * @package phpMyAdmin-test - * @version $Id: common.lib.php 9832 2007-01-09 09:50:49Z nijel $ + * @version $Id$ */ /**