aws-sdk-sns 1.124.0 → 1.125.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/VERSION +1 -1
- data/lib/aws-sdk-sns/client.rb +1 -1
- data/lib/aws-sdk-sns/message_verifier.rb +76 -19
- data/lib/aws-sdk-sns.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8c4de1c6e682bc02fa66c6af6759f14f18ba58cc9a1c1943380e75d26d12db4c
|
|
4
|
+
data.tar.gz: f5f754bdf50a61fe76445323b484ca3a8ee8da26be705d69f1943dd058c0e5cf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 642eaac779964be128f5ab179ef664d9e1330b1a5145d94190062f0a07d36e815206ef3303ec8e8707d8d640ba6b01c8e86dac86c99f868b306989897bef9162
|
|
7
|
+
data.tar.gz: e6318b84a43429767bdd750a7e4b99acda1daa9b814a370a3ee960b57618e12493aac5f2b9cd9663edd88c508b59be51479d5fdc8f6971ae50c48edb84c928c6
|
data/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
Unreleased Changes
|
|
2
2
|
------------------
|
|
3
3
|
|
|
4
|
+
1.125.0 (2026-10-28)
|
|
5
|
+
------------------
|
|
6
|
+
|
|
7
|
+
* Feature - Code Generated Changes, see `./build_tools` or `aws-sdk-core`'s CHANGELOG.md for details.
|
|
8
|
+
|
|
9
|
+
* Issue - Reject SNS messages with an unsupported `Type` or malformed signed fields in `Aws::SNS::MessageVerifier`.
|
|
10
|
+
|
|
11
|
+
1.124.1 (2026-10-26)
|
|
12
|
+
------------------
|
|
13
|
+
|
|
14
|
+
* Issue - Fix `MessageVerifier#authentic?` to return false, rather than raise, for messages that are not JSON objects or have malformed signing fields.
|
|
15
|
+
|
|
4
16
|
1.124.0 (2026-10-21)
|
|
5
17
|
------------------
|
|
6
18
|
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.125.0
|
data/lib/aws-sdk-sns/client.rb
CHANGED
|
@@ -23,17 +23,23 @@ module Aws
|
|
|
23
23
|
|
|
24
24
|
class VerificationError < StandardError; end
|
|
25
25
|
|
|
26
|
+
# Signable fields per message type.
|
|
26
27
|
# @api private
|
|
27
|
-
|
|
28
|
-
'Message
|
|
29
|
-
'
|
|
30
|
-
|
|
31
|
-
'
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
SIGNABLE_KEYS_BY_TYPE = {
|
|
29
|
+
'Notification' => %w[Message MessageId Subject Timestamp TopicArn Type].freeze,
|
|
30
|
+
'SubscriptionConfirmation' =>
|
|
31
|
+
%w[Message MessageId SubscribeURL Timestamp Token TopicArn Type].freeze,
|
|
32
|
+
'UnsubscribeConfirmation' =>
|
|
33
|
+
%w[Message MessageId SubscribeURL Timestamp Token TopicArn Type].freeze
|
|
34
|
+
}.freeze
|
|
35
|
+
|
|
36
|
+
# Metadata fields that must be present as non-empty strings.
|
|
37
|
+
# @api private
|
|
38
|
+
REQUIRED_KEYS = %w[MessageId Timestamp TopicArn].freeze
|
|
39
|
+
|
|
40
|
+
# Only Message may contain the newline used as the field delimiter.
|
|
41
|
+
# @api private
|
|
42
|
+
NEWLINE_SAFE_KEY = 'Message'
|
|
37
43
|
|
|
38
44
|
# @api private
|
|
39
45
|
AWS_HOSTNAMES = [
|
|
@@ -63,8 +69,9 @@ module Aws
|
|
|
63
69
|
# @raise [VerificationError] Raised when the given message has failed
|
|
64
70
|
# verification.
|
|
65
71
|
def authenticate!(message_body)
|
|
66
|
-
msg =
|
|
72
|
+
msg = parse(message_body)
|
|
67
73
|
msg = convert_lambda_msg(msg) if is_from_lambda(msg)
|
|
74
|
+
verify_signing_fields!(msg)
|
|
68
75
|
|
|
69
76
|
case msg['SignatureVersion']
|
|
70
77
|
when '1'
|
|
@@ -79,6 +86,56 @@ module Aws
|
|
|
79
86
|
|
|
80
87
|
private
|
|
81
88
|
|
|
89
|
+
def parse(message_body)
|
|
90
|
+
msg = Json.load(message_body)
|
|
91
|
+
raise VerificationError, 'the message must be a JSON object' unless msg.is_a?(Hash)
|
|
92
|
+
|
|
93
|
+
msg
|
|
94
|
+
rescue Json::ParseError
|
|
95
|
+
raise VerificationError, 'the message is not valid JSON'
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def verify_signing_fields!(msg)
|
|
99
|
+
unless msg['Signature'].is_a?(String) && msg['SigningCertURL'].is_a?(String)
|
|
100
|
+
raise VerificationError, 'the Signature and SigningCertURL must be strings'
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
verify_signable_fields!(msg)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def verify_signable_fields!(msg)
|
|
107
|
+
keys = SIGNABLE_KEYS_BY_TYPE[msg['Type']]
|
|
108
|
+
unless keys
|
|
109
|
+
raise VerificationError, 'the message Type is not supported'
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
verify_required_keys!(msg)
|
|
113
|
+
verify_field_values!(msg, keys)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def verify_required_keys!(msg)
|
|
117
|
+
REQUIRED_KEYS.each do |key|
|
|
118
|
+
value = msg[key]
|
|
119
|
+
next if value.is_a?(String) && !value.empty?
|
|
120
|
+
|
|
121
|
+
raise VerificationError, "the #{key} must be a non-empty string"
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def verify_field_values!(msg, keys)
|
|
126
|
+
keys.each do |key|
|
|
127
|
+
value = msg[key]
|
|
128
|
+
next if value.nil?
|
|
129
|
+
|
|
130
|
+
unless value.is_a?(String)
|
|
131
|
+
raise VerificationError, "the #{key} must be a string"
|
|
132
|
+
end
|
|
133
|
+
if key != NEWLINE_SAFE_KEY && value.include?("\n")
|
|
134
|
+
raise VerificationError, "the #{key} must not contain newlines"
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
82
139
|
def is_from_lambda(message)
|
|
83
140
|
message.key? 'SigningCertUrl'
|
|
84
141
|
end
|
|
@@ -114,18 +171,18 @@ module Aws
|
|
|
114
171
|
end
|
|
115
172
|
|
|
116
173
|
def canonical_string(message)
|
|
117
|
-
|
|
118
|
-
SIGNABLE_KEYS.each do |key|
|
|
174
|
+
SIGNABLE_KEYS_BY_TYPE.fetch(message['Type']).filter_map do |key|
|
|
119
175
|
value = message[key]
|
|
120
|
-
unless value.nil?
|
|
121
|
-
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
parts.join
|
|
176
|
+
"#{key}\n#{value}\n" unless value.nil? || value.empty?
|
|
177
|
+
end.join
|
|
125
178
|
end
|
|
126
179
|
|
|
127
180
|
def public_key(message)
|
|
128
|
-
x509_url =
|
|
181
|
+
x509_url = begin
|
|
182
|
+
URI.parse(message['SigningCertURL'])
|
|
183
|
+
rescue URI::InvalidURIError
|
|
184
|
+
raise VerificationError, 'the SigningCertURL is not a valid URI'
|
|
185
|
+
end
|
|
129
186
|
x509 = OpenSSL::X509::Certificate.new(pem(x509_url))
|
|
130
187
|
OpenSSL::PKey::RSA.new(x509.public_key)
|
|
131
188
|
end
|
data/lib/aws-sdk-sns.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: aws-sdk-sns
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.125.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Amazon Web Services
|
|
@@ -18,7 +18,7 @@ dependencies:
|
|
|
18
18
|
version: '3'
|
|
19
19
|
- - ">="
|
|
20
20
|
- !ruby/object:Gem::Version
|
|
21
|
-
version: 3.
|
|
21
|
+
version: 3.262.0
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -28,7 +28,7 @@ dependencies:
|
|
|
28
28
|
version: '3'
|
|
29
29
|
- - ">="
|
|
30
30
|
- !ruby/object:Gem::Version
|
|
31
|
-
version: 3.
|
|
31
|
+
version: 3.262.0
|
|
32
32
|
- !ruby/object:Gem::Dependency
|
|
33
33
|
name: aws-sigv4
|
|
34
34
|
requirement: !ruby/object:Gem::Requirement
|