heroic-sns 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ODJhMzlkZTE4ODA5ZWE2ODdmMGNmOTM0M2IxYTFkNWYwMzBlMjVjYw==
4
+ N2Q1NmY1MjNhNGViOTI4NDk1N2FjZmQzYWZjNTE2ZTM4MzM3OTlkNA==
5
5
  data.tar.gz: !binary |-
6
- MzEyN2NhN2IyMDMzMjQ0NGZjZGJjNzRlOWZiYWNjNzIxMzI2OGRjNA==
6
+ ZmFkMjY5YzdiMDQ3ODMwZjQyNDNkNzY1ZGM3MzU3OWVmNWYzNDJkYQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- OTNmZTE4MGI0YTVjZWM4MTYxNjdmNGFlM2I1OGI1YzZiMmUyM2FhNzdmNzk5
10
- YmE4MThiMjNmYmMxZGFjMDBkZDg0N2VhNDVhYzlhMzBjMDU1MjUyOTg3ZGU5
11
- NzI1MGIzNTExNzM2MjZiYjU1ZmI2YTYyODNiZjM2OGU3NzcwZmM=
9
+ MDZkY2QwOTkwZmRkMzc4ZmMwNTcyYTc5MDRlZjQ1ZTkxN2JmZjMwZWI4MTA4
10
+ MTRmYzRjMmRjM2M3YTJiOTdlOGZlN2IyMzQyMjAyYWJiZjQ4OTc2Zjg1Yjll
11
+ MGQ5NjM5ZmM5ZmY5YjdmYjg4Y2ZmZjFiNmUzZDc2Zjk3OWQwMDI=
12
12
  data.tar.gz: !binary |-
