Skip to content

Commit 37da333

Browse files
authored
Only return extensions for known structured syntax suffixes (#76)
Prevents return of arbitrary extension if input MIME type from unsafe source.
1 parent 87c160c commit 37da333

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

lib/mime.ex

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ defmodule MIME do
117117
"video/x-msvideo" => ["avi"]
118118
}
119119

120+
#selected from https://www.iana.org/assignments/media-type-structured-suffix/media-type-structured-suffix.xhtml
121+
suffixes = %{
122+
"gzip" => ["gz"],
123+
"json" => ["json"],
124+
"xml" => ["xml"],
125+
"zip" => ["zip"]
126+
}
127+
120128
require Application
121129
custom_types = Application.compile_env(:mime, :types, %{})
122130

@@ -177,7 +185,7 @@ defmodule MIME do
177185

178186
defp suffix(type) do
179187
case String.split(type, "+") do
180-
[_type_subtype_without_suffix, suffix] -> [suffix]
188+
[_type_subtype_without_suffix, suffix] -> suffix_to_ext(suffix)
181189
_ -> nil
182190
end
183191
end
@@ -265,4 +273,13 @@ defmodule MIME do
265273
end
266274

267275
defp mime_to_ext(_type), do: nil
276+
277+
@spec suffix_to_ext(String.t()) :: list(String.t()) | nil
278+
defp suffix_to_ext(suffix)
279+
280+
for {suffix, exts} <- suffixes do
281+
defp suffix_to_ext(unquote(suffix)), do: unquote(List.wrap(exts))
282+
end
283+
284+
defp suffix_to_ext(_suffix), do: nil
268285
end

test/mime_test.exs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ defmodule MIMETest do
2020
assert extensions("application/xml") == ["xml"]
2121
assert extensions("application/vnd.custom+xml") == ["xml"]
2222
assert extensions("application/vnd.custom+xml+xml") == []
23+
assert extensions("application/vnd.custom+inexist") == []
24+
assert extensions("application/vnd.custom+xml/extrainvalid") == []
2325
end
2426

2527
test "type/1" do

0 commit comments

Comments
 (0)