Skip to content

Commit

Permalink
🐛 [#4795] Validate .msg file type only on backend
Browse files Browse the repository at this point in the history
The sdk cannot determine which content type belongs to a .msg file. This is because (at least) Linux and MacOS don't know this file type.

To make sure these files can be uploaded, the type property on the FileSerializer is now optional. For .smg files a new rule has been added to the MimeTypeValidator
  • Loading branch information
robinmolen committed Dec 23, 2024
1 parent 26063d9 commit f4d64af
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 9 deletions.
16 changes: 15 additions & 1 deletion src/openforms/formio/api/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ def __init__(self, allowed_mime_types: Iterable[str] | None = None):

def __call__(self, value: UploadedFile) -> None:
head = value.read(2048)
ext = value.name.split(".")[-1]
file_name_parts = value.name.split(".")
ext = file_name_parts[-1]
mime_type = magic.from_buffer(head, mime=True)

# gh #2520
Expand All @@ -76,6 +77,14 @@ def __call__(self, value: UploadedFile) -> None:
_("The provided file is not a valid file type.")
)

if len(file_name_parts) == 1:
raise serializers.ValidationError(
_(
"Could not determine the file type. Please make sure the file name "
"has an extension."
)
)

# Contents is allowed. Do extension or submitted content_type agree?
if value.content_type == "application/octet-stream":
m = magic.Magic(extension=True)
Expand Down Expand Up @@ -111,6 +120,11 @@ def __call__(self, value: UploadedFile) -> None:
"image/heif",
):
return
# 4795
# The sdk cannot determine the file type of .msg files, which result into
# content_type "". So we have to validate these for ourselves
elif mime_type == "application/vnd.ms-outlook" and ext == "msg":
return

# gh #4658
# Windows use application/x-zip-compressed as a mimetype for .zip files, which
Expand Down
9 changes: 1 addition & 8 deletions src/openforms/formio/components/vanilla.py
Original file line number Diff line number Diff line change
Expand Up @@ -338,14 +338,7 @@ class FileSerializer(serializers.Serializer):
originalName = serializers.CharField(trim_whitespace=False)
size = serializers.IntegerField(min_value=0)
storage = serializers.ChoiceField(choices=["url"])
type = serializers.CharField(
error_messages={
"blank": _(
"Could not determine the file type. Please make sure the file name "
"has an extension."
),
}
)
type = serializers.CharField(required=False, allow_blank=True)
url = serializers.URLField()
data = FileDataSerializer() # type: ignore

Expand Down

0 comments on commit f4d64af

Please sign in to comment.