rfacebook 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -21,22 +21,22 @@ Then, whenever a user visits
21
21
  You can get this behavior by installing the new RFacebook gem. After
22
22
  installing the gem, make your ApplicationController look like this:
23
23
 
24
- >>>>>>>>>>>> require "facebook_rails_controller_extensions"
25
- >>>>>>>>>>>>
26
- >>>>>>>>>>>> class ApplicationController < ActionController::Base
27
- >>>>>>>>>>>>
28
- >>>>>>>>>>>> # additions to integrate Facebook into controllers
29
- >>>>>>>>>>>> include RFacebook::RailsControllerExtensions
30
- >>>>>>>>>>>>
31
- >>>>>>>>>>>> def facebook_api_key
32
- >>>>>>>>>>>> return "<YOUR API KEY HERE>"
33
- >>>>>>>>>>>> end
34
- >>>>>>>>>>>>
35
- >>>>>>>>>>>> def facebook_api_secret
36
- >>>>>>>>>>>> return "<YOUR API SECRET HERE>"
37
- >>>>>>>>>>>> end
38
- >>>>>>>>>>>>
39
- >>>>>>>>>>>> end
24
+ require "facebook_rails_controller_extensions"
25
+
26
+ class ApplicationController < ActionController::Base
27
+
28
+ # additions to integrate Facebook into controllers
29
+ include RFacebook::RailsControllerExtensions
30
+
31
+ def facebook_api_key
32
+ return "YOUR API KEY HERE"
33
+ end
34
+
35
+ def facebook_api_secret
36
+ return "YOUR API SECRET HERE"
37
+ end
38
+
39
+ end
40
40
 
41
41
  You will have access to 2 new items in your controllers:
42
42
 
@@ -55,18 +55,18 @@ And, you have a few new filters to try out:
55
55
 
56
56
  For example, one of my Rails controllers looks like this:
57
57
 
58
- >>>>>>>>>>>> class FacebookController < ApplicationController
59
- >>>>>>>>>>>>
60
- >>>>>>>>>>>> before_filter :require_facebook_install # require users to install the application (less intrusive is to require_facebook_login)
61
- >>>>>>>>>>>>
62
- >>>>>>>>>>>> def index
63
- >>>>>>>>>>>> xml = fbsession.users_getInfo(:uids => [fbsession.session_user_id], :fields => ["first_name", "last_name"])
64
- >>>>>>>>>>>> @firstName = xml.at("first_name").inner_html
65
- >>>>>>>>>>>> @lastName = xml.at("last_name").inner_html
66
- >>>>>>>>>>>> end
67
- >>>>>>>>>>>>
68
- >>>>>>>>>>>>
69
- >>>>>>>>>>>> end
58
+ class FacebookController < ApplicationController
59
+
60
+ before_filter :require_facebook_install # require users to install the application (less intrusive is to require_facebook_login)
61
+
62
+ def index
63
+ xml = fbsession.users_getInfo(:uids => [fbsession.session_user_id], :fields => ["first_name", "last_name"])
64
+ @firstName = xml.at("first_name").inner_html
65
+ @lastName = xml.at("last_name").inner_html
66
+ end
67
+
68
+
69
+ end
70
70
 
71
71
 
72
72
 
@@ -9,6 +9,7 @@ module RFacebook
9
9
 
10
10
  class APIKeyNeededException < Exception; end
11
11
  class APISecretNeededException < Exception; end
12
+ class APIFinisherNeededException < Exception; end
12
13
 
13
14
  # SECTION: Template Methods (must be implemented by concrete subclass)
14
15
 
@@ -20,6 +21,10 @@ module RFacebook
20
21
  raise APISecretNeededException
21
22
  end
22
23
 
24
+ def finish_facebook_login
25
+ raise APIFinisherNeededException
26
+ end
27
+
23
28
 
24
29
 
25
30
  # SECTION: Required Methods
@@ -47,24 +52,24 @@ module RFacebook
47
52
 
48
53
  if !@fbsession
49
54
 
50
- # create a Facebook session that can be used by the controller
55
+ # create a session no matter what
51
56
  @fbsession = FacebookWebSession.new(facebook_api_key, facebook_api_secret)
52
-
53
- # now we need to activate the session somehow. If the signature parameters are bad, then we don't make the session
54
- if fbparams
55
- # these might be nil
56
- facebookUid = fbparams["user"]
57
- facebookSessionKey = fbparams["session_key"]
58
- expirationTime = fbparams["expires"]
59
57
 
