octoks 0.0.2 → 0.0.3

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
  SHA1:
3
- metadata.gz: 4869f327501027d1871533875f3cbc8eb6c22472
4
- data.tar.gz: ab852da066b5ba52c262540adc3ac47338ddbbdc
3
+ metadata.gz: f01a72b6d4686929f27246110d1321cde9803a0c
4
+ data.tar.gz: 50d1096709d5d3b16b86d24dc68d634e9deefdb9
5
5
  SHA512:
6
- metadata.gz: c3375aee458e1c59095f2d5be83779ce2f5045eb389bfdf02cd5d8ca9a60c2d7575b78bbefa53609ae50411acb2740310771f458634c72bff9b1a79fc64eec51
7
- data.tar.gz: 7b55dfab55af46e3a6217d68bd962962dd7c71a2f38fc7f7b0e9e5f362f67049f025fb83cfe875d9f6e8b6ed7fa5206ee5649df9ba2cd5c2abe4b0f69de19de1
6
+ metadata.gz: 837a171ab1decbfd3072b9e18ce8aa605204a456f977a193b4712677f7db56f63fb416c08b1ded8f26b8690a8a52586b35fb95e859aeb67fb027567fdd782718
7
+ data.tar.gz: f583546331816c6ccdbdb095b1c004b423fc69f61cc8590fcd6026f07e2a3dbed5b687e0a7cf21004ed215d840b14a246322d8ccb3f1b05fbe50accdc3525bd1
@@ -1,12 +1,16 @@
1
1
  require 'rack'
2
2
  require 'json'
3
+ require 'openssl'
4
+ require 'secure_compare'
3
5
 
4
6
  module Octoks
5
7
  class Receiver
6
8
  attr_accessor :hooks
9
+ attr_reader :secret
7
10
 
8
- def initialize
9
- @hooks = {}
11
+ def initialize(secret = nil)
12
+ @hooks = {}
13
+ @secret = secret
10
14
  end
11
15
 
12
16
  def on(name, &cb)
@@ -29,6 +33,10 @@ module Octoks
29
33
  return failed
30
34
  end
31
35
 
36
+ unless verify_signature(req)
37
+ return failed
38
+ end
39
+
32
40
  begin
33
41
  payload = JSON.parse(req.params['payload'])
34
42
  rescue
@@ -42,5 +50,15 @@ module Octoks
42
50
 
43
51
  [200, [], ["OK"]]
44
52
  end
53
+
54
+ HMAC_DIGEST = OpenSSL::Digest.new('sha1')
55
+ def verify_signature(req)
56
+ return true unless @secret
57
+ return false unless req.body
58
+ sig = 'sha1='+OpenSSL::HMAC.hexdigest(HMAC_DIGEST, @secret, req.body.read)
59
+ req.body.rewind
60
+ SecureCompare.compare(sig, req.env["HTTP_HUB_SIGNATURE"])
61
+ end
62
+
45
63
  end
46
64
  end
@@ -1,3 +1,3 @@
1
1
  module Octoks
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/octoks.gemspec CHANGED
@@ -18,8 +18,11 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.add_runtime_dependency "secure_compare", "~> 0"
22
+
21
23
  spec.add_development_dependency "bundler", "~> 1.5"
22
24
  spec.add_development_dependency "rake"
23
25
  spec.add_development_dependency "rack"
24
26
  spec.add_development_dependency "json"
27
+
25
28
  end
@@ -0,0 +1,30 @@
1
+ require 'minitest/autorun'
2
+ require 'octoks'
3
+
4
+ class TestReceiver < MiniTest::Unit::TestCase
5
+ def test_call
6
+ receiver = Octoks::Receiver.new("secret1234")
7
+ env = {
8
+ 'rack.version' => [1, 2],
9
+ 'REQUEST_METHOD' => 'POST',
10
+ 'SERVER_NAME' => 'example.com',
11
+ 'SERVER_PORT' => 80,
12
+ 'QUERY_STRING' => '',
13
+ 'PATH_INFO' => '/',
14
+ 'rack.url_scheme' => 'http',
15
+ 'HTTPS' => 'off',
16
+ 'CONTENT_LENGTH' => 15,
17
+ 'rack.input' => StringIO.new('payload={"hoge":"fuga"}'),
18
+ 'HTTP_X_GITHUB_EVENT' => 'issue',
19
+ 'HTTP_HUB_SIGNATURE' => 'sha1=b2d620dd0b514b814685364d637058fe5ce29479',
20
+ 'HTTP_X_GITHUB_DELIVERY' => 'gggg',
21
+ }
22
+ res = receiver.call(env)
23
+ assert_equal 200, res[0]
24
+
25
+ env['HTTP_HUB_SIGNATURE'] += "fail!"
26
+ res = receiver.call(env)
27
+ assert_equal 400, res[0]
28
+ end
29
+
30
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octoks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - hisaichi5518
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-12 00:00:00.000000000 Z
11
+ date: 2015-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: secure_compare
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -87,6 +101,7 @@ files:
87
101
  - octoks.gemspec
88
102
  - test/octoks/test_event.rb
89
103
  - test/octoks/test_receiver.rb
104
+ - test/octoks/test_receiver_secret.rb
90
105
  homepage: https://github.com/hisaichi5518/octoks
91
106
  licenses:
92
107
  - MIT
@@ -107,10 +122,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
122
  version: '0'
108
123
  requirements: []
109
124
  rubyforge_project:
110
- rubygems_version: 2.2.0
125
+ rubygems_version: 2.2.2
111
126
  signing_key:
112
127
  specification_version: 4
113
128
  summary: github hooks receiver.
114
129
  test_files:
115
130
  - test/octoks/test_event.rb
116
131
  - test/octoks/test_receiver.rb
132
+ - test/octoks/test_receiver_secret.rb