github_webhook 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 56016facfc0ab28b56bc588e152852a637d56c95
4
- data.tar.gz: f0ff11bc356e334855cf92f83193aa53fd56cdc1
3
+ metadata.gz: 8e1aafa2b371f63f8ff7276d892c0279845d4a84
4
+ data.tar.gz: 203d5fca9f09fd28ac501eabf2ae1f656b4358be
5
5
  SHA512:
6
- metadata.gz: 0826b815bff7d4edda1faf73bee0df2e1b0a13251fd0bb0f6805bfd0f5367ba81f2e6a2b8d6bc3193e549d7aad61bb0c0e912225e477a4cf033d34282a2912d3
7
- data.tar.gz: 837e31c5deae7e64b6f21407b1e67ba560aba9b98fa611952e753e0c90a46ec53dd1612fe9b4f954affdc66135ce5d02aa7468f0fc264fb4a3d0680353a20d5f
6
+ metadata.gz: fe0d6e2cc1f78f99cf0ec4b9825ee086332058c764ec117c1011007f81e458d13e2aa9352fa31c9e30ae30a067a1945fc63aed24dbd02eebca3678e5f4ed35f7
7
+ data.tar.gz: b2de02e5b6cc046efa2fc07bbe74057eed8571592f1f7260d3831b4f5788cba3392f466c43f1ee31816f8094b86a1b4628741663f068d59eeea25e4508f788c1
data/Gemfile.lock CHANGED
@@ -1,25 +1,27 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- github_webhook (0.3.2)
4
+ github_webhook (0.4.0)
5
5
  activesupport (~> 4)
6
+ rack (~> 1.3)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
10
- activesupport (4.1.1)
11
- i18n (~> 0.6, >= 0.6.9)
11
+ activesupport (4.2.5.1)
12
+ i18n (~> 0.7)
12
13
  json (~> 1.7, >= 1.7.7)
13
14
  minitest (~> 5.1)
14
- thread_safe (~> 0.1)
15
+ thread_safe (~> 0.3, >= 0.3.4)
15
16
  tzinfo (~> 1.1)
16
17
  codeclimate-test-reporter (0.4.8)
17
18
  simplecov (>= 0.7.1, < 1.0.0)
18
19
  diff-lcs (1.2.5)
19
20
  docile (1.1.5)
20
- i18n (0.6.9)
21
+ i18n (0.7.0)
21
22
  json (1.8.3)
22
- minitest (5.3.5)
23
+ minitest (5.8.4)
24
+ rack (1.6.4)
23
25
  rake (10.3.1)
24
26
  rspec (2.14.1)
25
27
  rspec-core (~> 2.14.0)
@@ -34,8 +36,8 @@ GEM
34
36
  json (~> 1.8)
35
37
  simplecov-html (~> 0.10.0)
36
38
  simplecov-html (0.10.0)
37
- thread_safe (0.3.4)
38
- tzinfo (1.2.1)
39
+ thread_safe (0.3.5)
40
+ tzinfo (1.2.2)
39
41
  thread_safe (~> 0.1)
40
42
 
41
43
  PLATFORMS
