thefacebook 0.1.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/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'activesupport', ">= 3.0.0"
4
+
5
+ # Specify your gem's dependencies in thefacebook.gemspec
6
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,7 @@
1
+ require "thefacebook/version"
2
+ require "thefacebook/base64_extensions"
3
+ require "thefacebook/parser"
4
+
5
+ module Thefacebook
6
+ # Your code goes here...
7
+ end
@@ -0,0 +1,10 @@
1
+ require 'base64'
2
+ module Base64
3
+ module_function
4
+
5
+ def decode64url(str)
6
+ str = str.ljust((str.size/6+1)*6,"=") if (str.size % 6) > 0
7
+ Base64.decode64(str.tr("-_", "+/"))
8
+ end
9
+
10
+ end
@@ -0,0 +1,26 @@
1
+ require 'openssl'
2
+ require 'active_support/json'
3
+ require File.dirname(__FILE__) + '/base64_extensions'
4
+
5
+ module Thefacebook
6
+
7
+ class SignedRequest
8
+ def initialize(signed_request, secret)
9
+ @signed_request = signed_request
10
+ @signature, @signed_params = signed_request.split('.') if signed_request
11
+ @secret = secret
12
+ self
13
+ end
14
+
15
+ def valid?
16
+ return false unless [@signature, @signed_params].all? { |str| str.respond_to?(:tr) }
17
+ expected_signature = OpenSSL::HMAC.digest('SHA256', @secret, @signed_params.tr("-_", "+/"))
18
+ return expected_signature == Base64.decode64url(@signature)
19
+ end
20
+
21
+ def params
22
+ ActiveSupport::JSON.decode Base64.decode64url(@signed_params)
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ module Thefacebook
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,29 @@
1
+ $:.push File.expand_path("../lib")
2
+ require 'minitest/autorun'
3
+ require 'thefacebook/base64_extensions'
4
+
5
+ def base64url_compare(str)
6
+ encoded_str = str.gsub('-','+').gsub('_','/')
7
+ encoded_str += '=' while !(encoded_str.size % 4).zero?
8
+ Base64.decode64(encoded_str)
9
+ end
10
+
11
+
12
+ describe Base64 do
13
+
14
+ it "should give the correct encoding with different lengths" do
15
+ url = "http://123"
16
+ Base64.decode64url(url).must_equal base64url_compare(url)
17
+ url = "http://1234"
18
+ Base64.decode64url(url).must_equal base64url_compare(url)
19
+ url = "http://12345"
20
+ Base64.decode64url(url).must_equal base64url_compare(url)
21
+ url = "http://123456"
22
+ Base64.decode64url(url).must_equal base64url_compare(url)
23
+ url = "http://123457"
24
+ Base64.decode64url(url).must_equal base64url_compare(url)
25
+ url = "http://1234578"
26
+ Base64.decode64url(url).must_equal base64url_compare(url)
27
+ end
28
+
29
+ end
@@ -0,0 +1,31 @@
1
+ $:.push File.expand_path("../lib")
2
+ require 'minitest/autorun'
3
+ require 'thefacebook/signed_request'
4
+
5
+
6
+ describe Thefacebook::SignedRequest do
7
+
8
+ it "should validate a correct signed request" do
9
+ sr = "vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0"
10
+ result = Thefacebook::SignedRequest.new(sr,"secret")
11
+ result.valid?.must_equal true
12
+ end
13
+
14
+ it "should not validate an incorrect signed request" do
15
+ sr = "vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0"
16
+ result = Thefacebook::SignedRequest.new(sr,"secret_false")
17
+ result.valid?.must_equal false
18
+ end
19
+
20
+ it "should not validate an empty signed request" do
21
+ result = Thefacebook::SignedRequest.new(nil,"secret_false")
22
+ result.valid?.must_equal false
23
+ end
24
+
25
+ it "should decode the encoded params" do
26
+ sr = "vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0"
27
+ result = Thefacebook::SignedRequest.new(sr,"secret")
28
+ result.params["0"].must_equal "payload"
29
+ end
30
+
31
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "thefacebook/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "thefacebook"
7
+ s.version = Thefacebook::VERSION
8
+ s.authors = ["Sascha Brink"]
9
+ s.email = ["sascha.brink@gmail.com"]
10
+ s.homepage = "http://github.com/sbrink/thefacebook"
11
+ s.summary = %q{Facebook tools for rails to generate signed request}
12
+ s.description = %q{Facebook tools for rails to generate signed request. Helpers soon to be included.}
13
+
14
+ s.rubyforge_project = "thefacebook"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ s.add_runtime_dependency "activesupport", ">= 3.0.0"
24
+ end
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: thefacebook
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sascha Brink
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-12-19 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: &70220929106180 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 3.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70220929106180
25
+ description: Facebook tools for rails to generate signed request. Helpers soon to
26
+ be included.
27
+ email:
28
+ - sascha.brink@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - .gitignore
34
+ - Gemfile
35
+ - Rakefile
36
+ - lib/thefacebook.rb
37
+ - lib/thefacebook/base64_extensions.rb
38
+ - lib/thefacebook/signed_request.rb
39
+ - lib/thefacebook/version.rb
40
+ - spec/base64_extensions_test.rb
41
+ - spec/signed_request_test.rb
42
+ - thefacebook.gemspec
43
+ homepage: http://github.com/sbrink/thefacebook
44
+ licenses: []
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ requirements: []
62
+ rubyforge_project: thefacebook
63
+ rubygems_version: 1.8.10
64
+ signing_key:
65
+ specification_version: 3
66
+ summary: Facebook tools for rails to generate signed request
67
+ test_files:
68
+ - spec/base64_extensions_test.rb
69
+ - spec/signed_request_test.rb