rack-facebook-method-fix 0.3.0 → 0.4.0

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.
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/Gemfile CHANGED
@@ -10,4 +10,7 @@ group :development do
10
10
  gem "bundler", "~> 1.0.0"
11
11
  gem "jeweler", "~> 1.5.2"
12
12
  gem "rcov", ">= 0"
13
+ gem "json"
14
+ gem "rspec"
15
+ gem "rack-test"
13
16
  end
@@ -1,13 +1,26 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ diff-lcs (1.1.2)
4
5
  git (1.2.5)
5
6
  jeweler (1.5.2)
6
7
  bundler (~> 1.0.0)
7
8
  git (>= 1.2.5)
8
9
  rake
10
+ json (1.5.3)
11
+ rack (1.3.0)
12
+ rack-test (0.6.0)
13
+ rack (>= 1.0)
9
14
  rake (0.8.7)
10
15
  rcov (0.9.9)
16
+ rspec (2.6.0)
17
+ rspec-core (~> 2.6.0)
18
+ rspec-expectations (~> 2.6.0)
19
+ rspec-mocks (~> 2.6.0)
20
+ rspec-core (2.6.4)
21
+ rspec-expectations (2.6.0)
22
+ diff-lcs (~> 1.1.2)
23
+ rspec-mocks (2.6.0)
11
24
  shoulda (2.11.3)
12
25
 
13
26
  PLATFORMS
@@ -16,5 +29,8 @@ PLATFORMS
16
29
  DEPENDENCIES
17
30
  bundler (~> 1.0.0)
18
31
  jeweler (~> 1.5.2)
32
+ json
33
+ rack-test
19
34
  rcov
35
+ rspec
20
36
  shoulda
@@ -14,7 +14,15 @@ In early 2011 Facebook started to send all iframe application requests as POST.
14
14
  or
15
15
 
16
16
  require "rack-facebook-method-fix"
17
- use Rack::Facebook::MethodFix, :secret_id => "c561df165eacdd6e32672c9eaee10318"
17
+ use Rack::Facebook::MethodFix, :secret_id => "c561df165eacdd6e32672c9eaee10318"
18
+
19
+
20
+ You can exclude requests from being processed by adding an exclude option:
21
+
22
+ use Rack::Facebook::MethodFix, :exclude => proc { |env| env['PATH_INFO'].match(/^\/admin/) }
23
+
24
+ This would make sure that no path in the /admin namespace would change from a POST to a GET regardless of the signed_request param.
25
+
18
26
 
19
27
  == Contributing to Rack::Facebook::MethodFix
20
28
 
data/Rakefile CHANGED
@@ -27,13 +27,6 @@ Jeweler::Tasks.new do |gem|
27
27
  end
28
28
  Jeweler::RubygemsDotOrgTasks.new
29
29
 
30
- require 'rake/testtask'
31
- Rake::TestTask.new(:test) do |test|
32
- test.libs << 'lib' << 'test'
33
- test.pattern = 'test/**/test_*.rb'
34
- test.verbose = true
35
- end
36
-
37
30
  require 'rcov/rcovtask'
38
31
  Rcov::RcovTask.new do |test|
39
32
  test.libs << 'test'
@@ -41,8 +34,6 @@ Rcov::RcovTask.new do |test|
41
34
  test.verbose = true
42
35
  end
43
36
 
44
- task :default => :test
45
-
46
37
  require 'rake/rdoctask'
47
38
  Rake::RDocTask.new do |rdoc|
48
39
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
@@ -52,3 +43,11 @@ Rake::RDocTask.new do |rdoc|
52
43
  rdoc.rdoc_files.include('README*')
53
44
  rdoc.rdoc_files.include('lib/**/*.rb')
54
45
  end
46
+
47
+ require 'rspec/core/rake_task'
48
+ desc "Run all specs in spec/"
49
+ RSpec::Core::RakeTask.new(:spec) do |t|
50
+ t.pattern = "./spec/**/*_spec.rb"
51
+ end
52
+
53
+ task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
@@ -8,46 +8,54 @@ module Rack
8
8
  end
9
9
 
10
10
  def call(env)
11
- if env["REQUEST_METHOD"] == "POST"
12
- request = Request.new(env)
13
- if @settings[:secret_id] && request.params["signed_request"]
14
- env["REQUEST_METHOD"] = "GET" if signed_request_valid?(@settings[:secret_id], request)
15
- else
16
- env["REQUEST_METHOD"] = "GET" if request.params["signed_request"]
11
+ unless env_excluded?(env)
12
+ if env["REQUEST_METHOD"] == "POST"
13
+ request = Request.new(env)
14
+ if @settings[:secret_id] && request.params["signed_request"]
15
+ env["REQUEST_METHOD"] = "GET" if signed_request_valid?(@settings[:secret_id], request)
16
+ else
17
+ env["REQUEST_METHOD"] = "GET" if request.params["signed_request"]
18
+ end
17
19
  end