data/README.md CHANGED
@@ -13,7 +13,7 @@ to a [GitHub webhook](https://developer.github.com/webhooks/)
13
13
  Add this line to your application's Gemfile:
14
14
 
15
15
  ```ruby
16
- gem 'github_webhook', '~> 0.3.0'
16
+ gem 'github_webhook', '~> 0.4.0'
17
17
  ```
18
18
 
19
19
  And then execute:
@@ -18,6 +18,7 @@ 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_dependency "rack", "~> 1.3"
21
22
  spec.add_dependency "activesupport", "~> 4"
22
23
 
23
24
  spec.add_development_dependency "bundler", "~> 1.5"
@@ -9,6 +9,7 @@ module GithubWebhook::Processor
9
9
  class SignatureError < StandardError; end
10
10
  class UnspecifiedWebhookSecretError < StandardError; end
11
11
  class UnsupportedGithubEventError < StandardError; end
12
+ class UnsupportedContentTypeError < StandardError; end
12
13
 
13
14
  GITHUB_EVENTS_WHITELIST = %w(ping commit_comment create delete deployment deployment_status download follow fork fork_apply gist gollum issue_comment issues member membership page_build public pull_request pull_request_review_comment push release repository status team_add watch)
14
15
 
@@ -53,7 +54,20 @@ module GithubWebhook::Processor
53
54
  end
54
55
 
55
56
  def json_body
56
- @json_body ||= ActiveSupport::HashWithIndifferentAccess.new(JSON.load(request_body))
57
+ @json_body ||= (
58
+ content_type = request.headers['Content-Type']
59
+ case content_type
60
+ when 'application/x-www-form-urlencoded'
61
+ require 'rack'
62
+ payload = Rack::Utils.parse_query(request_body)['payload']
63
+ when 'application/json'
64
+ payload = request_body
65
+ else
66
+ raise UnsupportedContentTypeError.new(
67
+ "Content-Type #{content_type} is not supported. Use 'application/x-www-form-urlencoded' or 'application.json")
68
+ end
69
+ ActiveSupport::HashWithIndifferentAccess.new(JSON.load(payload))
70
+ )
57
71
  end
58
72
 
59
73
  def signature_header
@@ -1,3 +1,3 @@
1
1
  module GithubWebhook
2
- VERSION = "0.3.2"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -49,10 +49,22 @@ module GithubWebhook
49
49
  expect { controller_without_secret.send :authenticate_github_request! }.to raise_error(Processor::UnspecifiedWebhookSecretError)
50
50
  end
51
51
 
52
- it "calls the #push method in controller" do
52
+ it "calls the #push method in controller (json)" do
53
53
  controller.request.body = StringIO.new({ :foo => "bar" }.to_json.to_s)
54
54
  controller.request.headers['X-Hub-Signature'] = "sha1=52b582138706ac0c597c315cfc1a1bf177408a4d"
55
55
  controller.request.headers['X-GitHub-Event'] = 'push'
56
+ controller.request.headers['Content-Type'] = 'application/json'
57
+ controller.send :authenticate_github_request! # Manually as we don't have the before_filter logic in our Mock object
58
+ controller.create
59
+ expect(controller.pushed).to eq "bar"
60
+ end
61
+
62
+ it "calls the #push method (x-www-form-urlencoded encoded)" do
63
+ body = "payload=" + CGI::escape({ :foo => "bar" }.to_json.to_s)
64
+ controller.request.body = StringIO.new(body)
65
+ controller.request.headers['X-Hub-Signature'] = "sha1=6986874ecdf710b04de7ef5a040161d41687407a"
66
+ controller.request.headers['X-GitHub-Event'] = 'push'
67
+ controller.request.headers['Content-Type'] = 'application/x-www-form-urlencoded'
56
68
  controller.send :authenticate_github_request! # Manually as we don't have the before_filter logic in our Mock object
57
69
  controller.create
58
70
  expect(controller.pushed).to eq "bar"
@@ -62,18 +74,29 @@ module GithubWebhook
62
74
  controller.request.body = StringIO.new({ :foo => "bar" }.to_json.to_s)
63
75
  controller.request.headers['X-Hub-Signature'] = "sha1=FOOBAR"
64
76
  controller.request.headers['X-GitHub-Event'] = 'push'
77
+ controller.request.headers['Content-Type'] = 'application/json'
65
78
  expect { controller.send :authenticate_github_request! }.to raise_error(Processor::SignatureError)
66
79
  end
67
80
 
68
81
  it "raises an error when the github event method is not implemented" do
69
82
  controller.request.headers['X-GitHub-Event'] = 'deployment'
83
+ controller.request.headers['Content-Type'] = 'application/json'
70
84
  expect { controller.create }.to raise_error(NoMethodError)
71
85
  end
72
86
 
73
87
  it "raises an error when the github event is not in the whitelist" do
74
88
  controller.request.headers['X-GitHub-Event'] = 'fake_event'
89
+ controller.request.headers['Content-Type'] = 'application/json'
75
90
  expect { controller.send :check_github_event! }.to raise_error(Processor::UnsupportedGithubEventError)
76
91
  end
92
+
93
+ it "raises an error when the content type is not correct" do
94
+ controller.request.body = StringIO.new({ :foo => "bar" }.to_json.to_s)
95
+ controller.request.headers['X-Hub-Signature'] = "sha1=52b582138706ac0c597c315cfc1a1bf177408a4d"
96
+ controller.request.headers['X-GitHub-Event'] = 'ping'
97
+ controller.request.headers['Content-Type'] = 'application/xml'
98
+ expect { controller.send :authenticate_github_request! }.to raise_error(Processor::UnsupportedContentTypeError)
99
+ end
77
100
  end
78
101
  end
79
102
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: github_webhook
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastien Saunier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-15 00:00:00.000000000 Z
11
+ date: 2016-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: activesupport
15
29
  requirement: !ruby/object:Gem::Requirement