djanowski-facebooker 1.0.1

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.
Files changed (111) hide show
  1. data/CHANGELOG.txt +0 -0
  2. data/COPYING +19 -0
  3. data/History.txt +16 -0
  4. data/Manifest.txt +110 -0
  5. data/README +46 -0
  6. data/README.txt +81 -0
  7. data/Rakefile +76 -0
  8. data/TODO.txt +10 -0
  9. data/generators/facebook/facebook_generator.rb +14 -0
  10. data/generators/facebook/templates/config/facebooker.yml +41 -0
  11. data/generators/facebook/templates/public/javascripts/facebooker.js +106 -0
  12. data/generators/facebook_controller/USAGE +33 -0
  13. data/generators/facebook_controller/facebook_controller_generator.rb +40 -0
  14. data/generators/facebook_controller/templates/controller.rb +7 -0
  15. data/generators/facebook_controller/templates/functional_test.rb +11 -0
  16. data/generators/facebook_controller/templates/helper.rb +2 -0
  17. data/generators/facebook_controller/templates/view.fbml.erb +2 -0
  18. data/generators/facebook_controller/templates/view.html.erb +2 -0
  19. data/generators/facebook_publisher/facebook_publisher_generator.rb +14 -0
  20. data/generators/facebook_publisher/templates/create_facebook_templates.rb +15 -0
  21. data/generators/facebook_publisher/templates/publisher.rb +3 -0
  22. data/generators/facebook_scaffold/USAGE +27 -0
  23. data/generators/facebook_scaffold/facebook_scaffold_generator.rb +118 -0
  24. data/generators/facebook_scaffold/templates/controller.rb +93 -0
  25. data/generators/facebook_scaffold/templates/facebook_style.css +2579 -0
  26. data/generators/facebook_scaffold/templates/functional_test.rb +89 -0
  27. data/generators/facebook_scaffold/templates/helper.rb +2 -0
  28. data/generators/facebook_scaffold/templates/layout.fbml.erb +6 -0
  29. data/generators/facebook_scaffold/templates/layout.html.erb +17 -0
  30. data/generators/facebook_scaffold/templates/style.css +74 -0
  31. data/generators/facebook_scaffold/templates/view_edit.fbml.erb +13 -0
  32. data/generators/facebook_scaffold/templates/view_edit.html.erb +18 -0
  33. data/generators/facebook_scaffold/templates/view_index.fbml.erb +24 -0
  34. data/generators/facebook_scaffold/templates/view_index.html.erb +24 -0
  35. data/generators/facebook_scaffold/templates/view_new.fbml.erb +12 -0
  36. data/generators/facebook_scaffold/templates/view_new.html.erb +17 -0
  37. data/generators/facebook_scaffold/templates/view_show.fbml.erb +10 -0
  38. data/generators/facebook_scaffold/templates/view_show.html.erb +10 -0
  39. data/generators/publisher/publisher_generator.rb +14 -0
  40. data/init.rb +54 -0
  41. data/install.rb +12 -0
  42. data/lib/facebooker/adapters/adapter_base.rb +87 -0
  43. data/lib/facebooker/adapters/bebo_adapter.rb +73 -0
  44. data/lib/facebooker/adapters/facebook_adapter.rb +48 -0
  45. data/lib/facebooker/admin.rb +28 -0
  46. data/lib/facebooker/batch_request.rb +44 -0
  47. data/lib/facebooker/data.rb +57 -0
  48. data/lib/facebooker/feed.rb +78 -0
  49. data/lib/facebooker/logging.rb +51 -0
  50. data/lib/facebooker/model.rb +123 -0
  51. data/lib/facebooker/models/affiliation.rb +10 -0
  52. data/lib/facebooker/models/album.rb +11 -0
  53. data/lib/facebooker/models/applicationproperties.rb +39 -0
  54. data/lib/facebooker/models/cookie.rb +10 -0
  55. data/lib/facebooker/models/education_info.rb +11 -0
  56. data/lib/facebooker/models/event.rb +26 -0
  57. data/lib/facebooker/models/friend_list.rb +14 -0
  58. data/lib/facebooker/models/group.rb +35 -0
  59. data/lib/facebooker/models/info_item.rb +10 -0
  60. data/lib/facebooker/models/info_section.rb +10 -0
  61. data/lib/facebooker/models/location.rb +8 -0
  62. data/lib/facebooker/models/notifications.rb +17 -0
  63. data/lib/facebooker/models/page.rb +27 -0
  64. data/lib/facebooker/models/photo.rb +10 -0
  65. data/lib/facebooker/models/tag.rb +12 -0
  66. data/lib/facebooker/models/user.rb +352 -0
  67. data/lib/facebooker/models/work_info.rb +9 -0
  68. data/lib/facebooker/parser.rb +540 -0
  69. data/lib/facebooker/rails/controller.rb +246 -0
  70. data/lib/facebooker/rails/facebook_asset_path.rb +18 -0
  71. data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
  72. data/lib/facebooker/rails/facebook_pretty_errors.rb +14 -0
  73. data/lib/facebooker/rails/facebook_request_fix.rb +24 -0
  74. data/lib/facebooker/rails/facebook_session_handling.rb +69 -0
  75. data/lib/facebooker/rails/facebook_url_rewriting.rb +39 -0
  76. data/lib/facebooker/rails/helpers.rb +615 -0
  77. data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
  78. data/lib/facebooker/rails/publisher.rb +492 -0
  79. data/lib/facebooker/rails/routing.rb +49 -0
  80. data/lib/facebooker/rails/test_helpers.rb +88 -0
  81. data/lib/facebooker/rails/utilities.rb +22 -0
  82. data/lib/facebooker/server_cache.rb +24 -0
  83. data/lib/facebooker/service.rb +31 -0
  84. data/lib/facebooker/session.rb +564 -0
  85. data/lib/facebooker/version.rb +9 -0
  86. data/lib/facebooker.rb +143 -0
  87. data/lib/net/http_multipart_post.rb +123 -0
  88. data/lib/tasks/facebooker.rake +18 -0
  89. data/lib/tasks/tunnel.rake +46 -0
  90. data/rails/init.rb +1 -0
  91. data/setup.rb +1585 -0
  92. data/templates/layout.erb +24 -0
  93. data/test/adapters_test.rb +98 -0
  94. data/test/batch_request_test.rb +82 -0
  95. data/test/event_test.rb +15 -0
  96. data/test/facebook_admin_test.rb +75 -0
  97. data/test/facebook_cache_test.rb +43 -0
  98. data/test/facebook_data_test.rb +84 -0
  99. data/test/facebooker_test.rb +855 -0
  100. data/test/fixtures/multipart_post_body_with_only_parameters.txt +33 -0
  101. data/test/fixtures/multipart_post_body_with_single_file.txt +38 -0
  102. data/test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt +38 -0
  103. data/test/http_multipart_post_test.rb +54 -0
  104. data/test/logging_test.rb +43 -0
  105. data/test/model_test.rb +91 -0
  106. data/test/publisher_test.rb +436 -0
  107. data/test/rails_integration_test.rb +1126 -0
  108. data/test/session_test.rb +587 -0
  109. data/test/test_helper.rb +60 -0
  110. data/test/user_test.rb +229 -0
  111. metadata +181 -0