18
20
  end
19
21
  @app.call(env)
20
22
  end
21
-
23
+
22
24
  # Code adapted from https://github.com/nsanta/fbgraph
23
25
  def signed_request_valid?(secret_id, request)
24
26
  encoded_signature, payload = request.params["signed_request"].split(".", 2)
25
27
  signature = ""
26
28
  valid = true
27
-
29
+
28
30
  url_decode_64(encoded_signature).each_byte do |byte|
29
31
  signature << "%02x" % byte
30
32
  end
31
-
33
+
32
34
  data = JSON.parse(url_decode_64(payload))
33
35
  if data["algorithm"].to_s.upcase != "HMAC-SHA256"
34
36
  valid = false
35
37
  end
36
-
38
+
37
39
  expected_signature = OpenSSL::HMAC.hexdigest("sha256", secret_id, payload)
38
40
  if expected_signature != signature
39
41
  valid = false
40
42
  end
41
-
43
+
42
44
  valid
43
45
  end
44
-
46
+
45
47
  def url_decode_64(string)
46
48
  encoded_string = string.gsub("-", "+").gsub("_", "/")
47
49
  encoded_string += "=" while !(encoded_string.size % 4).zero?
48
50
  Base64.decode64(encoded_string)
49
51
  end
50
-
52
+
53
+ protected
54
+
55
+ def env_excluded?(env)
56
+ @settings[:exclude] && @settings[:exclude].call(env)
57
+ end
58
+
51
59
  end
52
60
  end
53
61
  end
@@ -4,20 +4,21 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{rack-facebook-method-fix}
8
- s.version = "0.3.0"
7
+ s.name = "rack-facebook-method-fix"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Mika Tuupola"]
12
- s.date = %q{2011-04-13}
13
- s.description = %q{In early 2011 Facebook started to send all application requests as POST. This Rack middleware converts POST requests back to GET when applicable.}
14
- s.email = %q{tuupola@appelsiini.net}
12
+ s.date = "2011-09-13"
13
+ s.description = "In early 2011 Facebook started to send all application requests as POST. This Rack middleware converts POST requests back to GET when applicable."
14
+ s.email = "tuupola@appelsiini.net"
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
17
  "README.rdoc"
18
18
  ]
19
19
  s.files = [
20
20
  ".document",
21
+ ".rspec",
21
22
  "Gemfile",
22
23
  "Gemfile.lock",
23
24
  "LICENSE",
@@ -27,21 +28,20 @@ Gem::Specification.new do |s|
27
28
  "lib/rack-facebook-method-fix.rb",
28
29
  "lib/rack/facebook/method-fix.rb",
29
30
  "rack-facebook-method-fix.gemspec",
30
- "test/helper.rb",
31
- "test/test_rack-facebook-method-fix.rb"
31
+ "spec/rack/facebook/method_fix_spec.rb",
32
+ "spec/spec_helper.rb"
32
33
  ]
