PageRenderTime 47ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/app/webroot/js/editor/dialog/php/ckfinder/core/connector/php/php5/CommandHandler/FileUpload.php

https://github.com/talesam/sgce
PHP | 190 lines | 124 code | 30 blank | 36 comment | 36 complexity | eba34611f7190de9b2e753b824c59b3e MD5 | raw file
  1. <?php
  2. /**
  3. * CKFinder
  4. * ========
  5. * http://www.ckfinder.com
  6. * Copyright (C) 2007-2008 Frederico Caldeira Knabben (FredCK.com)
  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 Frederico Caldeira Knabben
  17. */
  18. /**
  19. * Handle FileUpload command
  20. *
  21. * @package CKFinder
  22. * @subpackage CommandHandlers
  23. * @copyright Frederico Caldeira 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. $oRegistry =& CKFinder_Connector_Core_Factory::getInstance("Core_Registry");
  43. $oRegistry->set("FileUpload_fileName", "unknown file");
  44. $uploadedFile = array_shift($_FILES);
  45. if (!isset($uploadedFile['name'])) {
  46. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_INVALID);
  47. }
  48. $sFileName = CKFinder_Connector_Utils_FileSystem::convertToFilesystemEncoding(basename($uploadedFile['name']));
  49. $oRegistry->set("FileUpload_fileName", $sFileName);
  50. $this->checkConnector();
  51. $this->checkRequest();
  52. $_config =& CKFinder_Connector_Core_Factory::getInstance("Core_Config");
  53. if (!$this->_currentFolder->checkAcl(CKFINDER_CONNECTOR_ACL_FILE_UPLOAD)) {
  54. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UNAUTHORIZED);
  55. }
  56. $_resourceTypeConfig = $this->_currentFolder->getResourceTypeConfig();
  57. if (!CKFinder_Connector_Utils_FileSystem::checkFileName($sFileName) || $_resourceTypeConfig->checkIsHiddenFile($sFileName)) {
  58. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_INVALID_NAME);
  59. }
  60. $resourceTypeInfo = $this->_currentFolder->getResourceTypeConfig();
  61. if (!$resourceTypeInfo->checkExtension($sFileName)) {
  62. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_INVALID_EXTENSION);
  63. }
  64. $sFileNameOrginal = $sFileName;
  65. $oRegistry->set("FileUpload_fileName", $sFileName);
  66. $maxSize = $resourceTypeInfo->getMaxSize();
  67. if (!$_config->checkSizeAfterScaling() && $maxSize && $uploadedFile['size']>$maxSize) {
  68. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_TOO_BIG);
  69. }
  70. $htmlExtensions = $_config->getHtmlExtensions();
  71. $sExtension = CKFinder_Connector_Utils_FileSystem::getExtension($sFileNameOrginal);
  72. if ($htmlExtensions
  73. && !CKFinder_Connector_Utils_Misc::inArrayCaseInsensitive($sExtension, $htmlExtensions)
  74. && ($detectHtml = CKFinder_Connector_Utils_FileSystem::detectHtml($uploadedFile['tmp_name'])) === true ) {
  75. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_WRONG_HTML_FILE);
  76. }
  77. $sExtension = CKFinder_Connector_Utils_FileSystem::getExtension($sFileNameOrginal);
  78. $secureImageUploads = $_config->getSecureImageUploads();
  79. if ($secureImageUploads
  80. && ($isImageValid = CKFinder_Connector_Utils_FileSystem::isImageValid($uploadedFile['tmp_name'], $sExtension)) === false ) {
  81. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_CORRUPT);
  82. }
  83. switch ($uploadedFile['error']) {
  84. case UPLOAD_ERR_OK:
  85. break;
  86. case UPLOAD_ERR_INI_SIZE:
  87. case UPLOAD_ERR_FORM_SIZE:
  88. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_TOO_BIG);
  89. break;
  90. case UPLOAD_ERR_PARTIAL:
  91. case UPLOAD_ERR_NO_FILE:
  92. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_CORRUPT);
  93. break;
  94. case UPLOAD_ERR_NO_TMP_DIR:
  95. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_NO_TMP_DIR);
  96. break;
  97. case UPLOAD_ERR_CANT_WRITE:
  98. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_ACCESS_DENIED);
  99. break;
  100. case UPLOAD_ERR_EXTENSION:
  101. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_ACCESS_DENIED);
  102. break;
  103. }
  104. $sServerDir = $this->_currentFolder->getServerPath();
  105. $iCounter = 0;
  106. while (true)
  107. {
  108. $sFilePath = CKFinder_Connector_Utils_FileSystem::combinePaths($sServerDir, $sFileName);
  109. if (file_exists($sFilePath)) {
  110. $iCounter++;
  111. $sFileName =
  112. CKFinder_Connector_Utils_FileSystem::getFileNameWithoutExtension($sFileNameOrginal) .
  113. "(" . $iCounter . ")" . "." .
  114. CKFinder_Connector_Utils_FileSystem::getExtension($sFileNameOrginal);
  115. $oRegistry->set("FileUpload_fileName", $sFileName);
  116. $iErrorNumber = CKFINDER_CONNECTOR_ERROR_UPLOADED_FILE_RENAMED;
  117. } else {
  118. if (false === move_uploaded_file($uploadedFile['tmp_name'], $sFilePath)) {
  119. $iErrorNumber = CKFINDER_CONNECTOR_ERROR_ACCESS_DENIED;
  120. }
  121. else {
  122. if (isset($detectHtml) && $detectHtml === -1 && CKFinder_Connector_Utils_FileSystem::detectHtml($sFilePath) === true) {
  123. @unlink($sFilePath);
  124. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_WRONG_HTML_FILE);
  125. }
  126. else if (isset($isImageValid) && $isImageValid === -1 && CKFinder_Connector_Utils_FileSystem::isImageValid($sFilePath, $sExtension) === false) {
  127. @unlink($sFilePath);
  128. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_CORRUPT);
  129. }
  130. }
  131. if (is_file($sFilePath) && ($perms = $_config->getChmodFiles())) {
  132. $oldumask = umask(0);
  133. chmod($sFilePath, $perms);
  134. umask($oldumask);
  135. }
  136. break;
  137. }
  138. }
  139. if (!$_config->checkSizeAfterScaling()) {
  140. $this->_errorHandler->throwError($iErrorNumber, $sFileName, false);
  141. }
  142. //resize image if required
  143. require_once CKFINDER_CONNECTOR_LIB_DIR . "/CommandHandler/Thumbnail.php";
  144. $_imagesConfig = $_config->getImagesConfig();
  145. if ($_imagesConfig->getMaxWidth()>0 && $_imagesConfig->getMaxHeight()>0 && $_imagesConfig->getQuality()>0) {
  146. CKFinder_Connector_CommandHandler_Thumbnail::createThumb($sFilePath, $sFilePath, $_imagesConfig->getMaxWidth(), $_imagesConfig->getMaxHeight(), $_imagesConfig->getQuality(), true) ;
  147. }
  148. if ($_config->checkSizeAfterScaling()) {
  149. //check file size after scaling, attempt to delete if too big
  150. clearstatcache();
  151. if ($maxSize && filesize($sFilePath)>$maxSize) {
  152. @unlink($sFilePath);
  153. $this->_errorHandler->throwError(CKFINDER_CONNECTOR_ERROR_UPLOADED_TOO_BIG);
  154. }
  155. else {
  156. $this->_errorHandler->throwError($iErrorNumber, $sFileName);
  157. }
  158. }
  159. }
  160. }