taweili-facebooker 1.0.37
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/.autotest +15 -0
- data/CHANGELOG.rdoc +24 -0
- data/COPYING.rdoc +19 -0
- data/Manifest.txt +133 -0
- data/README.rdoc +104 -0
- data/Rakefile +85 -0
- data/TODO.rdoc +4 -0
- data/examples/desktop_login.rb +14 -0
- data/facebooker.gemspec +38 -0
- data/generators/facebook/facebook_generator.rb +14 -0
- data/generators/facebook/templates/config/facebooker.yml +49 -0
- data/generators/facebook/templates/public/javascripts/facebooker.js +83 -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/generators/xd_receiver/templates/xd_receiver.html +10 -0
- data/generators/xd_receiver/xd_receiver_generator.rb +10 -0
- data/init.rb +25 -0
- data/install.rb +12 -0
- data/lib/facebooker/adapters/adapter_base.rb +91 -0
- data/lib/facebooker/adapters/bebo_adapter.rb +77 -0
- data/lib/facebooker/adapters/facebook_adapter.rb +52 -0
- data/lib/facebooker/admin.rb +42 -0
- data/lib/facebooker/batch_request.rb +45 -0
- data/lib/facebooker/data.rb +57 -0
- data/lib/facebooker/feed.rb +78 -0
- data/lib/facebooker/logging.rb +44 -0
- data/lib/facebooker/mobile.rb +20 -0
- data/lib/facebooker/mock/service.rb +50 -0
- data/lib/facebooker/mock/session.rb +18 -0
- data/lib/facebooker/model.rb +139 -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/applicationrestrictions.rb +10 -0
- data/lib/facebooker/models/cookie.rb +10 -0
- data/lib/facebooker/models/education_info.rb +11 -0
- data/lib/facebooker/models/event.rb +28 -0
- data/lib/facebooker/models/friend_list.rb +16 -0
- data/lib/facebooker/models/group.rb +36 -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 +28 -0
- data/lib/facebooker/models/photo.rb +19 -0
- data/lib/facebooker/models/tag.rb +12 -0
- data/lib/facebooker/models/user.rb +497 -0
- data/lib/facebooker/models/video.rb +9 -0
- data/lib/facebooker/models/work_info.rb +10 -0
- data/lib/facebooker/parser.rb +650 -0
- data/lib/facebooker/rails/backwards_compatible_param_checks.rb +31 -0
- data/lib/facebooker/rails/controller.rb +337 -0
- data/lib/facebooker/rails/cucumber/world.rb +46 -0
- data/lib/facebooker/rails/cucumber.rb +28 -0
- data/lib/facebooker/rails/extensions/action_controller.rb +48 -0
- data/lib/facebooker/rails/extensions/rack_setup.rb +6 -0
- data/lib/facebooker/rails/extensions/routing.rb +15 -0
- data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
- data/lib/facebooker/rails/facebook_pretty_errors.rb +22 -0
- data/lib/facebooker/rails/facebook_request_fix.rb +30 -0
- data/lib/facebooker/rails/facebook_request_fix_2-3.rb +31 -0
- data/lib/facebooker/rails/facebook_session_handling.rb +68 -0
- data/lib/facebooker/rails/facebook_url_helper.rb +192 -0
- data/lib/facebooker/rails/facebook_url_rewriting.rb +60 -0
- data/lib/facebooker/rails/helpers/fb_connect.rb +118 -0
- data/lib/facebooker/rails/helpers.rb +780 -0
- data/lib/facebooker/rails/integration_session.rb +38 -0
- data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
- data/lib/facebooker/rails/publisher.rb +554 -0
- data/lib/facebooker/rails/routing.rb +49 -0
- data/lib/facebooker/rails/test_helpers.rb +68 -0
- data/lib/facebooker/rails/utilities.rb +22 -0
- data/lib/facebooker/server_cache.rb +24 -0
- data/lib/facebooker/service.rb +102 -0
- data/lib/facebooker/session.rb +606 -0
- data/lib/facebooker/version.rb +9 -0
- data/lib/facebooker.rb +180 -0
- data/lib/net/http_multipart_post.rb +123 -0
- data/lib/rack/facebook.rb +77 -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/facebooker/adapters_test.rb +96 -0
- data/test/facebooker/admin_test.rb +102 -0
- data/test/facebooker/batch_request_test.rb +83 -0
- data/test/facebooker/data_test.rb +86 -0
- data/test/facebooker/logging_test.rb +43 -0
- data/test/facebooker/mobile_test.rb +45 -0
- data/test/facebooker/model_test.rb +133 -0
- data/test/facebooker/models/event_test.rb +15 -0
- data/test/facebooker/models/photo_test.rb +16 -0
- data/test/facebooker/models/user_test.rb +343 -0
- data/test/facebooker/rails/facebook_request_fix_2-3_test.rb +24 -0
- data/test/facebooker/rails/facebook_url_rewriting_test.rb +39 -0
- data/test/facebooker/rails/publisher_test.rb +481 -0
- data/test/facebooker/rails_integration_test.rb +1398 -0
- data/test/facebooker/server_cache_test.rb +44 -0
- data/test/facebooker/session_test.rb +614 -0
- data/test/facebooker_test.rb +951 -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/net/http_multipart_post_test.rb +52 -0
- data/test/rack/facebook_test.rb +61 -0
- data/test/rails_test_helper.rb +27 -0
- data/test/test_helper.rb +74 -0
- metadata +232 -0
@@ -0,0 +1,68 @@
|
|
1
|
+
module Facebooker
|
2
|
+
module Rails
|
3
|
+
module TestHelpers
|
4
|
+
def assert_facebook_redirect_to(url)
|
5
|
+
assert_response :success
|
6
|
+
assert_not_nil facebook_redirect_url
|
7
|
+
assert_equal url, facebook_redirect_url
|
8
|
+
end
|
9
|
+
|
10
|
+
def follow_facebook_redirect!
|
11
|
+
facebook_post facebook_redirect_url
|
12
|
+
end
|
13
|
+
|
14
|
+
def facebook_get(path,params={})
|
15
|
+
facebook_verb(:get,path,params)
|
16
|
+
end
|
17
|
+
|
18
|
+
def facebook_post(path,params={})
|
19
|
+
facebook_verb(:post,path,params)
|
20
|
+
end
|
21
|
+
|
22
|
+
def facebook_put(path,params={})
|
23
|
+
facebook_verb(:put,path,params)
|
24
|
+
end
|
25
|
+
|
26
|
+
def facebook_delete(path,params={})
|
27
|
+
facebook_verb(:delete,path,params)
|
28
|
+
end
|
29
|
+
|
30
|
+
def facebook_verb(verb,path, params={})
|
31
|
+
send verb, path, facebook_params(params).reverse_merge(:canvas => true)
|
32
|
+
end
|
33
|
+
|
34
|
+
def facebook_params(params = {})
|
35
|
+
params = default_facebook_parameters.with_indifferent_access.merge(params || {})
|
36
|
+
sig = generate_signature params
|
37
|
+
params.merge(:fb_sig => sig)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def default_facebook_parameters
|
43
|
+
{
|
44
|
+
:fb_sig_added => "1",
|
45
|
+
:fb_sig_session_key => "facebook_session_key",
|
46
|
+
:fb_sig_user => "1234",
|
47
|
+
:fb_sig_expires => "0",
|
48
|
+
:fb_sig_in_canvas => "1",
|
49
|
+
:fb_sig_time => Time.now.to_f
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
def facebook_redirect_url
|
54
|
+
match = @response.body.match(/<fb:redirect url="([^"]+)"/)
|
55
|
+
match.nil? ? nil : match.captures[0]
|
56
|
+
end
|
57
|
+
|
58
|
+
def generate_signature(params)
|
59
|
+
facebook_params = params.select { |param,_| param =~ /^fb_sig_/ }.map do |param, value|
|
60
|
+
[param.sub(/^fb_sig_/, ''), value].join('=')
|
61
|
+
end
|
62
|
+
Digest::MD5.hexdigest([facebook_params.sort.join, Facebooker::Session.secret_key].join)
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Facebooker
|
2
|
+
module Rails
|
3
|
+
class Utilities
|
4
|
+
class << self
|
5
|
+
def refresh_all_images(session)
|
6
|
+
Dir.glob(File.join(RAILS_ROOT,"public","images","*.{png,jpg,gif}")).each do |img|
|
7
|
+
refresh_image(session,img)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def refresh_image(session,full_path)
|
12
|
+
basename=File.basename(full_path)
|
13
|
+
base_path=ActionController::Base.asset_host
|
14
|
+
base_path += "/" unless base_path.ends_with?("/")
|
15
|
+
image_path=base_path+"images/#{basename}"
|
16
|
+
puts "refreshing: #{image_path}"
|
17
|
+
session.server_cache.refresh_img_src(image_path)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Facebooker
|
2
|
+
class ServerCache
|
3
|
+
def initialize(session)
|
4
|
+
@session = session
|
5
|
+
end
|
6
|
+
|
7
|
+
#
|
8
|
+
# Stores an FBML reference on the server for use
|
9
|
+
# across multiple users in FBML
|
10
|
+
def set_ref_handle(handle_name, fbml_source)
|
11
|
+
(@session.post 'facebook.fbml.setRefHandle', {:handle => handle_name, :fbml => fbml_source},false) == '1'
|
12
|
+
end
|
13
|
+
|
14
|
+
##
|
15
|
+
# Fetches and re-caches the content stored at the given URL, for use in a fb:ref FBML tag.
|
16
|
+
def refresh_ref_url(url)
|
17
|
+
(@session.post 'facebook.fbml.refreshRefUrl', {:url => url},false) == '1'
|
18
|
+
end
|
19
|
+
|
20
|
+
def refresh_img_src(url)
|
21
|
+
(@session.post 'facebook.fbml.refreshImgSrc', {:url => url},false) == '1'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
begin
|
2
|
+
require 'curb'
|
3
|
+
Facebooker.use_curl = true
|
4
|
+
rescue LoadError
|
5
|
+
require 'net/http'
|
6
|
+
end
|
7
|
+
require 'facebooker/parser'
|
8
|
+
module Facebooker
|
9
|
+
class Service
|
10
|
+
def initialize(api_base, api_path, api_key)
|
11
|
+
@api_base = api_base
|
12
|
+
@api_path = api_path
|
13
|
+
@api_key = api_key
|
14
|
+
end
|
15
|
+
|
16
|
+
# TODO: support ssl
|
17
|
+
def post(params)
|
18
|
+
attempt = 0
|
19
|
+
Parser.parse(params[:method], post_form(url,params) )
|
20
|
+
rescue Errno::ECONNRESET, EOFError
|
21
|
+
if attempt == 0
|
22
|
+
attempt += 1
|
23
|
+
retry
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
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
|
50
|
+
end
|
51
|
+
|
52
|
+
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
|
58
|
+
end
|
59
|
+
|
60
|
+
def post_multipart_form_with_net_http(url,params)
|
61
|
+
Net::HTTP.post_multipart_form(url, params)
|
62
|
+
end
|
63
|
+
|
64
|
+
def post_file(params)
|
65
|
+
service_url = url(params.delete(:base))
|
66
|
+
result = post_multipart_form(service_url, params)
|
67
|
+
Parser.parse(params[:method], result)
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
def url(base = nil)
|
72
|
+
base ||= @api_base
|
73
|
+
URI.parse('http://'+ base + @api_path)
|
74
|
+
end
|
75
|
+
|
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
|
+
end
|
102
|
+
end
|