33
- s.homepage = %q{http://github.com/tuupola/rack-facebook-method-fix}
34
+ s.homepage = "http://github.com/tuupola/rack-facebook-method-fix"
34
35
  s.licenses = ["MIT"]
35
36
  s.require_paths = ["lib"]
36
- s.rubygems_version = %q{1.3.7}
37
- s.summary = %q{Fix RESTfull Facebook applications}
37
+ s.rubygems_version = "1.8.10"
38
+ s.summary = "Fix RESTfull Facebook applications"
38
39
  s.test_files = [
39
- "test/helper.rb",
40
- "test/test_rack-facebook-method-fix.rb"
40
+ "spec/rack/facebook/method_fix_spec.rb",
41
+ "spec/spec_helper.rb"
41
42
  ]
42
43
 
43
44
  if s.respond_to? :specification_version then
44
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
45
45
  s.specification_version = 3
46
46
 
47
47
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
@@ -49,17 +49,26 @@ Gem::Specification.new do |s|
49
49
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
50
50
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
51
51
  s.add_development_dependency(%q<rcov>, [">= 0"])
52
+ s.add_development_dependency(%q<json>, [">= 0"])
53
+ s.add_development_dependency(%q<rspec>, [">= 0"])
54
+ s.add_development_dependency(%q<rack-test>, [">= 0"])
52
55
  else
53
56
  s.add_dependency(%q<shoulda>, [">= 0"])
54
57
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
55
58
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
56
59
  s.add_dependency(%q<rcov>, [">= 0"])
60
+ s.add_dependency(%q<json>, [">= 0"])
61
+ s.add_dependency(%q<rspec>, [">= 0"])
62
+ s.add_dependency(%q<rack-test>, [">= 0"])
57
63
  end
58
64
  else
59
65
  s.add_dependency(%q<shoulda>, [">= 0"])
60
66
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
61
67
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
62
68
  s.add_dependency(%q<rcov>, [">= 0"])
69
+ s.add_dependency(%q<json>, [">= 0"])
70
+ s.add_dependency(%q<rspec>, [">= 0"])
71
+ s.add_dependency(%q<rack-test>, [">= 0"])
63
72
  end
64
73
  end
65
74
 
@@ -0,0 +1,71 @@
1
+ require File.expand_path('spec_helper', File.join(File.dirname(__FILE__), '../../'))
2
+
3
+ class MockRackWrapper
4
+ def initialize(response)
5
+ @response = response
6
+ end
7
+
8
+ def call(env)
9
+ @env = env
10
+ @response
11
+ end
12
+
13
+ def env
14
+ @env
15
+ end
16
+ end
17
+
18
+ describe Rack::Facebook::MethodFix do
19
+ context "with no exclusions" do
20
+ before do
21
+ header = [200, {"Content-type" => "test/plain", "Content-length" => "5"}, ["foo"]]
22
+ @rack_mock = MockRackWrapper.new(header)
23
+ facebook = Rack::Facebook::MethodFix.new(@rack_mock)
24
+ @request = Rack::MockRequest.new(facebook)
25
+ end
26
+
27
+ context "POST requests not from facebook" do
28
+ it 'should stay as a POST' do
29
+ @request.post("/", {})
30
+
31
+ @rack_mock.env["REQUEST_METHOD"].should == "POST"
32
+ end
33
+ end
34
+
35
+ context 'POST requests from facebook' do
36
+ it 'should be changed to GET requests' do
37
+ @request.post("/", {:params => {"signed_request" => 'nothing'}})
38
+
39
+ @rack_mock.env["REQUEST_METHOD"].should == "GET"
40
+ end
41
+ end
42
+ end
43
+
44
+ context 'when the middleware is passed an exclusion proc' do
45
+ before do
46
+ simple_response = [200, {"Content-type" => "test/plain", "Content-length" => "5"}, ["foo"]]
47
+ @mock_rack_app = MockRackWrapper.new(simple_response)
48
+ exclusion_proc = proc { |env| env['PATH_INFO'].match(/^\/admin/) }
49
+ facebook_method_fix_app = Rack::Facebook::MethodFix.new(@mock_rack_app, :exclude => exclusion_proc)
50
+ @request = Rack::MockRequest.new(facebook_method_fix_app)
51
+ end
52
+
53
+ it "does not change requests that are not from facebook" do
54
+ @request.post('/', {})
55
+ @mock_rack_app.env["REQUEST_METHOD"].should == "POST"
56
+ end
57
+
58
+ context "requests from facebook " do
59
+ let(:params) { {:params => {"signed_request" => 'nothing'}} }
60
+ it "changes POSTs to GETs the exclusion proc returns false" do
61
+ @request.post('/foo', params)
62
+ @mock_rack_app.env["REQUEST_METHOD"].should == "GET"
63
+ end
64
+
65
+ it "does not change POSTs when the exclusion proc returns true" do
66
+ @request.post('/admin/foo', params)
67
+ @mock_rack_app.env["REQUEST_METHOD"].should == "POST"
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,5 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'rack/test'
4
+ require 'rack/mock'
5
+ require File.expand_path('../../lib/rack-facebook-method-fix', __FILE__)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-facebook-method-fix
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease: false
4
+ hash: 15
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
- - 3
8
+ - 4
9
9
  - 0
10
- version: 0.3.0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Mika Tuupola
@@ -15,11 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-13 00:00:00 +03:00
19
- default_executable:
18
+ date: 2011-09-13 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
- requirement: &id001 !ruby/object:Gem::Requirement
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
22
  none: false
24
23
  requirements:
25
24
  - - ">="
@@ -28,12 +27,12 @@ dependencies:
28
27
  segments:
29
28
  - 0
30
29
  version: "0"
31
- type: :development
32
30
  name: shoulda
33
31
  prerelease: false
34
- version_requirements: *id001
32
+ type: :development
33
+ requirement: *id001
35
34
  - !ruby/object:Gem::Dependency
36
- requirement: &id002 !ruby/object:Gem::Requirement
35
+ version_requirements: &id002 !ruby/object:Gem::Requirement
37
36
  none: false
38
37
  requirements:
39
38
  - - ~>
@@ -44,12 +43,12 @@ dependencies:
44
43
  - 0
45
44
  - 0
46
45
  version: 1.0.0
47
- type: :development
48
46
  name: bundler
49
47
  prerelease: false
50
- version_requirements: *id002
48
+ type: :development
49
+ requirement: *id002
51
50
  - !ruby/object:Gem::Dependency
52
- requirement: &id003 !ruby/object:Gem::Requirement
51
+ version_requirements: &id003 !ruby/object:Gem::Requirement
53
52
  none: false
54
53
  requirements:
55
54
  - - ~>
@@ -60,12 +59,12 @@ dependencies:
60
59
  - 5
61
60
  - 2
62
61
  version: 1.5.2
63
- type: :development
64
62
  name: jeweler
65
63
  prerelease: false
66
- version_requirements: *id003
64
+ type: :development
65
+ requirement: *id003
67
66
  - !ruby/object:Gem::Dependency
68
- requirement: &id004 !ruby/object:Gem::Requirement
67
+ version_requirements: &id004 !ruby/object:Gem::Requirement
69
68
  none: false
70
69
  requirements:
71
70
  - - ">="
@@ -74,10 +73,52 @@ dependencies:
74
73
  segments:
75
74
  - 0
76
75
  version: "0"
77
- type: :development
78
76
  name: rcov
79
77
  prerelease: false
80
- version_requirements: *id004
78
+ type: :development
79
+ requirement: *id004
80
+ - !ruby/object:Gem::Dependency
81
+ version_requirements: &id005 !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
89
+ version: "0"
90
+ name: json
91
+ prerelease: false
92
+ type: :development
93
+ requirement: *id005
94
+ - !ruby/object:Gem::Dependency
95
+ version_requirements: &id006 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ hash: 3
101
+ segments:
102
+ - 0
103
+ version: "0"
104
+ name: rspec
105
+ prerelease: false
106
+ type: :development
107
+ requirement: *id006
108
+ - !ruby/object:Gem::Dependency
109
+ version_requirements: &id007 !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ hash: 3
115
+ segments:
116
+ - 0
117
+ version: "0"
118
+ name: rack-test
119
+ prerelease: false
120
+ type: :development
121
+ requirement: *id007
81
122
  description: In early 2011 Facebook started to send all application requests as POST. This Rack middleware converts POST requests back to GET when applicable.
82
123
  email: tuupola@appelsiini.net
83
124
  executables: []
@@ -89,6 +130,7 @@ extra_rdoc_files:
89
130
  - README.rdoc
90
131
  files:
91
132
  - .document
133
+ - .rspec
92
134
  - Gemfile
93
135
  - Gemfile.lock
94
136
  - LICENSE
@@ -98,9 +140,8 @@ files:
98
140
  - lib/rack-facebook-method-fix.rb
99
141
  - lib/rack/facebook/method-fix.rb
100
142
  - rack-facebook-method-fix.gemspec
101
- - test/helper.rb
102
- - test/test_rack-facebook-method-fix.rb
103
- has_rdoc: true
143
+ - spec/rack/facebook/method_fix_spec.rb
144
+ - spec/spec_helper.rb
104
145
  homepage: http://github.com/tuupola/rack-facebook-method-fix
105
146
  licenses:
106
147
  - MIT
@@ -130,10 +171,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
171
  requirements: []
131
172
 
132
173
  rubyforge_project:
133
- rubygems_version: 1.3.7
174
+ rubygems_version: 1.8.10
134
175
  signing_key:
135
176
  specification_version: 3
136
177
  summary: Fix RESTfull Facebook applications
137
178
  test_files:
138
- - test/helper.rb
139
- - test/test_rack-facebook-method-fix.rb
179
+ - spec/rack/facebook/method_fix_spec.rb
180
+ - spec/spec_helper.rb
@@ -1,18 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
- require 'test/unit'
11
- require 'shoulda'
12
-
13
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
- $LOAD_PATH.unshift(File.dirname(__FILE__))
15
- require 'rack-facebook-method-fix'
16
-
17
- class Test::Unit::TestCase
18
- end
@@ -1,7 +0,0 @@
1
- require 'helper'
2
-
3
- class TestRackFacebookMethodFix < Test::Unit::TestCase
4
- should "probably rename this file and start testing for real" do
5
- flunk "hey buddy, you should probably rename this file and start testing for real"
6
- end
7
- end