mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-19 19:00:39 -07:00
Merge pull request #1746 from Shopify/gm/base64-encoding
[base64] Respect string encoding of input in base64_decode filters
This commit is contained in:
@@ -29,6 +29,19 @@ module Liquid
|
|||||||
)
|
)
|
||||||
STRIP_HTML_TAGS = /<.*?>/m
|
STRIP_HTML_TAGS = /<.*?>/m
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def try_coerce_encoding(input, encoding:)
|
||||||
|
original_encoding = input.encoding
|
||||||
|
if input.encoding != encoding
|
||||||
|
input.force_encoding(encoding)
|
||||||
|
unless input.valid_encoding?
|
||||||
|
input.force_encoding(original_encoding)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
input
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# @liquid_public_docs
|
# @liquid_public_docs
|
||||||
# @liquid_type filter
|
# @liquid_type filter
|
||||||
# @liquid_category array
|
# @liquid_category array
|
||||||
@@ -150,7 +163,8 @@ module Liquid
|
|||||||
# @liquid_syntax string | base64_decode
|
# @liquid_syntax string | base64_decode
|
||||||
# @liquid_return [string]
|
# @liquid_return [string]
|
||||||
def base64_decode(input)
|
def base64_decode(input)
|
||||||
Base64.strict_decode64(input.to_s)
|
input = input.to_s
|
||||||
|
StandardFilters.try_coerce_encoding(Base64.strict_decode64(input), encoding: input.encoding)
|
||||||
rescue ::ArgumentError
|
rescue ::ArgumentError
|
||||||
raise Liquid::ArgumentError, "invalid base64 provided to base64_decode"
|
raise Liquid::ArgumentError, "invalid base64 provided to base64_decode"
|
||||||
end
|
end
|
||||||
@@ -174,7 +188,8 @@ module Liquid
|
|||||||
# @liquid_syntax string | base64_url_safe_decode
|
# @liquid_syntax string | base64_url_safe_decode
|
||||||
# @liquid_return [string]
|
# @liquid_return [string]
|
||||||
def base64_url_safe_decode(input)
|
def base64_url_safe_decode(input)
|
||||||
Base64.urlsafe_decode64(input.to_s)
|
input = input.to_s
|
||||||
|
StandardFilters.try_coerce_encoding(Base64.urlsafe_decode64(input), encoding: input.encoding)
|
||||||
rescue ::ArgumentError
|
rescue ::ArgumentError
|
||||||
raise Liquid::ArgumentError, "invalid base64 provided to base64_url_safe_decode"
|
raise Liquid::ArgumentError, "invalid base64 provided to base64_url_safe_decode"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -176,7 +176,17 @@ class StandardFiltersTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_base64_decode
|
def test_base64_decode
|
||||||
assert_equal('one two three', @filters.base64_decode('b25lIHR3byB0aHJlZQ=='))
|
decoded = @filters.base64_decode('b25lIHR3byB0aHJlZQ==')
|
||||||
|
assert_equal('one two three', decoded)
|
||||||
|
assert_equal(Encoding::UTF_8, decoded.encoding)
|
||||||
|
|
||||||
|
decoded = @filters.base64_decode('4pyF')
|
||||||
|
assert_equal('✅', decoded)
|
||||||
|
assert_equal(Encoding::UTF_8, decoded.encoding)
|
||||||
|
|
||||||
|
decoded = @filters.base64_decode("/w==")
|
||||||
|
assert_equal(Encoding::ASCII_8BIT, decoded.encoding)
|
||||||
|
assert_equal((+"\xFF").force_encoding(Encoding::ASCII_8BIT), decoded)
|
||||||
|
|
||||||
exception = assert_raises(Liquid::ArgumentError) do
|
exception = assert_raises(Liquid::ArgumentError) do
|
||||||
@filters.base64_decode("invalidbase64")
|
@filters.base64_decode("invalidbase64")
|
||||||
@@ -194,10 +204,21 @@ class StandardFiltersTest < Minitest::Test
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_base64_url_safe_decode
|
def test_base64_url_safe_decode
|
||||||
|
decoded = @filters.base64_url_safe_decode('YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMTIzNDU2Nzg5MCAhQCMkJV4mKigpLT1fKy8_Ljo7W117fVx8')
|
||||||
assert_equal(
|
assert_equal(
|
||||||
'abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 !@#$%^&*()-=_+/?.:;[]{}\|',
|
'abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 !@#$%^&*()-=_+/?.:;[]{}\|',
|
||||||
@filters.base64_url_safe_decode('YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMTIzNDU2Nzg5MCAhQCMkJV4mKigpLT1fKy8_Ljo7W117fVx8'),
|
decoded,
|
||||||
)
|
)
|
||||||
|
assert_equal(Encoding::UTF_8, decoded.encoding)
|
||||||
|
|
||||||
|
decoded = @filters.base64_url_safe_decode('4pyF')
|
||||||
|
assert_equal('✅', decoded)
|
||||||
|
assert_equal(Encoding::UTF_8, decoded.encoding)
|
||||||
|
|
||||||
|
decoded = @filters.base64_url_safe_decode("_w==")
|
||||||
|
assert_equal(Encoding::ASCII_8BIT, decoded.encoding)
|
||||||
|
assert_equal((+"\xFF").force_encoding(Encoding::ASCII_8BIT), decoded)
|
||||||
|
|
||||||
exception = assert_raises(Liquid::ArgumentError) do
|
exception = assert_raises(Liquid::ArgumentError) do
|
||||||
@filters.base64_url_safe_decode("invalidbase64")
|
@filters.base64_url_safe_decode("invalidbase64")
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user