facebooker2 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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