Reject bogus Content-Type when saving downloaded media
Code review: - also validate URL-extension fallback as a media type - hoist trimInlineMetaData + drop !! on mimeType
This commit is contained in:
@@ -111,26 +111,30 @@ object MediaSaverToDisk {
|
|||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
check(response.isSuccessful)
|
check(response.isSuccessful)
|
||||||
|
|
||||||
|
val trimmedUrl = trimInlineMetaData(url)
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||||
val contentType = response.header("Content-Type") ?: getMimeTypeFromExtension(trimInlineMetaData(url))
|
val headerType =
|
||||||
check(contentType.isNotBlank()) { "Can't find out the content type" }
|
response
|
||||||
|
.header("Content-Type")
|
||||||
|
?.substringBefore(";")
|
||||||
|
?.trim()
|
||||||
|
|
||||||
val realType =
|
val realType =
|
||||||
if (contentType == "application/octet-stream") {
|
headerType?.takeIf(::isMediaMimeType)
|
||||||
mimeType ?: getMimeTypeFromExtension(url)
|
?: mimeType?.takeIf(::isMediaMimeType)
|
||||||
} else {
|
?: getMimeTypeFromExtension(trimmedUrl).takeIf(::isMediaMimeType)
|
||||||
contentType
|
?: ""
|
||||||
}
|
check(realType.isNotBlank()) { "Can't find out the content type" }
|
||||||
|
|
||||||
saveContentQ(
|
saveContentQ(
|
||||||
displayName = File(trimInlineMetaData(url)).nameWithoutExtension,
|
displayName = File(trimmedUrl).nameWithoutExtension,
|
||||||
contentType = realType,
|
contentType = realType,
|
||||||
contentSource = response.body.source(),
|
contentSource = response.body.source(),
|
||||||
contentResolver = context.contentResolver,
|
contentResolver = context.contentResolver,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
saveContentDefault(
|
saveContentDefault(
|
||||||
fileName = File(trimInlineMetaData(url)).name,
|
fileName = File(trimmedUrl).name,
|
||||||
contentSource = response.body.source(),
|
contentSource = response.body.source(),
|
||||||
context = context,
|
context = context,
|
||||||
)
|
)
|
||||||
@@ -150,6 +154,14 @@ object MediaSaverToDisk {
|
|||||||
MimeTypeMap.getSingleton().getMimeTypeFromExtension(it).orEmpty()
|
MimeTypeMap.getSingleton().getMimeTypeFromExtension(it).orEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun isMediaMimeType(type: String): Boolean =
|
||||||
|
type.isNotBlank() &&
|
||||||
|
(
|
||||||
|
type.startsWith("image/", ignoreCase = true) ||
|
||||||
|
type.startsWith("video/", ignoreCase = true) ||
|
||||||
|
type.startsWith("audio/", ignoreCase = true)
|
||||||
|
)
|
||||||
|
|
||||||
@OptIn(ExperimentalUuidApi::class)
|
@OptIn(ExperimentalUuidApi::class)
|
||||||
fun save(
|
fun save(
|
||||||
localFile: File,
|
localFile: File,
|
||||||
|
|||||||
Reference in New Issue
Block a user