facebooker2 0.0.4 → 0.0.5

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.
@@ -1,4 +1,5 @@
1
1
  require "digest/md5"
2
+ require "hmac-sha2"
2
3
  module Facebooker2
3
4
  module Rails
4
5
  module Controller
@@ -7,31 +8,40 @@ module Facebooker2
7
8
  controller.helper Facebooker2::Rails::Helpers
8
9
  controller.helper_method :current_facebook_user
9
10
  controller.helper_method :current_facebook_client
11
+ controller.helper_method :facebook_params
10
12
  end
11
13
 
12
14
  def current_facebook_user
13
- fetch_client_and_user_from_cookie
15
+ fetch_client_and_user
14
16
  @_current_facebook_user
15
17
  end
16
18
 
17
19
  def current_facebook_client
18
- fetch_client_and_user_from_cookie
20
+ fetch_client_and_user
19
21
  @_current_facebook_client
20
22
  end
21
23
 
22
- def fetch_client_and_user_from_cookie
24
+ def fetch_client_and_user
23
25
  return if @_fb_user_fetched
26
+ fetch_client_and_user_from_cookie
27
+ fetch_client_and_user_from_signed_request unless @_current_facebook_client
28
+ @_fb_user_fetched = true
29
+ end
30
+
31
+ def fetch_client_and_user_from_cookie
24
32
  app_id = Facebooker2.app_id
25
33
  if (hash_data = fb_cookie_hash_for_app_id(app_id)) and
26
34
  fb_cookie_signature_correct?(fb_cookie_hash_for_app_id(app_id),Facebooker2.secret)
27
- client = Mogli::Client.new(hash_data["access_token"],hash_data["expires"].to_i)
28
- user = Mogli::User.new(:id=>hash_data["uid"])
29
- user.client = @_current_facebook_client
30
- fb_sign_in_user_and_client(user,client)
35
+ fb_create_user_and_client(hash_data["access_token"],hash_data["expires"],hash_data["uid"])
31
36
  end
32
- @_fb_user_fetched = true
33
37
  end
34
38
 
39
+ def fb_create_user_and_client(token,expires,userid)
40
+ client = Mogli::Client.new(token,expires.to_i)
41
+ user = Mogli::User.new(:id=>userid)
42
+ fb_sign_in_user_and_client(user,client)
43
+ end
44
+
35
45
  def fb_sign_in_user_and_client(user,client)
36
46
  user.client = client
37
47
  @_current_facebook_user = user
@@ -67,6 +77,36 @@ module Facebooker2
67
77
  test_string += secret
68
78
  Digest::MD5.hexdigest(test_string) == hash["sig"]
69
79
  end
80
+
81
+ def fb_signed_request_json(encoded)
82
+ chars_to_add = 4-(encoded.size % 4)
83
+ encoded += ("=" * chars_to_add)
84
+ Base64.decode64(encoded)
85
+ end
86
+
87
+ def facebook_params
88
+ @facebook_param ||= fb_load_facebook_params
89
+ end
90
+
91
+ def fb_load_facebook_params
92
+ return {} if params[:signed_request].blank?
93
+ sig,encoded_json = params[:signed_request].split(".")
94
+ return {} unless fb_signed_request_sig_valid?(sig,encoded_json)
95
+ ActiveSupport::JSON.decode(fb_signed_request_json(encoded_json)).with_indifferent_access
96
+ end
97
+
98
+ def fb_signed_request_sig_valid?(sig,encoded)
99
+ base64 = Base64.encode64(HMAC::SHA256.digest(Facebooker2.secret,encoded))
100
+ #now make the url changes that facebook makes
101
+ url_escaped_base64 = base64.gsub(/=*\n?$/,"").tr("+/","-_")
102
+ sig == url_escaped_base64
103
+ end
104
+
105
+ def fetch_client_and_user_from_signed_request
106
+ if facebook_params[:oauth_token]
107
+ fb_create_user_and_client(facebook_params[:oauth_token],facebook_params[:expires],facebook_params[:user_id])
108
+ end
109
+ end
70
110
  end
71
111
  end
72
112
  end
@@ -26,10 +26,10 @@ module Facebooker2
26
26
  content_tag("fb:login-button",text,options.merge(:onlogin=>js))
27
27
  end
28
28
 
29
- def fb_login(url, options = {},&proc)
30
- js = concat(&proc)
29
+ def fb_login(options = {},&proc)
30
+ js = capture(&proc)
31
31
  text = options.delete(:text)
32
- content_tag("fb:login-button",text,options.merge(:onlogin=>js))
32
+ concat(content_tag("fb:login-button",text,options.merge(:onlogin=>js)))
33
33
  end
34
34
 
35
35
  #
@@ -2,6 +2,15 @@ module Facebooker2
2
2
  module Rails
3
3
  module Helpers
4
4
  module Javascript
5
+
6
+ def fb_html_safe(str)
7
+ if str.respond_to?(:html_safe)
8
+ str.html_safe
9
+ else
10
+ str
11
+ end
12
+ end
13
+
5
14
  def fb_connect_async_js(app_id=Facebooker2.app_id,options={},&proc)
6
15
  opts = Hash.new(true).merge!(options)
7
16
  cookie = opts[:cookie]
@@ -9,7 +18,6 @@ module Facebooker2
9
18
  xfbml = opts[:xfbml]
10
19
  extra_js = capture(&proc) if block_given?
11
20
  js = <<-JAVASCRIPT
12
- <div id="fb-root"></div>
13
21
  <script>
14
22
  window.fbAsyncInit = function() {
15
23
  FB.init({
@@ -22,10 +30,13 @@ module Facebooker2
22
30
  };
23
31
 
24
32
  (function() {
33
+ var s = document.createElement('div');
34
+ s.setAttribute('id','fb-root');
35
+ document.documentElement.getElementsByTagName("body")[0].appendChild(s);
25
36
  var e = document.createElement('script');
26
37
  e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
27
38
  e.async = true;
28
- document.getElementById('fb-root').appendChild(e);
39
+ s.appendChild(e);
29
40
  }());
30
41
  </script>
31
42
  JAVASCRIPT
@@ -34,4 +45,4 @@ module Facebooker2
34
45
  end
35
46
  end
36
47
  end
37
- end
48
+ end
data/lib/facebooker2.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  # Facebooker2
2
2
  require "mogli"
3
-
4
3
  module Facebooker2
5
4
  class NotConfigured < Exception; end
6
5
  class << self
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: facebooker2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Mangino
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-05-13 00:00:00 -04:00
12
+ date: 2010-08-20 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,17 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.0.4
23
+ version: 0.0.12
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: ruby-hmac
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
24
34
  version:
25
35
  description: Facebook Connect integration library for ruby and rails
26
36
  email: mmangino@elevatedrails.com