60
- # Method 1: user logged in and was redirected to our site (iframe/external)
61
- if ( params["auth_token"] )
62
- @fbsession.activate_with_token(params["auth_token"])
63
- # Method 2: we have the user id and key from the fb_sig_ params
64
- elsif (facebookUid and facebookSessionKey and expirationTime)
65
- @fbsession.activate_with_previous_session(facebookSessionKey, facebookUid, expirationTime)
66
- end
67
- end
58
+ # then try to activate it somehow (or retrieve from previous state)
59
+ # these might be nil
60
+ facebookUid = fbparams["user"]
61
+ facebookSessionKey = fbparams["session_key"]
62
+ expirationTime = fbparams["expires"]
63
+
64
+ if (facebookUid and facebookSessionKey and expirationTime)
65
+ # Method 1: we have the user id and key from the fb_sig_ params
66
+ @fbsession.activate_with_previous_session(facebookSessionKey, facebookUid, expirationTime)
67
+
68
+ elsif (!in_facebook_canvas? and session[:rfacebook_fbsession])
69
+ # Method 2: we've logged in the user already
70
+ @fbsession = session[:rfacebook_fbsession]
71
+
72
+ end
68
73
 
69
74
  end
70
75
 
@@ -75,43 +80,65 @@ module RFacebook
75
80
  # SECTION: Helpful Methods
76
81
 
77
82
  def facebook_redirect_to(url)
78
-
79
- if (in_facebook_canvas? and !in_facebook_iframe?)
80
- render :text => "<fb:redirect url=\"#{url}\" />"
81
-
82
- elsif url =~ /^https?:\/\/([^\/]*\.)?facebook\.com(:\d+)?/i # TODO: why doesn't this just check for iframe?
83
- render :text => "<script type=\"text/javascript\">\ntop.location.href = \"#{url}\";\n</script>"
84
-
83
+ if in_facebook_canvas?
84
+ render :text => "<fb:redirect url=\"#{url}\" />"
85
85
  else
86
86
  redirect_to url
87
-
88
87
  end
89
-
90
88
  end
91
89
 
92
90
  def in_facebook_canvas?
93
- return (fbparams["in_fbframe"] != nil)
91
+ return (fbparams["in_canvas"] != nil)
92
+ end
93
+
94
+ def in_facebook_frame?
95
+ return (fbparams["in_iframe"] != nil || fbparams["in_canvas"] != nil)
94
96
  end
97
+
98
+ def handle_facebook_login
99
+
100
+ if (params["auth_token"] and !in_facebook_canvas?)
101
+
102
+ # create a session
103
+ session[:rfacebook_fbsession] = FacebookWebSession.new(facebook_api_key, facebook_api_secret)
104
+ session[:rfacebook_fbsession].activate_with_token(params["auth_token"])
95
105
 
96
- def in_facebook_iframe?
97
- return (fbparams["in_iframe"] != nil)
106
+ # template method call upon success
107
+ if session[:rfacebook_fbsession].is_valid?
108
+ finish_facebook_login
109
+ end
110
+
111
+ end
112
+
98
113
  end
99
114
 
100
115
  def require_facebook_login
101
- sess = fbsession
102
- if (sess and !sess.is_valid?)
103
- if in_facebook_canvas?
104
- render :text => "<fb:redirect url=\"#{sess.get_login_url(:canvas=>true)}\" />"
105
- else
106
- redirect_to sess.get_login_url
116
+
117
+ # handle a facebook login if given (external sites and iframe only)
118
+ handle_facebook_login
119
+
120
+ if !performed?
121
+ # try to get the session
122
+ sess = fbsession
123
+
124
+ # handle invalid sessions by forcing the user to log in
125
+ if !sess.is_valid?
126
+ if in_facebook_canvas?
127
+ render :text => "<fb:redirect url=\"#{sess.get_login_url(:canvas=>true)}\" />"
128
+ return false
129
+ else
130
+ redirect_to sess.get_login_url
131
+ return false
132
+ end
107
133
  end
108
134
  end
135
+
109
136
  end
110
137
 
111
138
  def require_facebook_install
112
139
  sess = fbsession
113
- if (sess and !sess.is_valid? and in_facebook_canvas?)
114
- render :text => "<fb:redirect url=\"#{sess.get_install_url(:canvas=>true)}\" />"
140
+ if (in_facebook_canvas? and !sess.is_valid?)
141
+ render :text => "<fb:redirect url=\"#{sess.get_install_url}\" />"
115
142
  end
116
143
  end
117
144
 
@@ -39,10 +39,10 @@ require "hpricot"
39
39
 
40
40
  module RFacebook
41
41
 
42
- API_SERVER_BASE_URL = "api.f8.facebook.com"
42
+ API_SERVER_BASE_URL = "api.facebook.com"
43
43
  API_PATH_REST = "/restserver.php"
44
44
 
45
- WWW_SERVER_BASE_URL = "www.f8.facebook.com"
45
+ WWW_SERVER_BASE_URL = "www.facebook.com"
46
46
  WWW_PATH_LOGIN = "/login.php"
47
47
  WWW_PATH_ADD = "/add.php"
48
48
  WWW_PATH_INSTALL = "/install.php"
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.1
3
3
  specification_version: 1
4
4
  name: rfacebook
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.6.0
7
- date: 2007-05-29 00:00:00 -07:00
6
+ version: 0.6.1
7
+ date: 2007-05-31 00:00:00 -07:00
8
8
  summary: A Ruby interface to the Facebook API v1.0+. Supports the new features from F8.
9
9
  require_paths:
10
10
  - lib