fb_graph 1.9.5 → 2.0.0.alpha
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|