@strapi/upload 5.30.0 → 5.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/dist/admin/ai/components/AIAssetCard.js +27 -7
  2. package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
  3. package/dist/admin/ai/components/AIAssetCard.mjs +21 -1
  4. package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
  5. package/dist/admin/ai/components/AIUploadModal.js +1 -1
  6. package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
  7. package/dist/admin/ai/components/AIUploadModal.mjs +1 -1
  8. package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
  9. package/dist/admin/components/AssetCard/AssetCard.js +5 -4
  10. package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
  11. package/dist/admin/components/AssetCard/AssetCard.mjs +2 -1
  12. package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
  13. package/dist/admin/components/AssetCard/AssetCardBase.js +1 -1
  14. package/dist/admin/components/AssetCard/AssetCardBase.mjs +1 -1
  15. package/dist/admin/components/AssetCard/DocAssetCard.js +3 -7
  16. package/dist/admin/components/AssetCard/DocAssetCard.js.map +1 -1
  17. package/dist/admin/components/AssetCard/DocAssetCard.mjs +3 -7
  18. package/dist/admin/components/AssetCard/DocAssetCard.mjs.map +1 -1
  19. package/dist/admin/components/AssetCard/ImageAssetCard.js +1 -1
  20. package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
  21. package/dist/admin/components/AssetCard/ImageAssetCard.mjs +1 -1
  22. package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
  23. package/dist/admin/components/AssetCard/UploadingAssetCard.js +5 -4
  24. package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
  25. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs +2 -1
  26. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
  27. package/dist/admin/components/AssetCard/VideoAssetCard.js +1 -1
  28. package/dist/admin/components/AssetCard/VideoAssetCard.mjs +1 -1
  29. package/dist/admin/components/AssetDialog/AssetDialog.js +1 -1
  30. package/dist/admin/components/AssetDialog/AssetDialog.mjs +1 -1
  31. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +2 -0
  32. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  33. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +2 -0
  34. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  35. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js +1 -1
  36. package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs +1 -1
  37. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js +1 -1
  38. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs +1 -1
  39. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js +1 -1
  40. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs +1 -1
  41. package/dist/admin/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  42. package/dist/admin/components/Breadcrumbs/Breadcrumbs.mjs.map +1 -1
  43. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js +1 -1
  44. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +1 -1
  45. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js +1 -1
  46. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs +1 -1
  47. package/dist/admin/components/CopyLinkButton/CopyLinkButton.js +1 -1
  48. package/dist/admin/components/CopyLinkButton/CopyLinkButton.mjs +1 -1
  49. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +1 -1
  50. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  51. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +1 -1
  52. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  53. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js +15 -34
  54. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
  55. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs +15 -34
  56. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
  57. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js +1 -1
  58. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs +1 -1
  59. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +3 -2
  60. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  61. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +2 -1
  62. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
  63. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js +1 -1
  64. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs +1 -1
  65. package/dist/admin/components/EditFolderDialog/EditFolderDialog.js +1 -1
  66. package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs +1 -1
  67. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js +1 -1
  68. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs +1 -1
  69. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.js.map +1 -1
  70. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.mjs.map +1 -1
  71. package/dist/admin/components/FilterList/FilterList.js.map +1 -1
  72. package/dist/admin/components/FilterList/FilterList.mjs.map +1 -1
  73. package/dist/admin/components/FilterList/FilterTag.js.map +1 -1
  74. package/dist/admin/components/FilterList/FilterTag.mjs.map +1 -1
  75. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.js.map +1 -1
  76. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.mjs.map +1 -1
  77. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js.map +1 -1
  78. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.mjs.map +1 -1
  79. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js +8 -10
  80. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
  81. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs +5 -7
  82. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
  83. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js +1 -1
  84. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs +1 -1
  85. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js +1 -0
  86. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
  87. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs +1 -0
  88. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
  89. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +1 -1
  90. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  91. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +1 -1
  92. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  93. package/dist/admin/components/SelectTree/Option.js.map +1 -1
  94. package/dist/admin/components/SelectTree/Option.mjs.map +1 -1
  95. package/dist/admin/components/SelectTree/SelectTree.js.map +1 -1
  96. package/dist/admin/components/SelectTree/SelectTree.mjs.map +1 -1
  97. package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -1
  98. package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -1
  99. package/dist/admin/components/SortPicker/SortPicker.js +1 -0
  100. package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
  101. package/dist/admin/components/SortPicker/SortPicker.mjs +1 -0
  102. package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
  103. package/dist/admin/components/TableList/CellContent.js +1 -1
  104. package/dist/admin/components/TableList/CellContent.mjs +1 -1
  105. package/dist/admin/components/TableList/PreviewCell.js +5 -4
  106. package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
  107. package/dist/admin/components/TableList/PreviewCell.mjs +2 -1
  108. package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
  109. package/dist/admin/components/TableList/TableList.js +1 -0
  110. package/dist/admin/components/TableList/TableList.js.map +1 -1
  111. package/dist/admin/components/TableList/TableList.mjs +1 -0
  112. package/dist/admin/components/TableList/TableList.mjs.map +1 -1
  113. package/dist/admin/components/TableList/TableRows.js +1 -0
  114. package/dist/admin/components/TableList/TableRows.js.map +1 -1
  115. package/dist/admin/components/TableList/TableRows.mjs +1 -0
  116. package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
  117. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js +1 -1
  118. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs +1 -1
  119. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +1 -0
  120. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
  121. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs +1 -0
  122. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
  123. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +1 -1
  124. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +1 -1
  125. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +1 -1
  126. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
  127. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs +1 -1
  128. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
  129. package/dist/admin/components/UploadProgress/UploadProgress.js.map +1 -1
  130. package/dist/admin/components/UploadProgress/UploadProgress.mjs.map +1 -1
  131. package/dist/admin/constants.js +5 -10
  132. package/dist/admin/constants.js.map +1 -1
  133. package/dist/admin/constants.mjs +5 -11
  134. package/dist/admin/constants.mjs.map +1 -1
  135. package/dist/admin/enums.js +20 -0
  136. package/dist/admin/enums.js.map +1 -0
  137. package/dist/admin/enums.mjs +17 -0
  138. package/dist/admin/enums.mjs.map +1 -0
  139. package/dist/admin/hooks/useBulkEdit.js +1 -1
  140. package/dist/admin/hooks/useBulkEdit.mjs +1 -1
  141. package/dist/admin/hooks/useBulkMove.js +1 -1
  142. package/dist/admin/hooks/useBulkMove.mjs +1 -1
  143. package/dist/admin/hooks/useBulkRemove.js +1 -1
  144. package/dist/admin/hooks/useBulkRemove.mjs +1 -1
  145. package/dist/admin/hooks/useEditAsset.js +1 -1
  146. package/dist/admin/hooks/useEditAsset.js.map +1 -1
  147. package/dist/admin/hooks/useEditAsset.mjs +1 -1
  148. package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
  149. package/dist/admin/hooks/useEditFolder.js.map +1 -1
  150. package/dist/admin/hooks/useEditFolder.mjs.map +1 -1
  151. package/dist/admin/hooks/useFolder.js +1 -1
  152. package/dist/admin/hooks/useFolder.js.map +1 -1
  153. package/dist/admin/hooks/useFolder.mjs +1 -1
  154. package/dist/admin/hooks/useFolder.mjs.map +1 -1
  155. package/dist/admin/hooks/useFolderStructure.js +1 -1
  156. package/dist/admin/hooks/useFolderStructure.mjs +1 -1
  157. package/dist/admin/hooks/useRemoveAsset.js.map +1 -1
  158. package/dist/admin/hooks/useRemoveAsset.mjs.map +1 -1
  159. package/dist/admin/hooks/useTracking.js +4 -1
  160. package/dist/admin/hooks/useTracking.js.map +1 -1
  161. package/dist/admin/hooks/useTracking.mjs +5 -2
  162. package/dist/admin/hooks/useTracking.mjs.map +1 -1
  163. package/dist/admin/hooks/useUpload.js.map +1 -1
  164. package/dist/admin/hooks/useUpload.mjs.map +1 -1
  165. package/dist/admin/index.js +1 -0
  166. package/dist/admin/index.js.map +1 -1
  167. package/dist/admin/index.mjs +1 -0
  168. package/dist/admin/index.mjs.map +1 -1
  169. package/dist/admin/package.json.js +7 -6
  170. package/dist/admin/package.json.js.map +1 -1
  171. package/dist/admin/package.json.mjs +7 -6
  172. package/dist/admin/package.json.mjs.map +1 -1
  173. package/dist/admin/pages/App/App.js +1 -1
  174. package/dist/admin/pages/App/App.mjs +1 -1
  175. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +1 -1
  176. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  177. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +1 -1
  178. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  179. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js +1 -0
  180. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
  181. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs +1 -0
  182. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
  183. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.js.map +1 -1
  184. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.mjs.map +1 -1
  185. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js +1 -0
  186. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js.map +1 -1
  187. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs +1 -0
  188. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs.map +1 -1
  189. package/dist/admin/pages/App/MediaLibrary/components/BulkActions.js +1 -1
  190. package/dist/admin/pages/App/MediaLibrary/components/BulkActions.mjs +1 -1
  191. package/dist/admin/pages/App/MediaLibrary/components/EmptyOrNoPermissions.js +1 -1
  192. package/dist/admin/pages/App/MediaLibrary/components/EmptyOrNoPermissions.mjs +1 -1
  193. package/dist/admin/pages/App/MediaLibrary/components/Filters.js +1 -1
  194. package/dist/admin/pages/App/MediaLibrary/components/Filters.mjs +1 -1
  195. package/dist/admin/pages/App/MediaLibrary/components/Header.js +1 -1
  196. package/dist/admin/pages/App/MediaLibrary/components/Header.js.map +1 -1
  197. package/dist/admin/pages/App/MediaLibrary/components/Header.mjs +1 -1
  198. package/dist/admin/pages/App/MediaLibrary/components/Header.mjs.map +1 -1
  199. package/dist/admin/pages/SettingsPage/SettingsPage.js +1 -0
  200. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  201. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +1 -0
  202. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  203. package/dist/admin/src/components/AssetCard/UploadingAssetCard.d.ts +1 -1
  204. package/dist/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.d.ts +1 -1
  205. package/dist/admin/src/constants.d.ts +0 -6
  206. package/dist/admin/src/enums.d.ts +12 -0
  207. package/dist/admin/src/utils/icons.d.ts +14 -0
  208. package/dist/admin/src/utils/rawFileToAsset.d.ts +1 -1
  209. package/dist/admin/src/utils/typeFromMime.d.ts +2 -2
  210. package/dist/admin/src/utils/urlsToAssets.d.ts +1 -1
  211. package/dist/admin/translations/pt-BR.json.js +75 -7
  212. package/dist/admin/translations/pt-BR.json.js.map +1 -1
  213. package/dist/admin/translations/pt-BR.json.mjs +75 -7
  214. package/dist/admin/translations/pt-BR.json.mjs.map +1 -1
  215. package/dist/admin/utils/formatBytes.js.map +1 -1
  216. package/dist/admin/utils/formatBytes.mjs.map +1 -1
  217. package/dist/admin/utils/formatDuration.js.map +1 -1
  218. package/dist/admin/utils/formatDuration.mjs.map +1 -1
  219. package/dist/admin/utils/getFolderURL.js.map +1 -1
  220. package/dist/admin/utils/getFolderURL.mjs.map +1 -1
  221. package/dist/admin/utils/getTrad.js.map +1 -1
  222. package/dist/admin/utils/getTrad.mjs.map +1 -1
  223. package/dist/admin/utils/icons.js +23 -0
  224. package/dist/admin/utils/icons.js.map +1 -0
  225. package/dist/admin/utils/icons.mjs +19 -0
  226. package/dist/admin/utils/icons.mjs.map +1 -0
  227. package/dist/admin/utils/normalizeAPIError.js.map +1 -1
  228. package/dist/admin/utils/normalizeAPIError.mjs.map +1 -1
  229. package/dist/admin/utils/prefixFileUrlWithBackendUrl.js.map +1 -1
  230. package/dist/admin/utils/prefixFileUrlWithBackendUrl.mjs.map +1 -1
  231. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
  232. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
  233. package/dist/admin/utils/typeFromMime.js +15 -11
  234. package/dist/admin/utils/typeFromMime.js.map +1 -1
  235. package/dist/admin/utils/typeFromMime.mjs +15 -11
  236. package/dist/admin/utils/typeFromMime.mjs.map +1 -1
  237. package/dist/server/controllers/admin-folder-file.js.map +1 -1
  238. package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
  239. package/dist/server/controllers/admin-upload.js +37 -5
  240. package/dist/server/controllers/admin-upload.js.map +1 -1
  241. package/dist/server/controllers/admin-upload.mjs +37 -5
  242. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  243. package/dist/server/controllers/utils/folders.js.map +1 -1
  244. package/dist/server/controllers/utils/folders.mjs.map +1 -1
  245. package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
  246. package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
  247. package/dist/server/controllers/validation/admin/folder.js +1 -1
  248. package/dist/server/controllers/validation/admin/folder.js.map +1 -1
  249. package/dist/server/controllers/validation/admin/folder.mjs +1 -1
  250. package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
  251. package/dist/server/register.js.map +1 -1
  252. package/dist/server/register.mjs.map +1 -1
  253. package/dist/server/services/ai-metadata.js.map +1 -1
  254. package/dist/server/services/ai-metadata.mjs.map +1 -1
  255. package/dist/server/services/api-upload-folder.js.map +1 -1
  256. package/dist/server/services/api-upload-folder.mjs.map +1 -1
  257. package/dist/server/services/folder.js.map +1 -1
  258. package/dist/server/services/folder.mjs.map +1 -1
  259. package/dist/server/services/image-manipulation.js +1 -1
  260. package/dist/server/services/image-manipulation.js.map +1 -1
  261. package/dist/server/services/image-manipulation.mjs +1 -1
  262. package/dist/server/services/image-manipulation.mjs.map +1 -1
  263. package/dist/server/services/metrics.js +4 -1
  264. package/dist/server/services/metrics.js.map +1 -1
  265. package/dist/server/services/metrics.mjs +4 -1
  266. package/dist/server/services/metrics.mjs.map +1 -1
  267. package/dist/server/services/upload.js.map +1 -1
  268. package/dist/server/services/upload.mjs.map +1 -1
  269. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  270. package/dist/server/src/services/metrics.d.ts.map +1 -1
  271. package/dist/server/src/types.d.ts +1 -0
  272. package/dist/server/src/types.d.ts.map +1 -1
  273. package/dist/server/src/utils/mime-validation.d.ts +34 -0
  274. package/dist/server/src/utils/mime-validation.d.ts.map +1 -0
  275. package/dist/server/utils/cron.js.map +1 -1
  276. package/dist/server/utils/cron.mjs.map +1 -1
  277. package/dist/server/utils/mime-validation.js +218 -0
  278. package/dist/server/utils/mime-validation.js.map +1 -0
  279. package/dist/server/utils/mime-validation.mjs +211 -0
  280. package/dist/server/utils/mime-validation.mjs.map +1 -0
  281. package/package.json +7 -6
