Class: Heroic::SNS::Message
- Inherits:
-
Object
- Object
- Heroic::SNS::Message
- Defined in:
- lib/heroic/sns/message.rb
Overview
Encapsulates an SNS message. See: docs.aws.amazon.com/sns/latest/gsg/json-formats.html
Instance Method Summary collapse
- #==(other_message) ⇒ Object
- #body ⇒ Object
- #hash ⇒ Object
- #id ⇒ Object
-
#initialize(json) ⇒ Message
constructor
A new instance of Message.
-
#signature ⇒ Object
The message signature data, Base-64 decoded.
- #signature_version ⇒ Object
- #signing_cert_url ⇒ Object
-
#subject ⇒ Object
The message may not have a subject.
- #subscribe_url ⇒ Object
-
#timestamp ⇒ Object
The timestamp as a Time object.
- #to_json ⇒ Object
- #to_s ⇒ Object
-
#token ⇒ Object
The token is used to confirm subscriptions via the SNS API.
- #topic_arn ⇒ Object
- #type ⇒ Object
- #unsubscribe_url ⇒ Object
-
#verify! ⇒ Object
Verifies the message signature.
Constructor Details
Instance Method Details
#==(other_message) ⇒ Object
83 84 85 |
# File 'lib/heroic/sns/message.rb', line 83 def ==() @msg == .instance_variable_get(:@msg) end |
#body ⇒ Object
65 66 67 |
# File 'lib/heroic/sns/message.rb', line 65 def body @msg['Message'] end |
#hash ⇒ Object
87 88 89 |
# File 'lib/heroic/sns/message.rb', line 87 def hash @msg.hash end |
#id ⇒ Object
38 39 40 |
# File 'lib/heroic/sns/message.rb', line 38 def id @msg['MessageId'] end |
#signature ⇒ Object
The message signature data, Base-64 decoded.
56 57 58 |
# File 'lib/heroic/sns/message.rb', line 56 def signature Base64::decode64(@msg['Signature']) end |
#signature_version ⇒ Object
47 48 49 |
# File 'lib/heroic/sns/message.rb', line 47 def signature_version @msg['SignatureVersion'] end |
#signing_cert_url ⇒ Object
51 52 53 |
# File 'lib/heroic/sns/message.rb', line 51 def signing_cert_url @msg['SigningCertURL'] end |
#subject ⇒ Object
The message may not have a subject.
61 62 63 |
# File 'lib/heroic/sns/message.rb', line 61 def subject @msg['Subject'] end |
#subscribe_url ⇒ Object
69 70 71 |
# File 'lib/heroic/sns/message.rb', line 69 def subscribe_url @msg['SubscribeURL'] end |
#timestamp ⇒ Object
The timestamp as a Time object.
43 44 45 |
# File 'lib/heroic/sns/message.rb', line 43 def Time.xmlschema(@msg['Timestamp']) end |
#to_json ⇒ Object
99 100 101 |
# File 'lib/heroic/sns/message.rb', line 99 def to_json @msg.to_json end |
#to_s ⇒ Object
91 92 93 94 95 96 97 |
# File 'lib/heroic/sns/message.rb', line 91 def to_s string = "<SNSMessage:\n" @msg.each do |k,v| string << sprintf(" %s: %s\n", k, v.inspect) end string << ">" end |
#token ⇒ Object
The token is used to confirm subscriptions via the SNS API. If you visit the :subscribe_url, you can ignore this field.
79 80 81 |
# File 'lib/heroic/sns/message.rb', line 79 def token @msg['Token'] end |
#topic_arn ⇒ Object
34 35 36 |
# File 'lib/heroic/sns/message.rb', line 34 def topic_arn @msg['TopicArn'] end |
#type ⇒ Object
30 31 32 |
# File 'lib/heroic/sns/message.rb', line 30 def type @msg['Type'] end |
#unsubscribe_url ⇒ Object
73 74 75 |
# File 'lib/heroic/sns/message.rb', line 73 def unsubscribe_url @msg['UnsubscribeURL'] end |
#verify! ⇒ Object
Verifies the message signature. Raises an exception if it is not valid. See: docs.aws.amazon.com/sns/latest/gsg/SendMessageToHttp.verify.signature.html
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/heroic/sns/message.rb', line 105 def verify! age = Time.now - raise Errow.new("timestamp is in the future", self) if age < 0 raise Error.new("timestamp is too old", self) if age > MAXIMUM_ALLOWED_AGE if signature_version != '1' raise Error.new("unknown signature version: #{signature_version}", self) end if signing_cert_url !~ %r[^https://.*amazonaws\.com/] raise Error.new("signing certificate is not from amazonaws.com", self) end text = string_to_sign # will warn of invalid Type cert = CERTIFICATE_CACHE[signing_cert_url] digest = OpenSSL::Digest::SHA1.new unless cert.public_key.verify(digest, signature, text) raise Error.new("message signature is invalid", self) end end |