BxBaseUploaderServices.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup UnaBaseView UNA Base Representation Classes
  7. * @{
  8. */
  9. /**
  10. * System services related to Comments.
  11. */
  12. class BxBaseUploaderServices extends BxDol
  13. {
  14. public function __construct()
  15. {
  16. parent::__construct();
  17. }
  18. /**
  19. * @page service Service Calls
  20. * @section bx_system_cmts System Services
  21. * @subsection bx_system_cmts-general General
  22. * @subsubsection bx_system_cmts-get_data_api get_data_api
  23. *
  24. * @code bx_srv('system', 'get_data_api', [], 'TemplCmtsServices'); @endcode
  25. *
  26. * Get comments data
  27. * @param $aParams array with paramenters :
  28. * "module":"bx_posts","object_id":3,"start_from":5,"order_way":"desc","is_form":false
  29. *
  30. * @see TemplCmtsServices::serviceGetDataApi
  31. */
  32. /**
  33. * @ref bx_system_cmts-get_data_api "get_data_api"
  34. * @api @ref bx_system_cmts-get_data_api "get_data_api"
  35. */
  36. public function serviceGetDataApi($aParams = [])
  37. {
  38. $sUploaderObject = bx_process_input(bx_get('uo'));
  39. $sStorageObject = bx_process_input(bx_get('so'));
  40. $sUniqId = preg_match("/^[\d\w]+$/", bx_get('uid')) ? bx_get('uid') : '';
  41. $isMultiple = bx_get('m') ? true : false;
  42. $sFormat = bx_process_input(bx_get('f'));
  43. if ($sFormat != 'html' && $sFormat != 'json')
  44. $sFormat = 'html';
  45. $iContentId = bx_get('c');
  46. if (false === $iContentId || '' === $iContentId)
  47. $iContentId = false;
  48. else
  49. $iContentId = bx_process_input($iContentId, BX_DATA_INT);
  50. $iProfileId = (int)bx_get_logged_profile_id();
  51. $isPrivate = (int)bx_get('p') ? 1 : 0;
  52. $sAction = bx_process_input(bx_get('a'));
  53. // Direct upload (bypassing the app proxy): the profile comes from a one-time upload token.
  54. $sUploadToken = bx_get('ut');
  55. if($sUploadToken !== false && $sUploadToken !== '') {
  56. $sUploadToken = bx_process_input($sUploadToken);
  57. $aToken = BxDolKey::getInstance()->getKeyData($sUploadToken, 'uploader');
  58. if($sAction != 'upload' || !$this->isUploadTokenValid($aToken, $sUploaderObject, $sStorageObject))
  59. return ['error' => _t('_Access denied'), 'code' => 403];
  60. $iProfileId = (int)$aToken['profile_id'];
  61. }
  62. $oUploader = BxDolUploader::getObjectInstance($sUploaderObject, $sStorageObject, $sUniqId);
  63. switch ($sAction) {
  64. case 'restore_ghosts':
  65. $sImagesTranscoder = bx_process_input(bx_get('img_trans'));
  66. $oData = $oUploader->getGhostsWithOrder($iProfileId, $sFormat, $sImagesTranscoder, $iContentId);
  67. $aRv = isset($oData['g']) ? [$oData['g'], $oData['o']] : [];
  68. return $aRv;
  69. break;
  70. case 'delete':
  71. header('Content-type: text/html; charset=utf-8');
  72. $iFileId = bx_process_input(bx_get('id'), BX_DATA_INT);
  73. return $oUploader->deleteGhost($iFileId, $iProfileId);
  74. break;
  75. case 'upload':
  76. if(($aFile = $_FILES['file'] ?? false)) {
  77. $aResult = $oUploader->handleUploads($iProfileId, $aFile, $isMultiple, $iContentId, $isPrivate);
  78. // One-time token: burn it once the file is stored.
  79. if(!empty($sUploadToken))
  80. BxDolKey::getInstance()->removeKey($sUploadToken);
  81. if(($iId = (int)($aResult['id'] ?? 0)) && ($sImagesTranscoder = bx_get('img_trans')) !== false) {
  82. $aGhosts = $oUploader->getGhosts($iProfileId, 'array', bx_process_input($sImagesTranscoder), $iContentId);
  83. if(isset($aGhosts[$iId]))
  84. $aResult['ghost'] = $aGhosts[$iId];
  85. }
  86. return $aResult;
  87. }
  88. break;
  89. case 'upload_inline':
  90. $sStorageObject = bx_process_input(bx_get('o'));
  91. $sFile = bx_process_input(bx_get('f'));
  92. $oStorage = BxDolStorage::getObjectInstance($sStorageObject);
  93. if (!($iId = $oStorage->storeFileFromForm($_FILES['file'], false, $iProfileId))) {
  94. return array('error' => '1');
  95. exit;
  96. }
  97. $oStorage->afterUploadCleanup($iId, $iProfileId);
  98. $aFileInfo = $oStorage->getFile($iId);
  99. if ($aFileInfo && in_array($aFileInfo['ext'], array('jpg', 'jpeg', 'jpe', 'png'))) {
  100. $oTranscoder = BxDolTranscoderImage::getObjectInstance(bx_get('t'));
  101. $sUrl = $oTranscoder->getFileUrl($iId);
  102. }
  103. else {
  104. $sUrl = $oStorage->getFileUrlById($iId);
  105. }
  106. return ['link' => $sUrl];
  107. break;
  108. }
  109. }
  110. public function serviceGetUploadToken()
  111. {
  112. $iProfileId = (int)bx_get_logged_profile_id();
  113. if(!$iProfileId)
  114. return ['error' => _t('_Access denied'), 'code' => 403];
  115. $sUploaderObject = bx_process_input(bx_get('uo'));
  116. $sStorageObject = bx_process_input(bx_get('so'));
  117. if(!$sUploaderObject || !$sStorageObject || !BxDolUploader::getObjectInstance($sUploaderObject, $sStorageObject, 'token'))
  118. return ['error' => _t('_sys_request_page_not_found_cpt'), 'code' => 404];
  119. $iLifetime = 900;
  120. $sToken = BxDolKey::getInstance()->getNewKey([
  121. 'profile_id' => $iProfileId,
  122. 'uo' => $sUploaderObject,
  123. 'so' => $sStorageObject,
  124. 'expire' => time() + $iLifetime,
  125. ], $iLifetime, 'uploader');
  126. if(!$sToken)
  127. return ['error' => _t('_error occured'), 'code' => 500];
  128. return [
  129. 'token' => $sToken,
  130. 'url' => BX_DOL_URL_ROOT . 'api.php',
  131. 'expire' => $iLifetime,
  132. ];
  133. }
  134. // sys_keys doesn't check expiration on read (only prune does), so the token keeps its own.
  135. public function isUploadTokenValid($aToken, $sUploaderObject, $sStorageObject)
  136. {
  137. return !empty($aToken) && is_array($aToken)
  138. && (int)($aToken['profile_id'] ?? 0) > 0
  139. && (int)($aToken['expire'] ?? 0) >= time()
  140. && ($aToken['uo'] ?? '') === $sUploaderObject
  141. && ($aToken['so'] ?? '') === $sStorageObject;
  142. }
  143. }
  144. /** @} */