@@ -0,0 +1,246 @@
1
+ require 'facebooker'
2
+ require 'facebooker/rails/profile_publisher_extensions'
3
+ module Facebooker
4
+ module Rails
5
+ module Controller
6
+ include Facebooker::Rails::ProfilePublisherExtensions
7
+ def self.included(controller)
8
+ controller.extend(ClassMethods)
9
+ controller.before_filter :set_adapter
10
+ controller.before_filter :set_fbml_format
11
+ controller.helper_attr :facebook_session_parameters
12
+ controller.helper_method :request_comes_from_facebook?
13
+ end
14
+
15
+
16
+ def facebook_session
17
+ @facebook_session
18
+ end
19
+
20
+ def facebook_session_parameters
21
+ {:fb_sig_session_key=>params[:fb_sig_session_key]}
22
+ end
23
+
24
+
25
+ def set_facebook_session
26
+
27
+ returning session_set = session_already_secured? || secure_with_facebook_params! ||secure_with_token! do
28
+ if session_set
29
+ capture_facebook_friends_if_available!
30
+ Session.current = facebook_session
31
+ end
32
+ end
33
+ end
34
+
35
+ def facebook_params
36
+ @facebook_params ||= verified_facebook_params
37
+ end
38
+
39
+ def redirect_to(*args)
40
+ if request_is_for_a_facebook_canvas? and !request_is_facebook_tab?
41
+ render :text => fbml_redirect_tag(*args)
42
+ else
43
+ super
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def session_already_secured?
50
+ (@facebook_session = session[:facebook_session]) && session[:facebook_session].secured? if valid_session_key_in_session?
51
+ end
52
+
53
+ def user_has_deauthorized_application?
54
+ # if we're inside the facebook session and there is no session key,
55
+ # that means the user revoked our access
56
+ # we don't want to keep using the old expired key from the cookie.
57
+ request_comes_from_facebook? and params[:fb_sig_session_key].blank?
58
+ end
59
+
60
+ def clear_facebook_session_information
61
+ session[:facebook_session] = nil
62
+ @facebook_session=nil
63
+ end
64
+
65
+ def valid_session_key_in_session?
66
+ #before we access the facebook_params, make sure we have the parameters
67
+ #otherwise we will blow up trying to access the secure parameters
68
+ if user_has_deauthorized_application?
69
+ clear_facebook_session_information
70
+ false
71
+ else
72
+ !session[:facebook_session].blank? && (params[:fb_sig_session_key].blank? || session[:facebook_session].session_key == facebook_params[:session_key])
73
+ end
74
+ end
75
+
76
+ def secure_with_token!
77
+ if params['auth_token']
78
+ @facebook_session = new_facebook_session
79
+ @facebook_session.auth_token = params['auth_token']
80
+ @facebook_session.secure!
81
+ session[:facebook_session] = @facebook_session
82
+ end
83
+ end
84
+
85
+ def secure_with_facebook_params!
86
+ return unless request_comes_from_facebook?
87
+
88
+ if ['user', 'session_key'].all? {|element| facebook_params[element]}
89
+ @facebook_session = new_facebook_session
90
+ @facebook_session.secure_with!(facebook_params['session_key'], facebook_params['user'], facebook_params['expires'])
91
+ session[:facebook_session] = @facebook_session
92
+ end
93
+ end
94
+
95
+ #override to specify where the user should be sent after logging in
96
+ def after_facebook_login_url
97
+ nil
98
+ end
99
+
100
+ def create_new_facebook_session_and_redirect!
101
+ session[:facebook_session] = new_facebook_session
102
+ url_params = after_facebook_login_url.nil? ? {} : {:next=>after_facebook_login_url}
103
+ redirect_to session[:facebook_session].login_url(url_params) unless @installation_required
104
+ false
105
+ end
106
+
107
+ def new_facebook_session
108
+ Facebooker::Session.create(Facebooker.api_key, Facebooker.secret_key)
109
+ end
110
+
111
+ def capture_facebook_friends_if_available!
112
+ return unless request_comes_from_facebook?
113
+ if friends = facebook_params['friends']
114
+ facebook_session.user.friends = friends.map do |friend_uid|
115
+ User.new(friend_uid, facebook_session)
116
+ end
117
+ end
118
+ end
119
+
120
+ def blank?(value)
121
+ (value == '0' || value.nil? || value == '')
122
+ end
123
+
124
+ def verified_facebook_params
125
+ facebook_sig_params = params.inject({}) do |collection, pair|
126
+ collection[pair.first.sub(/^fb_sig_/, '')] = pair.last if pair.first[0,7] == 'fb_sig_'
127
+ collection
128
+ end
129
+ verify_signature(facebook_sig_params,params['fb_sig'])
130
+
131
+ facebook_sig_params.inject(HashWithIndifferentAccess.new) do |collection, pair|
132
+ collection[pair.first] = facebook_parameter_conversions[pair.first].call(pair.last)
133
+ collection
134
+ end
135
+ end
136
+
137
+ def earliest_valid_session
138
+ 48.hours.ago
139
+ end
140
+
141
+ def verify_signature(facebook_sig_params,expected_signature)
142
+ raw_string = facebook_sig_params.map{ |*args| args.join('=') }.sort.join
143
+ actual_sig = Digest::MD5.hexdigest([raw_string, Facebooker::Session.secret_key].join)
144
+ raise Facebooker::Session::IncorrectSignature if actual_sig != expected_signature
145
+ raise Facebooker::Session::SignatureTooOld if Time.at(facebook_sig_params['time'].to_f) < earliest_valid_session
146
+ true
147
+ end
148
+
149
+ def facebook_parameter_conversions
150
+ @facebook_parameter_conversions ||= Hash.new do |hash, key|
151
+ lambda{|value| value}
152
+ end.merge(
153
+ 'time' => lambda{|value| Time.at(value.to_f)},
154
+ 'in_canvas' => lambda{|value| !blank?(value)},
155
+ 'added' => lambda{|value| !blank?(value)},
156
+ 'expires' => lambda{|value| blank?(value) ? nil : Time.at(value.to_f)},
157
+ 'friends' => lambda{|value| value.split(/,/)}
158
+ )
159
+ end
160
+
161
+ def fbml_redirect_tag(url)
162
+ "<fb:redirect url=\"#{url_for(url)}\" />"
163
+ end
164
+
165
+ def request_comes_from_facebook?
166
+ request_is_for_a_facebook_canvas? || request_is_facebook_ajax?
167
+ end
168
+
169
+ def request_is_for_a_facebook_canvas?
170
+ !params['fb_sig_in_canvas'].blank?
171
+ end
172
+
173
+ def request_is_facebook_tab?
174
+ !params["fb_sig_in_profile_tab"].blank?
175
+ end
176
+
177
+ def request_is_facebook_ajax?
178
+ params["fb_sig_is_mockajax"]=="1" || params["fb_sig_is_ajax"]=="1"
179
+ end
180
+ def xml_http_request?
181
+ request_is_facebook_ajax? || super
182
+ end
183
+
184
+
185
+
186
+ def application_is_installed?
187
+ facebook_params['added']
188
+ end
189
+
190
+ def ensure_has_status_update
191
+ has_extended_permission?("status_update") || application_needs_permission("status_update")
192
+ end
193
+ def ensure_has_photo_upload
194
+ has_extended_permission?("photo_upload") || application_needs_permission("photo_upload")
195
+ end
196
+ def ensure_has_create_listing
197
+ has_extended_permission?("create_listing") || application_needs_permission("create_listing")
198
+ end
199
+
200
+ def application_needs_permission(perm)
201
+ redirect_to(facebook_session.permission_url(perm))
202
+ end
203
+
204
+ def has_extended_permission?(perm)
205
+ params["fb_sig_ext_perms"] and params["fb_sig_ext_perms"].include?(perm)
206
+ end
207
+
208
+ def ensure_authenticated_to_facebook
209
+ set_facebook_session || create_new_facebook_session_and_redirect!
210
+ end
211
+
212
+ def ensure_application_is_installed_by_facebook_user
213
+ @installation_required = true
214
+ returning ensure_authenticated_to_facebook && application_is_installed? do |authenticated_and_installed|
215
+ application_is_not_installed_by_facebook_user unless authenticated_and_installed
216
+ end
217
+ end
218
+
219
+ def application_is_not_installed_by_facebook_user
220
+ redirect_to session[:facebook_session].install_url
221
+ end
222
+
223
+ def set_fbml_format
224
+ params[:format]="fbml" if request_comes_from_facebook?
225
+ end
226
+ def set_adapter
227
+ Facebooker.load_adapter(params) if(params[:fb_sig_api_key])
228
+ end
229
+
230
+
231
+ module ClassMethods
232
+ #
233
+ # Creates a filter which reqires a user to have already authenticated to
234
+ # Facebook before executing actions. Accepts the same optional options hash which
235
+ # before_filter and after_filter accept.
236
+ def ensure_authenticated_to_facebook(options = {})
237
+ before_filter :ensure_authenticated_to_facebook, options
238
+ end
239
+
240
+ def ensure_application_is_installed_by_facebook_user(options = {})
241
+ before_filter :ensure_application_is_installed_by_facebook_user, options
242
+ end
243
+ end
244
+ end
245
+ end
246
+ end
@@ -0,0 +1,18 @@
1
+ # module ActionView
2
+ # module Helpers
3
+ # module AssetTagHelper
4
+ # def compute_public_path_with_facebooker(*args)
5
+ # public_path=compute_public_path_without_facebooker(*args)
6
+ # if public_path.starts_with?(ActionController::Base.asset_host)
7
+ # str=ActionController::Base.asset_host
8
+ # str += "/" unless str.ends_with?("/")
9
+ # public_path.gsub(/#{Regexp.escape(ActionController::Base.asset_host)}#{@controller.request.relative_url_root}\//,str)
10
+ # else
11
+ # public_path
12
+ # end
13
+ # end
14
+ #
15
+ # alias_method_chain :compute_public_path, :facebooker
16
+ # end
17
+ # end
18
+ # end
@@ -0,0 +1,112 @@
1
+ module Facebooker
2
+ module Rails
3
+ class FacebookFormBuilder < ActionView::Helpers::FormBuilder
4
+
5
+
6
+ second_param = %w(password_field file_field check_box date_select datetime_select time_select)
7
+ third_param = %w(radio_button country_select select time_zone_select)
8
+ fifth_param = %w(collection_select)
9
+
10
+ def self.create_with_offset(name,offset)
11
+ define_method name do |field,*args|
12
+ options = args[offset] || {}
13
+ build_shell(field,options) do
14
+ super
15
+ end
16
+ end
17
+ end
18
+
19
+ second_param.each do |name|
20
+ create_with_offset(name,0)
21
+ end
22
+ third_param.each do |name|
23
+ create_with_offset(name,1)
24
+ end
25
+ fifth_param.each do |name|
26
+ create_with_offset(name,3)
27
+ end
28
+
29
+ def build_shell(field,options)
30
+ @template.content_tag "fb:editor-custom", :label=>label_for(field,options) do
31
+ yield
32
+ end
33
+ end
34
+
35
+ def label_for(field,options)
36
+ options[:label] || field.to_s.humanize
37
+ end
38
+
39
+ def text(string,options={})
40
+ @template.content_tag "fb:editor-custom",string, :label=>label_for("",options)
41
+ end
42
+
43
+
44
+ def text_field(method, options = {})
45
+ options[:label] ||= label_for(method,options)
46
+ add_default_name_and_id(options,method)
47
+ options["value"] ||= value_before_type_cast(object,method)
48
+ @template.content_tag("fb:editor-text","",options)
49
+ end
50
+
51
+
52
+ def text_area(method, options = {})
53
+ options[:label] ||= label_for(method,options)
54
+ add_default_name_and_id(options,method)
55
+ @template.content_tag("fb:editor-textarea",value_before_type_cast(object,method),options)
56
+ end
57
+
58
+ #
59
+ # Build a text input area that uses typeahed
60
+ # options are like collection_select
61
+ def collection_typeahead(method,collection,value_method,text_method,options={})
62
+ build_shell(method,options) do
63
+ collection_typeahead_internal(method,collection,value_method,text_method,options)
64
+ end
65
+ end
66
+
67
+ def collection_typeahead_internal(method,collection,value_method,text_method,options={})
68
+ option_values = collection.map do |item|
69
+ value=item.send(value_method)
70
+ text=item.send(text_method)
71
+ @template.content_tag "fb:typeahead-option",text,:value=>value
72
+ end.join
73
+ add_default_name_and_id(options,method)
74
+ options["value"] ||= value_before_type_cast(object,method)
75
+ @template.content_tag("fb:typeahead-input",option_values,options)
76
+ end
77
+
78
+ def value_before_type_cast(object,method)
79
+ unless object.nil?
80
+ method_name = method.to_s
81
+ object.respond_to?(method_name + "_before_type_cast") ?
82
+ object.send(method_name + "_before_type_cast") :
83
+ object.send(method_name)
84
+ end
85
+ end
86
+
87
+ def multi_friend_input(options={})
88
+ build_shell(:friends,options) do
89
+ @template.content_tag("fb:multi-friend-input","",options)
90
+ end
91
+ end
92
+
93
+ def buttons(*names)
94
+ buttons=names.map do |name|
95
+ create_button(name)
96
+ end.join
97
+
98
+ @template.content_tag "fb:editor-buttonset",buttons
99
+ end
100
+
101
+ def create_button(name)
102
+ @template.content_tag("fb:editor-button","",:value=>name,:name=>"commit")
103
+ end
104
+
105
+ def add_default_name_and_id(options,method)
106
+ options[:name] ||= "#{object.class.name.underscore}[#{method}]"
107
+ options[:id] ||= "#{object.class.name.underscore}_#{method}"
108
+ end
109
+
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,14 @@
1
+ if Facebooker.facebooker_config['pretty_errors'] || (Facebooker.facebooker_config['pretty_errors'].nil? && RAILS_ENV=="development")
2
+ class ActionController::Base
3
+ def rescues_path_with_facebooker(template_name)
4
+ t="#{RAILS_ROOT}/vendor/plugins/facebooker/templates/#{template_name}.erb"
5
+ File.exist?(t) ? t : rescues_path_without_facebooker(template_name)
6
+ end
7
+
8
+ alias_method_chain :rescues_path,:facebooker
9
+
10
+ def response_code_for_rescue(exception)
11
+ 200
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ module ::ActionController
2
+ class AbstractRequest
3
+ def request_method_with_facebooker
4
+ if parameters[:fb_sig_request_method]=="GET" and parameters[:_method].blank?
5
+ parameters[:_method]="GET"
6
+ end
7
+ request_method_without_facebooker
8
+ end
9
+
10
+ if new.methods.include?("request_method")
11
+ alias_method_chain :request_method, :facebooker
12
+ end
13
+
14
+ def xml_http_request_with_facebooker?
15
+ parameters["fb_sig_is_mockajax"] == "1" ||
16
+ parameters["fb_sig_is_ajax"] == "1" ||
17
+ xml_http_request_without_facebooker?
18
+ end
19
+ alias_method_chain :xml_http_request?, :facebooker
20
+ # we have to re-alias xhr? since it was pointing to the old method
21
+ alias xhr? :xml_http_request?
22
+
23
+ end
24
+ end
@@ -0,0 +1,69 @@
1
+ module ActionController
2
+ class CgiRequest
3
+ alias :initialize_aliased_by_facebooker :initialize
4
+
5
+ def initialize(cgi, session_options = {})
6
+ initialize_aliased_by_facebooker(cgi, session_options)
7
+ @cgi.instance_variable_set("@request_params", request_parameters.merge(query_parameters))
8
+ end
9
+
10
+ DEFAULT_SESSION_OPTIONS[:cookie_only] = false
11
+ end
12
+ end
13
+
14
+ module ActionController
15
+ class RackRequest < AbstractRequest #:nodoc:
16
+ alias :initialize_aliased_by_facebooker :initialize
17
+
18
+ def initialize(cgi, session_options = {})
19
+ initialize_aliased_by_facebooker(cgi, session_options)
20
+ @cgi.instance_variable_set("@request_params", request_parameters.merge(query_parameters))
21
+ end
22
+ end
23
+ end
24
+
25
+ class CGI
26
+ class Session
27
+ private
28
+ alias :initialize_aliased_by_facebooker :initialize
29
+ attr_reader :request, :initialization_options
30
+
31
+ def initialize(request, option={})
32
+ @request = request
33
+ @initialization_options = option
34
+ option['session_id'] = set_session_id
35
+ initialize_aliased_by_facebooker(request, option)
36
+ end
37
+
38
+ def set_session_id
39
+ if session_key_should_be_set_with_facebook_session_key?
40
+ request_parameters[facebook_session_key]
41
+ else
42
+ request_parameters[session_key]
43
+ end
44
+ end
45
+
46
+ def request_parameters
47
+ request.instance_variable_get("@request_params")
48
+ end
49
+
50
+ def session_key_should_be_set_with_facebook_session_key?
51
+ request_parameters[session_key].blank? && !request_parameters[facebook_session_key].blank?
52
+ end
53
+
54
+ def session_key
55
+ initialization_options['session_key'] || '_session_id'
56
+ end
57
+
58
+ def facebook_session_key
59
+ 'fb_sig_session_key'
60
+ end
61
+
62
+ alias :create_new_id_aliased_by_facebooker :create_new_id
63
+
64
+ def create_new_id
65
+ @new_session = true
66
+ @session_id || create_new_id_aliased_by_facebooker
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,39 @@
1
+ module ::ActionController
2
+ class AbstractRequest
3
+ def relative_url_root
4
+ Facebooker.path_prefix
5
+ end
6
+ end
7
+
8
+ class Base
9
+ def self.relative_url_root
10
+ Facebooker.path_prefix
11
+ end
12
+ end
13
+
14
+ class UrlRewriter
15
+ RESERVED_OPTIONS << :canvas
16
+ def link_to_new_canvas?
17
+ @request.parameters["fb_sig_in_new_facebook"] == "1"
18
+ end
19
+ def link_to_canvas?(params, options)
20
+ option_override = options[:canvas]
21
+ return false if option_override == false # important to check for false. nil should use default behavior
22
+ option_override || @request.parameters["fb_sig_in_canvas"] == "1" || @request.parameters[:fb_sig_in_canvas] == "1"
23
+ end
24
+
25
+ def rewrite_url_with_facebooker(*args)
26
+ options = args.first.is_a?(Hash) ? args.first : args.last
27
+ is_link_to_canvas = link_to_canvas?(@request.request_parameters, options)
28
+ if is_link_to_canvas && !options.has_key?(:host)
29
+ options[:host] = Facebooker.canvas_server_base
30
+ end
31
+ options.delete(:canvas)
32
+ Facebooker.request_for_canvas(is_link_to_canvas) do
33
+ rewrite_url_without_facebooker(*args)
34
+ end
35
+ end
36
+
37
+ alias_method_chain :rewrite_url, :facebooker
38
+ end
39
+ end