PageRenderTime 27ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/ckfinder/core/connector/php/php5/CommandHandler/FileUpload.php

https://github.com/sauger/forbes_old
PHP | 197 lines | 131 code | 30 blank | 36 comment | 39 complexity | 57360574eabe43d18108a265bd0f28a2 MD5 | raw file
  1. <?php
  2. /**
  3. * CKFinder
  4. * ========
  5. * http://ckfinder.com
  6. * Copyright (C) 2007-2010, CKSource - Frederico Knabben. All rights reserved.
  7. *
  8. * The software, this file and its contents are subject to the CKFinder
  9. * License. Please read the license.txt file before using, installing, copying,
  10. * modifying or distribute this file or part of its contents. The contents of
  11. * this file is part of the Source Code of CKFinder.
  12. */
  13. /**
  14. * @package CKFinder
  15. * @subpackage CommandHandlers
  16. * @copyright CKSource - Frederico Knabben
  17. */
  18. /**
  19. * Handle FileUpload command
  20. *
  21. * @package CKFinder
  22. * @subpackage CommandHandlers
  23. * @copyright CKSource - Frederico Knabben
  24. */
  25. class CKFinder_Connector_CommandHandler_FileUpload extends CKFinder_Connector_CommandHandler_CommandHandlerBase
  26. {
  27. /**
  28. * Command name
  29. *
  30. * @access protected
  31. * @var string
  32. */
  33. protected $command = "FileUpload";
  34. /**
  35. * send response (save uploaded file, resize if required)
  36. * @access public
  37. *
  38. */
  39. public function sendResponse()
  40. {
  41. $iErrorNumber = CKFINDER_CONNECTOR_ERROR_NONE;
  42. $_config =& CKFinder_Connector_Core_Factory::getInstance("Core_Config");
  43. $oRegistry =& CKFinder_Connector_Core_Factory::getInstance("Core_Registry");
  44. $oRegistry->set("FileUpload_fileName", "unknown file");
  45. $uploadedFile = array_shift($_FILES);
  46. if (!isset($uploadedFile['name'])) {
  47. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_INVALID);
  48. }
  49. $sUnsafeFileName = CKFinder_Connector_Utils_FileSystem::convertToFilesystemEncoding(CKFinder_Connector_Utils_Misc::mbBasename($uploadedFile['name']));
  50. $sFileName = str_replace(array(":", "*", "?", "|", "/"), "_", $sUnsafeFileName);
  51. if ($_config->forceAscii()) {
  52. $sFileName = CKFinder_Connector_Utils_FileSystem::convertToAscii($sFileName);
  53. }
  54. if ($sFileName != $sUnsafeFileName) {
  55. $iErrorNumber = CKFINDER_CONNECTOR_ERROR_UPLOADED_INVALID_NAME_RENAMED;
  56. }
  57. $oRegistry->set("FileUpload_fileName", $sFileName);
  58. $this->checkConnector();
  59. $this->checkRequest();
  60. if (!$this->_currentFolder->checkAcl(CKFINDER_CONNECTOR_ACL_FILE_UPLOAD)) {
  61. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UNAUTHORIZED);
  62. }
  63. $_resourceTypeConfig = $this->_currentFolder->getResourceTypeConfig();
  64. if (!CKFinder_Connector_Utils_FileSystem::checkFileName($sFileName) || $_resourceTypeConfig->checkIsHiddenFile($sFileName)) {
  65. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_INVALID_NAME);
  66. }
  67. $resourceTypeInfo = $this->_currentFolder->getResourceTypeConfig();
  68. if (!$resourceTypeInfo->checkExtension($sFileName)) {
  69. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_INVALID_EXTENSION);
  70. }
  71. $sFileNameOrginal = $sFileName;
  72. $oRegistry->set("FileUpload_fileName", $sFileName);
  73. $maxSize = $resourceTypeInfo->getMaxSize();
  74. if (!$_config->checkSizeAfterScaling() && $maxSize && $uploadedFile['size']>$maxSize) {
  75. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_TOO_BIG);
  76. }
  77. $htmlExtensions = $_config->getHtmlExtensions();
  78. $sExtension = CKFinder_Connector_Utils_FileSystem::getExtension($sFileNameOrginal);
  79. if ($htmlExtensions
  80. && !CKFinder_Connector_Utils_Misc::inArrayCaseInsensitive($sExtension, $htmlExtensions)
  81. && ($detectHtml = CKFinder_Connector_Utils_FileSystem::detectHtml($uploadedFile['tmp_name'])) === true ) {
  82. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_WRONG_HTML_FILE);
  83. }
  84. $sExtension = CKFinder_Connector_Utils_FileSystem::getExtension($sFileNameOrginal);
  85. $secureImageUploads = $_config->getSecureImageUploads();
  86. if ($secureImageUploads
  87. && ($isImageValid = CKFinder_Connector_Utils_FileSystem::isImageValid($uploadedFile['tmp_name'], $sExtension)) === false ) {
  88. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_CORRUPT);
  89. }
  90. switch ($uploadedFile['error']) {
  91. case UPLOAD_ERR_OK:
  92. break;
  93. case UPLOAD_ERR_INI_SIZE:
  94. case UPLOAD_ERR_FORM_SIZE:
  95. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_TOO_BIG);
  96. break;
  97. case UPLOAD_ERR_PARTIAL:
  98. case UPLOAD_ERR_NO_FILE:
  99. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_CORRUPT);
  100. break;
  101. case UPLOAD_ERR_NO_TMP_DIR:
  102. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_NO_TMP_DIR);
  103. break;
  104. case UPLOAD_ERR_CANT_WRITE:
  105. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_ACCESS_DENIED);
  106. break;
  107. case UPLOAD_ERR_EXTENSION:
  108. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_ACCESS_DENIED);
  109. break;
  110. }
  111. $sServerDir = $this->_currentFolder->getServerPath();
  112. $iCounter = 0;
  113. while (true)
  114. {
  115. $sFilePath = CKFinder_Connector_Utils_FileSystem::combinePaths($sServerDir, $sFileName);
  116. if (file_exists($sFilePath)) {
  117. $iCounter++;
  118. $sFileName =
  119. CKFinder_Connector_Utils_FileSystem::getFileNameWithoutExtension($sFileNameOrginal) .
  120. "(" . $iCounter . ")" . "." .
  121. CKFinder_Connector_Utils_FileSystem::getExtension($sFileNameOrginal);
  122. $oRegistry->set("FileUpload_fileName", $sFileName);
  123. $iErrorNumber = CKFINDER_CONNECTOR_ERROR_UPLOADED_FILE_RENAMED;
  124. } else {
  125. if (false === move_uploaded_file($uploadedFile['tmp_name'], $sFilePath)) {
  126. $iErrorNumber = CKFINDER_CONNECTOR_ERROR_ACCESS_DENIED;
  127. }
  128. else {
  129. if (isset($detectHtml) && $detectHtml === -1 && CKFinder_Connector_Utils_FileSystem::detectHtml($sFilePath) === true) {
  130. @unlink($sFilePath);
  131. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_WRONG_HTML_FILE);
  132. }
  133. else if (isset($isImageValid) && $isImageValid === -1 && CKFinder_Connector_Utils_FileSystem::isImageValid($sFilePath, $sExtension) === false) {
  134. @unlink($sFilePath);
  135. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_CORRUPT);
  136. }
  137. }
  138. if (is_file($sFilePath) && ($perms = $_config->getChmodFiles())) {
  139. $oldumask = umask(0);
  140. chmod($sFilePath, $perms);
  141. umask($oldumask);
  142. }
  143. break;
  144. }
  145. }
  146. if (!$_config->checkSizeAfterScaling()) {
  147. $this->_errorHandler->throwError($iErrorNumber, true, false);
  148. }
  149. //resize image if required
  150. require_once CKFINDER_CONNECTOR_LIB_DIR . "/CommandHandler/Thumbnail.php";
  151. $_imagesConfig = $_config->getImagesConfig();
  152. if ($_imagesConfig->getMaxWidth()>0 && $_imagesConfig->getMaxHeight()>0 && $_imagesConfig->getQuality()>0) {
  153. CKFinder_Connector_CommandHandler_Thumbnail::createThumb($sFilePath, $sFilePath, $_imagesConfig->getMaxWidth(), $_imagesConfig->getMaxHeight(), $_imagesConfig->getQuality(), true) ;
  154. }
  155. if ($_config->checkSizeAfterScaling()) {
  156. //check file size after scaling, attempt to delete if too big
  157. clearstatcache();
  158. if ($maxSize && filesize($sFilePath)>$maxSize) {
  159. @unlink($sFilePath);
  160. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_TOO_BIG);
  161. }
  162. else {
  163. $this->_errorHandler->throwError($iErrorNumber, true);
  164. }
  165. }
  166. }
  167. }