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 CHANGED
@@ -77,6 +77,9 @@ class CGI
77
77
  end
78
78
  end
79
79
 
80
+ == Other versions
81
+
82
+ A facebooker port for Sinatra is available at http://github.com/jsmestad/frankie/tree/master
80
83
 
81
84
  == LICENSE:
82
85
 
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.38"
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-06-23}
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: * 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}
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.1}
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/facebooker_test.rb", "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/rails_integration_test.rb", "test/facebooker/server_cache_test.rb", "test/facebooker/session_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/net/http_multipart_post_test.rb", "test/rack/facebook_test.rb"]
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 = 2
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>, [">= 1.11.0"])
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>, [">= 1.11.0"])
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>, [">= 1.11.0"])
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?
@@ -2,5 +2,5 @@
2
2
  require 'rack/facebook'
3
3
  ActionController::Dispatcher.middleware.insert_before(
4
4
  ActionController::ParamsParser,
5
- Rack::Facebook,
6
- Facebooker.secret_key )
5
+ Rack::Facebook
6
+ )
@@ -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
- Parser.parse(params[:method], post_form(url,params) )
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
- if Facebooker.use_curl?
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
- if Facebooker.use_curl?
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 post_multipart_form_with_net_http(url,params)
61
- Net::HTTP.post_multipart_form(url, params)
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
@@ -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.
@@ -2,7 +2,7 @@ module Facebooker #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 1
4
4
  MINOR = 0
5
- TINY = 38
5
+ TINY = 40
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
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 = YAML.load_file(facebooker_yaml_file)[RAILS_ENV]
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
- old = Thread.current[:fb_api_config].dup rescue false
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
- if @condition.nil? || @condition.call(env)
34
- request = Rack::Request.new(env)
35
- fb_params = extract_fb_sig_params(request.POST)
36
- unless fb_params.empty?
37
- Facebooker.with_application(fb_params['api_key']) do
38
- unless signature_is_valid?(fb_params, request.POST['fb_sig'])
39
- return Rack::Response.new(["Invalid Facebook signature"], 400).finish
40
- end
41
- env['REQUEST_METHOD'] = fb_params["request_method"] if fb_params["request_method"]
42
- convert_parameters!(request.POST)
43
- @app.call(env)
44
- end
45
- else
46
- @app.call(env)
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
- else
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_'
@@ -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.load_file(facebook_config)[RAILS_ENV]
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.38
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-06-23 00:00:00 -07:00
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: 1.11.0
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
- has_rdoc: true
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: 2
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