@@ -0,0 +1,211 @@
1
+ import { fileTypeFromBuffer } from 'file-type';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { errors } from '@strapi/utils';
4
+
5
+ async function readFileChunk(filePath, chunkSize = 4100) {
6
+ const buffer = await readFile(filePath);
7
+ return buffer.length > chunkSize ? buffer.subarray(0, chunkSize) : buffer;
8
+ }
9
+ async function detectMimeType(file) {
10
+ let buffer;
11
+ const filePath = file.path || file.filepath || file.tempFilePath;
12
+ if (filePath) {
13
+ try {
14
+ buffer = await readFileChunk(filePath, 4100);
15
+ } catch (error) {
16
+ throw new Error(`Failed to read file: ${error instanceof Error ? error.message : String(error)}`);
17
+ }
18
+ } else if (file.buffer) {
19
+ buffer = file.buffer.length > 4100 ? file.buffer.subarray(0, 4100) : file.buffer;
20
+ } else {
21
+ // No file data available
22
+ return undefined;
23
+ }
24
+ try {
25
+ const result = await fileTypeFromBuffer(new Uint8Array(buffer));
26
+ return result?.mime;
27
+ } catch (error) {
28
+ throw new Error(`Failed to detect MIME type: ${error instanceof Error ? error.message : String(error)}`);
29
+ }
30
+ }
31
+ function matchesMimePattern(mimeType, patterns) {
32
+ if (!patterns?.length) return false;
33
+ return patterns.some((pattern)=>{
34
+ const normalizedPattern = pattern.toLowerCase();
35
+ const normalizedMimeType = mimeType.toLowerCase();
36
+ if (normalizedPattern.includes('*')) {
37
+ const regexPattern = normalizedPattern.replace(/\*/g, '.*');
38
+ const regex = new RegExp(`^${regexPattern}$`);
39
+ const matches = regex.test(normalizedMimeType);
40
+ return matches;
41
+ }
42
+ const exactMatch = normalizedPattern === normalizedMimeType;
43
+ return exactMatch;
44
+ });
45
+ }
46
+ function isMimeTypeAllowed(mimeType, config) {
47
+ const { allowedTypes, deniedTypes } = config;
48
+ if (!mimeType) return false;
49
+ if (deniedTypes?.length && matchesMimePattern(mimeType, deniedTypes)) {
50
+ return false;
51
+ }
52
+ if (allowedTypes?.length) {
53
+ return matchesMimePattern(mimeType, allowedTypes);
54
+ }
55
+ return true;
56
+ }
57
+ function extractFileInfo(file) {
58
+ const fileName = file.originalFilename || file.name || file.filename || file.newFilename || 'unknown';
59
+ const declaredMimeType = file.mimetype || file.type || file.mimeType || file.mime || '';
60
+ return {
61
+ fileName,
62
+ declaredMimeType
63
+ };
64
+ }
65
+ async function validateFile(file, config, strapi) {
66
+ const { allowedTypes, deniedTypes } = config;
67
+ if (!allowedTypes && !deniedTypes) {
68
+ return {
69
+ isValid: true
70
+ };
71
+ }
72
+ const { fileName, declaredMimeType } = extractFileInfo(file);
73
+ let detectedMime;
74
+ let mimeDetectionFailed = false;
75
+ try {
76
+ detectedMime = await detectMimeType(file);
77
+ } catch (error) {
78
+ mimeDetectionFailed = true;
79
+ strapi.log.warn('Failed to detect MIME type from file', {
80
+ fileName,
81
+ error: error instanceof Error ? error.message : String(error)
82
+ });
83
+ }
84
+ const mimeToValidate = detectedMime || declaredMimeType;
85
+ if (!detectedMime && (declaredMimeType === 'application/octet-stream' || !declaredMimeType || mimeDetectionFailed)) {
86
+ if (allowedTypes?.length || deniedTypes?.length) {
87
+ return {
88
+ isValid: false,
89
+ error: {
90
+ code: 'MIME_TYPE_NOT_ALLOWED',
91
+ message: `Cannot verify file type for security reasons`,
92
+ details: {
93
+ fileName,
94
+ reason: 'Unable to detect MIME type from file content',
95
+ declaredType: declaredMimeType,
96
+ mimeDetectionFailed
97
+ }
98
+ }
99
+ };
100
+ }
101
+ }
102
+ if (mimeToValidate && (allowedTypes || deniedTypes) && !isMimeTypeAllowed(mimeToValidate, config)) {
103
+ return {
104
+ isValid: false,
105
+ error: {
106
+ code: 'MIME_TYPE_NOT_ALLOWED',
107
+ message: `File type '${mimeToValidate}' is not allowed`,
108
+ details: {
109
+ fileName,
110
+ detectedType: detectedMime,
111
+ declaredType: declaredMimeType,
112
+ finalType: mimeToValidate,
113
+ allowedTypes,
114
+ deniedTypes
115
+ }
116
+ }
117
+ };
118
+ }
119
+ return {
120
+ isValid: true
121
+ };
122
+ }
123
+ async function validateFiles(files, strapi) {
124
+ const filesArray = Array.isArray(files) ? files : [
125
+ files
126
+ ];
127
+ if (!filesArray.length) {
128
+ return [];
129
+ }
130
+ const config = strapi.config.get('plugin::upload.security', {});
131
+ if (config.allowedTypes && (!Array.isArray(config.allowedTypes) || !config.allowedTypes.every((item)=>typeof item === 'string'))) {
132
+ throw new errors.ApplicationError('Invalid configuration: allowedTypes must be an array of strings.');
133
+ }
134
+ if (config.deniedTypes && (!Array.isArray(config.deniedTypes) || !config.deniedTypes.every((item)=>typeof item === 'string'))) {
135
+ throw new errors.ApplicationError('Invalid configuration: deniedTypes must be an array of strings.');
136
+ }
137
+ if (!config.allowedTypes && !config.deniedTypes) {
138
+ strapi.log.warn('No upload security configuration found. Consider configuring plugin.upload.security for enhanced file validation.');
139
+ return filesArray.map(()=>({
140
+ isValid: true
141
+ }));
142
+ }
143
+ const validationPromises = filesArray.map(async (file, index)=>{
144
+ try {
145
+ return await validateFile(file, config, strapi);
146
+ } catch (error) {
147
+ strapi.log.error('Unexpected error during file validation', {
148
+ fileIndex: index,
149
+ fileName: file?.name || file?.originalname,
150
+ error: error instanceof Error ? error.message : String(error)
151
+ });
152
+ return {
153
+ isValid: false,
154
+ error: {
155
+ code: 'VALIDATION_ERROR',
156
+ message: `Validation failed for file at index ${index}`,
157
+ details: {
158
+ index,
159
+ fileName: file?.name || file?.originalname,
160
+ originalError: error instanceof Error ? error.message : String(error)
161
+ }
162
+ }
163
+ };
164
+ }
165
+ });
166
+ return Promise.all(validationPromises);
167
+ }
168
+ async function enforceUploadSecurity(files, strapi) {
169
+ const validationResults = await validateFiles(files, strapi);
170
+ const filesArray = Array.isArray(files) ? files : [
171
+ files
172
+ ];
173
+ const validFiles = [];
174
+ const validFileNames = [];
175
+ const errors = [];
176
+ for (const [index, result] of validationResults.entries()){
177
+ if (result.isValid) {
178
+ const file = filesArray[index];
179
+ validFiles.push(file);
180
+ validFileNames.push(file.originalFilename || file.name);
181
+ } else if (result.error) {
182
+ errors.push({
183
+ file: filesArray[index],
184
+ originalIndex: index,
185
+ error: result.error
186
+ });
187
+ } else {
188
+ // Handle case where validation failed but no error details are provided
189
+ errors.push({
190
+ file: filesArray[index],
191
+ originalIndex: index,
192
+ error: {
193
+ code: 'UNKNOWN_ERROR',
194
+ message: 'File validation failed for unknown reason',
195
+ details: {
196
+ index,
197
+ fileName: filesArray[index]?.name || filesArray[index]?.originalname
198
+ }
199
+ }
200
+ });
201
+ }
202
+ }
203
+ return {
204
+ validFiles,
205
+ validFileNames,
206
+ errors
207
+ };
208
+ }
209
+
210
+ export { detectMimeType, enforceUploadSecurity, extractFileInfo, isMimeTypeAllowed, validateFile, validateFiles };
211
+ //# sourceMappingURL=mime-validation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mime-validation.mjs","sources":["../../../server/src/utils/mime-validation.ts"],"sourcesContent":["import { fileTypeFromBuffer } from 'file-type';\nimport { readFile } from 'node:fs/promises';\nimport type { Core } from '@strapi/types';\nimport { errors } from '@strapi/utils';\n\nexport type SecurityConfig = {\n allowedTypes?: string[];\n deniedTypes?: string[];\n};\ntype UploadValidationError = {\n code: 'MIME_TYPE_NOT_ALLOWED' | 'VALIDATION_ERROR' | 'UNKNOWN_ERROR';\n message: string;\n details: Record<string, any>;\n};\n\ntype ValidationResult = {\n isValid: boolean;\n error?: UploadValidationError;\n};\n\ntype ErrorDetail = {\n file: any;\n originalIndex: number;\n error: UploadValidationError;\n};\n\nasync function readFileChunk(filePath: string, chunkSize: number = 4100): Promise<Buffer> {\n const buffer = await readFile(filePath);\n return buffer.length > chunkSize ? buffer.subarray(0, chunkSize) : buffer;\n}\n\nexport async function detectMimeType(file: any): Promise<string | undefined> {\n let buffer: Buffer;\n\n const filePath = file.path || file.filepath || file.tempFilePath;\n\n if (filePath) {\n try {\n buffer = await readFileChunk(filePath, 4100);\n } catch (error) {\n throw new Error(\n `Failed to read file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n } else if (file.buffer) {\n buffer = file.buffer.length > 4100 ? file.buffer.subarray(0, 4100) : file.buffer;\n } else {\n // No file data available\n return undefined;\n }\n\n try {\n const result = await fileTypeFromBuffer(new Uint8Array(buffer));\n return result?.mime;\n } catch (error) {\n throw new Error(\n `Failed to detect MIME type: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction matchesMimePattern(mimeType: string, patterns: string[]): boolean {\n if (!patterns?.length) return false;\n\n return patterns.some((pattern) => {\n const normalizedPattern = pattern.toLowerCase();\n const normalizedMimeType = mimeType.toLowerCase();\n\n if (normalizedPattern.includes('*')) {\n const regexPattern = normalizedPattern.replace(/\\*/g, '.*');\n\n const regex = new RegExp(`^${regexPattern}$`);\n const matches = regex.test(normalizedMimeType);\n return matches;\n }\n\n const exactMatch = normalizedPattern === normalizedMimeType;\n return exactMatch;\n });\n}\n\nexport function isMimeTypeAllowed(mimeType: string, config: SecurityConfig): boolean {\n const { allowedTypes, deniedTypes } = config;\n\n if (!mimeType) return false;\n\n if (deniedTypes?.length && matchesMimePattern(mimeType, deniedTypes)) {\n return false;\n }\n\n if (allowedTypes?.length) {\n return matchesMimePattern(mimeType, allowedTypes);\n }\n\n return true;\n}\n\nexport function extractFileInfo(file: any) {\n const fileName =\n file.originalFilename || file.name || file.filename || file.newFilename || 'unknown';\n const declaredMimeType = file.mimetype || file.type || file.mimeType || file.mime || '';\n\n return { fileName, declaredMimeType };\n}\n\nexport async function validateFile(\n file: any,\n config: SecurityConfig,\n strapi: Core.Strapi\n): Promise<ValidationResult> {\n const { allowedTypes, deniedTypes } = config;\n\n if (!allowedTypes && !deniedTypes) {\n return { isValid: true };\n }\n\n const { fileName, declaredMimeType } = extractFileInfo(file);\n\n let detectedMime: string | undefined;\n let mimeDetectionFailed = false;\n\n try {\n detectedMime = await detectMimeType(file);\n } catch (error) {\n mimeDetectionFailed = true;\n strapi.log.warn('Failed to detect MIME type from file', {\n fileName,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const mimeToValidate = detectedMime || declaredMimeType;\n\n if (\n !detectedMime &&\n (declaredMimeType === 'application/octet-stream' || !declaredMimeType || mimeDetectionFailed)\n ) {\n if (allowedTypes?.length || deniedTypes?.length) {\n return {\n isValid: false,\n error: {\n code: 'MIME_TYPE_NOT_ALLOWED',\n message: `Cannot verify file type for security reasons`,\n details: {\n fileName,\n reason: 'Unable to detect MIME type from file content',\n declaredType: declaredMimeType,\n mimeDetectionFailed,\n },\n },\n };\n }\n }\n\n if (\n mimeToValidate &&\n (allowedTypes || deniedTypes) &&\n !isMimeTypeAllowed(mimeToValidate, config)\n ) {\n return {\n isValid: false,\n error: {\n code: 'MIME_TYPE_NOT_ALLOWED',\n message: `File type '${mimeToValidate}' is not allowed`,\n details: {\n fileName,\n detectedType: detectedMime,\n declaredType: declaredMimeType,\n finalType: mimeToValidate,\n allowedTypes,\n deniedTypes,\n },\n },\n };\n }\n\n return { isValid: true };\n}\n\nexport async function validateFiles(files: any, strapi: Core.Strapi): Promise<ValidationResult[]> {\n const filesArray = Array.isArray(files) ? files : [files];\n\n if (!filesArray.length) {\n return [];\n }\n\n const config: SecurityConfig = strapi.config.get('plugin::upload.security', {});\n if (\n config.allowedTypes &&\n (!Array.isArray(config.allowedTypes) ||\n !config.allowedTypes.every((item) => typeof item === 'string'))\n ) {\n throw new errors.ApplicationError(\n 'Invalid configuration: allowedTypes must be an array of strings.'\n );\n }\n\n if (\n config.deniedTypes &&\n (!Array.isArray(config.deniedTypes) ||\n !config.deniedTypes.every((item) => typeof item === 'string'))\n ) {\n throw new errors.ApplicationError(\n 'Invalid configuration: deniedTypes must be an array of strings.'\n );\n }\n\n if (!config.allowedTypes && !config.deniedTypes) {\n strapi.log.warn(\n 'No upload security configuration found. Consider configuring plugin.upload.security for enhanced file validation.'\n );\n return filesArray.map(() => ({ isValid: true }));\n }\n\n const validationPromises = filesArray.map(async (file, index) => {\n try {\n return await validateFile(file, config, strapi);\n } catch (error) {\n strapi.log.error('Unexpected error during file validation', {\n fileIndex: index,\n fileName: file?.name || file?.originalname,\n error: error instanceof Error ? error.message : String(error),\n });\n\n return {\n isValid: false,\n error: {\n code: 'VALIDATION_ERROR' as const,\n message: `Validation failed for file at index ${index}`,\n details: {\n index,\n fileName: file?.name || file?.originalname,\n originalError: error instanceof Error ? error.message : String(error),\n },\n },\n };\n }\n });\n\n return Promise.all(validationPromises);\n}\n\nexport async function enforceUploadSecurity(\n files: any,\n strapi: Core.Strapi\n): Promise<{\n validFiles: any[];\n validFileNames: string[];\n errors: Array<ErrorDetail>;\n}> {\n const validationResults = await validateFiles(files, strapi);\n const filesArray = Array.isArray(files) ? files : [files];\n\n const validFiles: any[] = [];\n const validFileNames: string[] = [];\n const errors: Array<ErrorDetail> = [];\n\n for (const [index, result] of validationResults.entries()) {\n if (result.isValid) {\n const file = filesArray[index];\n validFiles.push(file);\n validFileNames.push(file.originalFilename || file.name);\n } else if (result.error) {\n errors.push({\n file: filesArray[index],\n originalIndex: index,\n error: result.error,\n });\n } else {\n // Handle case where validation failed but no error details are provided\n errors.push({\n file: filesArray[index],\n originalIndex: index,\n error: {\n code: 'UNKNOWN_ERROR' as const,\n message: 'File validation failed for unknown reason',\n details: {\n index,\n fileName: filesArray[index]?.name || filesArray[index]?.originalname,\n },\n },\n });\n }\n }\n\n return { validFiles, validFileNames, errors };\n}\n"],"names":["readFileChunk","filePath","chunkSize","buffer","readFile","length","subarray","detectMimeType","file","path","filepath","tempFilePath","error","Error","message","String","undefined","result","fileTypeFromBuffer","Uint8Array","mime","matchesMimePattern","mimeType","patterns","some","pattern","normalizedPattern","toLowerCase","normalizedMimeType","includes","regexPattern","replace","regex","RegExp","matches","test","exactMatch","isMimeTypeAllowed","config","allowedTypes","deniedTypes","extractFileInfo","fileName","originalFilename","name","filename","newFilename","declaredMimeType","mimetype","type","validateFile","strapi","isValid","detectedMime","mimeDetectionFailed","log","warn","mimeToValidate","code","details","reason","declaredType","detectedType","finalType","validateFiles","files","filesArray","Array","isArray","get","every","item","errors","ApplicationError","map","validationPromises","index","fileIndex","originalname","originalError","Promise","all","enforceUploadSecurity","validationResults","validFiles","validFileNames","entries","push","originalIndex"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/upload",
3
- "version": "5.30.0",
3
+ "version": "5.31.0",
4
4
  "description": "Makes it easy to upload images and files to your Strapi Application.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": {
@@ -64,11 +64,12 @@
64
64
  "@reduxjs/toolkit": "1.9.7",
65
65
  "@strapi/design-system": "2.0.0-rc.30",
66
66
  "@strapi/icons": "2.0.0-rc.30",
67
- "@strapi/provider-upload-local": "5.30.0",
68
- "@strapi/utils": "5.30.0",
67
+ "@strapi/provider-upload-local": "5.31.0",
68
+ "@strapi/utils": "5.31.0",
69
69
  "byte-size": "8.1.1",
70
70
  "cropperjs": "1.6.1",
71
71
  "date-fns": "2.30.0",
72
+ "file-type": "21.0.0",
72
73
  "formik": "2.4.5",
73
74
  "fs-extra": "11.2.0",
74
75
  "immer": "9.0.21",
@@ -88,8 +89,8 @@
88
89
  "zod": "3.25.67"
89
90
  },
90
91
  "devDependencies": {
91
- "@strapi/admin": "5.30.0",
92
- "@strapi/types": "5.30.0",
92
+ "@strapi/admin": "5.31.0",
93
+ "@strapi/types": "5.31.0",
93
94
  "@testing-library/dom": "10.1.0",
94
95
  "@testing-library/react": "15.0.7",
95
96
  "@testing-library/user-event": "14.5.2",
@@ -115,7 +116,7 @@
115
116
  "styled-components": "^6.0.0"
116
117
  },
117
118
  "engines": {
118
- "node": ">=18.0.0 <=22.x.x",
119
+ "node": ">=20.0.0 <=24.x.x",
119
120
  "npm": ">=6.0.0"
120
121
  },
121
122
  "strapi": {