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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ebc66c7b9e4b0f43e01c45db095f2a8c03f2271c165495cf31d0b51ef7349740
4
- data.tar.gz: 6913600447c8a3e53e23d21585e7163224799240c6cdba9f31dadb2e00233fce
3
+ metadata.gz: 8c4de1c6e682bc02fa66c6af6759f14f18ba58cc9a1c1943380e75d26d12db4c
4
+ data.tar.gz: f5f754bdf50a61fe76445323b484ca3a8ee8da26be705d69f1943dd058c0e5cf
5
5
  SHA512:
6
- metadata.gz: 8a16b65324c7f6b90a9df62f0e9fdb51d60fd66e98d0976d89a855bc1b9f40e941c4d22e694b6acd0f92f1522cabf43d1e3700a0656e596fb34ef840dbe51071
7
- data.tar.gz: d4d0ce3df3c4e8751efddb5dd223693fdeaeea1a2f09126ec7d94e6152c4a54e46662e0515945ac6983fce206c8092ab30bd6e77e12628b380fb965e3339934f
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.124.0
1
+ 1.125.0
@@ -3256,7 +3256,7 @@ module Aws::SNS
3256
3256
  tracer: tracer
3257
3257
  )
3258
3258
  context[:gem_name] = 'aws-sdk-sns'
3259
- context[:gem_version] = '1.124.0'
3259
+ context[:gem_version] = '1.125.0'
3260
3260
  Seahorse::Client::Request.new(handlers, context)
3261
3261
  end
3262
3262
 
@@ -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
- SIGNABLE_KEYS = [
28
- 'Message',
29
- 'MessageId',
30
- 'Subject',
31
- 'SubscribeURL',
32
- 'Timestamp',
33
- 'Token',
34
- 'TopicArn',
35
- 'Type'
36
- ].freeze
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 = Json.load(message_body)
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
- parts = []
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? or value.empty?
121
- parts << "#{key}\n#{value}\n"
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 = URI.parse(message['SigningCertURL'])
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
@@ -58,7 +58,7 @@ module Aws::SNS
58
58
  autoload :Subscription, 'aws-sdk-sns/subscription'
59
59
  autoload :Topic, 'aws-sdk-sns/topic'
60
60
 
61
- GEM_VERSION = '1.124.0'
61
+ GEM_VERSION = '1.125.0'
62
62
 
63
63
  end
64
64
 
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.124.0
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.260.0
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.260.0
31
+ version: 3.262.0
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: aws-sigv4
34
34
  requirement: !ruby/object:Gem::Requirement