From f140f28e5a8132522e43f8e9253b03e39a7d3528 Mon Sep 17 00:00:00 2001 From: Ross Kaffenberger Date: Sun, 21 Jan 2024 10:16:08 -0500 Subject: [PATCH] Remove Ruby <2.3 base64 decoding workaround (#9) In older Ruby versions, WebPush.decode64 was introduced to wrap Base64.urlsafe_decode64 to prevent errors decoding "unpadded" urlsafe-encoded input. Since Ruby 2.3, Base64.urlsafe_decode64 can now gracefully decode padded and unpadded input. --- lib/web_push.rb | 4 ---- spec/web_push_spec.rb | 12 ++++++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/web_push.rb b/lib/web_push.rb index 80ccaf6..93d1e13 100644 --- a/lib/web_push.rb +++ b/lib/web_push.rb @@ -56,10 +56,6 @@ def encode64(bytes) end def decode64(str) - # For Ruby < 2.3, Base64.urlsafe_decode64 strict decodes and will raise errors if encoded value is not properly padded - # Implementation: http://ruby-doc.org/stdlib-2.3.0/libdoc/base64/rdoc/Base64.html#method-i-urlsafe_decode64 - str = str.ljust((str.length + 3) & ~3, '=') if !str.end_with?('=') && str.length % 4 != 0 - Base64.urlsafe_decode64(str) end diff --git a/spec/web_push_spec.rb b/spec/web_push_spec.rb index 42d806c..f915b61 100644 --- a/spec/web_push_spec.rb +++ b/spec/web_push_spec.rb @@ -5,6 +5,18 @@ expect(WebPush::VERSION).not_to be nil end + describe '.decode64' do + let(:a_padded_key) { "YWJjZGU=" } + + it 'urlsafe decodes padded base64 string' do + expect(WebPush.decode64(a_padded_key)).to eq("abcde") + end + + it 'urlsafe decodes unpadded base64 string' do + expect(WebPush.decode64(a_padded_key.delete("="))).to eq("abcde") + end + end + shared_examples 'web push protocol standard error handling' do it 'raises InvalidSubscription if the API returns a 404 Error' do stub_request(:post, expected_endpoint)