rest-core 0.2.3 → 0.3.0.pre.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/.travis.yml +8 -4
- data/CHANGES.md +20 -0
- data/Gemfile +4 -3
- data/README.md +8 -8
- data/Rakefile +42 -2
- data/example/rails2/Gemfile +13 -0
- data/example/rails2/README +4 -0
- data/example/rails2/Rakefile +11 -0
- data/example/rails2/app/controllers/application_controller.rb +119 -0
- data/example/rails2/app/views/application/helper.html.erb +1 -0
- data/example/rails2/config/boot.rb +130 -0
- data/example/rails2/config/environment.rb +15 -0
- data/example/rails2/config/environments/development.rb +17 -0
- data/example/rails2/config/environments/production.rb +28 -0
- data/example/rails2/config/environments/test.rb +30 -0
- data/example/rails2/config/initializers/cookie_verification_secret.rb +7 -0
- data/example/rails2/config/initializers/new_rails_defaults.rb +21 -0
- data/example/rails2/config/initializers/session_store.rb +15 -0
- data/example/rails2/config/preinitializer.rb +23 -0
- data/example/rails2/config/rest-core.yaml +12 -0
- data/example/rails2/config/routes.rb +43 -0
- data/example/rails2/log +0 -0
- data/example/rails2/test/functional/application_controller_test.rb +183 -0
- data/example/rails2/test/test_helper.rb +18 -0
- data/example/rails2/test/unit/rails_util_test.rb +44 -0
- data/example/rails3/Gemfile +13 -0
- data/example/rails3/README +4 -0
- data/example/rails3/Rakefile +7 -0
- data/example/rails3/app/controllers/application_controller.rb +119 -0
- data/example/rails3/app/views/application/helper.html.erb +1 -0
- data/example/rails3/config/application.rb +23 -0
- data/example/rails3/config/environment.rb +5 -0
- data/example/rails3/config/environments/development.rb +26 -0
- data/example/rails3/config/environments/production.rb +49 -0
- data/example/rails3/config/environments/test.rb +30 -0
- data/example/rails3/config/initializers/secret_token.rb +7 -0
- data/example/rails3/config/initializers/session_store.rb +8 -0
- data/example/rails3/config/rest-core.yaml +12 -0
- data/example/rails3/config/routes.rb +5 -0
- data/example/rails3/config.ru +4 -0
- data/example/rails3/test/functional/application_controller_test.rb +183 -0
- data/example/rails3/test/test_helper.rb +18 -0
- data/example/rails3/test/unit/rails_util_test.rb +44 -0
- data/example/sinatra/config.ru +16 -0
- data/lib/rest-core/app/ask.rb +0 -2
- data/lib/rest-core/client/facebook/rails_util.rb +342 -0
- data/lib/rest-core/client/{rest-graph.rb → facebook.rb} +21 -28
- data/lib/rest-core/client/github.rb +1 -1
- data/lib/rest-core/client/linkedin.rb +3 -1
- data/lib/rest-core/client/twitter.rb +2 -2
- data/lib/rest-core/client.rb +2 -2
- data/lib/rest-core/client_oauth1.rb +3 -3
- data/lib/rest-core/middleware/oauth2_query.rb +3 -3
- data/{test/common.rb → lib/rest-core/test.rb} +7 -3
- data/lib/rest-core/util/config.rb +22 -17
- data/lib/rest-core/util/vendor.rb +31 -0
- data/lib/rest-core/version.rb +1 -1
- data/lib/rest-core.rb +5 -0
- data/rest-core.gemspec +135 -108
- data/test/client/facebook/config/rest-core.yaml +8 -0
- data/test/{test_api.rb → client/facebook/test_api.rb} +22 -23
- data/test/{test_cache.rb → client/facebook/test_cache.rb} +4 -8
- data/test/{test_default.rb → client/facebook/test_default.rb} +6 -10
- data/test/client/facebook/test_error.rb +65 -0
- data/test/{test_handler.rb → client/facebook/test_handler.rb} +12 -15
- data/test/{test_load_config.rb → client/facebook/test_load_config.rb} +6 -9
- data/test/{test_misc.rb → client/facebook/test_misc.rb} +15 -18
- data/test/{test_oauth.rb → client/facebook/test_oauth.rb} +4 -8
- data/test/{test_old.rb → client/facebook/test_old.rb} +16 -18
- data/test/{test_page.rb → client/facebook/test_page.rb} +5 -9
- data/test/{test_parse.rb → client/facebook/test_parse.rb} +13 -16
- data/test/client/facebook/test_serialize.rb +42 -0
- data/test/client/facebook/test_timeout.rb +22 -0
- data/test/test_oauth1_header.rb +1 -5
- metadata +99 -58
- data/test/config/rest-core.yaml +0 -7
- data/test/test_error.rb +0 -66
- data/test/test_serialize.rb +0 -44
- data/test/test_timeout.rb +0 -25
@@ -0,0 +1,183 @@
|
|
1
|
+
|
2
|
+
require 'test_helper'
|
3
|
+
require 'webmock'
|
4
|
+
|
5
|
+
WebMock.disable_net_connect!
|
6
|
+
|
7
|
+
class ApplicationControllerTest < ActionController::TestCase
|
8
|
+
include WebMock::API
|
9
|
+
|
10
|
+
def setup
|
11
|
+
body = rand(2) == 0 ? '{"error":{"type":"OAuthException"}}' :
|
12
|
+
'{"error_code":104}'
|
13
|
+
|
14
|
+
stub_request(:get, 'https://graph.facebook.com/me').
|
15
|
+
to_return(:body => body)
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
WebMock.reset!
|
20
|
+
end
|
21
|
+
|
22
|
+
def assert_url expected
|
23
|
+
assert_equal(expected, normalize_url(assigns(:rc_facebook_authorize_url)))
|
24
|
+
if @response.status == 200 # js redirect
|
25
|
+
assert_equal(
|
26
|
+
expected,
|
27
|
+
normalize_url(
|
28
|
+
@response.body.match(/window\.top\.location\.href = '(.+?)'/)[1]))
|
29
|
+
|
30
|
+
assert_equal(
|
31
|
+
CGI.escapeHTML(expected),
|
32
|
+
normalize_url(
|
33
|
+
@response.body.match(/content="0;url=(.+?)"/)[1], '&'))
|
34
|
+
|
35
|
+
assert_equal(
|
36
|
+
CGI.escapeHTML(expected),
|
37
|
+
normalize_url(
|
38
|
+
@response.body.match(/<a href="(.+?)" target="_top">/)[1], '&'))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_index
|
43
|
+
get(:index)
|
44
|
+
assert_response :redirect
|
45
|
+
|
46
|
+
url = normalize_url(
|
47
|
+
'https://graph.facebook.com/oauth/authorize?client_id=123&' \
|
48
|
+
'scope=&redirect_uri=http%3A%2F%2Ftest.host%2F')
|
49
|
+
|
50
|
+
assert_url(url)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_canvas
|
54
|
+
get(:canvas)
|
55
|
+
assert_response :success
|
56
|
+
|
57
|
+
url = normalize_url(
|
58
|
+
'https://graph.facebook.com/oauth/authorize?client_id=123&' \
|
59
|
+
'scope=publish_stream&' \
|
60
|
+
'redirect_uri=http%3A%2F%2Fapps.facebook.com%2Fcan%2Fcanvas')
|
61
|
+
|
62
|
+
assert_url(url)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_diff_canvas
|
66
|
+
get(:diff_canvas)
|
67
|
+
assert_response :success
|
68
|
+
|
69
|
+
url = normalize_url(
|
70
|
+
'https://graph.facebook.com/oauth/authorize?client_id=123&' \
|
71
|
+
'scope=email&' \
|
72
|
+
'redirect_uri=http%3A%2F%2Fapps.facebook.com%2FToT%2Fdiff_canvas')
|
73
|
+
|
74
|
+
assert_url(url)
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_iframe_canvas
|
78
|
+
get(:iframe_canvas)
|
79
|
+
assert_response :success
|
80
|
+
|
81
|
+
url = normalize_url(
|
82
|
+
'https://graph.facebook.com/oauth/authorize?client_id=123&' \
|
83
|
+
'scope=&' \
|
84
|
+
'redirect_uri=http%3A%2F%2Fapps.facebook.com%2Fzzz%2Fiframe_canvas')
|
85
|
+
|
86
|
+
assert_url(url)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_options
|
90
|
+
get(:options)
|
91
|
+
assert_response :redirect
|
92
|
+
|
93
|
+
url = normalize_url(
|
94
|
+
'https://graph.facebook.com/oauth/authorize?client_id=123&' \
|
95
|
+
'scope=bogus&' \
|
96
|
+
'redirect_uri=http%3A%2F%2Ftest.host%2Foptions')
|
97
|
+
|
98
|
+
assert_url(url)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_protected
|
102
|
+
assert_nil @controller.public_methods.find{ |m| m.to_s =~ /^rest_graph/ }
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_no_auto
|
106
|
+
get(:no_auto)
|
107
|
+
assert_response :success
|
108
|
+
assert_equal 'XD', @response.body
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_app_id
|
112
|
+
get(:diff_app_id)
|
113
|
+
assert_response :success
|
114
|
+
assert_equal 'zzz', @response.body
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_cache
|
118
|
+
WebMock.reset!
|
119
|
+
stub_request(:get, 'https://graph.facebook.com/cache').
|
120
|
+
to_return(:body => '{"message":"ok"}')
|
121
|
+
|
122
|
+
get(:cache)
|
123
|
+
assert_response :success
|
124
|
+
assert_equal '{"message":"ok"}', @response.body
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_handler
|
128
|
+
WebMock.reset!
|
129
|
+
stub_request(:get, 'https://graph.facebook.com/me?access_token=aloha').
|
130
|
+
to_return(:body => '["snowman"]')
|
131
|
+
|
132
|
+
Rails.cache[:fbs] = RestCore::Facebook.new(:access_token => 'aloha').fbs
|
133
|
+
get(:handler_)
|
134
|
+
assert_response :success
|
135
|
+
assert_equal '["snowman"]', @response.body
|
136
|
+
ensure
|
137
|
+
Rails.cache.clear
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_session
|
141
|
+
WebMock.reset!
|
142
|
+
stub_request(:get, 'https://graph.facebook.com/me?access_token=wozilla').
|
143
|
+
to_return(:body => '["fireball"]')
|
144
|
+
|
145
|
+
@request.session[RestCore::Facebook::RailsUtil.rc_facebook_storage_key] =
|
146
|
+
RestCore::Facebook.new(:access_token => 'wozilla').fbs
|
147
|
+
|
148
|
+
get(:session_)
|
149
|
+
assert_response :success
|
150
|
+
assert_equal '["fireball"]', @response.body
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_cookies
|
154
|
+
WebMock.reset!
|
155
|
+
stub_request(:get, 'https://graph.facebook.com/me?access_token=blizzard').
|
156
|
+
to_return(:body => '["yeti"]')
|
157
|
+
|
158
|
+
@request.cookies[RestCore::Facebook::RailsUtil.rc_facebook_storage_key] =
|
159
|
+
RestCore::Facebook.new(:access_token => 'blizzard').fbs
|
160
|
+
|
161
|
+
get(:cookies_)
|
162
|
+
assert_response :success
|
163
|
+
assert_equal '["yeti"]', @response.body
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_error
|
167
|
+
get(:error)
|
168
|
+
rescue => e
|
169
|
+
assert_equal RestCore::Facebook::Error, e.class
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_reinitailize
|
173
|
+
get(:reinitialize)
|
174
|
+
assert_response :success
|
175
|
+
assert_equal [nil, {'a' => 'b'}], YAML.load(@response.body)
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_helper
|
179
|
+
get(:helper)
|
180
|
+
assert_response :success
|
181
|
+
assert_equal RestCore::Facebook.default_app_id, @response.body.strip
|
182
|
+
end
|
183
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
ENV["RAILS_ENV"] = "test"
|
3
|
+
require File.expand_path('../../config/environment', __FILE__)
|
4
|
+
begin
|
5
|
+
require 'rails/test_help'
|
6
|
+
rescue LoadError # for rails2
|
7
|
+
require 'test_help'
|
8
|
+
end
|
9
|
+
|
10
|
+
class ActiveSupport::TestCase
|
11
|
+
def normalize_query query, amp='&'
|
12
|
+
'?' + query[1..-1].split(amp).sort.join(amp)
|
13
|
+
end
|
14
|
+
|
15
|
+
def normalize_url url, amp='&'
|
16
|
+
url.sub(/\?.+/){ |query| normalize_query(query, amp) }
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
require 'test_helper'
|
3
|
+
require 'rr'
|
4
|
+
|
5
|
+
class RailsUtilTest < ActiveSupport::TestCase
|
6
|
+
include RR::Adapters::TestUnit
|
7
|
+
|
8
|
+
def setup_mock url
|
9
|
+
mock(RestCore::Facebook::RailsUtil).rc_facebook_in_canvas?{ false }
|
10
|
+
mock(RestCore::Facebook::RailsUtil).request{
|
11
|
+
mock(Object.new).url{ url }
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_rest_graph_normalized_request_uri_0
|
16
|
+
setup_mock( 'http://test.com/?code=123&lang=en')
|
17
|
+
assert_equal('http://test.com/?lang=en',
|
18
|
+
RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_rest_graph_normalized_request_uri_1
|
22
|
+
setup_mock( 'http://test.com/?lang=en&code=123')
|
23
|
+
assert_equal('http://test.com/?lang=en',
|
24
|
+
RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_rest_graph_normalized_request_uri_2
|
28
|
+
setup_mock( 'http://test.com/?session=abc&lang=en&code=123')
|
29
|
+
assert_equal('http://test.com/?lang=en',
|
30
|
+
RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_rest_graph_normalized_request_uri_3
|
34
|
+
setup_mock( 'http://test.com/?code=123')
|
35
|
+
assert_equal('http://test.com/',
|
36
|
+
RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_rest_graph_normalized_request_uri_4
|
40
|
+
setup_mock( 'http://test.com/?signed_request=abc&code=123')
|
41
|
+
assert_equal('http://test.com/',
|
42
|
+
RestCore::Facebook::RailsUtil.rc_facebook_normalized_request_uri)
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
require 'sinatra'
|
3
|
+
require 'rest-core'
|
4
|
+
|
5
|
+
app_id = '123'
|
6
|
+
secret = 'abc'
|
7
|
+
config = {:app_id => app_id,
|
8
|
+
:secret => secret}
|
9
|
+
|
10
|
+
post '/' do
|
11
|
+
fb = RestCore::Facebook.new(config)
|
12
|
+
fb.parse_signed_request!(params['signed_request'])
|
13
|
+
"#{fb.get('me').inspect.gsub('<', '<')}\n"
|
14
|
+
end
|
15
|
+
|
16
|
+
run Sinatra::Application
|
data/lib/rest-core/app/ask.rb
CHANGED
@@ -0,0 +1,342 @@
|
|
1
|
+
|
2
|
+
require 'cgi'
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
class RestCore::Facebook
|
6
|
+
module DefaultAttributes
|
7
|
+
def default_canvas ; '' ; end
|
8
|
+
def default_iframe ; false; end
|
9
|
+
def default_auto_authorize ; false; end
|
10
|
+
def default_auto_authorize_options; {} ; end
|
11
|
+
def default_auto_authorize_scope ; '' ; end
|
12
|
+
def default_ensure_authorized ; false; end
|
13
|
+
def default_write_session ; false; end
|
14
|
+
def default_write_cookies ; false; end
|
15
|
+
def default_write_handler ; nil; end
|
16
|
+
def default_check_handler ; nil; end
|
17
|
+
end
|
18
|
+
|
19
|
+
module RailsCache
|
20
|
+
def [] key ; read(key) ; end
|
21
|
+
def []= key, value; write(key, value) ; end
|
22
|
+
def store key, value,
|
23
|
+
options={}; write(key, value, options); end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module RestCore::Facebook::RailsUtil
|
28
|
+
def self.init app=Rails
|
29
|
+
ActiveSupport::Cache::Store.send(:include, RestCore::Facebook::RailsCache)
|
30
|
+
RestCore::Config.load_for_rails(RestCore::Facebook, 'facebook', app)
|
31
|
+
end
|
32
|
+
|
33
|
+
module Helper
|
34
|
+
def rc_facebook
|
35
|
+
controller.send(:rc_facebook)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.included controller
|
40
|
+
# skip if included already, any better way to detect this?
|
41
|
+
return if controller.respond_to?(:rc_facebook, true)
|
42
|
+
|
43
|
+
controller.rescue_from(RestCore::Facebook::Error::AccessToken,
|
44
|
+
:with => :rc_facebook_on_access_token_error)
|
45
|
+
controller.helper(RestCore::Facebook::RailsUtil::Helper)
|
46
|
+
controller.instance_methods.select{ |method|
|
47
|
+
method.to_s =~ /^rc_facebook/
|
48
|
+
}.each{ |method| controller.send(:protected, method) }
|
49
|
+
end
|
50
|
+
|
51
|
+
def rc_facebook_setup options={}
|
52
|
+
rc_facebook_options_ctl.merge!(
|
53
|
+
rc_facebook_extract_options(options, :reject))
|
54
|
+
rc_facebook_options_new.merge!(
|
55
|
+
rc_facebook_extract_options(options, :select))
|
56
|
+
|
57
|
+
# we'll need to reinitialize rc_facebook with the new options,
|
58
|
+
# otherwise if you're calling rc_facebook before rc_facebook_setup,
|
59
|
+
# you'll end up with default options without the ones you've passed
|
60
|
+
# into rc_facebook_setup.
|
61
|
+
rc_facebook.send(:initialize, rc_facebook_options_new)
|
62
|
+
|
63
|
+
rc_facebook_check_params_signed_request # canvas
|
64
|
+
rc_facebook_check_params_session # i think it would be deprecated
|
65
|
+
rc_facebook_check_cookie # for js sdk (canvas or not)
|
66
|
+
rc_facebook_check_code # oauth api
|
67
|
+
|
68
|
+
# there are above 4 ways to check the user identity!
|
69
|
+
# if nor of them passed, then we can suppose the user
|
70
|
+
# didn't authorize for us, but we can check if user has authorized
|
71
|
+
# before, in that case, the fbs would be inside session,
|
72
|
+
# as we just saved it there
|
73
|
+
|
74
|
+
rc_facebook_check_rg_fbs # check rc_facebook storage
|
75
|
+
|
76
|
+
if rc_facebook_oget(:ensure_authorized) && !rc_facebook.authorized?
|
77
|
+
rc_facebook_authorize('ensure authorized')
|
78
|
+
false # action halt, redirect to do authorize,
|
79
|
+
# eagerly, as opposed to auto_authorize
|
80
|
+
else
|
81
|
+
true # keep going
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# override this if you need different app_id and secret
|
86
|
+
def rc_facebook
|
87
|
+
@rc_facebook ||= RestCore::Facebook.new(rc_facebook_options_new)
|
88
|
+
end
|
89
|
+
|
90
|
+
def rc_facebook_on_access_token_error error=nil
|
91
|
+
rc_facebook_authorize(error, false)
|
92
|
+
end
|
93
|
+
|
94
|
+
def rc_facebook_authorize error=nil, force_redirect=true
|
95
|
+
logger.warn("WARN: Facebook: #{error.inspect}")
|
96
|
+
|
97
|
+
if force_redirect || rc_facebook_auto_authorize?
|
98
|
+
@rc_facebook_authorize_url = rc_facebook.authorize_url(
|
99
|
+
{:redirect_uri => rc_facebook_normalized_request_uri,
|
100
|
+
:scope => rc_facebook_oget(:auto_authorize_scope)}.
|
101
|
+
merge(rc_facebook_oget(:auto_authorize_options)))
|
102
|
+
|
103
|
+
logger.debug(
|
104
|
+
"DEBUG: Facebook: redirect to #{@rc_facebook_authorize_url}")
|
105
|
+
|
106
|
+
cookies.delete("fbs_#{rc_facebook.app_id}")
|
107
|
+
rc_facebook_authorize_redirect
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# override this if you want the simple redirect_to
|
112
|
+
def rc_facebook_authorize_redirect
|
113
|
+
unless rc_facebook_in_canvas?
|
114
|
+
redirect_to @rc_facebook_authorize_url
|
115
|
+
else
|
116
|
+
rc_facebook_js_redirect(@rc_facebook_authorize_url,
|
117
|
+
rc_facebook_authorize_body)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def rc_facebook_js_redirect redirect_url, body=''
|
122
|
+
render :inline => <<-HTML
|
123
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
124
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
125
|
+
<html>
|
126
|
+
<head>
|
127
|
+
<script type="text/javascript">
|
128
|
+
window.top.location.href = '#{redirect_url}'
|
129
|
+
</script>
|
130
|
+
<noscript>
|
131
|
+
<meta http-equiv="refresh" content="0;url=#{
|
132
|
+
CGI.escapeHTML(redirect_url)}"/>
|
133
|
+
<meta http-equiv="window-target" content="_top"/>
|
134
|
+
</noscript>
|
135
|
+
</head>
|
136
|
+
<body>
|
137
|
+
#{body}
|
138
|
+
</bodt>
|
139
|
+
</html>
|
140
|
+
HTML
|
141
|
+
end
|
142
|
+
|
143
|
+
def rc_facebook_authorize_body redirect_url=@rc_facebook_authorize_url
|
144
|
+
<<-HTML
|
145
|
+
<div>
|
146
|
+
Please
|
147
|
+
<a href="#{CGI.escapeHTML(redirect_url)}" target="_top">authorize</a>
|
148
|
+
if this page is not automatically redirected.
|
149
|
+
</div>
|
150
|
+
HTML
|
151
|
+
end
|
152
|
+
|
153
|
+
module_function
|
154
|
+
|
155
|
+
# ==================== begin options utility =======================
|
156
|
+
def rc_facebook_oget key
|
157
|
+
if rc_facebook_options_ctl.has_key?(key)
|
158
|
+
rc_facebook_options_ctl[key]
|
159
|
+
else
|
160
|
+
RestCore::Facebook.send("default_#{key}")
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def rc_facebook_options_ctl
|
165
|
+
@rc_facebook_options_ctl ||= {}
|
166
|
+
end
|
167
|
+
|
168
|
+
def rc_facebook_options_new
|
169
|
+
@rc_facebook_options_new ||= {:log_method => logger.method(:debug)}
|
170
|
+
end
|
171
|
+
# ==================== end options utility =======================
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
# ==================== begin facebook check ======================
|
176
|
+
def rc_facebook_check_params_signed_request
|
177
|
+
return if rc_facebook.authorized? || !params[:signed_request]
|
178
|
+
|
179
|
+
rc_facebook.parse_signed_request!(params[:signed_request])
|
180
|
+
logger.debug("DEBUG: Facebook: detected signed_request," \
|
181
|
+
" parsed: #{rc_facebook.data.inspect}")
|
182
|
+
|
183
|
+
if rc_facebook.authorized?
|
184
|
+
rc_facebook_write_rg_fbs
|
185
|
+
else
|
186
|
+
logger.warn(
|
187
|
+
"WARN: Facebook: bad signed_request: #{params[:signed_request]}")
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
# if the code is bad or not existed,
|
192
|
+
# check if there's one in session,
|
193
|
+
# meanwhile, there the sig and access_token is correct,
|
194
|
+
# that means we're in the context of canvas
|
195
|
+
def rc_facebook_check_params_session
|
196
|
+
return if rc_facebook.authorized? || !params[:session]
|
197
|
+
|
198
|
+
rc_facebook.parse_json!(params[:session])
|
199
|
+
logger.debug("DEBUG: Facebook: detected session, parsed:" \
|
200
|
+
" #{rc_facebook.data.inspect}")
|
201
|
+
|
202
|
+
if rc_facebook.authorized?
|
203
|
+
rc_facebook_write_rg_fbs
|
204
|
+
else
|
205
|
+
logger.warn("WARN: Facebook: bad session: #{params[:session]}")
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
# if we're not in canvas nor code passed,
|
210
|
+
# we could check out cookies as well.
|
211
|
+
def rc_facebook_check_cookie
|
212
|
+
return if rc_facebook.authorized? ||
|
213
|
+
!cookies["fbs_#{rc_facebook.app_id}"]
|
214
|
+
|
215
|
+
rc_facebook.parse_cookies!(cookies)
|
216
|
+
logger.debug("DEBUG: Facebook: detected cookies, parsed:" \
|
217
|
+
" #{rc_facebook.data.inspect}")
|
218
|
+
end
|
219
|
+
|
220
|
+
# exchange the code with access_token
|
221
|
+
def rc_facebook_check_code
|
222
|
+
return if rc_facebook.authorized? || !params[:code]
|
223
|
+
|
224
|
+
rc_facebook.authorize!(:code => params[:code],
|
225
|
+
:redirect_uri => rc_facebook_normalized_request_uri)
|
226
|
+
logger.debug(
|
227
|
+
"DEBUG: Facebook: detected code with " \
|
228
|
+
"#{rc_facebook_normalized_request_uri}," \
|
229
|
+
" parsed: #{rc_facebook.data.inspect}")
|
230
|
+
|
231
|
+
rc_facebook_write_rg_fbs if rc_facebook.authorized?
|
232
|
+
end
|
233
|
+
# ==================== end facebook check ======================
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
# ==================== begin check ================================
|
238
|
+
def rc_facebook_storage_key
|
239
|
+
"rc_facebook_fbs_#{rc_facebook_oget(:app_id)}"
|
240
|
+
end
|
241
|
+
|
242
|
+
def rc_facebook_check_rg_fbs
|
243
|
+
rc_facebook_check_rg_handler # custom method to store fbs
|
244
|
+
rc_facebook_check_rg_session # prefered way to store fbs
|
245
|
+
rc_facebook_check_rg_cookies # in canvas, session might not work..
|
246
|
+
end
|
247
|
+
|
248
|
+
def rc_facebook_check_rg_handler handler=rc_facebook_oget(:check_handler)
|
249
|
+
return if rc_facebook.authorized? || !handler
|
250
|
+
rc_facebook.parse_fbs!(handler.call)
|
251
|
+
logger.debug("DEBUG: Facebook: called check_handler, parsed:" \
|
252
|
+
" #{rc_facebook.data.inspect}")
|
253
|
+
end
|
254
|
+
|
255
|
+
def rc_facebook_check_rg_session
|
256
|
+
return if rc_facebook.authorized? || !rc_facebook_oget(:write_session) ||
|
257
|
+
!(fbs = session[rc_facebook_storage_key])
|
258
|
+
rc_facebook.parse_fbs!(fbs)
|
259
|
+
logger.debug("DEBUG: Facebook: detected rc_facebook session, parsed:" \
|
260
|
+
" #{rc_facebook.data.inspect}")
|
261
|
+
end
|
262
|
+
|
263
|
+
def rc_facebook_check_rg_cookies
|
264
|
+
return if rc_facebook.authorized? || !rc_facebook_oget(:write_cookies) ||
|
265
|
+
!(fbs = cookies[rc_facebook_storage_key])
|
266
|
+
rc_facebook.parse_fbs!(fbs)
|
267
|
+
logger.debug("DEBUG: Facebook: detected rc_facebook cookies, parsed:" \
|
268
|
+
" #{rc_facebook.data.inspect}")
|
269
|
+
end
|
270
|
+
# ==================== end check ================================
|
271
|
+
# ==================== begin write ================================
|
272
|
+
def rc_facebook_write_rg_fbs
|
273
|
+
cookies.delete("fbs_#{rc_facebook.app_id}")
|
274
|
+
rc_facebook_write_rg_handler
|
275
|
+
rc_facebook_write_rg_session
|
276
|
+
rc_facebook_write_rg_cookies
|
277
|
+
end
|
278
|
+
|
279
|
+
def rc_facebook_write_rg_handler handler=rc_facebook_oget(:write_handler)
|
280
|
+
return if !handler
|
281
|
+
handler.call(fbs = rc_facebook.fbs)
|
282
|
+
logger.debug("DEBUG: Facebook: called write_handler: fbs => #{fbs}")
|
283
|
+
end
|
284
|
+
|
285
|
+
def rc_facebook_write_rg_session
|
286
|
+
return if !rc_facebook_oget(:write_session)
|
287
|
+
session[rc_facebook_storage_key] = fbs = rc_facebook.fbs
|
288
|
+
logger.debug("DEBUG: Facebook: wrote session: fbs => #{fbs}")
|
289
|
+
end
|
290
|
+
|
291
|
+
def rc_facebook_write_rg_cookies
|
292
|
+
return if !rc_facebook_oget(:write_cookies)
|
293
|
+
cookies[rc_facebook_storage_key] = fbs = rc_facebook.fbs
|
294
|
+
logger.debug("DEBUG: Facebook: wrote cookies: fbs => #{fbs}")
|
295
|
+
end
|
296
|
+
# ==================== end write ================================
|
297
|
+
|
298
|
+
|
299
|
+
|
300
|
+
# ==================== begin misc ================================
|
301
|
+
def rc_facebook_normalized_request_uri
|
302
|
+
uri = if rc_facebook_in_canvas?
|
303
|
+
# rails 3 uses newer rack which has fullpath
|
304
|
+
"http://apps.facebook.com/#{rc_facebook_oget(:canvas)}" +
|
305
|
+
(request.respond_to?(:fullpath) ?
|
306
|
+
request.fullpath : request.request_uri)
|
307
|
+
else
|
308
|
+
request.url
|
309
|
+
end
|
310
|
+
|
311
|
+
rc_facebook_filter_uri(uri)
|
312
|
+
end
|
313
|
+
|
314
|
+
def rc_facebook_filter_uri uri
|
315
|
+
URI.parse(URI.encode(uri)).tap{ |uri|
|
316
|
+
uri.query = uri.query.split('&').reject{ |q|
|
317
|
+
q =~ /^(code|session|signed_request)\=/
|
318
|
+
}.join('&') if uri.query
|
319
|
+
uri.query = nil if uri.query.blank?
|
320
|
+
}.to_s
|
321
|
+
end
|
322
|
+
|
323
|
+
def rc_facebook_in_canvas?
|
324
|
+
!rc_facebook_oget(:canvas).blank?
|
325
|
+
end
|
326
|
+
|
327
|
+
def rc_facebook_auto_authorize?
|
328
|
+
!rc_facebook_oget(:auto_authorize_scope) .blank? ||
|
329
|
+
!rc_facebook_oget(:auto_authorize_options).blank? ||
|
330
|
+
rc_facebook_oget(:auto_authorize)
|
331
|
+
end
|
332
|
+
|
333
|
+
def rc_facebook_extract_options options, method
|
334
|
+
# Hash[] is for ruby 1.8.7
|
335
|
+
# map(&:to_sym) is for ruby 1.8.7
|
336
|
+
Hash[options.send(method){ |(k, v)|
|
337
|
+
RestCore::Facebook.members.map(&:to_sym).member?(k) }]
|
338
|
+
end
|
339
|
+
# ==================== end misc ================================
|
340
|
+
end
|
341
|
+
|
342
|
+
RestCore::Facebook::RailsUtil.init(Rails)
|