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.
- data/CHANGELOG.txt +0 -0
- data/COPYING +19 -0
- data/History.txt +16 -0
- data/Manifest.txt +110 -0
- data/README +46 -0
- data/README.txt +81 -0
- data/Rakefile +76 -0
- data/TODO.txt +10 -0
- data/generators/facebook/facebook_generator.rb +14 -0
- data/generators/facebook/templates/config/facebooker.yml +41 -0
- data/generators/facebook/templates/public/javascripts/facebooker.js +106 -0
- data/generators/facebook_controller/USAGE +33 -0
- data/generators/facebook_controller/facebook_controller_generator.rb +40 -0
- data/generators/facebook_controller/templates/controller.rb +7 -0
- data/generators/facebook_controller/templates/functional_test.rb +11 -0
- data/generators/facebook_controller/templates/helper.rb +2 -0
- data/generators/facebook_controller/templates/view.fbml.erb +2 -0
- data/generators/facebook_controller/templates/view.html.erb +2 -0
- data/generators/facebook_publisher/facebook_publisher_generator.rb +14 -0
- data/generators/facebook_publisher/templates/create_facebook_templates.rb +15 -0
- data/generators/facebook_publisher/templates/publisher.rb +3 -0
- data/generators/facebook_scaffold/USAGE +27 -0
- data/generators/facebook_scaffold/facebook_scaffold_generator.rb +118 -0
- data/generators/facebook_scaffold/templates/controller.rb +93 -0
- data/generators/facebook_scaffold/templates/facebook_style.css +2579 -0
- data/generators/facebook_scaffold/templates/functional_test.rb +89 -0
- data/generators/facebook_scaffold/templates/helper.rb +2 -0
- data/generators/facebook_scaffold/templates/layout.fbml.erb +6 -0
- data/generators/facebook_scaffold/templates/layout.html.erb +17 -0
- data/generators/facebook_scaffold/templates/style.css +74 -0
- data/generators/facebook_scaffold/templates/view_edit.fbml.erb +13 -0
- data/generators/facebook_scaffold/templates/view_edit.html.erb +18 -0
- data/generators/facebook_scaffold/templates/view_index.fbml.erb +24 -0
- data/generators/facebook_scaffold/templates/view_index.html.erb +24 -0
- data/generators/facebook_scaffold/templates/view_new.fbml.erb +12 -0
- data/generators/facebook_scaffold/templates/view_new.html.erb +17 -0
- data/generators/facebook_scaffold/templates/view_show.fbml.erb +10 -0
- data/generators/facebook_scaffold/templates/view_show.html.erb +10 -0
- data/generators/publisher/publisher_generator.rb +14 -0
- data/init.rb +54 -0
- data/install.rb +12 -0
- data/lib/facebooker/adapters/adapter_base.rb +87 -0
- data/lib/facebooker/adapters/bebo_adapter.rb +73 -0
- data/lib/facebooker/adapters/facebook_adapter.rb +48 -0
- data/lib/facebooker/admin.rb +28 -0
- data/lib/facebooker/batch_request.rb +44 -0
- data/lib/facebooker/data.rb +57 -0
- data/lib/facebooker/feed.rb +78 -0
- data/lib/facebooker/logging.rb +51 -0
- data/lib/facebooker/model.rb +123 -0
- data/lib/facebooker/models/affiliation.rb +10 -0
- data/lib/facebooker/models/album.rb +11 -0
- data/lib/facebooker/models/applicationproperties.rb +39 -0
- data/lib/facebooker/models/cookie.rb +10 -0
- data/lib/facebooker/models/education_info.rb +11 -0
- data/lib/facebooker/models/event.rb +26 -0
- data/lib/facebooker/models/friend_list.rb +14 -0
- data/lib/facebooker/models/group.rb +35 -0
- data/lib/facebooker/models/info_item.rb +10 -0
- data/lib/facebooker/models/info_section.rb +10 -0
- data/lib/facebooker/models/location.rb +8 -0
- data/lib/facebooker/models/notifications.rb +17 -0
- data/lib/facebooker/models/page.rb +27 -0
- data/lib/facebooker/models/photo.rb +10 -0
- data/lib/facebooker/models/tag.rb +12 -0
- data/lib/facebooker/models/user.rb +352 -0
- data/lib/facebooker/models/work_info.rb +9 -0
- data/lib/facebooker/parser.rb +540 -0
- data/lib/facebooker/rails/controller.rb +246 -0
- data/lib/facebooker/rails/facebook_asset_path.rb +18 -0
- data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
- data/lib/facebooker/rails/facebook_pretty_errors.rb +14 -0
- data/lib/facebooker/rails/facebook_request_fix.rb +24 -0
- data/lib/facebooker/rails/facebook_session_handling.rb +69 -0
- data/lib/facebooker/rails/facebook_url_rewriting.rb +39 -0
- data/lib/facebooker/rails/helpers.rb +615 -0
- data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
- data/lib/facebooker/rails/publisher.rb +492 -0
- data/lib/facebooker/rails/routing.rb +49 -0
- data/lib/facebooker/rails/test_helpers.rb +88 -0
- data/lib/facebooker/rails/utilities.rb +22 -0
- data/lib/facebooker/server_cache.rb +24 -0
- data/lib/facebooker/service.rb +31 -0
- data/lib/facebooker/session.rb +564 -0
- data/lib/facebooker/version.rb +9 -0
- data/lib/facebooker.rb +143 -0
- data/lib/net/http_multipart_post.rb +123 -0
- data/lib/tasks/facebooker.rake +18 -0
- data/lib/tasks/tunnel.rake +46 -0
- data/rails/init.rb +1 -0
- data/setup.rb +1585 -0
- data/templates/layout.erb +24 -0
- data/test/adapters_test.rb +98 -0
- data/test/batch_request_test.rb +82 -0
- data/test/event_test.rb +15 -0
- data/test/facebook_admin_test.rb +75 -0
- data/test/facebook_cache_test.rb +43 -0
- data/test/facebook_data_test.rb +84 -0
- data/test/facebooker_test.rb +855 -0
- data/test/fixtures/multipart_post_body_with_only_parameters.txt +33 -0
- data/test/fixtures/multipart_post_body_with_single_file.txt +38 -0
- data/test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt +38 -0
- data/test/http_multipart_post_test.rb +54 -0
- data/test/logging_test.rb +43 -0
- data/test/model_test.rb +91 -0
- data/test/publisher_test.rb +436 -0
- data/test/rails_integration_test.rb +1126 -0
- data/test/session_test.rb +587 -0
- data/test/test_helper.rb +60 -0
- data/test/user_test.rb +229 -0
- 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
|