fb_graph 1.9.5 → 2.0.0.alpha
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/Gemfile.lock +5 -4
- data/VERSION +1 -1
- data/lib/fb_graph/auth/cookie.rb +4 -28
- data/lib/fb_graph/auth/signed_request.rb +7 -7
- data/lib/fb_graph/auth.rb +14 -8
- data/lib/fb_graph.rb +1 -0
- data/lib/patch/rack/oauth2/util.rb +14 -0
- data/spec/fb_graph/auth/cookie_spec.rb +10 -11
- data/spec/fb_graph/auth_spec.rb +98 -77
- metadata +52 -5
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fb_graph (1.9.
|
4
|
+
fb_graph (1.9.5)
|
5
5
|
httpclient (>= 2.2.0.2)
|
6
6
|
rack-oauth2 (>= 0.8.0)
|
7
7
|
|
@@ -37,10 +37,11 @@ GEM
|
|
37
37
|
jruby-openssl (0.7.4)
|
38
38
|
bouncy-castle-java
|
39
39
|
json (1.5.3)
|
40
|
+
json (1.5.3-java)
|
40
41
|
rack (1.2.3)
|
41
42
|
rack-mount (0.6.14)
|
42
43
|
rack (>= 1.0.0)
|
43
|
-
rack-oauth2 (0.8.
|
44
|
+
rack-oauth2 (0.8.7)
|
44
45
|
activesupport (>= 2.3)
|
45
46
|
attr_required (>= 0.0.3)
|
46
47
|
httpclient (>= 2.2.0.2)
|
@@ -50,8 +51,8 @@ GEM
|
|
50
51
|
rack-test (0.5.7)
|
51
52
|
rack (>= 1.0)
|
52
53
|
rake (0.9.2)
|
53
|
-
rcov (0.9.
|
54
|
-
rcov (0.9.
|
54
|
+
rcov (0.9.10)
|
55
|
+
rcov (0.9.10-java)
|
55
56
|
rspec (2.6.0)
|
56
57
|
rspec-core (~> 2.6.0)
|
57
58
|
rspec-expectations (~> 2.6.0)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.0.0.alpha
|
data/lib/fb_graph/auth/cookie.rb
CHANGED
@@ -6,38 +6,14 @@ module FbGraph
|
|
6
6
|
# If you want access token, use FbGraph::Auth.new(APP_ID, APP_SECRET, :cookie => {..}) instead
|
7
7
|
class Cookie
|
8
8
|
def self.parse(client, cookie)
|
9
|
-
|
9
|
+
signed_request = case cookie
|
10
10
|
when String
|
11
11
|
cookie
|
12
12
|
else
|
13
|
-
cookie["
|
13
|
+
cookie["fbsr_#{client.identifier}"]
|
14
14
|
end
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
fb_cookie_string.gsub!(/[\\"]/, '')
|
19
|
-
signature, fb_cookie = '', {}
|
20
|
-
fb_cookie_string.split('&').each do |kv|
|
21
|
-
k, v = kv.split('=')
|
22
|
-
if k == 'sig'
|
23
|
-
signature = v
|
24
|
-
else
|
25
|
-
v = v.to_i if k == 'expires'
|
26
|
-
fb_cookie[k] = v
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
signature_base_string = fb_cookie.to_a.sort do |a, b|
|
31
|
-
a[0] <=> b[0] || a[1] <=> b[1]
|
32
|
-
end.map do |(k, v)|
|
33
|
-
"#{k}=#{v}"
|
34
|
-
end.join
|
35
|
-
|
36
|
-
unless Digest::MD5.hexdigest("#{signature_base_string}#{client.secret}") == signature
|
37
|
-
raise VerificationFailed.new(401, 'Facebook cookie signature invalid')
|
38
|
-
end
|
39
|
-
|
40
|
-
fb_cookie.with_indifferent_access
|
15
|
+
raise VerificationFailed.new('Facebook cookie not found') if signed_request.blank?
|
16
|
+
SignedRequest.verify(client, signed_request)
|
41
17
|
end
|
42
18
|
end
|
43
19
|
end
|
@@ -8,27 +8,27 @@ module FbGraph
|
|
8
8
|
|
9
9
|
def self.verify(client, signed_request)
|
10
10
|
signature, payload = signed_request.split('.')
|
11
|
-
raise VerificationFailed.new(
|
12
|
-
raise VerificationFailed.new(
|
11
|
+
raise VerificationFailed.new('No Signature') if signature.blank?
|
12
|
+
raise VerificationFailed.new('No Payload') if payload.blank?
|
13
13
|
signature = base64_url_decode signature
|
14
14
|
data = decode_json base64_url_decode(payload)
|
15
|
-
raise VerificationFailed.new(
|
15
|
+
raise VerificationFailed.new('Unexpected Signature Algorithm') unless data[:algorithm] == 'HMAC-SHA256'
|
16
16
|
_signature_ = sign(client.secret, payload)
|
17
|
-
raise VerificationFailed.new(
|
17
|
+
raise VerificationFailed.new('Signature Invalid') unless signature == _signature_
|
18
18
|
data
|
19
19
|
end
|
20
20
|
|
21
21
|
private
|
22
22
|
|
23
|
-
def self.sign(key,
|
23
|
+
def self.sign(key, payload)
|
24
24
|
klass = OpenSSL::Digest::SHA256.new
|
25
|
-
OpenSSL::HMAC.digest(klass, key,
|
25
|
+
OpenSSL::HMAC.digest(klass, key, payload)
|
26
26
|
end
|
27
27
|
|
28
28
|
def self.decode_json(json)
|
29
29
|
JSON.parse(json).with_indifferent_access
|
30
30
|
rescue => e
|
31
|
-
raise VerificationFailed.new(
|
31
|
+
raise VerificationFailed.new('Invalid JSON')
|
32
32
|
end
|
33
33
|
|
34
34
|
def self.base64_url_decode(str)
|
data/lib/fb_graph/auth.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module FbGraph
|
2
2
|
class Auth
|
3
|
-
class VerificationFailed <
|
3
|
+
class VerificationFailed < BadRequest; end
|
4
4
|
|
5
5
|
attr_accessor :client, :access_token, :user, :data
|
6
6
|
|
@@ -35,25 +35,31 @@ module FbGraph
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def from_cookie(cookie)
|
38
|
-
data = Cookie.parse(
|
39
|
-
|
40
|
-
self.user = User.new(data[:uid], :access_token => self.access_token)
|
41
|
-
self.data = data
|
38
|
+
self.data = Cookie.parse(client, cookie)
|
39
|
+
get_access_token! data[:code]
|
42
40
|
self
|
43
41
|
end
|
44
42
|
|
45
43
|
def from_signed_request(signed_request)
|
46
|
-
data = SignedRequest.verify(
|
47
|
-
if data[:oauth_token]
|
44
|
+
self.data = SignedRequest.verify(client, signed_request)
|
45
|
+
if self.data[:oauth_token]
|
48
46
|
self.access_token = build_access_token(data)
|
49
47
|
self.user = User.new(data[:user_id], :access_token => self.access_token)
|
50
48
|
end
|
51
|
-
self.data = data
|
52
49
|
self
|
53
50
|
end
|
54
51
|
|
55
52
|
private
|
56
53
|
|
54
|
+
def get_access_token!(code)
|
55
|
+
raise Unauthorized.new('No Authorization Code') unless code
|
56
|
+
client.redirect_uri = ''
|
57
|
+
client.authorization_code = code
|
58
|
+
self.access_token = client.access_token!
|
59
|
+
self.user = User.new(data[:user_id], :access_token => access_token)
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
57
63
|
def build_access_token(data)
|
58
64
|
expires_in = unless data[:expires].zero?
|
59
65
|
data[:expires] - Time.now.to_i
|
data/lib/fb_graph.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
# NOTE: Authorization code given via FB JS SDK needs blank string as redirect_uri
|
2
|
+
module Rack::OAuth2::Util
|
3
|
+
class << self
|
4
|
+
def compact_hash_with_blank_redirect_uri(hash)
|
5
|
+
original_redirect_uri = hash[:redirect_uri]
|
6
|
+
result = compact_hash_without_blank_redirect_uri hash
|
7
|
+
if original_redirect_uri
|
8
|
+
result[:redirect_uri] ||= original_redirect_uri
|
9
|
+
end
|
10
|
+
result
|
11
|
+
end
|
12
|
+
alias_method_chain :compact_hash, :blank_redirect_uri
|
13
|
+
end
|
14
|
+
end
|
@@ -1,30 +1,29 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe FbGraph::Auth::Cookie, '.parse' do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
'
|
4
|
+
let(:client) { Rack::OAuth2::Client.new(:identifier => 'client_id', :secret => 'client_secret') }
|
5
|
+
let :cookie do
|
6
|
+
{
|
7
|
+
'fbsr_client_id' => "9heZHFs6tDH/Nif4CqmBaMQ8nKEOc5g2WgVJa10LF00.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImNvZGUiOiI4ZDYwZDY4NDA4MmQ1NjczMjY3MWUxNzAuMS01Nzk2MTIyNzZ8N2pkVlp6MlNLNUY2b0gtQ21FQWtZZVpuVjEwIiwiaXNzdWVkX2F0IjoxMzEyOTUzOTcxLCJ1c2VyX2lkIjo1Nzk2MTIyNzZ9"
|
8
8
|
}
|
9
9
|
end
|
10
10
|
|
11
11
|
shared_examples_for :parsable_cookie do
|
12
12
|
it 'should be parsable' do
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
cookie[:uid].should == '12345'
|
13
|
+
data[:algorithm].should == 'HMAC-SHA256'
|
14
|
+
data[:code].should == '8d60d684082d56732671e170.1-579612276|7jdVZz2SK5F6oH-CmEAkYeZnV10'
|
15
|
+
data[:issued_at].should == 1312953971
|
16
|
+
data[:user_id].should == 579612276
|
18
17
|
end
|
19
18
|
end
|
20
19
|
|
21
20
|
context 'when whole cookie is given' do
|
22
|
-
let(:
|
21
|
+
let(:data) { FbGraph::Auth::Cookie.parse(client, cookie) }
|
23
22
|
it_behaves_like :parsable_cookie
|
24
23
|
end
|
25
24
|
|
26
25
|
context 'when actual cookie string is given' do
|
27
|
-
let(:
|
26
|
+
let(:data) { FbGraph::Auth::Cookie.parse(client, cookie['fbsr_client_id']) }
|
28
27
|
it_behaves_like :parsable_cookie
|
29
28
|
end
|
30
29
|
end
|
data/spec/fb_graph/auth_spec.rb
CHANGED
@@ -1,107 +1,52 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe FbGraph::Auth
|
4
|
-
|
5
|
-
|
6
|
-
auth.client.should be_a(Rack::OAuth2::Client)
|
7
|
-
auth.client.identifier.should == 'client_id'
|
8
|
-
auth.client.secret.should == 'client_secret'
|
3
|
+
describe FbGraph::Auth do
|
4
|
+
let :optional_attributes do
|
5
|
+
{}
|
9
6
|
end
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
7
|
+
let(:auth) { FbGraph::Auth.new('client_id', 'client_secret', optional_attributes) }
|
8
|
+
subject { auth }
|
9
|
+
|
10
|
+
its(:client) { should be_a(Rack::OAuth2::Client) }
|
11
|
+
describe 'client' do
|
12
|
+
subject { auth.client }
|
13
|
+
its(:identifier) { should == 'client_id' }
|
14
|
+
its(:secret) { should == 'client_secret' }
|
17
15
|
end
|
18
16
|
|
19
17
|
context 'when invalid cookie given' do
|
18
|
+
let :optional_attributes do
|
19
|
+
{:cookie => 'invalid'}
|
20
|
+
end
|
20
21
|
it 'should raise FbGraph::VerificationFailed' do
|
21
|
-
|
22
|
-
|
22
|
+
expect do
|
23
|
+
auth
|
23
24
|
end.should raise_exception(FbGraph::Auth::VerificationFailed)
|
24
25
|
end
|
25
26
|
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe FbGraph::Auth, '#from_cookie' do
|
29
|
-
before do
|
30
|
-
@auth = FbGraph::Auth.new('client_id', 'client_secret')
|
31
|
-
@expires_at = Time.parse('2020-12-31 12:00:00')
|
32
|
-
@cookie = {
|
33
|
-
'fbs_client_id' => "access_token=t&expires=#{@expires_at.to_i}&secret=s&session_key=k&sig=b06a0540959470e731cc3bc2ef31a007&uid=12345"
|
34
|
-
}
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'should fetch user and access_token from fbs_APP_ID cookie' do
|
38
|
-
@auth.access_token.should be_nil
|
39
|
-
@auth.user.should be_nil
|
40
|
-
@auth.from_cookie(@cookie)
|
41
|
-
@auth.access_token.access_token.should == 't'
|
42
|
-
@auth.access_token.expires_in.should be_within(1).of(@expires_at - Time.now)
|
43
|
-
@auth.user.identifier.should == '12345'
|
44
|
-
@auth.user.access_token.access_token.should == 't'
|
45
|
-
end
|
46
27
|
|
47
28
|
context 'when invalid cookie given' do
|
48
|
-
|
49
|
-
|
50
|
-
@auth.from_cookie('invalid')
|
51
|
-
end.should raise_exception(FbGraph::Auth::VerificationFailed)
|
29
|
+
let :optional_attributes do
|
30
|
+
{:signed_request => 'invalid'}
|
52
31
|
end
|
53
|
-
end
|
54
|
-
end
|
55
32
|
|
56
|
-
describe FbGraph::Auth, '#from_signed_request' do
|
57
|
-
before do
|
58
|
-
@signed_request = "LqsgnfcsRdfjOgyW6ZuSLpGBVsxUBegEqai4EcrWS0A=.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOjAsImlzc3VlZF9hdCI6MTI5ODc4MzczOSwib2F1dGhfdG9rZW4iOiIxMzQxNDU2NDMyOTQzMjJ8MmI4YTZmOTc1NTJjNmRjZWQyMDU4MTBiLTU3OTYxMjI3NnxGS1o0akdKZ0JwN2k3bFlrOVhhUk1QZ3lhNnMiLCJ1c2VyIjp7ImNvdW50cnkiOiJqcCIsImxvY2FsZSI6ImVuX1VTIiwiYWdlIjp7Im1pbiI6MjF9fSwidXNlcl9pZCI6IjU3OTYxMjI3NiJ9"
|
59
|
-
@auth = FbGraph::Auth.new('client_id', 'client_secret')
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'should fetch user and access_token from signed_request' do
|
63
|
-
@auth.access_token.should be_nil
|
64
|
-
@auth.user.should be_nil
|
65
|
-
@auth.from_signed_request(@signed_request)
|
66
|
-
@auth.access_token.access_token.should == '134145643294322|2b8a6f97552c6dced205810b-579612276|FKZ4jGJgBp7i7lYk9XaRMPgya6s'
|
67
|
-
@auth.user.identifier.should == '579612276'
|
68
|
-
@auth.user.access_token.access_token.should == '134145643294322|2b8a6f97552c6dced205810b-579612276|FKZ4jGJgBp7i7lYk9XaRMPgya6s'
|
69
|
-
@auth.data.should include(
|
70
|
-
"expires"=>0,
|
71
|
-
"algorithm"=>"HMAC-SHA256",
|
72
|
-
"issued_at"=>1298783739
|
73
|
-
)
|
74
|
-
@auth.data['user'].should include(
|
75
|
-
"country"=>"jp",
|
76
|
-
"locale"=>"en_US",
|
77
|
-
"age"=>{"min"=>21}
|
78
|
-
)
|
79
|
-
end
|
80
|
-
|
81
|
-
context 'when invalid signed_request given' do
|
82
33
|
it 'should raise FbGraph::VerificationFailed' do
|
83
|
-
|
84
|
-
|
34
|
+
expect do
|
35
|
+
auth
|
85
36
|
end.should raise_exception(FbGraph::Auth::VerificationFailed)
|
86
37
|
end
|
87
38
|
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe FbGraph::Auth do
|
91
|
-
let(:auth) { FbGraph::Auth.new('client_id', 'client_secret') }
|
92
39
|
|
93
40
|
describe '#authorized?' do
|
94
|
-
subject { auth.authorized? }
|
95
|
-
|
96
41
|
context 'when access_token is given' do
|
97
42
|
before do
|
98
43
|
auth.access_token = 'access_token'
|
99
44
|
end
|
100
|
-
|
45
|
+
its(:authorized?) { should be_true }
|
101
46
|
end
|
102
47
|
|
103
48
|
context 'otherwise' do
|
104
|
-
|
49
|
+
its(:authorized?) { should be_false }
|
105
50
|
end
|
106
51
|
end
|
107
52
|
|
@@ -115,5 +60,81 @@ describe FbGraph::Auth do
|
|
115
60
|
it { should == "https://www.facebook.com/dialog/oauth?client_id=client_id&redirect_uri=#{CGI.escape canvas_uri}&scope=#{CGI.escape "scope1,scope2"}&state=state1" }
|
116
61
|
end
|
117
62
|
end
|
63
|
+
|
64
|
+
describe '#from_cookie' do
|
65
|
+
let :cookie do
|
66
|
+
{
|
67
|
+
'fbsr_client_id' => "9heZHFs6tDH/Nif4CqmBaMQ8nKEOc5g2WgVJa10LF00.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImNvZGUiOiI4ZDYwZDY4NDA4MmQ1NjczMjY3MWUxNzAuMS01Nzk2MTIyNzZ8N2pkVlp6MlNLNUY2b0gtQ21FQWtZZVpuVjEwIiwiaXNzdWVkX2F0IjoxMzEyOTUzOTcxLCJ1c2VyX2lkIjo1Nzk2MTIyNzZ9"
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should exchange code with access token' do
|
72
|
+
expect {
|
73
|
+
auth.from_cookie(cookie)
|
74
|
+
}.should request_to '/oauth/access_token', :post
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should setup user and access_token' do
|
78
|
+
mock_graph :post, '/oauth/access_token', 'token_response' do
|
79
|
+
auth.access_token.should be_nil
|
80
|
+
auth.user.should be_nil
|
81
|
+
auth.from_cookie(cookie)
|
82
|
+
auth.access_token.should be_a Rack::OAuth2::AccessToken::Legacy
|
83
|
+
auth.access_token.access_token.should == 'token'
|
84
|
+
auth.user.should be_a FbGraph::User
|
85
|
+
auth.user.identifier.should == 579612276
|
86
|
+
auth.user.access_token.access_token.should == 'token'
|
87
|
+
auth.data.should == {
|
88
|
+
"algorithm" => "HMAC-SHA256",
|
89
|
+
"code" => "8d60d684082d56732671e170.1-579612276|7jdVZz2SK5F6oH-CmEAkYeZnV10",
|
90
|
+
"issued_at" => 1312953971,
|
91
|
+
"user_id" => 579612276
|
92
|
+
}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'when invalid cookie given' do
|
97
|
+
it 'should raise FbGraph::VerificationFailed' do
|
98
|
+
lambda do
|
99
|
+
auth.from_cookie('invalid')
|
100
|
+
end.should raise_exception(FbGraph::Auth::VerificationFailed)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe '#from_signed_request' do
|
106
|
+
let :signed_request do
|
107
|
+
"LqsgnfcsRdfjOgyW6ZuSLpGBVsxUBegEqai4EcrWS0A=.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOjAsImlzc3VlZF9hdCI6MTI5ODc4MzczOSwib2F1dGhfdG9rZW4iOiIxMzQxNDU2NDMyOTQzMjJ8MmI4YTZmOTc1NTJjNmRjZWQyMDU4MTBiLTU3OTYxMjI3NnxGS1o0akdKZ0JwN2k3bFlrOVhhUk1QZ3lhNnMiLCJ1c2VyIjp7ImNvdW50cnkiOiJqcCIsImxvY2FsZSI6ImVuX1VTIiwiYWdlIjp7Im1pbiI6MjF9fSwidXNlcl9pZCI6IjU3OTYxMjI3NiJ9"
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should setup user and access_token' do
|
111
|
+
auth.access_token.should be_nil
|
112
|
+
auth.user.should be_nil
|
113
|
+
auth.from_signed_request(signed_request)
|
114
|
+
auth.access_token.should be_a Rack::OAuth2::AccessToken::Legacy
|
115
|
+
auth.access_token.access_token.should == '134145643294322|2b8a6f97552c6dced205810b-579612276|FKZ4jGJgBp7i7lYk9XaRMPgya6s'
|
116
|
+
auth.user.should be_a FbGraph::User
|
117
|
+
auth.user.identifier.should == '579612276'
|
118
|
+
auth.user.access_token.access_token.should == '134145643294322|2b8a6f97552c6dced205810b-579612276|FKZ4jGJgBp7i7lYk9XaRMPgya6s'
|
119
|
+
auth.data.should include(
|
120
|
+
"expires"=>0,
|
121
|
+
"algorithm"=>"HMAC-SHA256",
|
122
|
+
"issued_at"=>1298783739
|
123
|
+
)
|
124
|
+
auth.data['user'].should include(
|
125
|
+
"country"=>"jp",
|
126
|
+
"locale"=>"en_US",
|
127
|
+
"age"=>{"min"=>21}
|
128
|
+
)
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'when invalid signed_request given' do
|
132
|
+
it 'should raise FbGraph::VerificationFailed' do
|
133
|
+
lambda do
|
134
|
+
auth.from_signed_request('invalid.signed_request')
|
135
|
+
end.should raise_exception(FbGraph::Auth::VerificationFailed)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
118
139
|
end
|
119
140
|
|
metadata
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fb_graph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
hash: -1851332194
|
5
|
+
prerelease: 6
|
6
|
+
segments:
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
- alpha
|
11
|
+
version: 2.0.0.alpha
|
6
12
|
platform: ruby
|
7
13
|
authors:
|
8
14
|
- nov matake
|
@@ -10,7 +16,7 @@ autorequire:
|
|
10
16
|
bindir: bin
|
11
17
|
cert_chain: []
|
12
18
|
|
13
|
-
date: 2011-08-
|
19
|
+
date: 2011-08-10 00:00:00 Z
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
22
|
name: httpclient
|
@@ -20,6 +26,12 @@ dependencies:
|
|
20
26
|
requirements:
|
21
27
|
- - ">="
|
22
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 123
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 2
|
33
|
+
- 0
|
34
|
+
- 2
|
23
35
|
version: 2.2.0.2
|
24
36
|
type: :runtime
|
25
37
|
version_requirements: *id001
|
@@ -31,6 +43,11 @@ dependencies:
|
|
31
43
|
requirements:
|
32
44
|
- - ">="
|
33
45
|
- !ruby/object:Gem::Version
|
46
|
+
hash: 63
|
47
|
+
segments:
|
48
|
+
- 0
|
49
|
+
- 8
|
50
|
+
- 0
|
34
51
|
version: 0.8.0
|
35
52
|
type: :runtime
|
36
53
|
version_requirements: *id002
|
@@ -42,6 +59,10 @@ dependencies:
|
|
42
59
|
requirements:
|
43
60
|
- - ">="
|
44
61
|
- !ruby/object:Gem::Version
|
62
|
+
hash: 27
|
63
|
+
segments:
|
64
|
+
- 0
|
65
|
+
- 8
|
45
66
|
version: "0.8"
|
46
67
|
type: :development
|
47
68
|
version_requirements: *id003
|
@@ -53,6 +74,10 @@ dependencies:
|
|
53
74
|
requirements:
|
54
75
|
- - ">="
|
55
76
|
- !ruby/object:Gem::Version
|
77
|
+
hash: 25
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
- 9
|
56
81
|
version: "0.9"
|
57
82
|
type: :development
|
58
83
|
version_requirements: *id004
|
@@ -64,6 +89,9 @@ dependencies:
|
|
64
89
|
requirements:
|
65
90
|
- - ">="
|
66
91
|
- !ruby/object:Gem::Version
|
92
|
+
hash: 7
|
93
|
+
segments:
|
94
|
+
- 2
|
67
95
|
version: "2"
|
68
96
|
type: :development
|
69
97
|
version_requirements: *id005
|
@@ -75,6 +103,11 @@ dependencies:
|
|
75
103
|
requirements:
|
76
104
|
- - ">="
|
77
105
|
- !ruby/object:Gem::Version
|
106
|
+
hash: 11
|
107
|
+
segments:
|
108
|
+
- 1
|
109
|
+
- 6
|
110
|
+
- 2
|
78
111
|
version: 1.6.2
|
79
112
|
type: :development
|
80
113
|
version_requirements: *id006
|
@@ -86,6 +119,11 @@ dependencies:
|
|
86
119
|
requirements:
|
87
120
|
- - ">="
|
88
121
|
- !ruby/object:Gem::Version
|
122
|
+
hash: 11
|
123
|
+
segments:
|
124
|
+
- 3
|
125
|
+
- 0
|
126
|
+
- 6
|
89
127
|
version: 3.0.6
|
90
128
|
type: :development
|
91
129
|
version_requirements: *id007
|
@@ -215,6 +253,7 @@ files:
|
|
215
253
|
- lib/fb_graph/venue.rb
|
216
254
|
- lib/fb_graph/video.rb
|
217
255
|
- lib/fb_graph/work.rb
|
256
|
+
- lib/patch/rack/oauth2/util.rb
|
218
257
|
- spec/fb_graph/album_spec.rb
|
219
258
|
- spec/fb_graph/app_request_spec.rb
|
220
259
|
- spec/fb_graph/application_spec.rb
|
@@ -462,13 +501,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
462
501
|
requirements:
|
463
502
|
- - ">="
|
464
503
|
- !ruby/object:Gem::Version
|
504
|
+
hash: 3
|
505
|
+
segments:
|
506
|
+
- 0
|
465
507
|
version: "0"
|
466
508
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
467
509
|
none: false
|
468
510
|
requirements:
|
469
|
-
- - "
|
511
|
+
- - ">"
|
470
512
|
- !ruby/object:Gem::Version
|
471
|
-
|
513
|
+
hash: 25
|
514
|
+
segments:
|
515
|
+
- 1
|
516
|
+
- 3
|
517
|
+
- 1
|
518
|
+
version: 1.3.1
|
472
519
|
requirements: []
|
473
520
|
|
474
521
|
rubyforge_project:
|