@strapi/upload 5.38.0 → 5.39.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.
@@ -51,6 +51,7 @@ const AssetPreview = /*#__PURE__*/ React__namespace.forwardRef(({ mime, url, nam
51
51
  ref: ref,
52
52
  src: url,
53
53
  alt: name,
54
+ crossOrigin: "anonymous",
54
55
  ...props
55
56
  });
56
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AssetPreview.js","sources":["../../../../../admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/media-has-caption */\nimport * as React from 'react';\n\nimport MuxPlayer from '@mux/mux-player-react';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled, useTheme } from 'styled-components';\n\nimport { AssetType } from '../../../enums';\nimport { typeFromMime } from '../../../utils';\nimport { getFileIconComponent } from '../../../utils/icons';\n\nconst CardAsset = styled(Flex)`\n min-height: 26.4rem;\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(\n 180deg,\n ${({ theme }) => theme.colors.neutral0} 0%,\n ${({ theme }) => theme.colors.neutral100} 121.48%\n );\n`;\n\ninterface AssetPreviewProps extends React.HTMLAttributes<HTMLElement> {\n mime: string;\n name: string;\n url: string;\n}\n\nexport const AssetPreview = React.forwardRef<\n HTMLImageElement | HTMLVideoElement | HTMLAudioElement,\n AssetPreviewProps\n>(({ mime, url, name, ...props }, ref) => {\n const theme = useTheme();\n\n const assetType = typeFromMime(mime);\n\n const { formatMessage } = useIntl();\n\n if (assetType === AssetType.Image) {\n return (\n <img ref={ref as React.ForwardedRef<HTMLImageElement>} src={url} alt={name} {...props} />\n );\n }\n\n if (assetType === AssetType.Video) {\n return <MuxPlayer src={url} accentColor={theme.colors.primary500} />;\n }\n\n if (assetType === AssetType.Audio) {\n return (\n <Box margin=\"5\">\n <audio controls src={url} ref={ref as React.ForwardedRef<HTMLAudioElement>} {...props}>\n {name}\n </audio>\n </Box>\n );\n }\n\n // getFileIconComponent will handle all other file types, eg. PDF, CSV, XLS, ZIP\n // If the file type is not recognized, the default icon will be used\n const IconComponent = getFileIconComponent(assetType);\n return (\n <CardAsset width=\"100%\" justifyContent=\"center\" {...props}>\n <Flex gap={2} direction=\"column\" alignItems=\"center\">\n <IconComponent aria-label={name} fill=\"neutral500\" width={24} height={24} />\n <Typography textColor=\"neutral500\" variant=\"pi\">\n {formatMessage({\n id: 'noPreview',\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </Flex>\n </CardAsset>\n );\n});\n\nAssetPreview.displayName = 'AssetPreview';\n"],"names":["CardAsset","styled","Flex","theme","borderRadius","colors","neutral0","neutral100","AssetPreview","React","forwardRef","mime","url","name","props","ref","useTheme","assetType","typeFromMime","formatMessage","useIntl","AssetType","Image","_jsx","img","src","alt","Video","MuxPlayer","accentColor","primary500","Audio","Box","margin","audio","controls","IconComponent","getFileIconComponent","width","justifyContent","_jsxs","gap","direction","alignItems","aria-label","fill","height","Typography","textColor","variant","id","defaultMessage","displayName"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAMA,SAAAA,GAAYC,uBAAAA,CAAOC,iBAAAA,CAAK;;AAEb,iBAAA,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,MAAMC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAMC,YAAY,CAAC;;;IAGtF,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACC,QAAQ,CAAC;IACvC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACE,UAAU,CAAC;;AAE7C,CAAC;AAQM,MAAMC,YAAAA,iBAAeC,gBAAAA,CAAMC,UAAU,CAG1C,CAAC,EAAEC,IAAI,EAAEC,GAAG,EAAEC,IAAI,EAAE,GAAGC,OAAO,EAAEC,GAAAA,GAAAA;AAChC,IAAA,MAAMZ,KAAAA,GAAQa,yBAAAA,EAAAA;AAEd,IAAA,MAAMC,YAAYC,yBAAAA,CAAaP,IAAAA,CAAAA;IAE/B,MAAM,EAAEQ,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAE1B,IAAIH,SAAAA,KAAcI,eAAAA,CAAUC,KAAK,EAAE;AACjC,QAAA,qBACEC,cAAA,CAACC,KAAAA,EAAAA;YAAIT,GAAAA,EAAKA,GAAAA;YAA6CU,GAAAA,EAAKb,GAAAA;YAAKc,GAAAA,EAAKb,IAAAA;AAAO,YAAA,GAAGC;;AAEpF,IAAA;IAEA,IAAIG,SAAAA,KAAcI,eAAAA,CAAUM,KAAK,EAAE;AACjC,QAAA,qBAAOJ,cAAA,CAACK,SAAAA,EAAAA;YAAUH,GAAAA,EAAKb,GAAAA;YAAKiB,WAAAA,EAAa1B,KAAAA,CAAME,MAAM,CAACyB;;AACxD,IAAA;IAEA,IAAIb,SAAAA,KAAcI,eAAAA,CAAUU,KAAK,EAAE;AACjC,QAAA,qBACER,cAAA,CAACS,gBAAAA,EAAAA;YAAIC,MAAAA,EAAO,GAAA;AACV,YAAA,QAAA,gBAAAV,cAAA,CAACW,OAAAA,EAAAA;gBAAMC,QAAQ,EAAA,IAAA;gBAACV,GAAAA,EAAKb,GAAAA;gBAAKG,GAAAA,EAAKA,GAAAA;AAA8C,gBAAA,GAAGD,KAAK;AAClFD,gBAAAA,QAAAA,EAAAA;;;AAIT,IAAA;;;AAIA,IAAA,MAAMuB,gBAAgBC,0BAAAA,CAAqBpB,SAAAA,CAAAA;AAC3C,IAAA,qBACEM,cAAA,CAACvB,SAAAA,EAAAA;QAAUsC,KAAAA,EAAM,MAAA;QAAOC,cAAAA,EAAe,QAAA;AAAU,QAAA,GAAGzB,KAAK;AACvD,QAAA,QAAA,gBAAA0B,eAAA,CAACtC,iBAAAA,EAAAA;YAAKuC,GAAAA,EAAK,CAAA;YAAGC,SAAAA,EAAU,QAAA;YAASC,UAAAA,EAAW,QAAA;;8BAC1CpB,cAAA,CAACa,aAAAA,EAAAA;oBAAcQ,YAAAA,EAAY/B,IAAAA;oBAAMgC,IAAAA,EAAK,YAAA;oBAAaP,KAAAA,EAAO,EAAA;oBAAIQ,MAAAA,EAAQ;;8BACtEvB,cAAA,CAACwB,uBAAAA,EAAAA;oBAAWC,SAAAA,EAAU,YAAA;oBAAaC,OAAAA,EAAQ,IAAA;8BACxC9B,aAAAA,CAAc;wBACb+B,EAAAA,EAAI,WAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;;;;AAKV,CAAA;AAEA3C,YAAAA,CAAa4C,WAAW,GAAG,cAAA;;;;"}
1
+ {"version":3,"file":"AssetPreview.js","sources":["../../../../../admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/media-has-caption */\nimport * as React from 'react';\n\nimport MuxPlayer from '@mux/mux-player-react';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled, useTheme } from 'styled-components';\n\nimport { AssetType } from '../../../enums';\nimport { typeFromMime } from '../../../utils';\nimport { getFileIconComponent } from '../../../utils/icons';\n\nconst CardAsset = styled(Flex)`\n min-height: 26.4rem;\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(\n 180deg,\n ${({ theme }) => theme.colors.neutral0} 0%,\n ${({ theme }) => theme.colors.neutral100} 121.48%\n );\n`;\n\ninterface AssetPreviewProps extends React.HTMLAttributes<HTMLElement> {\n mime: string;\n name: string;\n url: string;\n}\n\nexport const AssetPreview = React.forwardRef<\n HTMLImageElement | HTMLVideoElement | HTMLAudioElement,\n AssetPreviewProps\n>(({ mime, url, name, ...props }, ref) => {\n const theme = useTheme();\n\n const assetType = typeFromMime(mime);\n\n const { formatMessage } = useIntl();\n\n if (assetType === AssetType.Image) {\n return (\n <img\n ref={ref as React.ForwardedRef<HTMLImageElement>}\n src={url}\n alt={name}\n crossOrigin=\"anonymous\"\n {...props}\n />\n );\n }\n\n if (assetType === AssetType.Video) {\n return <MuxPlayer src={url} accentColor={theme.colors.primary500} />;\n }\n\n if (assetType === AssetType.Audio) {\n return (\n <Box margin=\"5\">\n <audio controls src={url} ref={ref as React.ForwardedRef<HTMLAudioElement>} {...props}>\n {name}\n </audio>\n </Box>\n );\n }\n\n // getFileIconComponent will handle all other file types, eg. PDF, CSV, XLS, ZIP\n // If the file type is not recognized, the default icon will be used\n const IconComponent = getFileIconComponent(assetType);\n return (\n <CardAsset width=\"100%\" justifyContent=\"center\" {...props}>\n <Flex gap={2} direction=\"column\" alignItems=\"center\">\n <IconComponent aria-label={name} fill=\"neutral500\" width={24} height={24} />\n <Typography textColor=\"neutral500\" variant=\"pi\">\n {formatMessage({\n id: 'noPreview',\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </Flex>\n </CardAsset>\n );\n});\n\nAssetPreview.displayName = 'AssetPreview';\n"],"names":["CardAsset","styled","Flex","theme","borderRadius","colors","neutral0","neutral100","AssetPreview","React","forwardRef","mime","url","name","props","ref","useTheme","assetType","typeFromMime","formatMessage","useIntl","AssetType","Image","_jsx","img","src","alt","crossOrigin","Video","MuxPlayer","accentColor","primary500","Audio","Box","margin","audio","controls","IconComponent","getFileIconComponent","width","justifyContent","_jsxs","gap","direction","alignItems","aria-label","fill","height","Typography","textColor","variant","id","defaultMessage","displayName"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAMA,SAAAA,GAAYC,uBAAAA,CAAOC,iBAAAA,CAAK;;AAEb,iBAAA,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,MAAMC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAMC,YAAY,CAAC;;;IAGtF,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACC,QAAQ,CAAC;IACvC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACE,UAAU,CAAC;;AAE7C,CAAC;AAQM,MAAMC,YAAAA,iBAAeC,gBAAAA,CAAMC,UAAU,CAG1C,CAAC,EAAEC,IAAI,EAAEC,GAAG,EAAEC,IAAI,EAAE,GAAGC,OAAO,EAAEC,GAAAA,GAAAA;AAChC,IAAA,MAAMZ,KAAAA,GAAQa,yBAAAA,EAAAA;AAEd,IAAA,MAAMC,YAAYC,yBAAAA,CAAaP,IAAAA,CAAAA;IAE/B,MAAM,EAAEQ,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAE1B,IAAIH,SAAAA,KAAcI,eAAAA,CAAUC,KAAK,EAAE;AACjC,QAAA,qBACEC,cAAA,CAACC,KAAAA,EAAAA;YACCT,GAAAA,EAAKA,GAAAA;YACLU,GAAAA,EAAKb,GAAAA;YACLc,GAAAA,EAAKb,IAAAA;YACLc,WAAAA,EAAY,WAAA;AACX,YAAA,GAAGb;;AAGV,IAAA;IAEA,IAAIG,SAAAA,KAAcI,eAAAA,CAAUO,KAAK,EAAE;AACjC,QAAA,qBAAOL,cAAA,CAACM,SAAAA,EAAAA;YAAUJ,GAAAA,EAAKb,GAAAA;YAAKkB,WAAAA,EAAa3B,KAAAA,CAAME,MAAM,CAAC0B;;AACxD,IAAA;IAEA,IAAId,SAAAA,KAAcI,eAAAA,CAAUW,KAAK,EAAE;AACjC,QAAA,qBACET,cAAA,CAACU,gBAAAA,EAAAA;YAAIC,MAAAA,EAAO,GAAA;AACV,YAAA,QAAA,gBAAAX,cAAA,CAACY,OAAAA,EAAAA;gBAAMC,QAAQ,EAAA,IAAA;gBAACX,GAAAA,EAAKb,GAAAA;gBAAKG,GAAAA,EAAKA,GAAAA;AAA8C,gBAAA,GAAGD,KAAK;AAClFD,gBAAAA,QAAAA,EAAAA;;;AAIT,IAAA;;;AAIA,IAAA,MAAMwB,gBAAgBC,0BAAAA,CAAqBrB,SAAAA,CAAAA;AAC3C,IAAA,qBACEM,cAAA,CAACvB,SAAAA,EAAAA;QAAUuC,KAAAA,EAAM,MAAA;QAAOC,cAAAA,EAAe,QAAA;AAAU,QAAA,GAAG1B,KAAK;AACvD,QAAA,QAAA,gBAAA2B,eAAA,CAACvC,iBAAAA,EAAAA;YAAKwC,GAAAA,EAAK,CAAA;YAAGC,SAAAA,EAAU,QAAA;YAASC,UAAAA,EAAW,QAAA;;8BAC1CrB,cAAA,CAACc,aAAAA,EAAAA;oBAAcQ,YAAAA,EAAYhC,IAAAA;oBAAMiC,IAAAA,EAAK,YAAA;oBAAaP,KAAAA,EAAO,EAAA;oBAAIQ,MAAAA,EAAQ;;8BACtExB,cAAA,CAACyB,uBAAAA,EAAAA;oBAAWC,SAAAA,EAAU,YAAA;oBAAaC,OAAAA,EAAQ,IAAA;8BACxC/B,aAAAA,CAAc;wBACbgC,EAAAA,EAAI,WAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;;;;AAKV,CAAA;AAEA5C,YAAAA,CAAa6C,WAAW,GAAG,cAAA;;;;"}
@@ -30,6 +30,7 @@ const AssetPreview = /*#__PURE__*/ React.forwardRef(({ mime, url, name, ...props
30
30
  ref: ref,
31
31
  src: url,
32
32
  alt: name,
33
+ crossOrigin: "anonymous",
33
34
  ...props
34
35
  });
35
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AssetPreview.mjs","sources":["../../../../../admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/media-has-caption */\nimport * as React from 'react';\n\nimport MuxPlayer from '@mux/mux-player-react';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled, useTheme } from 'styled-components';\n\nimport { AssetType } from '../../../enums';\nimport { typeFromMime } from '../../../utils';\nimport { getFileIconComponent } from '../../../utils/icons';\n\nconst CardAsset = styled(Flex)`\n min-height: 26.4rem;\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(\n 180deg,\n ${({ theme }) => theme.colors.neutral0} 0%,\n ${({ theme }) => theme.colors.neutral100} 121.48%\n );\n`;\n\ninterface AssetPreviewProps extends React.HTMLAttributes<HTMLElement> {\n mime: string;\n name: string;\n url: string;\n}\n\nexport const AssetPreview = React.forwardRef<\n HTMLImageElement | HTMLVideoElement | HTMLAudioElement,\n AssetPreviewProps\n>(({ mime, url, name, ...props }, ref) => {\n const theme = useTheme();\n\n const assetType = typeFromMime(mime);\n\n const { formatMessage } = useIntl();\n\n if (assetType === AssetType.Image) {\n return (\n <img ref={ref as React.ForwardedRef<HTMLImageElement>} src={url} alt={name} {...props} />\n );\n }\n\n if (assetType === AssetType.Video) {\n return <MuxPlayer src={url} accentColor={theme.colors.primary500} />;\n }\n\n if (assetType === AssetType.Audio) {\n return (\n <Box margin=\"5\">\n <audio controls src={url} ref={ref as React.ForwardedRef<HTMLAudioElement>} {...props}>\n {name}\n </audio>\n </Box>\n );\n }\n\n // getFileIconComponent will handle all other file types, eg. PDF, CSV, XLS, ZIP\n // If the file type is not recognized, the default icon will be used\n const IconComponent = getFileIconComponent(assetType);\n return (\n <CardAsset width=\"100%\" justifyContent=\"center\" {...props}>\n <Flex gap={2} direction=\"column\" alignItems=\"center\">\n <IconComponent aria-label={name} fill=\"neutral500\" width={24} height={24} />\n <Typography textColor=\"neutral500\" variant=\"pi\">\n {formatMessage({\n id: 'noPreview',\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </Flex>\n </CardAsset>\n );\n});\n\nAssetPreview.displayName = 'AssetPreview';\n"],"names":["CardAsset","styled","Flex","theme","borderRadius","colors","neutral0","neutral100","AssetPreview","React","forwardRef","mime","url","name","props","ref","useTheme","assetType","typeFromMime","formatMessage","useIntl","AssetType","Image","_jsx","img","src","alt","Video","MuxPlayer","accentColor","primary500","Audio","Box","margin","audio","controls","IconComponent","getFileIconComponent","width","justifyContent","_jsxs","gap","direction","alignItems","aria-label","fill","height","Typography","textColor","variant","id","defaultMessage","displayName"],"mappings":";;;;;;;;;;;;;;AAYA,MAAMA,SAAAA,GAAYC,MAAAA,CAAOC,IAAAA,CAAK;;AAEb,iBAAA,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,MAAMC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAMC,YAAY,CAAC;;;IAGtF,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACC,QAAQ,CAAC;IACvC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACE,UAAU,CAAC;;AAE7C,CAAC;AAQM,MAAMC,YAAAA,iBAAeC,KAAAA,CAAMC,UAAU,CAG1C,CAAC,EAAEC,IAAI,EAAEC,GAAG,EAAEC,IAAI,EAAE,GAAGC,OAAO,EAAEC,GAAAA,GAAAA;AAChC,IAAA,MAAMZ,KAAAA,GAAQa,QAAAA,EAAAA;AAEd,IAAA,MAAMC,YAAYC,YAAAA,CAAaP,IAAAA,CAAAA;IAE/B,MAAM,EAAEQ,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAE1B,IAAIH,SAAAA,KAAcI,SAAAA,CAAUC,KAAK,EAAE;AACjC,QAAA,qBACEC,GAAA,CAACC,KAAAA,EAAAA;YAAIT,GAAAA,EAAKA,GAAAA;YAA6CU,GAAAA,EAAKb,GAAAA;YAAKc,GAAAA,EAAKb,IAAAA;AAAO,YAAA,GAAGC;;AAEpF,IAAA;IAEA,IAAIG,SAAAA,KAAcI,SAAAA,CAAUM,KAAK,EAAE;AACjC,QAAA,qBAAOJ,GAAA,CAACK,SAAAA,EAAAA;YAAUH,GAAAA,EAAKb,GAAAA;YAAKiB,WAAAA,EAAa1B,KAAAA,CAAME,MAAM,CAACyB;;AACxD,IAAA;IAEA,IAAIb,SAAAA,KAAcI,SAAAA,CAAUU,KAAK,EAAE;AACjC,QAAA,qBACER,GAAA,CAACS,GAAAA,EAAAA;YAAIC,MAAAA,EAAO,GAAA;AACV,YAAA,QAAA,gBAAAV,GAAA,CAACW,OAAAA,EAAAA;gBAAMC,QAAQ,EAAA,IAAA;gBAACV,GAAAA,EAAKb,GAAAA;gBAAKG,GAAAA,EAAKA,GAAAA;AAA8C,gBAAA,GAAGD,KAAK;AAClFD,gBAAAA,QAAAA,EAAAA;;;AAIT,IAAA;;;AAIA,IAAA,MAAMuB,gBAAgBC,oBAAAA,CAAqBpB,SAAAA,CAAAA;AAC3C,IAAA,qBACEM,GAAA,CAACvB,SAAAA,EAAAA;QAAUsC,KAAAA,EAAM,MAAA;QAAOC,cAAAA,EAAe,QAAA;AAAU,QAAA,GAAGzB,KAAK;AACvD,QAAA,QAAA,gBAAA0B,IAAA,CAACtC,IAAAA,EAAAA;YAAKuC,GAAAA,EAAK,CAAA;YAAGC,SAAAA,EAAU,QAAA;YAASC,UAAAA,EAAW,QAAA;;8BAC1CpB,GAAA,CAACa,aAAAA,EAAAA;oBAAcQ,YAAAA,EAAY/B,IAAAA;oBAAMgC,IAAAA,EAAK,YAAA;oBAAaP,KAAAA,EAAO,EAAA;oBAAIQ,MAAAA,EAAQ;;8BACtEvB,GAAA,CAACwB,UAAAA,EAAAA;oBAAWC,SAAAA,EAAU,YAAA;oBAAaC,OAAAA,EAAQ,IAAA;8BACxC9B,aAAAA,CAAc;wBACb+B,EAAAA,EAAI,WAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;;;;AAKV,CAAA;AAEA3C,YAAAA,CAAa4C,WAAW,GAAG,cAAA;;;;"}
1
+ {"version":3,"file":"AssetPreview.mjs","sources":["../../../../../admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/media-has-caption */\nimport * as React from 'react';\n\nimport MuxPlayer from '@mux/mux-player-react';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled, useTheme } from 'styled-components';\n\nimport { AssetType } from '../../../enums';\nimport { typeFromMime } from '../../../utils';\nimport { getFileIconComponent } from '../../../utils/icons';\n\nconst CardAsset = styled(Flex)`\n min-height: 26.4rem;\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(\n 180deg,\n ${({ theme }) => theme.colors.neutral0} 0%,\n ${({ theme }) => theme.colors.neutral100} 121.48%\n );\n`;\n\ninterface AssetPreviewProps extends React.HTMLAttributes<HTMLElement> {\n mime: string;\n name: string;\n url: string;\n}\n\nexport const AssetPreview = React.forwardRef<\n HTMLImageElement | HTMLVideoElement | HTMLAudioElement,\n AssetPreviewProps\n>(({ mime, url, name, ...props }, ref) => {\n const theme = useTheme();\n\n const assetType = typeFromMime(mime);\n\n const { formatMessage } = useIntl();\n\n if (assetType === AssetType.Image) {\n return (\n <img\n ref={ref as React.ForwardedRef<HTMLImageElement>}\n src={url}\n alt={name}\n crossOrigin=\"anonymous\"\n {...props}\n />\n );\n }\n\n if (assetType === AssetType.Video) {\n return <MuxPlayer src={url} accentColor={theme.colors.primary500} />;\n }\n\n if (assetType === AssetType.Audio) {\n return (\n <Box margin=\"5\">\n <audio controls src={url} ref={ref as React.ForwardedRef<HTMLAudioElement>} {...props}>\n {name}\n </audio>\n </Box>\n );\n }\n\n // getFileIconComponent will handle all other file types, eg. PDF, CSV, XLS, ZIP\n // If the file type is not recognized, the default icon will be used\n const IconComponent = getFileIconComponent(assetType);\n return (\n <CardAsset width=\"100%\" justifyContent=\"center\" {...props}>\n <Flex gap={2} direction=\"column\" alignItems=\"center\">\n <IconComponent aria-label={name} fill=\"neutral500\" width={24} height={24} />\n <Typography textColor=\"neutral500\" variant=\"pi\">\n {formatMessage({\n id: 'noPreview',\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </Flex>\n </CardAsset>\n );\n});\n\nAssetPreview.displayName = 'AssetPreview';\n"],"names":["CardAsset","styled","Flex","theme","borderRadius","colors","neutral0","neutral100","AssetPreview","React","forwardRef","mime","url","name","props","ref","useTheme","assetType","typeFromMime","formatMessage","useIntl","AssetType","Image","_jsx","img","src","alt","crossOrigin","Video","MuxPlayer","accentColor","primary500","Audio","Box","margin","audio","controls","IconComponent","getFileIconComponent","width","justifyContent","_jsxs","gap","direction","alignItems","aria-label","fill","height","Typography","textColor","variant","id","defaultMessage","displayName"],"mappings":";;;;;;;;;;;;;;AAYA,MAAMA,SAAAA,GAAYC,MAAAA,CAAOC,IAAAA,CAAK;;AAEb,iBAAA,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,MAAMC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAMC,YAAY,CAAC;;;IAGtF,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACC,QAAQ,CAAC;IACvC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACE,UAAU,CAAC;;AAE7C,CAAC;AAQM,MAAMC,YAAAA,iBAAeC,KAAAA,CAAMC,UAAU,CAG1C,CAAC,EAAEC,IAAI,EAAEC,GAAG,EAAEC,IAAI,EAAE,GAAGC,OAAO,EAAEC,GAAAA,GAAAA;AAChC,IAAA,MAAMZ,KAAAA,GAAQa,QAAAA,EAAAA;AAEd,IAAA,MAAMC,YAAYC,YAAAA,CAAaP,IAAAA,CAAAA;IAE/B,MAAM,EAAEQ,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAE1B,IAAIH,SAAAA,KAAcI,SAAAA,CAAUC,KAAK,EAAE;AACjC,QAAA,qBACEC,GAAA,CAACC,KAAAA,EAAAA;YACCT,GAAAA,EAAKA,GAAAA;YACLU,GAAAA,EAAKb,GAAAA;YACLc,GAAAA,EAAKb,IAAAA;YACLc,WAAAA,EAAY,WAAA;AACX,YAAA,GAAGb;;AAGV,IAAA;IAEA,IAAIG,SAAAA,KAAcI,SAAAA,CAAUO,KAAK,EAAE;AACjC,QAAA,qBAAOL,GAAA,CAACM,SAAAA,EAAAA;YAAUJ,GAAAA,EAAKb,GAAAA;YAAKkB,WAAAA,EAAa3B,KAAAA,CAAME,MAAM,CAAC0B;;AACxD,IAAA;IAEA,IAAId,SAAAA,KAAcI,SAAAA,CAAUW,KAAK,EAAE;AACjC,QAAA,qBACET,GAAA,CAACU,GAAAA,EAAAA;YAAIC,MAAAA,EAAO,GAAA;AACV,YAAA,QAAA,gBAAAX,GAAA,CAACY,OAAAA,EAAAA;gBAAMC,QAAQ,EAAA,IAAA;gBAACX,GAAAA,EAAKb,GAAAA;gBAAKG,GAAAA,EAAKA,GAAAA;AAA8C,gBAAA,GAAGD,KAAK;AAClFD,gBAAAA,QAAAA,EAAAA;;;AAIT,IAAA;;;AAIA,IAAA,MAAMwB,gBAAgBC,oBAAAA,CAAqBrB,SAAAA,CAAAA;AAC3C,IAAA,qBACEM,GAAA,CAACvB,SAAAA,EAAAA;QAAUuC,KAAAA,EAAM,MAAA;QAAOC,cAAAA,EAAe,QAAA;AAAU,QAAA,GAAG1B,KAAK;AACvD,QAAA,QAAA,gBAAA2B,IAAA,CAACvC,IAAAA,EAAAA;YAAKwC,GAAAA,EAAK,CAAA;YAAGC,SAAAA,EAAU,QAAA;YAASC,UAAAA,EAAW,QAAA;;8BAC1CrB,GAAA,CAACc,aAAAA,EAAAA;oBAAcQ,YAAAA,EAAYhC,IAAAA;oBAAMiC,IAAAA,EAAK,YAAA;oBAAaP,KAAAA,EAAO,EAAA;oBAAIQ,MAAAA,EAAQ;;8BACtExB,GAAA,CAACyB,UAAAA,EAAAA;oBAAWC,SAAAA,EAAU,YAAA;oBAAaC,OAAAA,EAAQ,IAAA;8BACxC/B,aAAAA,CAAc;wBACbgC,EAAAA,EAAI,WAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;;;;AAKV,CAAA;AAEA5C,YAAAA,CAAa6C,WAAW,GAAG,cAAA;;;;"}
@@ -114,7 +114,31 @@ var es = {
114
114
  "modal.header.go-back": "Volver",
115
115
  "modal.folder.move.title": "Mover elementos a",
116
116
  "modal.move.success-label": "Los elementos han sido movidos con éxito",
117
- "modal.upload-list.footer.button": "Subir {number, plural, one {# archivo} other {# archivo}} a la biblioteca"
117
+ "modal.upload-list.footer.button": "Subir {number, plural, one {# archivo} other {# archivo}} a la biblioteca",
118
+ "apiError.FileTooBig": "El archivo cargado excede el tamaño máximo permitido.",
119
+ "input.notification.not-supported": "No puede cargar este tipo de archivos, sólo se aceptan los siguientes tipos – {fileTypes}",
120
+ "list-assets-select": "Seleccionar medio {name}",
121
+ "list.folder.select": "Seleccionar carpeta {name}",
122
+ "list.folders.link-label": "Entrar a la carpeta",
123
+ "modal.file-details.id": "ID del medio",
124
+ "list.table.header.actions": "acciones",
125
+ "list.table.header.preview": "previsualización",
126
+ "list.table.header.name": "nombre",
127
+ "list.table.header.ext": "extensión",
128
+ "list.table.header.size": "tamaño",
129
+ "list.table.header.createdAt": "creado",
130
+ "list.table.header.updatedAt": "última actualización",
131
+ "list.table.header.sort": "Ordenar en {label}",
132
+ "list.table.content.empty-label": "Este campo está vacío",
133
+ "config.back": "Atrás",
134
+ "config.subtitle": "Definir la configuración de vista de la libreria de medios.",
135
+ "config.entries.title": "Entradas por página",
136
+ "config.sort.title": "Orden de clasificación por defecto",
137
+ "config.entries.note": "Número de medios mostrados por defecto en la librería de medios",
138
+ "config.note": "Nota: Puedes anular este valor en la librería de medios.",
139
+ "config.popUpWarning.warning.updateAllSettings": "Esto modificará todos tus ajustes",
140
+ "view-switch.list": "Vista de lista",
141
+ "view-switch.grid": "Vista de cuadrícula"
118
142
  };
119
143
 
120
144
  module.exports = es;
@@ -1 +1 @@
1
- {"version":3,"file":"es.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"es.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -112,7 +112,31 @@ var es = {
112
112
  "modal.header.go-back": "Volver",
113
113
  "modal.folder.move.title": "Mover elementos a",
114
114
  "modal.move.success-label": "Los elementos han sido movidos con éxito",
115
- "modal.upload-list.footer.button": "Subir {number, plural, one {# archivo} other {# archivo}} a la biblioteca"
115
+ "modal.upload-list.footer.button": "Subir {number, plural, one {# archivo} other {# archivo}} a la biblioteca",
116
+ "apiError.FileTooBig": "El archivo cargado excede el tamaño máximo permitido.",
117
+ "input.notification.not-supported": "No puede cargar este tipo de archivos, sólo se aceptan los siguientes tipos – {fileTypes}",
118
+ "list-assets-select": "Seleccionar medio {name}",
119
+ "list.folder.select": "Seleccionar carpeta {name}",
120
+ "list.folders.link-label": "Entrar a la carpeta",
121
+ "modal.file-details.id": "ID del medio",
122
+ "list.table.header.actions": "acciones",
123
+ "list.table.header.preview": "previsualización",
124
+ "list.table.header.name": "nombre",
125
+ "list.table.header.ext": "extensión",
126
+ "list.table.header.size": "tamaño",
127
+ "list.table.header.createdAt": "creado",
128
+ "list.table.header.updatedAt": "última actualización",
129
+ "list.table.header.sort": "Ordenar en {label}",
130
+ "list.table.content.empty-label": "Este campo está vacío",
131
+ "config.back": "Atrás",
132
+ "config.subtitle": "Definir la configuración de vista de la libreria de medios.",
133
+ "config.entries.title": "Entradas por página",
134
+ "config.sort.title": "Orden de clasificación por defecto",
135
+ "config.entries.note": "Número de medios mostrados por defecto en la librería de medios",
136
+ "config.note": "Nota: Puedes anular este valor en la librería de medios.",
137
+ "config.popUpWarning.warning.updateAllSettings": "Esto modificará todos tus ajustes",
138
+ "view-switch.list": "Vista de lista",
139
+ "view-switch.grid": "Vista de cuadrícula"
116
140
  };
117
141
 
118
142
  export { es as default };
@@ -1 +1 @@
1
- {"version":3,"file":"es.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"es.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -118,9 +118,14 @@ var upload = (({ strapi })=>{
118
118
  return entity;
119
119
  }
120
120
  async function enhanceAndValidateFile(file, fileInfo, metas) {
121
+ // Prefer detected MIME type from security validation. Treat application/octet-stream as
122
+ // undeclared so we use detected type when the client sends no real Content-Type.
123
+ const detected = file.detectedMimeType;
124
+ const declared = file.mimetype || '';
125
+ const mimeType = detected || (declared && declared !== 'application/octet-stream' ? declared : undefined) || 'application/octet-stream';
121
126
  const currentFile = await formatFileInfo({
122
127
  filename: file.originalFilename ?? 'unamed',
123
- type: file.mimetype ?? 'application/octet-stream',
128
+ type: mimeType,
124
129
  size: file.size
125
130
  }, fileInfo, {
126
131
  ...metas,
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","sources":["../../../server/src/services/upload.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\nimport { extension } from 'mime-types';\nimport {\n async,\n sanitize,\n contentTypes as contentTypesUtils,\n errors,\n file as fileUtils,\n} from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { FILE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from '../constants';\nimport { getService } from '../utils';\n\nimport type { Config, File, InputFile, UploadableFile, FileInfo } from '../types';\nimport type { ViewConfiguration } from '../controllers/validation/admin/configureView';\nimport type { Settings } from '../controllers/validation/admin/settings';\n\ntype User = {\n id: string | number;\n};\n\ntype ID = string | number;\n\ntype CommonOptions = {\n user?: User;\n};\n\ntype Metas = {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n};\n\nconst { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;\nconst { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n\nconst { ApplicationError, NotFoundError } = errors;\nconst { bytesToKbytes } = fileUtils;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const fileService = getService('file');\n\n const sendMediaMetrics = async (data: Pick<File, 'caption' | 'alternativeText'>) => {\n if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {\n await getService('metrics').trackUsage('didSaveMediaWithCaption');\n }\n\n if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {\n await getService('metrics').trackUsage('didSaveMediaWithAlternativeText');\n }\n };\n\n const createAndAssignTmpWorkingDirectoryToFiles = async (\n files: InputFile | InputFile[]\n ): Promise<string> => {\n const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-'));\n\n if (Array.isArray(files)) {\n files.forEach((file) => {\n file.tmpWorkingDirectory = tmpWorkingDirectory;\n });\n } else {\n files.tmpWorkingDirectory = tmpWorkingDirectory;\n }\n\n return tmpWorkingDirectory;\n };\n\n function filenameReservedRegex() {\n // eslint-disable-next-line no-control-regex\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g;\n }\n\n function windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i;\n }\n\n /**\n * Copied from https://github.com/sindresorhus/valid-filename package\n */\n function isValidFilename(string: string) {\n if (!string || string.length > 255) {\n return false;\n }\n if (filenameReservedRegex().test(string) || windowsReservedNameRegex().test(string)) {\n return false;\n }\n if (string === '.' || string === '..') {\n return false;\n }\n return true;\n }\n\n async function emitEvent(event: string, data: Record<string, any>) {\n const modelDef = strapi.getModel(FILE_MODEL_UID);\n const sanitizedData = await sanitize.sanitizers.defaultSanitizeOutput(\n {\n schema: modelDef,\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n },\n data\n );\n\n strapi.eventHub.emit(event, { media: sanitizedData });\n }\n\n async function formatFileInfo(\n { filename, type, size }: { filename: string; type: string; size: number },\n fileInfo: Partial<FileInfo> = {},\n metas: {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n } = {}\n ): Promise<Omit<UploadableFile, 'getStream'>> {\n const fileService = getService('file');\n const imageManipulationService = getService('image-manipulation');\n\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n let ext = path.extname(filename);\n if (!ext) {\n ext = `.${extension(type)}`;\n }\n const usedName = (fileInfo.name || filename).normalize();\n const basename = path.basename(usedName, ext);\n\n // Prevent null characters in file name\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n const entity: Omit<UploadableFile, 'getStream'> = {\n name: usedName,\n alternativeText: fileInfo.alternativeText,\n caption: fileInfo.caption,\n focalPoint: fileInfo.focalPoint,\n folder: fileInfo.folder,\n folderPath: await fileService.getFolderPath(fileInfo.folder),\n hash: imageManipulationService.generateFileName(basename),\n ext,\n mime: type,\n size: bytesToKbytes(size),\n sizeInBytes: size,\n };\n\n const { refId, ref, field } = metas;\n\n if (refId && ref && field) {\n entity.related = [\n {\n id: refId,\n __type: ref,\n __pivot: { field },\n },\n ];\n }\n\n if (metas.path) {\n entity.path = metas.path;\n }\n\n if (metas.tmpWorkingDirectory) {\n entity.tmpWorkingDirectory = metas.tmpWorkingDirectory;\n }\n\n return entity;\n }\n\n async function enhanceAndValidateFile(\n file: InputFile,\n fileInfo: FileInfo,\n metas?: Metas\n ): Promise<UploadableFile> {\n const currentFile = (await formatFileInfo(\n {\n filename: file.originalFilename ?? 'unamed',\n type: file.mimetype ?? 'application/octet-stream',\n size: file.size,\n },\n fileInfo,\n {\n ...metas,\n tmpWorkingDirectory: file.tmpWorkingDirectory,\n }\n )) as UploadableFile;\n\n currentFile.filepath = file.filepath;\n currentFile.getStream = () => fs.createReadStream(file.filepath);\n\n const { optimize, isImage, isFaultyImage, isOptimizableImage } = strapi\n .plugin('upload')\n .service('image-manipulation');\n\n if (await isImage(currentFile)) {\n if (await isFaultyImage(currentFile)) {\n throw new ApplicationError('File is not a valid image');\n }\n if (await isOptimizableImage(currentFile)) {\n return optimize(currentFile);\n }\n }\n\n return currentFile;\n }\n\n async function upload(\n {\n data,\n files,\n }: {\n data: Record<string, unknown>;\n files: InputFile[];\n },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(files);\n\n let uploadedFiles: any[] = [];\n\n try {\n const { fileInfo, ...metas } = data;\n\n const fileArray = Array.isArray(files) ? files : [files];\n const fileInfoArray = Array.isArray(fileInfo) ? fileInfo : [fileInfo];\n\n const doUpload = async (file: InputFile, fileInfo: FileInfo) => {\n const fileData = await enhanceAndValidateFile(file, fileInfo, metas);\n return uploadFileAndPersist(fileData, { user });\n };\n\n uploadedFiles = await Promise.all(\n fileArray.map((file, idx) => doUpload(file, fileInfoArray[idx] || {}))\n );\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return uploadedFiles;\n }\n\n /**\n * When uploading an image, an additional thumbnail is generated.\n * Also, if there are responsive formats defined, another set of images will be generated too.\n *\n * @param {*} fileData\n */\n async function uploadImage(fileData: UploadableFile) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n // Store width and height of the original image\n const { width, height } = await getDimensions(fileData);\n\n // Make sure this is assigned before calling any upload\n // That way it can mutate the width and height\n _.assign(fileData, {\n width,\n height,\n });\n\n // For performance reasons, all uploads are wrapped in a single Promise.all\n const uploadThumbnail = async (thumbnailFile: UploadableFile) => {\n await getService('provider').upload(thumbnailFile);\n _.set(fileData, 'formats.thumbnail', thumbnailFile);\n };\n\n // Generate thumbnail and responsive formats\n const uploadResponsiveFormat = async (format: { key: string; file: UploadableFile }) => {\n const { key, file } = format;\n await getService('provider').upload(file);\n _.set(fileData, ['formats', key], file);\n };\n\n const uploadPromises: Promise<void>[] = [];\n\n // Upload image\n uploadPromises.push(getService('provider').upload(fileData));\n\n // Generate & Upload thumbnail and responsive formats\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n uploadPromises.push(uploadThumbnail(thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n uploadPromises.push(uploadResponsiveFormat(format));\n }\n }\n }\n // Wait for all uploads to finish\n await Promise.all(uploadPromises);\n }\n\n /**\n * Upload a file. If it is an image it will generate a thumbnail\n * and responsive formats (if enabled).\n */\n async function uploadFileAndPersist(fileData: UploadableFile, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n const { isImage } = getService('image-manipulation');\n\n await getService('provider').checkFileSize(fileData);\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n\n // Persist file(s)\n return add(fileData, { user });\n }\n\n async function updateFileInfo(\n id: ID,\n { name, alternativeText, caption, focalPoint, folder }: FileInfo,\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const dbFile = await findOne(id);\n\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n const fileService = getService('file');\n\n const newName = _.isNil(name) ? dbFile.name : name;\n const newInfos = {\n name: newName,\n alternativeText: _.isNil(alternativeText) ? dbFile.alternativeText : alternativeText,\n caption: _.isNil(caption) ? dbFile.caption : caption,\n focalPoint: _.isNil(focalPoint) ? dbFile.focalPoint : focalPoint,\n folder: _.isUndefined(folder) ? dbFile.folder : folder,\n folderPath: _.isUndefined(folder) ? dbFile.path : await fileService.getFolderPath(folder),\n };\n\n return update(id, newInfos, { user });\n }\n\n async function replace(\n id: ID,\n { data, file }: { data: { fileInfo: FileInfo }; file: InputFile },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n\n const { isImage } = getService('image-manipulation');\n\n const dbFile = await findOne(id);\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(file);\n\n let fileData: UploadableFile;\n\n try {\n const { fileInfo } = data;\n fileData = await enhanceAndValidateFile(file, fileInfo);\n\n // keep a constant hash and extension so the file url doesn't change when the file is replaced\n _.assign(fileData, {\n hash: dbFile.hash,\n ext: dbFile.ext,\n });\n\n // execute delete function of the provider\n if (dbFile.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(dbFile);\n\n if (dbFile.formats) {\n await Promise.all(\n Object.keys(dbFile.formats).map((key) => {\n return strapi.plugin('upload').provider.delete(dbFile.formats[key]);\n })\n );\n }\n }\n\n // clear old formats\n _.set(fileData, 'formats', {});\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return update(id, fileData, { user });\n }\n\n async function update(id: ID, values: Partial<File>, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).update({ where: { id }, data: fileValues });\n\n await emitEvent(MEDIA_UPDATE, res);\n\n return res;\n }\n\n async function add(values: any, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n [CREATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).create({ data: fileValues });\n\n await emitEvent(MEDIA_CREATE, res);\n\n return res;\n }\n\n async function findOne(id: ID, populate = {}) {\n const query = strapi.get('query-params').transform(FILE_MODEL_UID, {\n populate,\n });\n\n const file = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id },\n ...query,\n });\n\n if (!file) return file;\n\n // Sign file URLs if using private provider\n return fileService.signFileUrls(file);\n }\n\n async function findMany(query: any = {}): Promise<File[]> {\n const files = await strapi.db\n .query(FILE_MODEL_UID)\n .findMany(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n return async.map(files, (file: File) => fileService.signFileUrls(file));\n }\n\n async function findPage(query: any = {}) {\n const result = await strapi.db\n .query(FILE_MODEL_UID)\n .findPage(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n const signedResults = await async.map(result.results, (file: File) =>\n fileService.signFileUrls(file)\n );\n\n return {\n ...result,\n results: signedResults,\n };\n }\n\n async function remove(file: File) {\n const config = strapi.config.get<Config>('plugin::upload');\n\n // execute delete function of the provider\n if (file.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(file);\n\n if (file.formats) {\n const keys = Object.keys(file.formats);\n\n await Promise.all(\n keys.map((key) => {\n return strapi.plugin('upload').provider.delete(file.formats![key]);\n })\n );\n }\n }\n\n const media = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id: file.id },\n });\n\n await emitEvent(MEDIA_DELETE, media);\n\n return strapi.db.query(FILE_MODEL_UID).delete({ where: { id: file.id } });\n }\n\n async function getSettings() {\n const res = await strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).get({});\n\n return res as Settings | null;\n }\n\n async function setSettings(value: Settings) {\n if (value.responsiveDimensions === true) {\n await getService('metrics').trackUsage('didEnableResponsiveDimensions');\n } else {\n await getService('metrics').trackUsage('didDisableResponsiveDimensions');\n }\n\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).set({ value });\n }\n\n async function getConfiguration() {\n const res = await strapi.store!({\n type: 'plugin',\n name: 'upload',\n key: 'view_configuration',\n }).get({});\n\n return res as ViewConfiguration | null;\n }\n\n function setConfiguration(value: ViewConfiguration) {\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'view_configuration' }).set({\n value,\n });\n }\n\n return {\n formatFileInfo,\n upload,\n updateFileInfo,\n replace,\n findOne,\n findMany,\n findPage,\n remove,\n getSettings,\n setSettings,\n getConfiguration,\n setConfiguration,\n\n /**\n * exposed for testing only\n * @internal\n */\n _uploadImage: uploadImage,\n };\n};\n"],"names":["UPDATED_BY_ATTRIBUTE","CREATED_BY_ATTRIBUTE","contentTypesUtils","constants","MEDIA_CREATE","MEDIA_UPDATE","MEDIA_DELETE","ALLOWED_WEBHOOK_EVENTS","ApplicationError","NotFoundError","errors","bytesToKbytes","fileUtils","strapi","fileService","getService","sendMediaMetrics","data","_","has","isEmpty","caption","trackUsage","alternativeText","createAndAssignTmpWorkingDirectoryToFiles","files","tmpWorkingDirectory","fse","mkdtemp","path","join","os","tmpdir","Array","isArray","forEach","file","filenameReservedRegex","windowsReservedNameRegex","isValidFilename","string","length","test","emitEvent","event","modelDef","getModel","FILE_MODEL_UID","sanitizedData","sanitize","sanitizers","defaultSanitizeOutput","schema","uid","eventHub","emit","media","formatFileInfo","filename","type","size","fileInfo","metas","imageManipulationService","ext","extname","extension","usedName","name","normalize","basename","entity","focalPoint","folder","folderPath","getFolderPath","hash","generateFileName","mime","sizeInBytes","refId","ref","field","related","id","__type","__pivot","enhanceAndValidateFile","currentFile","originalFilename","mimetype","filepath","getStream","fs","createReadStream","optimize","isImage","isFaultyImage","isOptimizableImage","plugin","service","upload","opts","user","uploadedFiles","fileArray","fileInfoArray","doUpload","fileData","uploadFileAndPersist","Promise","all","map","idx","remove","uploadImage","getDimensions","generateThumbnail","generateResponsiveFormats","isResizableImage","width","height","assign","uploadThumbnail","thumbnailFile","set","uploadResponsiveFormat","format","key","uploadPromises","push","formats","config","get","checkFileSize","provider","add","updateFileInfo","dbFile","findOne","newName","isNil","newInfos","isUndefined","update","replace","delete","Object","keys","values","fileValues","res","db","query","where","create","populate","transform","signFileUrls","findMany","async","findPage","result","signedResults","results","getSettings","store","setSettings","value","responsiveDimensions","getConfiguration","setConfiguration","_uploadImage"],"mappings":"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"}
1
+ {"version":3,"file":"upload.js","sources":["../../../server/src/services/upload.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\nimport { extension } from 'mime-types';\nimport {\n async,\n sanitize,\n contentTypes as contentTypesUtils,\n errors,\n file as fileUtils,\n} from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { FILE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from '../constants';\nimport { getService } from '../utils';\n\nimport type { Config, File, InputFile, UploadableFile, FileInfo } from '../types';\nimport type { ViewConfiguration } from '../controllers/validation/admin/configureView';\nimport type { Settings } from '../controllers/validation/admin/settings';\n\ntype User = {\n id: string | number;\n};\n\ntype ID = string | number;\n\ntype CommonOptions = {\n user?: User;\n};\n\ntype Metas = {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n};\n\nconst { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;\nconst { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n\nconst { ApplicationError, NotFoundError } = errors;\nconst { bytesToKbytes } = fileUtils;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const fileService = getService('file');\n\n const sendMediaMetrics = async (data: Pick<File, 'caption' | 'alternativeText'>) => {\n if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {\n await getService('metrics').trackUsage('didSaveMediaWithCaption');\n }\n\n if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {\n await getService('metrics').trackUsage('didSaveMediaWithAlternativeText');\n }\n };\n\n const createAndAssignTmpWorkingDirectoryToFiles = async (\n files: InputFile | InputFile[]\n ): Promise<string> => {\n const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-'));\n\n if (Array.isArray(files)) {\n files.forEach((file) => {\n file.tmpWorkingDirectory = tmpWorkingDirectory;\n });\n } else {\n files.tmpWorkingDirectory = tmpWorkingDirectory;\n }\n\n return tmpWorkingDirectory;\n };\n\n function filenameReservedRegex() {\n // eslint-disable-next-line no-control-regex\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g;\n }\n\n function windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i;\n }\n\n /**\n * Copied from https://github.com/sindresorhus/valid-filename package\n */\n function isValidFilename(string: string) {\n if (!string || string.length > 255) {\n return false;\n }\n if (filenameReservedRegex().test(string) || windowsReservedNameRegex().test(string)) {\n return false;\n }\n if (string === '.' || string === '..') {\n return false;\n }\n return true;\n }\n\n async function emitEvent(event: string, data: Record<string, any>) {\n const modelDef = strapi.getModel(FILE_MODEL_UID);\n const sanitizedData = await sanitize.sanitizers.defaultSanitizeOutput(\n {\n schema: modelDef,\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n },\n data\n );\n\n strapi.eventHub.emit(event, { media: sanitizedData });\n }\n\n async function formatFileInfo(\n { filename, type, size }: { filename: string; type: string; size: number },\n fileInfo: Partial<FileInfo> = {},\n metas: {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n } = {}\n ): Promise<Omit<UploadableFile, 'getStream'>> {\n const fileService = getService('file');\n const imageManipulationService = getService('image-manipulation');\n\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n let ext = path.extname(filename);\n if (!ext) {\n ext = `.${extension(type)}`;\n }\n const usedName = (fileInfo.name || filename).normalize();\n const basename = path.basename(usedName, ext);\n\n // Prevent null characters in file name\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n const entity: Omit<UploadableFile, 'getStream'> = {\n name: usedName,\n alternativeText: fileInfo.alternativeText,\n caption: fileInfo.caption,\n focalPoint: fileInfo.focalPoint,\n folder: fileInfo.folder,\n folderPath: await fileService.getFolderPath(fileInfo.folder),\n hash: imageManipulationService.generateFileName(basename),\n ext,\n mime: type,\n size: bytesToKbytes(size),\n sizeInBytes: size,\n };\n\n const { refId, ref, field } = metas;\n\n if (refId && ref && field) {\n entity.related = [\n {\n id: refId,\n __type: ref,\n __pivot: { field },\n },\n ];\n }\n\n if (metas.path) {\n entity.path = metas.path;\n }\n\n if (metas.tmpWorkingDirectory) {\n entity.tmpWorkingDirectory = metas.tmpWorkingDirectory;\n }\n\n return entity;\n }\n\n async function enhanceAndValidateFile(\n file: InputFile,\n fileInfo: FileInfo,\n metas?: Metas\n ): Promise<UploadableFile> {\n // Prefer detected MIME type from security validation. Treat application/octet-stream as\n // undeclared so we use detected type when the client sends no real Content-Type.\n const detected = (file as any).detectedMimeType;\n const declared = file.mimetype || '';\n const mimeType =\n detected ||\n (declared && declared !== 'application/octet-stream' ? declared : undefined) ||\n 'application/octet-stream';\n\n const currentFile = (await formatFileInfo(\n {\n filename: file.originalFilename ?? 'unamed',\n type: mimeType,\n size: file.size,\n },\n fileInfo,\n {\n ...metas,\n tmpWorkingDirectory: file.tmpWorkingDirectory,\n }\n )) as UploadableFile;\n\n currentFile.filepath = file.filepath;\n currentFile.getStream = () => fs.createReadStream(file.filepath);\n\n const { optimize, isImage, isFaultyImage, isOptimizableImage } = strapi\n .plugin('upload')\n .service('image-manipulation');\n\n if (await isImage(currentFile)) {\n if (await isFaultyImage(currentFile)) {\n throw new ApplicationError('File is not a valid image');\n }\n if (await isOptimizableImage(currentFile)) {\n return optimize(currentFile);\n }\n }\n\n return currentFile;\n }\n\n async function upload(\n {\n data,\n files,\n }: {\n data: Record<string, unknown>;\n files: InputFile[];\n },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(files);\n\n let uploadedFiles: any[] = [];\n\n try {\n const { fileInfo, ...metas } = data;\n\n const fileArray = Array.isArray(files) ? files : [files];\n const fileInfoArray = Array.isArray(fileInfo) ? fileInfo : [fileInfo];\n\n const doUpload = async (file: InputFile, fileInfo: FileInfo) => {\n const fileData = await enhanceAndValidateFile(file, fileInfo, metas);\n return uploadFileAndPersist(fileData, { user });\n };\n\n uploadedFiles = await Promise.all(\n fileArray.map((file, idx) => doUpload(file, fileInfoArray[idx] || {}))\n );\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return uploadedFiles;\n }\n\n /**\n * When uploading an image, an additional thumbnail is generated.\n * Also, if there are responsive formats defined, another set of images will be generated too.\n *\n * @param {*} fileData\n */\n async function uploadImage(fileData: UploadableFile) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n // Store width and height of the original image\n const { width, height } = await getDimensions(fileData);\n\n // Make sure this is assigned before calling any upload\n // That way it can mutate the width and height\n _.assign(fileData, {\n width,\n height,\n });\n\n // For performance reasons, all uploads are wrapped in a single Promise.all\n const uploadThumbnail = async (thumbnailFile: UploadableFile) => {\n await getService('provider').upload(thumbnailFile);\n _.set(fileData, 'formats.thumbnail', thumbnailFile);\n };\n\n // Generate thumbnail and responsive formats\n const uploadResponsiveFormat = async (format: { key: string; file: UploadableFile }) => {\n const { key, file } = format;\n await getService('provider').upload(file);\n _.set(fileData, ['formats', key], file);\n };\n\n const uploadPromises: Promise<void>[] = [];\n\n // Upload image\n uploadPromises.push(getService('provider').upload(fileData));\n\n // Generate & Upload thumbnail and responsive formats\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n uploadPromises.push(uploadThumbnail(thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n uploadPromises.push(uploadResponsiveFormat(format));\n }\n }\n }\n // Wait for all uploads to finish\n await Promise.all(uploadPromises);\n }\n\n /**\n * Upload a file. If it is an image it will generate a thumbnail\n * and responsive formats (if enabled).\n */\n async function uploadFileAndPersist(fileData: UploadableFile, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n const { isImage } = getService('image-manipulation');\n\n await getService('provider').checkFileSize(fileData);\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n\n // Persist file(s)\n return add(fileData, { user });\n }\n\n async function updateFileInfo(\n id: ID,\n { name, alternativeText, caption, focalPoint, folder }: FileInfo,\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const dbFile = await findOne(id);\n\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n const fileService = getService('file');\n\n const newName = _.isNil(name) ? dbFile.name : name;\n const newInfos = {\n name: newName,\n alternativeText: _.isNil(alternativeText) ? dbFile.alternativeText : alternativeText,\n caption: _.isNil(caption) ? dbFile.caption : caption,\n focalPoint: _.isNil(focalPoint) ? dbFile.focalPoint : focalPoint,\n folder: _.isUndefined(folder) ? dbFile.folder : folder,\n folderPath: _.isUndefined(folder) ? dbFile.path : await fileService.getFolderPath(folder),\n };\n\n return update(id, newInfos, { user });\n }\n\n async function replace(\n id: ID,\n { data, file }: { data: { fileInfo: FileInfo }; file: InputFile },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n\n const { isImage } = getService('image-manipulation');\n\n const dbFile = await findOne(id);\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(file);\n\n let fileData: UploadableFile;\n\n try {\n const { fileInfo } = data;\n fileData = await enhanceAndValidateFile(file, fileInfo);\n\n // keep a constant hash and extension so the file url doesn't change when the file is replaced\n _.assign(fileData, {\n hash: dbFile.hash,\n ext: dbFile.ext,\n });\n\n // execute delete function of the provider\n if (dbFile.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(dbFile);\n\n if (dbFile.formats) {\n await Promise.all(\n Object.keys(dbFile.formats).map((key) => {\n return strapi.plugin('upload').provider.delete(dbFile.formats[key]);\n })\n );\n }\n }\n\n // clear old formats\n _.set(fileData, 'formats', {});\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return update(id, fileData, { user });\n }\n\n async function update(id: ID, values: Partial<File>, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).update({ where: { id }, data: fileValues });\n\n await emitEvent(MEDIA_UPDATE, res);\n\n return res;\n }\n\n async function add(values: any, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n [CREATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).create({ data: fileValues });\n\n await emitEvent(MEDIA_CREATE, res);\n\n return res;\n }\n\n async function findOne(id: ID, populate = {}) {\n const query = strapi.get('query-params').transform(FILE_MODEL_UID, {\n populate,\n });\n\n const file = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id },\n ...query,\n });\n\n if (!file) return file;\n\n // Sign file URLs if using private provider\n return fileService.signFileUrls(file);\n }\n\n async function findMany(query: any = {}): Promise<File[]> {\n const files = await strapi.db\n .query(FILE_MODEL_UID)\n .findMany(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n return async.map(files, (file: File) => fileService.signFileUrls(file));\n }\n\n async function findPage(query: any = {}) {\n const result = await strapi.db\n .query(FILE_MODEL_UID)\n .findPage(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n const signedResults = await async.map(result.results, (file: File) =>\n fileService.signFileUrls(file)\n );\n\n return {\n ...result,\n results: signedResults,\n };\n }\n\n async function remove(file: File) {\n const config = strapi.config.get<Config>('plugin::upload');\n\n // execute delete function of the provider\n if (file.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(file);\n\n if (file.formats) {\n const keys = Object.keys(file.formats);\n\n await Promise.all(\n keys.map((key) => {\n return strapi.plugin('upload').provider.delete(file.formats![key]);\n })\n );\n }\n }\n\n const media = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id: file.id },\n });\n\n await emitEvent(MEDIA_DELETE, media);\n\n return strapi.db.query(FILE_MODEL_UID).delete({ where: { id: file.id } });\n }\n\n async function getSettings() {\n const res = await strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).get({});\n\n return res as Settings | null;\n }\n\n async function setSettings(value: Settings) {\n if (value.responsiveDimensions === true) {\n await getService('metrics').trackUsage('didEnableResponsiveDimensions');\n } else {\n await getService('metrics').trackUsage('didDisableResponsiveDimensions');\n }\n\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).set({ value });\n }\n\n async function getConfiguration() {\n const res = await strapi.store!({\n type: 'plugin',\n name: 'upload',\n key: 'view_configuration',\n }).get({});\n\n return res as ViewConfiguration | null;\n }\n\n function setConfiguration(value: ViewConfiguration) {\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'view_configuration' }).set({\n value,\n });\n }\n\n return {\n formatFileInfo,\n upload,\n updateFileInfo,\n replace,\n findOne,\n findMany,\n findPage,\n remove,\n getSettings,\n setSettings,\n getConfiguration,\n setConfiguration,\n\n /**\n * exposed for testing only\n * @internal\n */\n _uploadImage: uploadImage,\n };\n};\n"],"names":["UPDATED_BY_ATTRIBUTE","CREATED_BY_ATTRIBUTE","contentTypesUtils","constants","MEDIA_CREATE","MEDIA_UPDATE","MEDIA_DELETE","ALLOWED_WEBHOOK_EVENTS","ApplicationError","NotFoundError","errors","bytesToKbytes","fileUtils","strapi","fileService","getService","sendMediaMetrics","data","_","has","isEmpty","caption","trackUsage","alternativeText","createAndAssignTmpWorkingDirectoryToFiles","files","tmpWorkingDirectory","fse","mkdtemp","path","join","os","tmpdir","Array","isArray","forEach","file","filenameReservedRegex","windowsReservedNameRegex","isValidFilename","string","length","test","emitEvent","event","modelDef","getModel","FILE_MODEL_UID","sanitizedData","sanitize","sanitizers","defaultSanitizeOutput","schema","uid","eventHub","emit","media","formatFileInfo","filename","type","size","fileInfo","metas","imageManipulationService","ext","extname","extension","usedName","name","normalize","basename","entity","focalPoint","folder","folderPath","getFolderPath","hash","generateFileName","mime","sizeInBytes","refId","ref","field","related","id","__type","__pivot","enhanceAndValidateFile","detected","detectedMimeType","declared","mimetype","mimeType","undefined","currentFile","originalFilename","filepath","getStream","fs","createReadStream","optimize","isImage","isFaultyImage","isOptimizableImage","plugin","service","upload","opts","user","uploadedFiles","fileArray","fileInfoArray","doUpload","fileData","uploadFileAndPersist","Promise","all","map","idx","remove","uploadImage","getDimensions","generateThumbnail","generateResponsiveFormats","isResizableImage","width","height","assign","uploadThumbnail","thumbnailFile","set","uploadResponsiveFormat","format","key","uploadPromises","push","formats","config","get","checkFileSize","provider","add","updateFileInfo","dbFile","findOne","newName","isNil","newInfos","isUndefined","update","replace","delete","Object","keys","values","fileValues","res","db","query","where","create","populate","transform","signFileUrls","findMany","async","findPage","result","signedResults","results","getSettings","store","setSettings","value","responsiveDimensions","getConfiguration","setConfiguration","_uploadImage"],"mappings":"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"}
@@ -116,9 +116,14 @@ var upload = (({ strapi })=>{
116
116
  return entity;
117
117
  }
118
118
  async function enhanceAndValidateFile(file, fileInfo, metas) {
119
+ // Prefer detected MIME type from security validation. Treat application/octet-stream as
120
+ // undeclared so we use detected type when the client sends no real Content-Type.
121
+ const detected = file.detectedMimeType;
122
+ const declared = file.mimetype || '';
123
+ const mimeType = detected || (declared && declared !== 'application/octet-stream' ? declared : undefined) || 'application/octet-stream';
119
124
  const currentFile = await formatFileInfo({
120
125
  filename: file.originalFilename ?? 'unamed',
121
- type: file.mimetype ?? 'application/octet-stream',
126
+ type: mimeType,
122
127
  size: file.size
123
128
  }, fileInfo, {
124
129
  ...metas,
@@ -1 +1 @@
1
- {"version":3,"file":"upload.mjs","sources":["../../../server/src/services/upload.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\nimport { extension } from 'mime-types';\nimport {\n async,\n sanitize,\n contentTypes as contentTypesUtils,\n errors,\n file as fileUtils,\n} from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { FILE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from '../constants';\nimport { getService } from '../utils';\n\nimport type { Config, File, InputFile, UploadableFile, FileInfo } from '../types';\nimport type { ViewConfiguration } from '../controllers/validation/admin/configureView';\nimport type { Settings } from '../controllers/validation/admin/settings';\n\ntype User = {\n id: string | number;\n};\n\ntype ID = string | number;\n\ntype CommonOptions = {\n user?: User;\n};\n\ntype Metas = {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n};\n\nconst { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;\nconst { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n\nconst { ApplicationError, NotFoundError } = errors;\nconst { bytesToKbytes } = fileUtils;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const fileService = getService('file');\n\n const sendMediaMetrics = async (data: Pick<File, 'caption' | 'alternativeText'>) => {\n if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {\n await getService('metrics').trackUsage('didSaveMediaWithCaption');\n }\n\n if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {\n await getService('metrics').trackUsage('didSaveMediaWithAlternativeText');\n }\n };\n\n const createAndAssignTmpWorkingDirectoryToFiles = async (\n files: InputFile | InputFile[]\n ): Promise<string> => {\n const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-'));\n\n if (Array.isArray(files)) {\n files.forEach((file) => {\n file.tmpWorkingDirectory = tmpWorkingDirectory;\n });\n } else {\n files.tmpWorkingDirectory = tmpWorkingDirectory;\n }\n\n return tmpWorkingDirectory;\n };\n\n function filenameReservedRegex() {\n // eslint-disable-next-line no-control-regex\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g;\n }\n\n function windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i;\n }\n\n /**\n * Copied from https://github.com/sindresorhus/valid-filename package\n */\n function isValidFilename(string: string) {\n if (!string || string.length > 255) {\n return false;\n }\n if (filenameReservedRegex().test(string) || windowsReservedNameRegex().test(string)) {\n return false;\n }\n if (string === '.' || string === '..') {\n return false;\n }\n return true;\n }\n\n async function emitEvent(event: string, data: Record<string, any>) {\n const modelDef = strapi.getModel(FILE_MODEL_UID);\n const sanitizedData = await sanitize.sanitizers.defaultSanitizeOutput(\n {\n schema: modelDef,\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n },\n data\n );\n\n strapi.eventHub.emit(event, { media: sanitizedData });\n }\n\n async function formatFileInfo(\n { filename, type, size }: { filename: string; type: string; size: number },\n fileInfo: Partial<FileInfo> = {},\n metas: {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n } = {}\n ): Promise<Omit<UploadableFile, 'getStream'>> {\n const fileService = getService('file');\n const imageManipulationService = getService('image-manipulation');\n\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n let ext = path.extname(filename);\n if (!ext) {\n ext = `.${extension(type)}`;\n }\n const usedName = (fileInfo.name || filename).normalize();\n const basename = path.basename(usedName, ext);\n\n // Prevent null characters in file name\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n const entity: Omit<UploadableFile, 'getStream'> = {\n name: usedName,\n alternativeText: fileInfo.alternativeText,\n caption: fileInfo.caption,\n focalPoint: fileInfo.focalPoint,\n folder: fileInfo.folder,\n folderPath: await fileService.getFolderPath(fileInfo.folder),\n hash: imageManipulationService.generateFileName(basename),\n ext,\n mime: type,\n size: bytesToKbytes(size),\n sizeInBytes: size,\n };\n\n const { refId, ref, field } = metas;\n\n if (refId && ref && field) {\n entity.related = [\n {\n id: refId,\n __type: ref,\n __pivot: { field },\n },\n ];\n }\n\n if (metas.path) {\n entity.path = metas.path;\n }\n\n if (metas.tmpWorkingDirectory) {\n entity.tmpWorkingDirectory = metas.tmpWorkingDirectory;\n }\n\n return entity;\n }\n\n async function enhanceAndValidateFile(\n file: InputFile,\n fileInfo: FileInfo,\n metas?: Metas\n ): Promise<UploadableFile> {\n const currentFile = (await formatFileInfo(\n {\n filename: file.originalFilename ?? 'unamed',\n type: file.mimetype ?? 'application/octet-stream',\n size: file.size,\n },\n fileInfo,\n {\n ...metas,\n tmpWorkingDirectory: file.tmpWorkingDirectory,\n }\n )) as UploadableFile;\n\n currentFile.filepath = file.filepath;\n currentFile.getStream = () => fs.createReadStream(file.filepath);\n\n const { optimize, isImage, isFaultyImage, isOptimizableImage } = strapi\n .plugin('upload')\n .service('image-manipulation');\n\n if (await isImage(currentFile)) {\n if (await isFaultyImage(currentFile)) {\n throw new ApplicationError('File is not a valid image');\n }\n if (await isOptimizableImage(currentFile)) {\n return optimize(currentFile);\n }\n }\n\n return currentFile;\n }\n\n async function upload(\n {\n data,\n files,\n }: {\n data: Record<string, unknown>;\n files: InputFile[];\n },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(files);\n\n let uploadedFiles: any[] = [];\n\n try {\n const { fileInfo, ...metas } = data;\n\n const fileArray = Array.isArray(files) ? files : [files];\n const fileInfoArray = Array.isArray(fileInfo) ? fileInfo : [fileInfo];\n\n const doUpload = async (file: InputFile, fileInfo: FileInfo) => {\n const fileData = await enhanceAndValidateFile(file, fileInfo, metas);\n return uploadFileAndPersist(fileData, { user });\n };\n\n uploadedFiles = await Promise.all(\n fileArray.map((file, idx) => doUpload(file, fileInfoArray[idx] || {}))\n );\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return uploadedFiles;\n }\n\n /**\n * When uploading an image, an additional thumbnail is generated.\n * Also, if there are responsive formats defined, another set of images will be generated too.\n *\n * @param {*} fileData\n */\n async function uploadImage(fileData: UploadableFile) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n // Store width and height of the original image\n const { width, height } = await getDimensions(fileData);\n\n // Make sure this is assigned before calling any upload\n // That way it can mutate the width and height\n _.assign(fileData, {\n width,\n height,\n });\n\n // For performance reasons, all uploads are wrapped in a single Promise.all\n const uploadThumbnail = async (thumbnailFile: UploadableFile) => {\n await getService('provider').upload(thumbnailFile);\n _.set(fileData, 'formats.thumbnail', thumbnailFile);\n };\n\n // Generate thumbnail and responsive formats\n const uploadResponsiveFormat = async (format: { key: string; file: UploadableFile }) => {\n const { key, file } = format;\n await getService('provider').upload(file);\n _.set(fileData, ['formats', key], file);\n };\n\n const uploadPromises: Promise<void>[] = [];\n\n // Upload image\n uploadPromises.push(getService('provider').upload(fileData));\n\n // Generate & Upload thumbnail and responsive formats\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n uploadPromises.push(uploadThumbnail(thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n uploadPromises.push(uploadResponsiveFormat(format));\n }\n }\n }\n // Wait for all uploads to finish\n await Promise.all(uploadPromises);\n }\n\n /**\n * Upload a file. If it is an image it will generate a thumbnail\n * and responsive formats (if enabled).\n */\n async function uploadFileAndPersist(fileData: UploadableFile, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n const { isImage } = getService('image-manipulation');\n\n await getService('provider').checkFileSize(fileData);\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n\n // Persist file(s)\n return add(fileData, { user });\n }\n\n async function updateFileInfo(\n id: ID,\n { name, alternativeText, caption, focalPoint, folder }: FileInfo,\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const dbFile = await findOne(id);\n\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n const fileService = getService('file');\n\n const newName = _.isNil(name) ? dbFile.name : name;\n const newInfos = {\n name: newName,\n alternativeText: _.isNil(alternativeText) ? dbFile.alternativeText : alternativeText,\n caption: _.isNil(caption) ? dbFile.caption : caption,\n focalPoint: _.isNil(focalPoint) ? dbFile.focalPoint : focalPoint,\n folder: _.isUndefined(folder) ? dbFile.folder : folder,\n folderPath: _.isUndefined(folder) ? dbFile.path : await fileService.getFolderPath(folder),\n };\n\n return update(id, newInfos, { user });\n }\n\n async function replace(\n id: ID,\n { data, file }: { data: { fileInfo: FileInfo }; file: InputFile },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n\n const { isImage } = getService('image-manipulation');\n\n const dbFile = await findOne(id);\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(file);\n\n let fileData: UploadableFile;\n\n try {\n const { fileInfo } = data;\n fileData = await enhanceAndValidateFile(file, fileInfo);\n\n // keep a constant hash and extension so the file url doesn't change when the file is replaced\n _.assign(fileData, {\n hash: dbFile.hash,\n ext: dbFile.ext,\n });\n\n // execute delete function of the provider\n if (dbFile.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(dbFile);\n\n if (dbFile.formats) {\n await Promise.all(\n Object.keys(dbFile.formats).map((key) => {\n return strapi.plugin('upload').provider.delete(dbFile.formats[key]);\n })\n );\n }\n }\n\n // clear old formats\n _.set(fileData, 'formats', {});\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return update(id, fileData, { user });\n }\n\n async function update(id: ID, values: Partial<File>, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).update({ where: { id }, data: fileValues });\n\n await emitEvent(MEDIA_UPDATE, res);\n\n return res;\n }\n\n async function add(values: any, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n [CREATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).create({ data: fileValues });\n\n await emitEvent(MEDIA_CREATE, res);\n\n return res;\n }\n\n async function findOne(id: ID, populate = {}) {\n const query = strapi.get('query-params').transform(FILE_MODEL_UID, {\n populate,\n });\n\n const file = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id },\n ...query,\n });\n\n if (!file) return file;\n\n // Sign file URLs if using private provider\n return fileService.signFileUrls(file);\n }\n\n async function findMany(query: any = {}): Promise<File[]> {\n const files = await strapi.db\n .query(FILE_MODEL_UID)\n .findMany(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n return async.map(files, (file: File) => fileService.signFileUrls(file));\n }\n\n async function findPage(query: any = {}) {\n const result = await strapi.db\n .query(FILE_MODEL_UID)\n .findPage(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n const signedResults = await async.map(result.results, (file: File) =>\n fileService.signFileUrls(file)\n );\n\n return {\n ...result,\n results: signedResults,\n };\n }\n\n async function remove(file: File) {\n const config = strapi.config.get<Config>('plugin::upload');\n\n // execute delete function of the provider\n if (file.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(file);\n\n if (file.formats) {\n const keys = Object.keys(file.formats);\n\n await Promise.all(\n keys.map((key) => {\n return strapi.plugin('upload').provider.delete(file.formats![key]);\n })\n );\n }\n }\n\n const media = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id: file.id },\n });\n\n await emitEvent(MEDIA_DELETE, media);\n\n return strapi.db.query(FILE_MODEL_UID).delete({ where: { id: file.id } });\n }\n\n async function getSettings() {\n const res = await strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).get({});\n\n return res as Settings | null;\n }\n\n async function setSettings(value: Settings) {\n if (value.responsiveDimensions === true) {\n await getService('metrics').trackUsage('didEnableResponsiveDimensions');\n } else {\n await getService('metrics').trackUsage('didDisableResponsiveDimensions');\n }\n\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).set({ value });\n }\n\n async function getConfiguration() {\n const res = await strapi.store!({\n type: 'plugin',\n name: 'upload',\n key: 'view_configuration',\n }).get({});\n\n return res as ViewConfiguration | null;\n }\n\n function setConfiguration(value: ViewConfiguration) {\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'view_configuration' }).set({\n value,\n });\n }\n\n return {\n formatFileInfo,\n upload,\n updateFileInfo,\n replace,\n findOne,\n findMany,\n findPage,\n remove,\n getSettings,\n setSettings,\n getConfiguration,\n setConfiguration,\n\n /**\n * exposed for testing only\n * @internal\n */\n _uploadImage: uploadImage,\n };\n};\n"],"names":["UPDATED_BY_ATTRIBUTE","CREATED_BY_ATTRIBUTE","contentTypesUtils","constants","MEDIA_CREATE","MEDIA_UPDATE","MEDIA_DELETE","ALLOWED_WEBHOOK_EVENTS","ApplicationError","NotFoundError","errors","bytesToKbytes","fileUtils","strapi","fileService","getService","sendMediaMetrics","data","_","has","isEmpty","caption","trackUsage","alternativeText","createAndAssignTmpWorkingDirectoryToFiles","files","tmpWorkingDirectory","fse","mkdtemp","path","join","os","tmpdir","Array","isArray","forEach","file","filenameReservedRegex","windowsReservedNameRegex","isValidFilename","string","length","test","emitEvent","event","modelDef","getModel","FILE_MODEL_UID","sanitizedData","sanitize","sanitizers","defaultSanitizeOutput","schema","uid","eventHub","emit","media","formatFileInfo","filename","type","size","fileInfo","metas","imageManipulationService","ext","extname","extension","usedName","name","normalize","basename","entity","focalPoint","folder","folderPath","getFolderPath","hash","generateFileName","mime","sizeInBytes","refId","ref","field","related","id","__type","__pivot","enhanceAndValidateFile","currentFile","originalFilename","mimetype","filepath","getStream","fs","createReadStream","optimize","isImage","isFaultyImage","isOptimizableImage","plugin","service","upload","opts","user","uploadedFiles","fileArray","fileInfoArray","doUpload","fileData","uploadFileAndPersist","Promise","all","map","idx","remove","uploadImage","getDimensions","generateThumbnail","generateResponsiveFormats","isResizableImage","width","height","assign","uploadThumbnail","thumbnailFile","set","uploadResponsiveFormat","format","key","uploadPromises","push","formats","config","get","checkFileSize","provider","add","updateFileInfo","dbFile","findOne","newName","isNil","newInfos","isUndefined","update","replace","delete","Object","keys","values","fileValues","res","db","query","where","create","populate","transform","signFileUrls","findMany","async","findPage","result","signedResults","results","getSettings","store","setSettings","value","responsiveDimensions","getConfiguration","setConfiguration","_uploadImage"],"mappings":"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"}
1
+ {"version":3,"file":"upload.mjs","sources":["../../../server/src/services/upload.ts"],"sourcesContent":["import os from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\nimport { extension } from 'mime-types';\nimport {\n async,\n sanitize,\n contentTypes as contentTypesUtils,\n errors,\n file as fileUtils,\n} from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { FILE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from '../constants';\nimport { getService } from '../utils';\n\nimport type { Config, File, InputFile, UploadableFile, FileInfo } from '../types';\nimport type { ViewConfiguration } from '../controllers/validation/admin/configureView';\nimport type { Settings } from '../controllers/validation/admin/settings';\n\ntype User = {\n id: string | number;\n};\n\ntype ID = string | number;\n\ntype CommonOptions = {\n user?: User;\n};\n\ntype Metas = {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n};\n\nconst { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;\nconst { MEDIA_CREATE, MEDIA_UPDATE, MEDIA_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n\nconst { ApplicationError, NotFoundError } = errors;\nconst { bytesToKbytes } = fileUtils;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const fileService = getService('file');\n\n const sendMediaMetrics = async (data: Pick<File, 'caption' | 'alternativeText'>) => {\n if (_.has(data, 'caption') && !_.isEmpty(data.caption)) {\n await getService('metrics').trackUsage('didSaveMediaWithCaption');\n }\n\n if (_.has(data, 'alternativeText') && !_.isEmpty(data.alternativeText)) {\n await getService('metrics').trackUsage('didSaveMediaWithAlternativeText');\n }\n };\n\n const createAndAssignTmpWorkingDirectoryToFiles = async (\n files: InputFile | InputFile[]\n ): Promise<string> => {\n const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-'));\n\n if (Array.isArray(files)) {\n files.forEach((file) => {\n file.tmpWorkingDirectory = tmpWorkingDirectory;\n });\n } else {\n files.tmpWorkingDirectory = tmpWorkingDirectory;\n }\n\n return tmpWorkingDirectory;\n };\n\n function filenameReservedRegex() {\n // eslint-disable-next-line no-control-regex\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g;\n }\n\n function windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i;\n }\n\n /**\n * Copied from https://github.com/sindresorhus/valid-filename package\n */\n function isValidFilename(string: string) {\n if (!string || string.length > 255) {\n return false;\n }\n if (filenameReservedRegex().test(string) || windowsReservedNameRegex().test(string)) {\n return false;\n }\n if (string === '.' || string === '..') {\n return false;\n }\n return true;\n }\n\n async function emitEvent(event: string, data: Record<string, any>) {\n const modelDef = strapi.getModel(FILE_MODEL_UID);\n const sanitizedData = await sanitize.sanitizers.defaultSanitizeOutput(\n {\n schema: modelDef,\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n },\n data\n );\n\n strapi.eventHub.emit(event, { media: sanitizedData });\n }\n\n async function formatFileInfo(\n { filename, type, size }: { filename: string; type: string; size: number },\n fileInfo: Partial<FileInfo> = {},\n metas: {\n refId?: ID;\n ref?: string;\n field?: string;\n path?: string;\n tmpWorkingDirectory?: string;\n } = {}\n ): Promise<Omit<UploadableFile, 'getStream'>> {\n const fileService = getService('file');\n const imageManipulationService = getService('image-manipulation');\n\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n let ext = path.extname(filename);\n if (!ext) {\n ext = `.${extension(type)}`;\n }\n const usedName = (fileInfo.name || filename).normalize();\n const basename = path.basename(usedName, ext);\n\n // Prevent null characters in file name\n if (!isValidFilename(filename)) {\n throw new ApplicationError('File name contains invalid characters');\n }\n\n const entity: Omit<UploadableFile, 'getStream'> = {\n name: usedName,\n alternativeText: fileInfo.alternativeText,\n caption: fileInfo.caption,\n focalPoint: fileInfo.focalPoint,\n folder: fileInfo.folder,\n folderPath: await fileService.getFolderPath(fileInfo.folder),\n hash: imageManipulationService.generateFileName(basename),\n ext,\n mime: type,\n size: bytesToKbytes(size),\n sizeInBytes: size,\n };\n\n const { refId, ref, field } = metas;\n\n if (refId && ref && field) {\n entity.related = [\n {\n id: refId,\n __type: ref,\n __pivot: { field },\n },\n ];\n }\n\n if (metas.path) {\n entity.path = metas.path;\n }\n\n if (metas.tmpWorkingDirectory) {\n entity.tmpWorkingDirectory = metas.tmpWorkingDirectory;\n }\n\n return entity;\n }\n\n async function enhanceAndValidateFile(\n file: InputFile,\n fileInfo: FileInfo,\n metas?: Metas\n ): Promise<UploadableFile> {\n // Prefer detected MIME type from security validation. Treat application/octet-stream as\n // undeclared so we use detected type when the client sends no real Content-Type.\n const detected = (file as any).detectedMimeType;\n const declared = file.mimetype || '';\n const mimeType =\n detected ||\n (declared && declared !== 'application/octet-stream' ? declared : undefined) ||\n 'application/octet-stream';\n\n const currentFile = (await formatFileInfo(\n {\n filename: file.originalFilename ?? 'unamed',\n type: mimeType,\n size: file.size,\n },\n fileInfo,\n {\n ...metas,\n tmpWorkingDirectory: file.tmpWorkingDirectory,\n }\n )) as UploadableFile;\n\n currentFile.filepath = file.filepath;\n currentFile.getStream = () => fs.createReadStream(file.filepath);\n\n const { optimize, isImage, isFaultyImage, isOptimizableImage } = strapi\n .plugin('upload')\n .service('image-manipulation');\n\n if (await isImage(currentFile)) {\n if (await isFaultyImage(currentFile)) {\n throw new ApplicationError('File is not a valid image');\n }\n if (await isOptimizableImage(currentFile)) {\n return optimize(currentFile);\n }\n }\n\n return currentFile;\n }\n\n async function upload(\n {\n data,\n files,\n }: {\n data: Record<string, unknown>;\n files: InputFile[];\n },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(files);\n\n let uploadedFiles: any[] = [];\n\n try {\n const { fileInfo, ...metas } = data;\n\n const fileArray = Array.isArray(files) ? files : [files];\n const fileInfoArray = Array.isArray(fileInfo) ? fileInfo : [fileInfo];\n\n const doUpload = async (file: InputFile, fileInfo: FileInfo) => {\n const fileData = await enhanceAndValidateFile(file, fileInfo, metas);\n return uploadFileAndPersist(fileData, { user });\n };\n\n uploadedFiles = await Promise.all(\n fileArray.map((file, idx) => doUpload(file, fileInfoArray[idx] || {}))\n );\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return uploadedFiles;\n }\n\n /**\n * When uploading an image, an additional thumbnail is generated.\n * Also, if there are responsive formats defined, another set of images will be generated too.\n *\n * @param {*} fileData\n */\n async function uploadImage(fileData: UploadableFile) {\n const { getDimensions, generateThumbnail, generateResponsiveFormats, isResizableImage } =\n getService('image-manipulation');\n\n // Store width and height of the original image\n const { width, height } = await getDimensions(fileData);\n\n // Make sure this is assigned before calling any upload\n // That way it can mutate the width and height\n _.assign(fileData, {\n width,\n height,\n });\n\n // For performance reasons, all uploads are wrapped in a single Promise.all\n const uploadThumbnail = async (thumbnailFile: UploadableFile) => {\n await getService('provider').upload(thumbnailFile);\n _.set(fileData, 'formats.thumbnail', thumbnailFile);\n };\n\n // Generate thumbnail and responsive formats\n const uploadResponsiveFormat = async (format: { key: string; file: UploadableFile }) => {\n const { key, file } = format;\n await getService('provider').upload(file);\n _.set(fileData, ['formats', key], file);\n };\n\n const uploadPromises: Promise<void>[] = [];\n\n // Upload image\n uploadPromises.push(getService('provider').upload(fileData));\n\n // Generate & Upload thumbnail and responsive formats\n if (await isResizableImage(fileData)) {\n const thumbnailFile = await generateThumbnail(fileData);\n if (thumbnailFile) {\n uploadPromises.push(uploadThumbnail(thumbnailFile));\n }\n\n const formats = await generateResponsiveFormats(fileData);\n if (Array.isArray(formats) && formats.length > 0) {\n for (const format of formats) {\n // eslint-disable-next-line no-continue\n if (!format) continue;\n uploadPromises.push(uploadResponsiveFormat(format));\n }\n }\n }\n // Wait for all uploads to finish\n await Promise.all(uploadPromises);\n }\n\n /**\n * Upload a file. If it is an image it will generate a thumbnail\n * and responsive formats (if enabled).\n */\n async function uploadFileAndPersist(fileData: UploadableFile, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n const { isImage } = getService('image-manipulation');\n\n await getService('provider').checkFileSize(fileData);\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n\n // Persist file(s)\n return add(fileData, { user });\n }\n\n async function updateFileInfo(\n id: ID,\n { name, alternativeText, caption, focalPoint, folder }: FileInfo,\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const dbFile = await findOne(id);\n\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n const fileService = getService('file');\n\n const newName = _.isNil(name) ? dbFile.name : name;\n const newInfos = {\n name: newName,\n alternativeText: _.isNil(alternativeText) ? dbFile.alternativeText : alternativeText,\n caption: _.isNil(caption) ? dbFile.caption : caption,\n focalPoint: _.isNil(focalPoint) ? dbFile.focalPoint : focalPoint,\n folder: _.isUndefined(folder) ? dbFile.folder : folder,\n folderPath: _.isUndefined(folder) ? dbFile.path : await fileService.getFolderPath(folder),\n };\n\n return update(id, newInfos, { user });\n }\n\n async function replace(\n id: ID,\n { data, file }: { data: { fileInfo: FileInfo }; file: InputFile },\n opts?: CommonOptions\n ) {\n const { user } = opts ?? {};\n\n const config = strapi.config.get<Config>('plugin::upload');\n\n const { isImage } = getService('image-manipulation');\n\n const dbFile = await findOne(id);\n if (!dbFile) {\n throw new NotFoundError();\n }\n\n // create temporary folder to store files for stream manipulation\n const tmpWorkingDirectory = await createAndAssignTmpWorkingDirectoryToFiles(file);\n\n let fileData: UploadableFile;\n\n try {\n const { fileInfo } = data;\n fileData = await enhanceAndValidateFile(file, fileInfo);\n\n // keep a constant hash and extension so the file url doesn't change when the file is replaced\n _.assign(fileData, {\n hash: dbFile.hash,\n ext: dbFile.ext,\n });\n\n // execute delete function of the provider\n if (dbFile.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(dbFile);\n\n if (dbFile.formats) {\n await Promise.all(\n Object.keys(dbFile.formats).map((key) => {\n return strapi.plugin('upload').provider.delete(dbFile.formats[key]);\n })\n );\n }\n }\n\n // clear old formats\n _.set(fileData, 'formats', {});\n\n if (await isImage(fileData)) {\n await uploadImage(fileData);\n } else {\n await getService('provider').upload(fileData);\n }\n\n _.set(fileData, 'provider', config.provider);\n } finally {\n // delete temporary folder\n await fse.remove(tmpWorkingDirectory);\n }\n\n return update(id, fileData, { user });\n }\n\n async function update(id: ID, values: Partial<File>, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).update({ where: { id }, data: fileValues });\n\n await emitEvent(MEDIA_UPDATE, res);\n\n return res;\n }\n\n async function add(values: any, opts?: CommonOptions) {\n const { user } = opts ?? {};\n\n const fileValues = { ...values };\n if (user) {\n Object.assign(fileValues, {\n [UPDATED_BY_ATTRIBUTE]: user.id,\n [CREATED_BY_ATTRIBUTE]: user.id,\n });\n }\n\n await sendMediaMetrics(fileValues);\n\n const res = await strapi.db.query(FILE_MODEL_UID).create({ data: fileValues });\n\n await emitEvent(MEDIA_CREATE, res);\n\n return res;\n }\n\n async function findOne(id: ID, populate = {}) {\n const query = strapi.get('query-params').transform(FILE_MODEL_UID, {\n populate,\n });\n\n const file = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id },\n ...query,\n });\n\n if (!file) return file;\n\n // Sign file URLs if using private provider\n return fileService.signFileUrls(file);\n }\n\n async function findMany(query: any = {}): Promise<File[]> {\n const files = await strapi.db\n .query(FILE_MODEL_UID)\n .findMany(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n return async.map(files, (file: File) => fileService.signFileUrls(file));\n }\n\n async function findPage(query: any = {}) {\n const result = await strapi.db\n .query(FILE_MODEL_UID)\n .findPage(strapi.get('query-params').transform(FILE_MODEL_UID, query));\n\n // Sign file URLs if using private provider\n const signedResults = await async.map(result.results, (file: File) =>\n fileService.signFileUrls(file)\n );\n\n return {\n ...result,\n results: signedResults,\n };\n }\n\n async function remove(file: File) {\n const config = strapi.config.get<Config>('plugin::upload');\n\n // execute delete function of the provider\n if (file.provider === config.provider) {\n await strapi.plugin('upload').provider.delete(file);\n\n if (file.formats) {\n const keys = Object.keys(file.formats);\n\n await Promise.all(\n keys.map((key) => {\n return strapi.plugin('upload').provider.delete(file.formats![key]);\n })\n );\n }\n }\n\n const media = await strapi.db.query(FILE_MODEL_UID).findOne({\n where: { id: file.id },\n });\n\n await emitEvent(MEDIA_DELETE, media);\n\n return strapi.db.query(FILE_MODEL_UID).delete({ where: { id: file.id } });\n }\n\n async function getSettings() {\n const res = await strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).get({});\n\n return res as Settings | null;\n }\n\n async function setSettings(value: Settings) {\n if (value.responsiveDimensions === true) {\n await getService('metrics').trackUsage('didEnableResponsiveDimensions');\n } else {\n await getService('metrics').trackUsage('didDisableResponsiveDimensions');\n }\n\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'settings' }).set({ value });\n }\n\n async function getConfiguration() {\n const res = await strapi.store!({\n type: 'plugin',\n name: 'upload',\n key: 'view_configuration',\n }).get({});\n\n return res as ViewConfiguration | null;\n }\n\n function setConfiguration(value: ViewConfiguration) {\n return strapi.store!({ type: 'plugin', name: 'upload', key: 'view_configuration' }).set({\n value,\n });\n }\n\n return {\n formatFileInfo,\n upload,\n updateFileInfo,\n replace,\n findOne,\n findMany,\n findPage,\n remove,\n getSettings,\n setSettings,\n getConfiguration,\n setConfiguration,\n\n /**\n * exposed for testing only\n * @internal\n */\n _uploadImage: uploadImage,\n };\n};\n"],"names":["UPDATED_BY_ATTRIBUTE","CREATED_BY_ATTRIBUTE","contentTypesUtils","constants","MEDIA_CREATE","MEDIA_UPDATE","MEDIA_DELETE","ALLOWED_WEBHOOK_EVENTS","ApplicationError","NotFoundError","errors","bytesToKbytes","fileUtils","strapi","fileService","getService","sendMediaMetrics","data","_","has","isEmpty","caption","trackUsage","alternativeText","createAndAssignTmpWorkingDirectoryToFiles","files","tmpWorkingDirectory","fse","mkdtemp","path","join","os","tmpdir","Array","isArray","forEach","file","filenameReservedRegex","windowsReservedNameRegex","isValidFilename","string","length","test","emitEvent","event","modelDef","getModel","FILE_MODEL_UID","sanitizedData","sanitize","sanitizers","defaultSanitizeOutput","schema","uid","eventHub","emit","media","formatFileInfo","filename","type","size","fileInfo","metas","imageManipulationService","ext","extname","extension","usedName","name","normalize","basename","entity","focalPoint","folder","folderPath","getFolderPath","hash","generateFileName","mime","sizeInBytes","refId","ref","field","related","id","__type","__pivot","enhanceAndValidateFile","detected","detectedMimeType","declared","mimetype","mimeType","undefined","currentFile","originalFilename","filepath","getStream","fs","createReadStream","optimize","isImage","isFaultyImage","isOptimizableImage","plugin","service","upload","opts","user","uploadedFiles","fileArray","fileInfoArray","doUpload","fileData","uploadFileAndPersist","Promise","all","map","idx","remove","uploadImage","getDimensions","generateThumbnail","generateResponsiveFormats","isResizableImage","width","height","assign","uploadThumbnail","thumbnailFile","set","uploadResponsiveFormat","format","key","uploadPromises","push","formats","config","get","checkFileSize","provider","add","updateFileInfo","dbFile","findOne","newName","isNil","newInfos","isUndefined","update","replace","delete","Object","keys","values","fileValues","res","db","query","where","create","populate","transform","signFileUrls","findMany","async","findPage","result","signedResults","results","getSettings","store","setSettings","value","responsiveDimensions","getConfiguration","setConfiguration","_uploadImage"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../../server/src/services/upload.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,eAAe,CAAC;AAK/C,OAAO,KAAK,EAAU,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAEzE,KAAK,IAAI,GAAG;IACV,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1B,KAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,CAAC;qCAgB0B;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;+CAsErB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,aAChE,QAAQ,QAAQ,CAAC,UACpB;QACL,KAAK,CAAC,EAAE,EAAE,CAAC;QACX,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,KACA,QAAQ,KAAK,cAAc,EAAE,WAAW,CAAC,CAAC;+BAkGxC;QACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,KAAK,EAAE,SAAS,EAAE,CAAC;KACpB,SACM,aAAa;yBAiHhB,EAAE,0DACkD,QAAQ,SACzD,aAAa;kBA0BhB,EAAE,kBACU;QAAE,IAAI,EAAE;YAAE,QAAQ,EAAE,QAAQ,CAAA;SAAE,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,SAC1D,aAAa;kBAkGK,EAAE;uBAgBE,GAAG,KAAQ,QAAQ,IAAI,EAAE,CAAC;uBAS1B,GAAG;;;;;;;;;mBAgBN,IAAI;;;;;;;yBAiCE,QAAQ;;;;;8BAoBT,iBAAiB;IAoBhD;;;OAGG;6BAlUgC,cAAc;;AAzNrD,wBA8hBE"}
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../../server/src/services/upload.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,eAAe,CAAC;AAK/C,OAAO,KAAK,EAAU,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAEzE,KAAK,IAAI,GAAG;IACV,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1B,KAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,CAAC;qCAgB0B;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;+CAsErB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,aAChE,QAAQ,QAAQ,CAAC,UACpB;QACL,KAAK,CAAC,EAAE,EAAE,CAAC;QACX,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,KACA,QAAQ,KAAK,cAAc,EAAE,WAAW,CAAC,CAAC;+BA2GxC;QACD,IAAI,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,KAAK,EAAE,SAAS,EAAE,CAAC;KACpB,SACM,aAAa;yBAiHhB,EAAE,0DACkD,QAAQ,SACzD,aAAa;kBA0BhB,EAAE,kBACU;QAAE,IAAI,EAAE;YAAE,QAAQ,EAAE,QAAQ,CAAA;SAAE,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,SAC1D,aAAa;kBAkGK,EAAE;uBAgBE,GAAG,KAAQ,QAAQ,IAAI,EAAE,CAAC;uBAS1B,GAAG;;;;;;;;;mBAgBN,IAAI;;;;;;;yBAiCE,QAAQ;;;;;8BAoBT,iBAAiB;IAoBhD;;;OAGG;6BAlUgC,cAAc;;AAlOrD,wBAuiBE"}
@@ -11,6 +11,7 @@ type UploadValidationError = {
11
11
  type ValidationResult = {
12
12
  isValid: boolean;
13
13
  error?: UploadValidationError;
14
+ detectedMime?: string;
14
15
  };
15
16
  type ErrorDetail = {
16
17
  file: any;
@@ -1 +1 @@
1
- {"version":3,"file":"mime-validation.d.ts","sourceRoot":"","sources":["../../../../server/src/utils/mime-validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AACF,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,uBAAuB,GAAG,kBAAkB,GAAG,eAAe,CAAC;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,qBAAqB,CAAC;CAC/B,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,GAAG,CAAC;IACV,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,qBAAqB,CAAC;CAC9B,CAAC;AAOF,wBAAsB,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmC3E;AAsBD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAcnF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG;;;EAMxC;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,IAAI,CAAC,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAoE3B;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA6DhG;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,IAAI,CAAC,MAAM,GAClB,OAAO,CAAC;IACT,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;CAC5B,CAAC,CAqCD;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,YAAY,EAAE,GAAG,CAAC;IAClB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,GAAG,EACf,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,IAAI,CAAC,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CAoD9B"}
1
+ {"version":3,"file":"mime-validation.d.ts","sourceRoot":"","sources":["../../../../server/src/utils/mime-validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AACF,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,uBAAuB,GAAG,kBAAkB,GAAG,eAAe,CAAC;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,GAAG,CAAC;IACV,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,qBAAqB,CAAC;CAC9B,CAAC;AAOF,wBAAsB,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoC3E;AAsBD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAcnF;AA6ED,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG;;;EAWxC;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,IAAI,CAAC,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CA0K3B;AA2BD,wBAAsB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoEhG;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,IAAI,CAAC,MAAM,GAClB,OAAO,CAAC;IACT,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;CAC5B,CAAC,CAyCD;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,YAAY,EAAE,GAAG,CAAC;IAClB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,GAAG,EACf,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,IAAI,CAAC,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CAoD9B"}