heroic-sns 1.0.0 → 1.0.1
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 +8 -8
- data/.gitignore +4 -0
- data/.travis.yml +6 -0
- data/CHANGELOG +9 -0
- data/Gemfile +5 -0
- data/README.md +49 -33
- data/Rakefile +15 -0
- data/bin/fake-sns +26 -0
- data/demo/config.ru +54 -0
- data/demo/demo.erb +35 -0
- data/description.txt +6 -0
- data/heroic-sns.gemspec +23 -0
- data/lib/heroic/sns.rb +1 -0
- data/lib/heroic/sns/version.rb +5 -0
- data/test/fixtures/notification.json +12 -0
- data/test/fixtures/sns.crt +15 -0
- data/test/fixtures/sns.key +15 -0
- data/test/fixtures/subscription.json +12 -0
- data/test/fixtures/unsubscribe.json +12 -0
- metadata +44 -12
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
N2Q1NmY1MjNhNGViOTI4NDk1N2FjZmQzYWZjNTE2ZTM4MzM3OTlkNA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZmFkMjY5YzdiMDQ3ODMwZjQyNDNkNzY1ZGM3MzU3OWVmNWYzNDJkYQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MDZkY2QwOTkwZmRkMzc4ZmMwNTcyYTc5MDRlZjQ1ZTkxN2JmZjMwZWI4MTA4
|
10
|
+
MTRmYzRjMmRjM2M3YTJiOTdlOGZlN2IyMzQyMjAyYWJiZjQ4OTc2Zjg1Yjll
|
11
|
+
MGQ5NjM5ZmM5ZmY5YjdmYjg4Y2ZmZjFiNmUzZDc2Zjk3OWQwMDI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NDBhNWZmMzY1N2M0YTM5MWY4Njk0ZWQyNTc0NGY0NDk2NTQ4N2U4NDIwODE1
|
14
|
+
NWMwNjhlNzYyNWUzZmE2YjZiMzBkN2Q3ZGM1NjczMDJiOGQ2MGVlNzAyZDQ5
|
15
|
+
MWY4N2RkZDJlOGQ4YWJlM2U0OTUzN2ZmNDNlZWIyODdjYmEwZDU=
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/CHANGELOG
ADDED
data/Gemfile
ADDED
data/README.md
CHANGED
@@ -1,34 +1,40 @@
|
|
1
|
-
# Heroic SNS
|
1
|
+
# Heroic::SNS, Rack middleware for Amazon SNS endpoints
|
2
2
|
|
3
|
-
|
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,
|
7
|
-
|
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
|
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
|
-
|
13
|
-
|
14
|
-
|
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.
|
22
|
-
2.
|
23
|
-
3.
|
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
|
-
|
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
|
-
|
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"
|
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
|
43
|
-
-
|
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 `
|
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`
|
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
|
-
##
|
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
|
-
##
|
133
|
+
## Contributing
|
118
134
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
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
|
-
|
125
|
-
subscriptions to go to different URLs, simply set them up that way.
|
140
|
+
## Copyright and License
|
126
141
|
|
127
|
-
|
142
|
+
Copyright 2013, Heroic Software Inc and Contributors.
|
128
143
|
|
129
|
-
|
144
|
+
This project [is licensed under the Apache license](LICENSE).
|
130
145
|
|
131
|
-
|
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
|
[](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.
|
data/heroic-sns.gemspec
ADDED
@@ -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
@@ -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.
|
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-
|
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
|
-
|
28
|
-
|
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
|
-
|
46
|
+
to the web application via the ''sns.message'' environment key. Heroic::SNS has
|
47
|
+
no
|
31
48
|
|
32
|
-
|
49
|
+
dependencies besides Rack (specifically, the aws-sdk gem is not needed).
|
33
50
|
|
34
|
-
|
51
|
+
SNS message signatures are verified in order to reject forgeries and replay
|
35
52
|
|
36
|
-
|
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
|
-
-
|
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:
|
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:
|