13
- YjJmNmJhZjg1YzFkZDhjODM2YmQ2ZDQ2MWNjZmM5MDRkYjk5ZjYyYmNiY2E2
14
- NmQ5ZTczZmE5OTMwYWQyMzhmZWQwZTAwNTNhZGVmOTZlYjIxMjRkODdlMjlm
15
- NTUxMmI5ODc0ZWY2YzE0MzEwMmQ5YTA0ODNmYTIzMThjM2IwMjY=
13
+ NDBhNWZmMzY1N2M0YTM5MWY4Njk0ZWQyNTc0NGY0NDk2NTQ4N2U4NDIwODE1
14
+ NWMwNjhlNzYyNWUzZmE2YjZiMzBkN2Q3ZGM1NjczMDJiOGQ2MGVlNzAyZDQ5
15
+ MWY4N2RkZDJlOGQ4YWJlM2U0OTUzN2ZmNDNlZWIyODdjYmEwZDU=
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ /capture
2
+ /pkg
3
+ /tmp
4
+ /Gemfile.lock
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - ruby-head
4
+ - "2.0.0"
5
+ - "1.9.3"
6
+ - "1.8.7"
data/CHANGELOG ADDED
@@ -0,0 +1,9 @@
1
+ ### 1.0.1 (May 17, 2013)
2
+
3
+ * Gem housekeeping, based on [advice by dblock](http://code.dblock.org/your-first-ruby-gem)
4
+
5
+ ### 1.0.0 (May 5, 2013)
6
+
7
+ * Initial public release - [@benzado]
8
+
9
+ [@benzado]: http://github.com/benzado
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem "rake"
data/README.md CHANGED
@@ -1,34 +1,40 @@
1
- # Heroic SNS Endpoint
1
+ # Heroic::SNS, Rack middleware for Amazon SNS endpoints
2
2
 
3
- This gem contains a lightweight Rack middleware for AWS Simple Notification
4
- Service (SNS) endpoints.
3
+ Heroic::SNS provides secure, lightweight Rack middleware for AWS Simple
4
+ Notification Service (SNS) endpoints.
5
5
 
6
- SNS messages to your web application are intercepted, parsed, verified, and then
7
- passed along to your Rack application in the `sns.message` environment key.
6
+ Any SNS messages POSTed by Amazon to your web application are intercepted,
7
+ parsed, verified, and then passed along via the `sns.message` environment key.
8
8
 
9
- If something goes wrong, the error will be passed along in the `sns.error`
10
- environment key. `Endpoint` does not log any messages itself.
9
+ If something goes wrong, the error will be passed along via the `sns.error`
10
+ environment key. `Heroic::SNS::Endpoint` does not log any messages itself.
11
11
 
12
- This gem *does not* depend on [aws-sdk][]. In fact, the only dependency it has
13
- beyond the standard libraries is [rack][]. This is intentional, since AWS
14
- credentials are not required to receive SNS notifications.
12
+ **Heroic::SNS aims to be secure.** All message signatures are verified (to avoid
13
+ forgeries) and stale messages are rejected (to avoid replay attacks).
14
+
15
+ **Heroic::SNS aims to be lightweight.** Beside Ruby standard libraries there are
16
+ no dependencies beside [rack][]. Specifically, Heroic::SNS *does not* depend on [aws-sdk][]. They will be friendly to each other, however, if you include both
17
+ in a project.
15
18
 
16
19
  [aws-sdk]: https://github.com/aws/aws-sdk-ruby
17
20
  [rack]: http://rack.github.io/
18
21
 
19
22
  ## Overview
20
23
 
21
- 1. Install in your middleware stack
22
- 2. Get SNS messages from `env['sns.message']`
23
- 3. Get errors from `env['sns.error']`
24
+ 1. `gem install heroic-sns`
25
+ 2. `require 'heroic/sns'`
26
+ 3. Install `Heroic::SNS::Endpoint` in your Rack app's middleware stack
27
+ 4. Get SNS messages from `env['sns.message']`
28
+ 5. Get errors from `env['sns.error']`
24
29
 
25
30
  ## How to use it
26
31
 
27
- Simply add the following to your `config.ru` file:
32
+ Once you have installed the gem, simply add the following to your `config.ru`
33
+ file:
28
34
 
29
35
  use Heroic::SNS::Endpoint, :topics => /:aws-ses-bounces$/
30
36
 
31
- For Rails, you could also install it in `/config/initializers/sns_endpoint.rb`:
37
+ On Rails, you could also install it in `/config/initializers/sns_endpoint.rb`:
32
38
 
33
39
  Rails.application.config.middleware.use Heroic::SNS::Endpoint, :topic => ...
34
40
 
@@ -36,21 +42,21 @@ The Endpoint class takes an options hash as an argument, and understands these
36
42
  options:
37
43
 
38
44
  `:topic` is required, and provides a filter that defines what SNS topics are
39
- handled by this endpoint. A message is considered either "on-topic" or
40
- "off-topic". You can supply any of the following:
45
+ handled by this endpoint. **A message is considered either "on-topic" or
46
+ "off-topic".** You can supply any of the following:
41
47
 
42
- - a single topic ARN as a `String`
43
- - a list of topic ARNs as an `Array` of `String`
48
+ - a `String` containing a single topic ARN
49
+ - an `Array` of `String` representing a list of topic ARNs
44
50
  - a `RegExp` which matches on-topic ARNs
45
51
  - a `Proc` which accepts an ARN as an argument and returns `true` or `false` for
46
52
  on-topic and off-topic ARNs, respectively.
47
53
 
48
- The key `topics:` also works.
54
+ The key `:topics` is also supported.
49
55
 
50
56
  `:auto_confirm` affects how on-topic subscription confirmations are handled.
51
57
 
52
- - If `true`, they are confirmed by retrieving the URL in the `SubscribeURL` field
53
- of the SNS message, and your app is not notified.
58
+ - If `true`, they are confirmed by retrieving the URL in the `SubscribeURL`
59
+ field of the SNS message, and your app is not notified.
54
60
  - If `false`, they are ignored; your app is also not notified.
55
61
  - If `nil`, there is no special handling and the message is passed along to your
56
62
  app.
@@ -96,7 +102,17 @@ You must skip the authenticity token verification to allow Amazon to POST to the
96
102
  controller action. Be careful not to disable it for more actions than you need.
97
103
  Be sure to disable any authentication checks for that action, too.
98
104
 
99
- ## How off-topic notifications are handled
105
+ ## Multiple endpoint URLs
106
+
107
+ If you are receiving multiple notifications at multiple endpoint URLs, you
108
+ should only include one instance of the Endpoint in your middleware stack, and
109
+ ensure that its topic filter allows all the notifications you are interested in
110
+ to pass through.
111
+
112
+ `Endpoint` does not interact with the URL path at all; if you want your
113
+ subscriptions to go to different URLs, simply set them up that way.
114
+
115
+ ## Off-topic notifications
100
116
 
101
117
  As a security measure, `Endpoint` requires you to set up a topic filter. Any
102
118
  notifications that do not match this filter are not passed along to your
@@ -114,20 +130,20 @@ messages will be treated as on topic. Be aware that it is dangerous to leave
114
130
  `:auto_confirm` enabled with a permissive topic filter, as this will allow
115
131
  anyone to subscribe your web app to any SNS notification.
116
132
 
117
- ## Receiving multiple notification topics
133
+ ## Contributing
118
134
 
119
- If you are receiving multiple notifications at multiple endpoint URLs, you should
120
- only include one instance of the Endpoint in your middleware stack, and ensure
121
- that its topic filter allows all the notifications you are interested in to pass
122
- through.
135
+ * Fork the project.
136
+ * Make your feature addition or bug fix and include tests.
137
+ * Update `CHANGELOG`.
138
+ * Send a pull request.
123
139
 
124
- `Endpoint` does not interact with the URL path at all; if you want your
125
- subscriptions to go to different URLs, simply set them up that way.
140
+ ## Copyright and License
126
141
 
127
- ## Questions?
142
+ Copyright 2013, Heroic Software Inc and Contributors.
128
143
 
129
- You can send me an email at <ben@benzado.com> or Twitter [@benzado][]
144
+ This project [is licensed under the Apache license](LICENSE).
130
145
 
131
- [@benzado]: https://twitter.com/benzado
146
+ Direct correspondence to Benjamin Ragheb via email at <ben@benzado.com>
147
+ or on Twitter [@benzado](https://twitter.com/benzado).
132
148
 
133
149
  [![Build Status](https://travis-ci.org/benzado/heroic-sns.png?branch=master)](https://travis-ci.org/benzado/heroic-sns)
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'bundler/gem_tasks'
3
+ require 'rake/testtask'
4
+
5
+ Bundler.setup(:default, :development)
6
+
7
+ Rake::TestTask.new do |t|
8
+ t.libs << 'test'
9
+ end
10
+
11
+ task :demo do
12
+ sh 'rackup -Ilib demo/config.ru'
13
+ end
14
+
15
+ task :default => :test
data/bin/fake-sns ADDED
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ require 'securerandom'
3
+ require 'net/http'
4
+ require 'json'
5
+
6
+ Net::HTTP.start('localhost', 9292) do |http|
7
+ ARGV.each do |path|
8
+ File.open(path) do |f|
9
+ json = f.read
10
+ message = JSON.parse(json)
11
+ type, message_id, topic_arn = message.values_at(*%w[Type MessageId TopicArn])
12
+ puts "Type: #{type}"
13
+ puts "MessageId: #{message_id}"
14
+ puts "TopicArn: #{topic_arn}"
15
+ headers = {
16
+ 'Content-Type' => 'text/plain',
17
+ 'x-amz-sns-message-type' => type,
18
+ 'x-amz-sns-message-id' => message_id,
19
+ 'x-amz-sns-topic-arn' => topic_arn,
20
+ 'x-amz-sns-subscription-arn' => "#{topic_arn}:#{SecureRandom.uuid}"
21
+ }
22
+ res = http.post('/', json, headers)
23
+ p res
24
+ end
25
+ end
26
+ end
data/demo/config.ru ADDED
@@ -0,0 +1,54 @@
1
+ require 'erb'
2
+ require 'heroic/sns'
3
+
4
+ # `rackup -Ilib` at the command line to start this rack app
5
+
6
+ class MessageCapture
7
+ def initialize(app)
8
+ @app = app
9
+ end
10
+ def call(env)
11
+ if message = env['sns.message']
12
+ path = "#{message.id}.txt"
13
+ File.open(path, 'w') { |f| f.write(message.to_json) } unless File.exists?(path)
14
+ end
15
+ @app.call(env)
16
+ end
17
+ end
18
+
19
+ class DemoApp
20
+
21
+ def initialize
22
+ @events = Array.new
23
+ @template = ERB.new(File.read(File.join(File.dirname(__FILE__), 'demo.erb')))
24
+ end
25
+
26
+ def call(env)
27
+ if error = env['sns.error']
28
+ @events << error
29
+ puts "SNS Error: #{error}"
30
+ response(500, 'Error')
31
+ elsif message = env['sns.message']
32
+ @events << message
33
+ puts "*** MESSAGE #{message.id} RECEIVED ***"
34
+ puts "Subject: #{message.subject}\n\n" if message.subject
35
+ puts message.body
36
+ puts "*** END MESSAGE ***"
37
+ response(200, 'OK')
38
+ else
39
+ content = @template.result(binding)
40
+ [200, { 'Content-Type' => 'text/html' }, [ content ]]
41
+ end
42
+ end
43
+
44
+ def response(code, text)
45
+ [code, {'Content-Type' => 'text/plain', 'Content-Length' => text.length.to_s}, [text]]
46
+ end
47
+
48
+ end
49
+
50
+ use Rack::Lint
51
+ use Heroic::SNS::Endpoint, topics: Proc.new { true }, auto_confirm: nil, auto_unsubscribe: nil
52
+ use Rack::Lint
53
+ use MessageCapture
54
+ run DemoApp.new
data/demo/demo.erb ADDED
@@ -0,0 +1,35 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Heroic::SNS::Endpoint Demo</title>
5
+ <style>
6
+ th { text-align: left; }
7
+ </style>
8
+ </head>
9
+ <body>
10
+ <p>Send SNS messages to this server and then reload to see them here.</p>
11
+ <% @events.each do |event| %>
12
+ <hr/>
13
+ <% if event.is_a? Heroic::SNS::Error %>
14
+ <p><b>Error</b> <code><%= event.message %></code></p>
15
+ <% else %>
16
+ <table>
17
+ <tr><th>Message</th><td><%= event.id %></td></td>
18
+ <tr><th>Topic</th><td><%= event.topic_arn %></td></td>
19
+ <tr><th>Time</th><td><%= event.timestamp %></td></td>
20
+ <tr><th>Type</th><td><%= event.type %></td></td>
21
+ <% if event.subject %>
22
+ <tr><th>Subject</th><td><%= event.subject %></td></td>
23
+ <% end %>
24
+ </table>
25
+ <pre><%= event.body %></pre>
26
+ <% if event.subscribe_url %>
27
+ <div><a href="<%= event.subscribe_url %>">Click Here to Subscribe</a></div>
28
+ <% end %>
29
+ <% if event.unsubscribe_url %>
30
+ <div><a href="<%= event.unsubscribe_url %>">Click Here to Unsubscribe</a></div>
31
+ <% end %>
32
+ <% end %>
33
+ <% end %>
34
+ </body>
35
+ </html>
data/description.txt ADDED
@@ -0,0 +1,6 @@
1
+ Secure, lightweight Rack middleware for Amazon Simple Notification Service (SNS)
2
+ endpoints. SNS messages are intercepted, parsed, verified, and then passed along
3
+ to the web application via the 'sns.message' environment key. Heroic::SNS has no
4
+ dependencies besides Rack (specifically, the aws-sdk gem is not needed).
5
+ SNS message signatures are verified in order to reject forgeries and replay
6
+ attacks.
@@ -0,0 +1,23 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+ require "heroic/sns/version"
3
+
4
+ # See: http://guides.rubygems.org/specification-reference/
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = 'heroic-sns'
8
+ s.version = Heroic::SNS::VERSION
9
+ s.summary = "Lightweight Rack middleware for AWS SNS endpoints"
10
+ s.description = File.read('description.txt')
11
+ s.license = 'Apache'
12
+
13
+ s.author = "Benjamin Ragheb"
14
+ s.email = 'ben@benzado.com'
15
+ s.homepage = 'https://github.com/benzado/heroic-sns'
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+
19
+ s.platform = Gem::Platform::RUBY
20
+ s.required_ruby_version = '>= 1.8.7'
21
+ s.add_runtime_dependency 'rack', '~> 1.4'
22
+ s.add_runtime_dependency 'json', '~> 1.7.7'
23
+ end
data/lib/heroic/sns.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'heroic/sns/version'
1
2
  require 'heroic/sns/message'
2
3
  require 'heroic/sns/endpoint'
3
4
 
@@ -0,0 +1,5 @@
1
+ module Heroic
2
+ module SNS
3
+ VERSION = '1.0.1'
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ {
2
+ "Type" : "Notification",
3
+ "MessageId" : "5b75c78f-8c52-5271-9250-8e51f8ced1a1",
4
+ "TopicArn" : "arn:aws:sns:us-east-1:777594007835:racktest",
5
+ "Subject" : "tmnt",
6
+ "Message" : "booyakasha!",
7
+ "Timestamp" : "2013-04-09T19:56:12.524Z",
8
+ "SignatureVersion" : "1",
9
+ "Signature" : "E6kUvZBxVnybY2tX3XpRlkZGfxw6W+d0E38IRBmrmLn/ANMx6RdG694xOguZsPX+t1rGvCMUmF9uPTJAkCTAkeCsy+VzYrvujgBTg2i50Lt/sfFslAOZFGXntHjN1R865VO8pscviCxFsaaiKobcAw2UjdgMguMZ6xrt80LAJFM=",
10
+ "SigningCertURL" : "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem",
11
+ "UnsubscribeURL" : "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:777594007835:racktest:24ed571c-0bdb-4da8-925a-f47aa0777a00"
12
+ }
@@ -0,0 +1,15 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIICSzCCAbQCCQDjh2/2exmnNjANBgkqhkiG9w0BAQUFADBqMQswCQYDVQQGEwJV
3
+ UzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEYMBYGA1UE
4
+ CgwPQW1hem9uLmNvbSBJbmMuMRowGAYDVQQDDBFzbnMuYW1hem9uYXdzLmNvbTAe
5
+ Fw0xMzA1MDUwNjUwMjVaFw0yMzA1MDUwNjUwMjVaMGoxCzAJBgNVBAYTAlVTMRMw
6
+ EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRgwFgYDVQQKDA9B
7
+ bWF6b24uY29tIEluYy4xGjAYBgNVBAMMEXNucy5hbWF6b25hd3MuY29tMIGfMA0G
8
+ CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCurgL0UtoZn07o7RTSgLI2OB8zvWJQGml
9
+ EJg9sklFL4DLsoqGU0qrQOq1AtbSevUlkIEHjrp9yZZqKBtbTtEeLYHeKdCQ/cYI
10
+ jS/VpYssfNM3aCjNUcgOZzAL3jr2xKNE7IaQRY1DUp3CNCq9prj1ieZ/pTa9M93P
11
+ freWW8S2ywIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAKXys+Orn3upqKnntj2+ZazJ
12
+ Jflvh91E7oQ2/pmWtO5jHKhu0hkD1yxbdQX2zTDuXhhoGN2pxSvvqCalR0lLQZLV
13
+ usV2I8HhTH8pYQTZWBW9kfdB1vgbB50J4O2PUnP4g2VgzOMi4Vzt2/WSSQdmMmVV
14
+ sLGpdYn+U2IvPgc5jdMV
15
+ -----END CERTIFICATE-----
@@ -0,0 +1,15 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIICXgIBAAKBgQDCurgL0UtoZn07o7RTSgLI2OB8zvWJQGmlEJg9sklFL4DLsoqG
3
+ U0qrQOq1AtbSevUlkIEHjrp9yZZqKBtbTtEeLYHeKdCQ/cYIjS/VpYssfNM3aCjN
4
+ UcgOZzAL3jr2xKNE7IaQRY1DUp3CNCq9prj1ieZ/pTa9M93PfreWW8S2ywIDAQAB
5
+ AoGBAJ1di5JxRwFNofLqbrXIX8u0CGaUUbTjSvzMFlv1kmTI6Mq0tGGtOfB/e61g
6
+ Z/6cwzPiPYPAAlHY8SdE1ibJ4Q+ZY1QSJJ7aPBTCoZtoa/pXzWtfgRu5CGRCDpLu
7
+ WTEn6zwv8eNmeX8C5GTLGKBDeo2wUJ9hgyXHH9BasUSVQsuhAkEA96tCmARErCrT
8
+ OdDg/nO1qxH6822lqzdlJoZzUmXooUidCTM6SmDZh+xeR/u1AVNi+Ay8ImPf1pir
9
+ yyg7+snu0wJBAMlHlR1D1F9R1poYXWNgCG3ubNYeAcENjnjTVaTcPY0GjLoQqeHI
10
+ ZdOIH0IXGcG30PzCiN5U9gstYTZIfEoITSkCQQCnTpn992QsqgFm3SQgwCnJFqxg
11
+ JYH018cM72aYEx/DVDpBLMoD1MkeeR53oiH0c1A4IOI2mSFs5lWnN9bM4/zhAkEA
12
+ le21PBxXaD08noIBplFVVhWgionFgrkHZCb/h5LqYk77qmlZMa6lcsDVj9RHQk4a
13
+ 5Pw/GWWt9LtzywyJUFgIqQJAUrBbnrmRqUWvlpjDaKeAAMy8URsp6UfSUZzoE5fe
14
+ oe/flOqC8m4SjxLvq+vZNeavP5/j5j4BRf+g5gD0GqXRIg==
15
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,12 @@
1
+ {
2
+ "Type" : "SubscriptionConfirmation",
3
+ "MessageId" : "0d2474c6-4928-4878-aced-421f2f197b96",
4
+ "Token" : "2336412f37fb687f5d51e6e241d164b14a5cd1b9e576b8d39bd752f279ff94cfb9d0ba217bdf2898e2b48d719b903880a5332117e194d90f7ee844ddbd8d672883f7d83eb9f780cff7319dc07a004c79ee4d55d0a29e782d8ac2f6ef751f8c02728f3382c8ab3f5ce0b8a439f985bac5",
5
+ "TopicArn" : "arn:aws:sns:us-east-1:777594007835:racktest",
6
+ "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-east-1:777594007835:racktest.\nTo confirm the subscription, visit the SubscribeURL included in this message.",
7
+ "SubscribeURL" : "https://sns.us-east-1.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-1:777594007835:racktest&Token=2336412f37fb687f5d51e6e241d164b14a5cd1b9e576b8d39bd752f279ff94cfb9d0ba217bdf2898e2b48d719b903880a5332117e194d90f7ee844ddbd8d672883f7d83eb9f780cff7319dc07a004c79ee4d55d0a29e782d8ac2f6ef751f8c02728f3382c8ab3f5ce0b8a439f985bac5",
8
+ "Timestamp" : "2013-04-09T19:44:39.541Z",
9
+ "SignatureVersion" : "1",
10
+ "Signature" : "ce73LnwE9kZ4sEUEGh/s63myK/sb7x1HkwP079h08CQN1wIF9/HVdqCEB56o8ngc9x1bp1lKQtHVVMPUWEoNnx1CJinj8/BcL0BiEL2Q/+4og1ucWMQ/3vnISVwE5MUrYzcDBFJdrZHDEO3RRCVeqF4GHV0nuD1CqKzvven8ORU=",
11
+ "SigningCertURL" : "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "Type" : "UnsubscribeConfirmation",
3
+ "MessageId" : "30ce782a-cb22-474a-bb42-a4b2ebd0df6a",
4
+ "Token" : "2336412f37fb687f5d51e6e241d164b14a5cd1b9e5753984c8d8cb6b1ec4709760069dd0e49f5b8f0b9030fcd08778bf41c80d105a934de1699bdb77e286185a7e24c142b55cd16f58b7e7eedc478a384c875379b2d6d9f153a3909dd0912eb84e3c9c5a210f68f9ce8707a0d23d14f4",
5
+ "TopicArn" : "arn:aws:sns:us-east-1:777594007835:racktest",
6
+ "Message" : "You have chosen to deactivate subscription arn:aws:sns:us-east-1:777594007835:racktest:24ed571c-0bdb-4da8-925a-f47aa0777a00.\nTo cancel this operation and restore the subscription, visit the SubscribeURL included in this message.",
7
+ "SubscribeURL" : "https://sns.us-east-1.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-1:777594007835:racktest&Token=2336412f37fb687f5d51e6e241d164b14a5cd1b9e5753984c8d8cb6b1ec4709760069dd0e49f5b8f0b9030fcd08778bf41c80d105a934de1699bdb77e286185a7e24c142b55cd16f58b7e7eedc478a384c875379b2d6d9f153a3909dd0912eb84e3c9c5a210f68f9ce8707a0d23d14f4",
8
+ "Timestamp" : "2013-04-09T20:00:52.060Z",
9
+ "SignatureVersion" : "1",
10
+ "Signature" : "M2cQRoTu16zvpZr8q8tgLuZeea1d5K+PS/AT1MqVCbGVr1hiax24JzlymoKSDYGTLAYFbLlh+Kx+0gbOQKfIVoxfUofsFZtCp/RW+iEAfinDfVBSfFoMyTeVVLZgsdigrdUVO99R707XwbS4zftj3dpIFP/2R5RzNzzPuAMN+pM=",
11
+ "SigningCertURL" : "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
12
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heroic-sns
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Ragheb
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-05 00:00:00.000000000 Z
11
+ date: 2013-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -24,16 +24,33 @@ dependencies:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.4'
27
- description: ! 'Lightweight Rack middleware for AWS Simple Notification Service (SNS)
28
- endpoints.
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.7.7
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 1.7.7
41
+ description: ! 'Secure, lightweight Rack middleware for Amazon Simple Notification
42
+ Service (SNS)
43
+
44
+ endpoints. SNS messages are intercepted, parsed, verified, and then passed along
29
45
 
30
- SNS messages are intercepted, parsed, verified, and passed along to the Rack
46
+ to the web application via the ''sns.message'' environment key. Heroic::SNS has
47
+ no
31
48
 
32
- application in the ''sns.message'' environment key. The gem is designed to be
49
+ dependencies besides Rack (specifically, the aws-sdk gem is not needed).
33
50
 
34
- lightweight and does not depend on any other gem besides ''rack'' (specifically,
51
+ SNS message signatures are verified in order to reject forgeries and replay
35
52
 
36
- the ''aws-sdk'' gem is not required).
53
+ attacks.
37
54
 
38
55
  '
39
56
  email: ben@benzado.com
@@ -41,11 +58,27 @@ executables: []
41
58
  extensions: []
42
59
  extra_rdoc_files: []
43
60
  files:
44
- - README.md
61
+ - .gitignore
62
+ - .travis.yml
63
+ - CHANGELOG
64
+ - Gemfile
45
65
  - LICENSE
66
+ - README.md
67
+ - Rakefile
68
+ - bin/fake-sns
69
+ - demo/config.ru
70
+ - demo/demo.erb
71
+ - description.txt
72
+ - heroic-sns.gemspec
73
+ - lib/heroic/sns.rb
46
74
  - lib/heroic/sns/endpoint.rb
47
75
  - lib/heroic/sns/message.rb
48
- - lib/heroic/sns.rb
76
+ - lib/heroic/sns/version.rb
77
+ - test/fixtures/notification.json
78
+ - test/fixtures/sns.crt
79
+ - test/fixtures/sns.key
80
+ - test/fixtures/subscription.json
81
+ - test/fixtures/unsubscribe.json
49
82
  - test/helper.rb
50
83
  - test/test_endpoint.rb
51
84
  - test/test_message.rb
@@ -53,7 +86,7 @@ homepage: https://github.com/benzado/heroic-sns
53
86
  licenses:
54
87
  - Apache
55
88
  metadata: {}
56
- post_install_message: Thanks for installing!
89
+ post_install_message:
57
90
  rdoc_options: []
58
91
  require_paths:
59
92
  - lib
@@ -74,4 +107,3 @@ signing_key:
74
107
  specification_version: 4
75
108
  summary: Lightweight Rack middleware for AWS SNS endpoints
76
109
  test_files: []
77
- has_rdoc: