taweili-facebooker 1.0.38 → 1.0.40
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/README.rdoc +3 -0
- data/facebooker.gemspec +15 -11
- data/lib/facebooker/rails/controller.rb +15 -0
- data/lib/facebooker/rails/extensions/rack_setup.rb +2 -2
- data/lib/facebooker/service.rb +59 -62
- data/lib/facebooker/session.rb +9 -4
- data/lib/facebooker/version.rb +1 -1
- data/lib/facebooker.rb +10 -5
- data/lib/rack/facebook.rb +22 -15
- data/lib/tasks/tunnel.rake +1 -1
- data/test/facebooker/rails/facebook_request_fix_2-3_test.rb +2 -1
- data/test/facebooker/rails_integration_test.rb +23 -2
- data/test/facebooker/service_test.rb +58 -0
- data/test/facebooker/session_test.rb +4 -24
- metadata +11 -9
data/README.rdoc
CHANGED
data/facebooker.gemspec
CHANGED
@@ -2,37 +2,41 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{facebooker}
|
5
|
-
s.version = "1.0.
|
5
|
+
s.version = "1.0.40"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Chad Fowler", "Patrick Ewing", "Mike Mangino", "Shane Vitarana", "Corey Innis"]
|
9
|
-
s.date = %q{2009-
|
10
|
-
s.description = %q{Facebooker is a Ruby wrapper over the Facebook[http://facebook.com] {REST API}[http://wiki.developers.facebook.com/index.php/API]. Its goals are:
|
9
|
+
s.date = %q{2009-07-10}
|
10
|
+
s.description = %q{Facebooker is a Ruby wrapper over the Facebook[http://facebook.com] {REST API}[http://wiki.developers.facebook.com/index.php/API]. Its goals are:
|
11
|
+
|
12
|
+
* Idiomatic Ruby
|
13
|
+
* No dependencies outside of the Ruby standard library (This is true with Rails 2.1. Previous Rails versions require the JSON gem)
|
14
|
+
* Concrete classes and methods modeling the Facebook data, so it's easy for a Rubyist to understand what's available
|
15
|
+
* Well tested}
|
11
16
|
s.email = %q{mmangino@elevatedrails.com}
|
12
17
|
s.extra_rdoc_files = ["Manifest.txt", "CHANGELOG.rdoc", "COPYING.rdoc", "README.rdoc", "TODO.rdoc"]
|
13
|
-
s.files = [".autotest", "CHANGELOG.rdoc", "COPYING.rdoc", "Manifest.txt", "README.rdoc", "Rakefile", "TODO.rdoc", "examples/desktop_login.rb", "facebooker.gemspec", "generators/facebook/facebook_generator.rb", "generators/facebook/templates/config/facebooker.yml", "generators/facebook/templates/public/javascripts/facebooker.js", "generators/facebook_controller/USAGE", "generators/facebook_controller/facebook_controller_generator.rb", "generators/facebook_controller/templates/controller.rb", "generators/facebook_controller/templates/functional_test.rb", "generators/facebook_controller/templates/helper.rb", "generators/facebook_controller/templates/view.fbml.erb", "generators/facebook_controller/templates/view.html.erb", "generators/facebook_publisher/facebook_publisher_generator.rb", "generators/facebook_publisher/templates/create_facebook_templates.rb", "generators/facebook_publisher/templates/publisher.rb", "generators/facebook_scaffold/USAGE", "generators/facebook_scaffold/facebook_scaffold_generator.rb", "generators/facebook_scaffold/templates/controller.rb", "generators/facebook_scaffold/templates/facebook_style.css", "generators/facebook_scaffold/templates/functional_test.rb", "generators/facebook_scaffold/templates/helper.rb", "generators/facebook_scaffold/templates/layout.fbml.erb", "generators/facebook_scaffold/templates/layout.html.erb", "generators/facebook_scaffold/templates/style.css", "generators/facebook_scaffold/templates/view_edit.fbml.erb", "generators/facebook_scaffold/templates/view_edit.html.erb", "generators/facebook_scaffold/templates/view_index.fbml.erb", "generators/facebook_scaffold/templates/view_index.html.erb", "generators/facebook_scaffold/templates/view_new.fbml.erb", "generators/facebook_scaffold/templates/view_new.html.erb", "generators/facebook_scaffold/templates/view_show.fbml.erb", "generators/facebook_scaffold/templates/view_show.html.erb", "generators/publisher/publisher_generator.rb", "generators/xd_receiver/templates/xd_receiver.html", "generators/xd_receiver/xd_receiver_generator.rb", "init.rb", "install.rb", "lib/facebooker.rb", "lib/facebooker/adapters/adapter_base.rb", "lib/facebooker/adapters/bebo_adapter.rb", "lib/facebooker/adapters/facebook_adapter.rb", "lib/facebooker/admin.rb", "lib/facebooker/batch_request.rb", "lib/facebooker/data.rb", "lib/facebooker/feed.rb", "lib/facebooker/logging.rb", "lib/facebooker/mobile.rb", "lib/facebooker/mock/service.rb", "lib/facebooker/mock/session.rb", "lib/facebooker/model.rb", "lib/facebooker/models/affiliation.rb", "lib/facebooker/models/album.rb", "lib/facebooker/models/applicationproperties.rb", "lib/facebooker/models/applicationrestrictions.rb", "lib/facebooker/models/cookie.rb", "lib/facebooker/models/education_info.rb", "lib/facebooker/models/event.rb", "lib/facebooker/models/friend_list.rb", "lib/facebooker/models/group.rb", "lib/facebooker/models/info_item.rb", "lib/facebooker/models/info_section.rb", "lib/facebooker/models/location.rb", "lib/facebooker/models/notifications.rb", "lib/facebooker/models/page.rb", "lib/facebooker/models/photo.rb", "lib/facebooker/models/tag.rb", "lib/facebooker/models/user.rb", "lib/facebooker/models/video.rb", "lib/facebooker/models/work_info.rb", "lib/facebooker/parser.rb", "lib/facebooker/rails/backwards_compatible_param_checks.rb", "lib/facebooker/rails/controller.rb", "lib/facebooker/rails/cucumber.rb", "lib/facebooker/rails/cucumber/world.rb", "lib/facebooker/rails/extensions/action_controller.rb", "lib/facebooker/rails/extensions/rack_setup.rb", "lib/facebooker/rails/extensions/routing.rb", "lib/facebooker/rails/facebook_form_builder.rb", "lib/facebooker/rails/facebook_pretty_errors.rb", "lib/facebooker/rails/facebook_request_fix.rb", "lib/facebooker/rails/facebook_request_fix_2-3.rb", "lib/facebooker/rails/facebook_session_handling.rb", "lib/facebooker/rails/facebook_url_helper.rb", "lib/facebooker/rails/facebook_url_rewriting.rb", "lib/facebooker/rails/helpers.rb", "lib/facebooker/rails/helpers/fb_connect.rb", "lib/facebooker/rails/integration_session.rb", "lib/facebooker/rails/profile_publisher_extensions.rb", "lib/facebooker/rails/publisher.rb", "lib/facebooker/rails/routing.rb", "lib/facebooker/rails/test_helpers.rb", "lib/facebooker/rails/utilities.rb", "lib/facebooker/server_cache.rb", "lib/facebooker/service.rb", "lib/facebooker/session.rb", "lib/facebooker/version.rb", "lib/net/http_multipart_post.rb", "lib/rack/facebook.rb", "lib/tasks/facebooker.rake", "lib/tasks/tunnel.rake", "rails/init.rb", "setup.rb", "templates/layout.erb", "test/facebooker/adapters_test.rb", "test/facebooker/admin_test.rb", "test/facebooker/batch_request_test.rb", "test/facebooker/data_test.rb", "test/facebooker/logging_test.rb", "test/facebooker/mobile_test.rb", "test/facebooker/model_test.rb", "test/facebooker/models/event_test.rb", "test/facebooker/models/photo_test.rb", "test/facebooker/models/user_test.rb", "test/facebooker/rails/publisher_test.rb", "test/facebooker/rails_integration_test.rb", "test/facebooker/rails/facebook_request_fix_2-3_test.rb", "test/facebooker/server_cache_test.rb", "test/facebooker/session_test.rb", "test/facebooker_test.rb", "test/fixtures/multipart_post_body_with_only_parameters.txt", "test/fixtures/multipart_post_body_with_single_file.txt", "test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt", "test/net/http_multipart_post_test.rb", "test/rack/facebook_test.rb", "test/rails_test_helper.rb", "test/test_helper.rb", "test/facebooker/rails/facebook_url_rewriting_test.rb"]
|
14
|
-
s.has_rdoc = true
|
18
|
+
s.files = [".autotest", "CHANGELOG.rdoc", "COPYING.rdoc", "Manifest.txt", "README.rdoc", "Rakefile", "TODO.rdoc", "examples/desktop_login.rb", "facebooker.gemspec", "generators/facebook/facebook_generator.rb", "generators/facebook/templates/config/facebooker.yml", "generators/facebook/templates/public/javascripts/facebooker.js", "generators/facebook_controller/USAGE", "generators/facebook_controller/facebook_controller_generator.rb", "generators/facebook_controller/templates/controller.rb", "generators/facebook_controller/templates/functional_test.rb", "generators/facebook_controller/templates/helper.rb", "generators/facebook_controller/templates/view.fbml.erb", "generators/facebook_controller/templates/view.html.erb", "generators/facebook_publisher/facebook_publisher_generator.rb", "generators/facebook_publisher/templates/create_facebook_templates.rb", "generators/facebook_publisher/templates/publisher.rb", "generators/facebook_scaffold/USAGE", "generators/facebook_scaffold/facebook_scaffold_generator.rb", "generators/facebook_scaffold/templates/controller.rb", "generators/facebook_scaffold/templates/facebook_style.css", "generators/facebook_scaffold/templates/functional_test.rb", "generators/facebook_scaffold/templates/helper.rb", "generators/facebook_scaffold/templates/layout.fbml.erb", "generators/facebook_scaffold/templates/layout.html.erb", "generators/facebook_scaffold/templates/style.css", "generators/facebook_scaffold/templates/view_edit.fbml.erb", "generators/facebook_scaffold/templates/view_edit.html.erb", "generators/facebook_scaffold/templates/view_index.fbml.erb", "generators/facebook_scaffold/templates/view_index.html.erb", "generators/facebook_scaffold/templates/view_new.fbml.erb", "generators/facebook_scaffold/templates/view_new.html.erb", "generators/facebook_scaffold/templates/view_show.fbml.erb", "generators/facebook_scaffold/templates/view_show.html.erb", "generators/publisher/publisher_generator.rb", "generators/xd_receiver/templates/xd_receiver.html", "generators/xd_receiver/xd_receiver_generator.rb", "init.rb", "install.rb", "lib/facebooker.rb", "lib/facebooker/adapters/adapter_base.rb", "lib/facebooker/adapters/bebo_adapter.rb", "lib/facebooker/adapters/facebook_adapter.rb", "lib/facebooker/admin.rb", "lib/facebooker/batch_request.rb", "lib/facebooker/data.rb", "lib/facebooker/feed.rb", "lib/facebooker/logging.rb", "lib/facebooker/mobile.rb", "lib/facebooker/mock/service.rb", "lib/facebooker/mock/session.rb", "lib/facebooker/model.rb", "lib/facebooker/models/affiliation.rb", "lib/facebooker/models/album.rb", "lib/facebooker/models/applicationproperties.rb", "lib/facebooker/models/applicationrestrictions.rb", "lib/facebooker/models/cookie.rb", "lib/facebooker/models/education_info.rb", "lib/facebooker/models/event.rb", "lib/facebooker/models/friend_list.rb", "lib/facebooker/models/group.rb", "lib/facebooker/models/info_item.rb", "lib/facebooker/models/info_section.rb", "lib/facebooker/models/location.rb", "lib/facebooker/models/notifications.rb", "lib/facebooker/models/page.rb", "lib/facebooker/models/photo.rb", "lib/facebooker/models/tag.rb", "lib/facebooker/models/user.rb", "lib/facebooker/models/video.rb", "lib/facebooker/models/work_info.rb", "lib/facebooker/parser.rb", "lib/facebooker/rails/backwards_compatible_param_checks.rb", "lib/facebooker/rails/controller.rb", "lib/facebooker/rails/cucumber.rb", "lib/facebooker/rails/cucumber/world.rb", "lib/facebooker/rails/extensions/action_controller.rb", "lib/facebooker/rails/extensions/rack_setup.rb", "lib/facebooker/rails/extensions/routing.rb", "lib/facebooker/rails/facebook_form_builder.rb", "lib/facebooker/rails/facebook_pretty_errors.rb", "lib/facebooker/rails/facebook_request_fix.rb", "lib/facebooker/rails/facebook_request_fix_2-3.rb", "lib/facebooker/rails/facebook_session_handling.rb", "lib/facebooker/rails/facebook_url_helper.rb", "lib/facebooker/rails/facebook_url_rewriting.rb", "lib/facebooker/rails/helpers.rb", "lib/facebooker/rails/helpers/fb_connect.rb", "lib/facebooker/rails/integration_session.rb", "lib/facebooker/rails/profile_publisher_extensions.rb", "lib/facebooker/rails/publisher.rb", "lib/facebooker/rails/routing.rb", "lib/facebooker/rails/test_helpers.rb", "lib/facebooker/rails/utilities.rb", "lib/facebooker/server_cache.rb", "lib/facebooker/service.rb", "lib/facebooker/session.rb", "lib/facebooker/version.rb", "lib/net/http_multipart_post.rb", "lib/rack/facebook.rb", "lib/tasks/facebooker.rake", "lib/tasks/tunnel.rake", "rails/init.rb", "setup.rb", "templates/layout.erb", "test/facebooker/adapters_test.rb", "test/facebooker/admin_test.rb", "test/facebooker/batch_request_test.rb", "test/facebooker/data_test.rb", "test/facebooker/logging_test.rb", "test/facebooker/mobile_test.rb", "test/facebooker/model_test.rb", "test/facebooker/models/event_test.rb", "test/facebooker/models/photo_test.rb", "test/facebooker/models/user_test.rb", "test/facebooker/rails/publisher_test.rb", "test/facebooker/rails_integration_test.rb", "test/facebooker/rails/facebook_request_fix_2-3_test.rb", "test/facebooker/server_cache_test.rb", "test/facebooker/session_test.rb", "test/facebooker_test.rb", "test/fixtures/multipart_post_body_with_only_parameters.txt", "test/fixtures/multipart_post_body_with_single_file.txt", "test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt", "test/net/http_multipart_post_test.rb", "test/rack/facebook_test.rb", "test/rails_test_helper.rb", "test/test_helper.rb", "test/facebooker/rails/facebook_url_rewriting_test.rb", "test/facebooker/service_test.rb"]
|
15
19
|
s.homepage = %q{http://facebooker.rubyforge.org}
|
16
20
|
s.rdoc_options = ["--main", "README.rdoc"]
|
17
21
|
s.require_paths = ["lib"]
|
18
22
|
s.rubyforge_project = %q{facebooker}
|
19
|
-
s.rubygems_version = %q{1.3.
|
23
|
+
s.rubygems_version = %q{1.3.4}
|
20
24
|
s.summary = %q{Facebooker is a Ruby wrapper over the Facebook[http://facebook.com] {REST API}[http://wiki.developers.facebook.com/index.php/API]}
|
21
|
-
s.test_files = ["test/
|
25
|
+
s.test_files = ["test/facebooker/adapters_test.rb", "test/facebooker/admin_test.rb", "test/facebooker/batch_request_test.rb", "test/facebooker/data_test.rb", "test/facebooker/logging_test.rb", "test/facebooker/mobile_test.rb", "test/facebooker/model_test.rb", "test/facebooker/models/event_test.rb", "test/facebooker/models/photo_test.rb", "test/facebooker/models/user_test.rb", "test/facebooker/rails/facebook_request_fix_2-3_test.rb", "test/facebooker/rails/facebook_url_rewriting_test.rb", "test/facebooker/rails/publisher_test.rb", "test/facebooker/rails_integration_test.rb", "test/facebooker/server_cache_test.rb", "test/facebooker/service_test.rb", "test/facebooker/session_test.rb", "test/facebooker_test.rb", "test/net/http_multipart_post_test.rb", "test/rack/facebook_test.rb"]
|
22
26
|
|
23
27
|
if s.respond_to? :specification_version then
|
24
28
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
-
s.specification_version =
|
29
|
+
s.specification_version = 3
|
26
30
|
|
27
31
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
32
|
s.add_runtime_dependency(%q<json>, [">= 1.0.0"])
|
29
|
-
s.add_development_dependency(%q<hoe>, [">=
|
33
|
+
s.add_development_dependency(%q<hoe>, [">= 2.3.2"])
|
30
34
|
else
|
31
35
|
s.add_dependency(%q<json>, [">= 1.0.0"])
|
32
|
-
s.add_dependency(%q<hoe>, [">=
|
36
|
+
s.add_dependency(%q<hoe>, [">= 2.3.2"])
|
33
37
|
end
|
34
38
|
else
|
35
39
|
s.add_dependency(%q<json>, [">= 1.0.0"])
|
36
|
-
s.add_dependency(%q<hoe>, [">=
|
40
|
+
s.add_dependency(%q<hoe>, [">= 2.3.2"])
|
37
41
|
end
|
38
42
|
end
|
@@ -31,6 +31,12 @@ module Facebooker
|
|
31
31
|
secure_with_facebook_params! || secure_with_cookies! || secure_with_token!
|
32
32
|
end
|
33
33
|
|
34
|
+
#this is used to proxy a connection through a rails app so the facebook secret key is not needed
|
35
|
+
#iphone apps use this
|
36
|
+
def create_facebook_session_with_secret
|
37
|
+
secure_with_session_secret!
|
38
|
+
end
|
39
|
+
|
34
40
|
def set_facebook_session
|
35
41
|
# first, see if we already have a session
|
36
42
|
session_set = session_already_secured?
|
@@ -148,6 +154,15 @@ module Facebooker
|
|
148
154
|
@facebook_session
|
149
155
|
end
|
150
156
|
end
|
157
|
+
|
158
|
+
def secure_with_session_secret!
|
159
|
+
if params['auth_token']
|
160
|
+
@facebook_session = new_facebook_session
|
161
|
+
@facebook_session.auth_token = params['auth_token']
|
162
|
+
@facebook_session.secure_with_session_secret!
|
163
|
+
@facebook_session
|
164
|
+
end
|
165
|
+
end
|
151
166
|
|
152
167
|
def secure_with_facebook_params!
|
153
168
|
return unless request_comes_from_facebook?
|
data/lib/facebooker/service.rb
CHANGED
@@ -1,9 +1,3 @@
|
|
1
|
-
begin
|
2
|
-
require 'curb'
|
3
|
-
Facebooker.use_curl = true
|
4
|
-
rescue LoadError
|
5
|
-
require 'net/http'
|
6
|
-
end
|
7
1
|
require 'facebooker/parser'
|
8
2
|
module Facebooker
|
9
3
|
class Service
|
@@ -13,10 +7,63 @@ module Facebooker
|
|
13
7
|
@api_key = api_key
|
14
8
|
end
|
15
9
|
|
10
|
+
def self.active_service
|
11
|
+
unless @active_service
|
12
|
+
if Facebooker.use_curl?
|
13
|
+
@active_service = Facebooker::Service::CurlService.new
|
14
|
+
else
|
15
|
+
@active_service = Facebooker::Service::NetHttpService.new
|
16
|
+
end
|
17
|
+
end
|
18
|
+
@active_service
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.active_service=(new_service)
|
22
|
+
@active_service = new_service
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.with_service(service)
|
26
|
+
old_service = active_service
|
27
|
+
self.active_service = service
|
28
|
+
begin
|
29
|
+
yield
|
30
|
+
ensure
|
31
|
+
self.active_service = old_service
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
# Process all calls to Facebook in th block asynchronously
|
37
|
+
# nil will be returned from all calls and no results will be parsed. This is mostly useful
|
38
|
+
# for sending large numbers of notifications or sending a lot of profile updates
|
39
|
+
#
|
40
|
+
# for example:
|
41
|
+
# User.all.each_slice(200) do |users|
|
42
|
+
# Faceboooker::Service.with_async do
|
43
|
+
# users.each {|u| u.facebook_session.send_notification(...)}
|
44
|
+
# end
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
# Note: You shouldn't make more than about 200 api calls in a with_async block
|
48
|
+
# or you might exhaust all filehandles.
|
49
|
+
def self.with_async(&proc)
|
50
|
+
block_with_process = Proc.new { proc.call ; process_async}
|
51
|
+
with_service(Facebooker::Service::TyphoeusMultiService.new,&block_with_process)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.process_async
|
55
|
+
active_service.process
|
56
|
+
end
|
57
|
+
|
58
|
+
|
16
59
|
# TODO: support ssl
|
17
60
|
def post(params)
|
18
61
|
attempt = 0
|
19
|
-
|
62
|
+
if active_service.parse_results?
|
63
|
+
Parser.parse(params[:method], post_form(url,params) )
|
64
|
+
else
|
65
|
+
post_form(url,params)
|
66
|
+
end
|
20
67
|
rescue Errno::ECONNRESET, EOFError
|
21
68
|
if attempt == 0
|
22
69
|
attempt += 1
|
@@ -25,42 +72,17 @@ module Facebooker
|
|
25
72
|
end
|
26
73
|
|
27
74
|
def post_form(url,params)
|
28
|
-
|
29
|
-
post_form_with_curl(url,params)
|
30
|
-
else
|
31
|
-
post_form_with_net_http(url,params)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def post_form_with_net_http(url,params)
|
36
|
-
post_params = {}
|
37
|
-
params.each do |k,v|
|
38
|
-
post_params[k] = v
|
39
|
-
post_params[k] = Facebooker.json_encode(v) if Array === v
|
40
|
-
end
|
41
|
-
Net::HTTP.post_form(url, post_params)
|
42
|
-
end
|
43
|
-
|
44
|
-
def post_form_with_curl(url,params,multipart=false)
|
45
|
-
response = Curl::Easy.http_post(url.to_s, *to_curb_params(params)) do |c|
|
46
|
-
c.multipart_form_post = multipart
|
47
|
-
c.timeout = Facebooker.timeout
|
48
|
-
end
|
49
|
-
response.body_str
|
75
|
+
active_service.post_form(url,params)
|
50
76
|
end
|
51
77
|
|
52
78
|
def post_multipart_form(url,params)
|
53
|
-
|
54
|
-
post_form_with_curl(url,params,true)
|
55
|
-
else
|
56
|
-
post_multipart_form_with_net_http(url,params)
|
57
|
-
end
|
79
|
+
active_service.post_multipart_form(url,params)
|
58
80
|
end
|
59
81
|
|
60
|
-
def
|
61
|
-
|
82
|
+
def active_service
|
83
|
+
self.class.active_service
|
62
84
|
end
|
63
|
-
|
85
|
+
|
64
86
|
def post_file(params)
|
65
87
|
service_url = url(params.delete(:base))
|
66
88
|
result = post_multipart_form(service_url, params)
|
@@ -73,30 +95,5 @@ module Facebooker
|
|
73
95
|
URI.parse('http://'+ base + @api_path)
|
74
96
|
end
|
75
97
|
|
76
|
-
# Net::HTTP::MultipartPostFile
|
77
|
-
def multipart_post_file?(object)
|
78
|
-
object.respond_to?(:content_type) &&
|
79
|
-
object.respond_to?(:data) &&
|
80
|
-
object.respond_to?(:filename)
|
81
|
-
end
|
82
|
-
|
83
|
-
def to_curb_params(params)
|
84
|
-
parray = []
|
85
|
-
params.each_pair do |k,v|
|
86
|
-
if multipart_post_file?(v)
|
87
|
-
# Curl doesn't like blank field names
|
88
|
-
field = Curl::PostField.file((k.blank? ? 'xxx' : k.to_s), nil, File.basename(v.filename))
|
89
|
-
field.content_type = v.content_type
|
90
|
-
field.content = v.data
|
91
|
-
parray << field
|
92
|
-
else
|
93
|
-
parray << Curl::PostField.content(
|
94
|
-
k.to_s,
|
95
|
-
Array === v ? Facebooker.json_encode(v) : v.to_s
|
96
|
-
)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
parray
|
100
|
-
end
|
101
98
|
end
|
102
99
|
end
|
data/lib/facebooker/session.rb
CHANGED
@@ -72,6 +72,7 @@ module Facebooker
|
|
72
72
|
|
73
73
|
attr_writer :auth_token
|
74
74
|
attr_reader :session_key
|
75
|
+
attr_reader :secret_from_session
|
75
76
|
|
76
77
|
def self.create(api_key=nil, secret_key=nil)
|
77
78
|
api_key ||= self.api_key
|
@@ -181,10 +182,14 @@ module Facebooker
|
|
181
182
|
!@session_key.nil? && !expired?
|
182
183
|
end
|
183
184
|
|
184
|
-
def secure!
|
185
|
-
response = post 'facebook.auth.getSession', :auth_token => auth_token
|
185
|
+
def secure!(args = {})
|
186
|
+
response = post 'facebook.auth.getSession', :auth_token => auth_token, :generate_session_secret => args[:generate_session_secret] ? "1" : "0"
|
186
187
|
secure_with!(response['session_key'], response['uid'], response['expires'], response['secret'])
|
187
188
|
end
|
189
|
+
|
190
|
+
def secure_with_session_secret!
|
191
|
+
self.secure!(:generate_session_secret => true)
|
192
|
+
end
|
188
193
|
|
189
194
|
def secure_with!(session_key, uid = nil, expires = nil, secret_from_session = nil)
|
190
195
|
@session_key = session_key
|
@@ -413,10 +418,10 @@ module Facebooker
|
|
413
418
|
|
414
419
|
##
|
415
420
|
# Send email to as many as 100 users at a time
|
416
|
-
def send_email(user_ids, subject, text, fbml = nil)
|
421
|
+
def send_email(user_ids, subject, text, fbml = nil)
|
417
422
|
user_ids = Array(user_ids)
|
418
423
|
params = {:fbml => fbml, :recipients => user_ids.map{ |id| User.cast_to_facebook_id(id)}.join(','), :text => text, :subject => subject}
|
419
|
-
post 'facebook.notifications.sendEmail', params
|
424
|
+
post 'facebook.notifications.sendEmail', params, false
|
420
425
|
end
|
421
426
|
|
422
427
|
# Only serialize the bare minimum to recreate the session.
|
data/lib/facebooker/version.rb
CHANGED
data/lib/facebooker.rb
CHANGED
@@ -37,10 +37,9 @@ module Facebooker
|
|
37
37
|
|
38
38
|
def load_configuration(facebooker_yaml_file)
|
39
39
|
if File.exist?(facebooker_yaml_file)
|
40
|
+
@raw_facebooker_configuration = YAML.load(ERB.new(File.read(facebooker_yaml_file)).result)
|
40
41
|
if defined? RAILS_ENV
|
41
|
-
@raw_facebooker_configuration =
|
42
|
-
else
|
43
|
-
@raw_facebooker_configuration = YAML.load_file(facebooker_yaml_file)
|
42
|
+
@raw_facebooker_configuration = @raw_facebooker_configuration[RAILS_ENV]
|
44
43
|
end
|
45
44
|
Thread.current[:fb_api_config] = @raw_facebooker_configuration unless Thread.current[:fb_api_config]
|
46
45
|
apply_configuration(@raw_facebooker_configuration)
|
@@ -78,8 +77,9 @@ module Facebooker
|
|
78
77
|
return
|
79
78
|
end
|
80
79
|
|
81
|
-
# Save the old config to handle nested activation
|
82
|
-
|
80
|
+
# Save the old config to handle nested activation. If no app context is
|
81
|
+
# set yet, use default app's configuration.
|
82
|
+
old = Thread.current[:fb_api_config] ? Thread.current[:fb_api_config].dup : @raw_facebooker_configuration
|
83
83
|
|
84
84
|
if block_given?
|
85
85
|
begin
|
@@ -186,6 +186,11 @@ require 'facebooker/logging'
|
|
186
186
|
require 'facebooker/model'
|
187
187
|
require 'facebooker/parser'
|
188
188
|
require 'facebooker/service'
|
189
|
+
require 'facebooker/service/base_service'
|
190
|
+
require 'facebooker/service/curl_service' rescue nil
|
191
|
+
require 'facebooker/service/typhoeus_service' rescue nil
|
192
|
+
require 'facebooker/service/typhoeus_multi_service' rescue nil
|
193
|
+
require 'facebooker/service/net_http_service'
|
189
194
|
require 'facebooker/server_cache'
|
190
195
|
require 'facebooker/data'
|
191
196
|
require 'facebooker/admin'
|
data/lib/rack/facebook.rb
CHANGED
@@ -30,28 +30,35 @@ module Rack
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def call(env)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
33
|
+
return @app.call(env) unless @condition.nil? || @condition.call(env)
|
34
|
+
|
35
|
+
request = Rack::Request.new(env)
|
36
|
+
fb_sig, fb_params = nil, nil
|
37
|
+
|
38
|
+
[ request.POST, request.GET ].each do |params|
|
39
|
+
fb_sig, fb_params = fb_sig_and_params( params )
|
40
|
+
break if fb_sig
|
41
|
+
end
|
42
|
+
|
43
|
+
return @app.call(env) if fb_params.empty?
|
44
|
+
|
45
|
+
Facebooker.with_application(fb_params['api_key']) do
|
46
|
+
unless signature_is_valid?(fb_params, fb_sig)
|
47
|
+
return Rack::Response.new(["Invalid Facebook signature"], 400).finish
|
47
48
|
end
|
48
|
-
|
49
|
+
env['REQUEST_METHOD'] = fb_params["request_method"] if fb_params["request_method"]
|
50
|
+
convert_parameters!(request.params)
|
49
51
|
@app.call(env)
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
53
55
|
private
|
54
56
|
|
57
|
+
def fb_sig_and_params( params )
|
58
|
+
return nil, [] unless params['fb_sig']
|
59
|
+
return params['fb_sig'], extract_fb_sig_params(params)
|
60
|
+
end
|
61
|
+
|
55
62
|
def extract_fb_sig_params(params)
|
56
63
|
params.inject({}) do |collection, (param, value)|
|
57
64
|
collection[param.sub(/^fb_sig_/, '')] = value if param[0,7] == 'fb_sig_'
|
data/lib/tasks/tunnel.rake
CHANGED
@@ -28,7 +28,7 @@ namespace :facebooker do
|
|
28
28
|
|
29
29
|
task :config => :environment do
|
30
30
|
facebook_config = File.dirname(__FILE__) + '/../../../../../config/facebooker.yml'
|
31
|
-
FACEBOOKER = YAML.
|
31
|
+
FACEBOOKER = YAML.load(ERB.new(File.read(facebook_config)).result)[RAILS_ENV]
|
32
32
|
@public_host_username = FACEBOOKER['tunnel']['public_host_username']
|
33
33
|
@public_host = FACEBOOKER['tunnel']['public_host']
|
34
34
|
@public_port = FACEBOOKER['tunnel']['public_port']
|
@@ -6,8 +6,9 @@ class Facebooker::Rails::FacebookRequestFix23Test < Test::Unit::TestCase
|
|
6
6
|
def setup
|
7
7
|
ENV['FACEBOOK_API_KEY'] = '1234567'
|
8
8
|
ENV['FACEBOOK_SECRET_KEY'] = '7654321'
|
9
|
-
if Rails.version < '2.3'
|
9
|
+
if Rails.version < '2.3'
|
10
10
|
@request = ActionController::TestRequest.new({"fb_sig_is_ajax"=>"1"}, {}, nil)
|
11
|
+
|
11
12
|
else
|
12
13
|
@request = ActionController::TestRequest.new
|
13
14
|
@request.query_parameters[:fb_sig_is_ajax] = "1"
|
@@ -37,6 +37,13 @@ class FBConnectController < NoisyController
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
class FBConnectControllerProxy < NoisyController
|
41
|
+
before_filter :create_facebook_session_with_secret
|
42
|
+
def index
|
43
|
+
render :text => 'score!'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
40
47
|
class ControllerWhichRequiresFacebookAuthentication < NoisyController
|
41
48
|
ensure_authenticated_to_facebook
|
42
49
|
def index
|
@@ -372,6 +379,20 @@ class RailsIntegrationTest < Test::Unit::TestCase
|
|
372
379
|
assert_equal(1111111, @controller.facebook_session.user.id)
|
373
380
|
end
|
374
381
|
|
382
|
+
def test_session_can_be_secured_with_secret
|
383
|
+
@controller = FBConnectControllerProxy.new
|
384
|
+
auth_token = 'ohaiauthtokenhere111'
|
385
|
+
modified_params = facebook_params
|
386
|
+
modified_params.delete('fb_sig_session_key')
|
387
|
+
modified_params['auth_token'] = auth_token
|
388
|
+
modified_params['generate_session_secret'] = true
|
389
|
+
session_mock = flexmock(session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY']))
|
390
|
+
session_params = { 'session_key' => '123', 'uid' => '321' }
|
391
|
+
session_mock.should_receive(:post).with('facebook.auth.getSession', :auth_token => auth_token, :generate_session_secret => "1").once.and_return(session_params).ordered
|
392
|
+
flexmock(@controller).should_receive(:new_facebook_session).once.and_return(session).ordered
|
393
|
+
get :index, modified_params
|
394
|
+
end
|
395
|
+
|
375
396
|
def test_session_can_be_secured_with_auth_token
|
376
397
|
auth_token = 'ohaiauthtokenhere111'
|
377
398
|
modified_params = facebook_params
|
@@ -379,7 +400,7 @@ class RailsIntegrationTest < Test::Unit::TestCase
|
|
379
400
|
modified_params['auth_token'] = auth_token
|
380
401
|
session_mock = flexmock(session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY']))
|
381
402
|
session_params = { 'session_key' => '123', 'uid' => '321' }
|
382
|
-
session_mock.should_receive(:post).with('facebook.auth.getSession', :auth_token => auth_token).once.and_return(session_params).ordered
|
403
|
+
session_mock.should_receive(:post).with('facebook.auth.getSession', :auth_token => auth_token, :generate_session_secret => "0").once.and_return(session_params).ordered
|
383
404
|
flexmock(@controller).should_receive(:new_facebook_session).once.and_return(session).ordered
|
384
405
|
get :index, modified_params
|
385
406
|
end
|
@@ -391,7 +412,7 @@ class RailsIntegrationTest < Test::Unit::TestCase
|
|
391
412
|
modified_params['auth_token'] = auth_token
|
392
413
|
session_mock = flexmock(session = Facebooker::Session.create(ENV['FACEBOOK_API_KEY'], ENV['FACEBOOK_SECRET_KEY']))
|
393
414
|
session_params = { 'session_key' => '123', 'uid' => '321' }
|
394
|
-
session_mock.should_receive(:post).with('facebook.auth.getSession', :auth_token => auth_token).once.and_return(session_params).ordered
|
415
|
+
session_mock.should_receive(:post).with('facebook.auth.getSession', :auth_token => auth_token, :generate_session_secret => "0").once.and_return(session_params).ordered
|
395
416
|
flexmock(@controller).should_receive(:new_facebook_session).once.and_return(session).ordered
|
396
417
|
setup_fb_connect_cookies(expired_cookie_hash_for_auth)
|
397
418
|
get :index, modified_params
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
require 'active_support'
|
3
|
+
# make sure the class exists
|
4
|
+
class ::Facebooker::Service::CurlService < Facebooker::Service::BaseService
|
5
|
+
end
|
6
|
+
|
7
|
+
class ::Facebooker::Service::TyphoeusMultiService
|
8
|
+
def process
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Facebooker::ServiceTest < Test::Unit::TestCase
|
13
|
+
|
14
|
+
def test_should_use_the_curl_service
|
15
|
+
Facebooker.use_curl = true
|
16
|
+
Facebooker::Service.active_service= nil
|
17
|
+
assert(Facebooker::Service::CurlService === Facebooker::Service.active_service)
|
18
|
+
ensure
|
19
|
+
Facebooker::Service.active_service= nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_should_allow_changing_the_service_in_a_block
|
23
|
+
Facebooker::Service.with_service("MyService") do
|
24
|
+
assert_equal(Facebooker::Service.active_service,"MyService")
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_should_restore_the_original_service_even_with_an_exception
|
30
|
+
original_service = Facebooker::Service.active_service
|
31
|
+
begin
|
32
|
+
Facebooker::Service.with_service("MyService") do
|
33
|
+
raise "This is a test"
|
34
|
+
end
|
35
|
+
fail("Should have raised")
|
36
|
+
rescue
|
37
|
+
end
|
38
|
+
assert_equal(original_service,Facebooker::Service.active_service)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_should_allow_using_the_async_service
|
42
|
+
Facebooker::Service.with_async do
|
43
|
+
assert(Facebooker::Service::TyphoeusMultiService === Facebooker::Service.active_service)
|
44
|
+
@called = true
|
45
|
+
end
|
46
|
+
assert @called
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_should_call_process_at_the_end_of_the_block
|
50
|
+
Facebooker::Service.with_async do
|
51
|
+
Facebooker::Service.active_service.expects(:process)
|
52
|
+
@called = true
|
53
|
+
end
|
54
|
+
assert @called
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -301,10 +301,14 @@ class Facebooker::SessionTest < Test::Unit::TestCase
|
|
301
301
|
<name>query1</name>
|
302
302
|
<results list="true">
|
303
303
|
<user>
|
304
|
+
<<<<<<< HEAD:test/facebooker/session_test.rb
|
304
305
|
<<<<<<< HEAD:test/facebooker/session_test.rb
|
305
306
|
<name>Ari Steinberg</name>
|
306
307
|
=======
|
307
308
|
>>>>>>> b7d143104d745caf56a73c8ed092e422c2d00508:test/facebooker/session_test.rb
|
309
|
+
=======
|
310
|
+
<name>Ari Steinberg</name>
|
311
|
+
>>>>>>> b15371bfe556124cd3ae82746a5aa0e8ba7584e6:test/facebooker/session_test.rb
|
308
312
|
<uid>46903192</uid>
|
309
313
|
<rsvp_status xsi:nil="true"/>
|
310
314
|
</user>
|
@@ -617,30 +621,6 @@ XML
|
|
617
621
|
end
|
618
622
|
end
|
619
623
|
|
620
|
-
class PostMethodTest < Test::Unit::TestCase
|
621
|
-
|
622
|
-
def setup
|
623
|
-
Facebooker.use_curl = true
|
624
|
-
Facebooker::Parser.stubs(:parse)
|
625
|
-
@uri = URI.parse("http://api.facebook.com/api")
|
626
|
-
@service = Facebooker::Service.new("a","b","c")
|
627
|
-
@service.stubs("url").returns(@uri)
|
628
|
-
end
|
629
|
-
|
630
|
-
def teardown
|
631
|
-
Facebooker.use_curl = false
|
632
|
-
end
|
633
|
-
|
634
|
-
def test_use_curl_makes_post_with_curl
|
635
|
-
@service.expects(:post_form_with_curl).with(@uri,{:method=>"a"})
|
636
|
-
@service.post(:method=>"a")
|
637
|
-
end
|
638
|
-
|
639
|
-
def test_use_curl_makes_post_file_use_curl_with_multipart
|
640
|
-
@service.expects(:post_form_with_curl).with(@uri,{:method=>"a"},true)
|
641
|
-
@service.post_file(:method=>"a")
|
642
|
-
end
|
643
|
-
end
|
644
624
|
|
645
625
|
class CanvasSessionTest < Test::Unit::TestCase
|
646
626
|
def setup
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: taweili-facebooker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.40
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chad Fowler
|
@@ -13,7 +13,7 @@ autorequire:
|
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
15
|
|
16
|
-
date: 2009-
|
16
|
+
date: 2009-07-10 00:00:00 -07:00
|
17
17
|
default_executable:
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - ">="
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
37
|
+
version: 2.3.2
|
38
38
|
version:
|
39
39
|
description: "Facebooker is a Ruby wrapper over the Facebook[http://facebook.com] {REST API}[http://wiki.developers.facebook.com/index.php/API]. Its goals are: * Idiomatic Ruby * No dependencies outside of the Ruby standard library (This is true with Rails 2.1. Previous Rails versions require the JSON gem) * Concrete classes and methods modeling the Facebook data, so it's easy for a Rubyist to understand what's available * Well tested"
|
40
40
|
email: mmangino@elevatedrails.com
|
@@ -183,7 +183,8 @@ files:
|
|
183
183
|
- test/rails_test_helper.rb
|
184
184
|
- test/test_helper.rb
|
185
185
|
- test/facebooker/rails/facebook_url_rewriting_test.rb
|
186
|
-
|
186
|
+
- test/facebooker/service_test.rb
|
187
|
+
has_rdoc: false
|
187
188
|
homepage: http://facebooker.rubyforge.org
|
188
189
|
post_install_message:
|
189
190
|
rdoc_options:
|
@@ -208,10 +209,9 @@ requirements: []
|
|
208
209
|
rubyforge_project: facebooker
|
209
210
|
rubygems_version: 1.2.0
|
210
211
|
signing_key:
|
211
|
-
specification_version:
|
212
|
+
specification_version: 3
|
212
213
|
summary: Facebooker is a Ruby wrapper over the Facebook[http://facebook.com] {REST API}[http://wiki.developers.facebook.com/index.php/API]
|
213
214
|
test_files:
|
214
|
-
- test/facebooker_test.rb
|
215
215
|
- test/facebooker/adapters_test.rb
|
216
216
|
- test/facebooker/admin_test.rb
|
217
217
|
- test/facebooker/batch_request_test.rb
|
@@ -219,14 +219,16 @@ test_files:
|
|
219
219
|
- test/facebooker/logging_test.rb
|
220
220
|
- test/facebooker/mobile_test.rb
|
221
221
|
- test/facebooker/model_test.rb
|
222
|
-
- test/facebooker/rails_integration_test.rb
|
223
|
-
- test/facebooker/server_cache_test.rb
|
224
|
-
- test/facebooker/session_test.rb
|
225
222
|
- test/facebooker/models/event_test.rb
|
226
223
|
- test/facebooker/models/photo_test.rb
|
227
224
|
- test/facebooker/models/user_test.rb
|
228
225
|
- test/facebooker/rails/facebook_request_fix_2-3_test.rb
|
229
226
|
- test/facebooker/rails/facebook_url_rewriting_test.rb
|
230
227
|
- test/facebooker/rails/publisher_test.rb
|
228
|
+
- test/facebooker/rails_integration_test.rb
|
229
|
+
- test/facebooker/server_cache_test.rb
|
230
|
+
- test/facebooker/service_test.rb
|
231
|
+
- test/facebooker/session_test.rb
|
232
|
+
- test/facebooker_test.rb
|
231
233
|
- test/net/http_multipart_post_test.rb
|
232
234
|
- test/rack/facebook_test.rb
|