sinatra-authentication 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ begin
6
6
 
7
7
  Jeweler::Tasks.new do |gemspec|
8
8
  gemspec.name = 'sinatra-authentication'
9
- gemspec.version = '0.0.5'
9
+ gemspec.version = '0.1.0'
10
10
  gemspec.description = "Simple authentication plugin for sinatra."
11
11
  gemspec.summary = "Simple authentication plugin for sinatra."
12
12
  gemspec.homepage = "http://github.com/maxjustus/sinatra-authentication"
@@ -17,7 +17,9 @@ begin
17
17
  gemspec.add_dependency "dm-validations"
18
18
  gemspec.add_dependency "dm-timestamps"
19
19
  gemspec.add_dependency "rufus-tokyo"
20
+ gemspec.add_dependency "sinbook"
20
21
  end
22
+ Jeweler::GemcutterTasks.new
21
23
  rescue LoadError
22
24
  puts "Jeweler (or a dependency) not available. Install it first!"
23
25
  end
@@ -2,11 +2,14 @@ class DmUser
2
2
  include DataMapper::Resource
3
3
 
4
4
  property :id, Serial
5
- property :email, String, :key => true, :nullable => false, :length => (5..40), :unique => true, :format => :email_address
5
+ property :email, String, :length => (5..40), :unique => true, :format => :email_address
6
6
  property :hashed_password, String
7
- property :salt, String, :nullable => false
7
+ property :salt, String
8
8
  property :created_at, DateTime
9
9
  property :permission_level, Integer, :default => 1
10
+ if Sinatra.const_defined?('FacebookObject')
11
+ property :fb_uid, String
12
+ end
10
13
 
11
14
  attr_accessor :password, :password_confirmation
12
15
  #protected equievelant? :protected => true doesn't exist in dm 0.10.0
@@ -30,6 +33,7 @@ class DmUser
30
33
  def site_admin?
31
34
  self.id == 1
32
35
  end
36
+
33
37
  protected
34
38
 
35
39
  def method_missing(m, *args)
@@ -24,6 +24,12 @@ module DmAdapter
24
24
  user
25
25
  end
26
26
 
27
+ def set!(attributes)
28
+ user = DmUser.new attributes
29
+ user.save!
30
+ user
31
+ end
32
+
27
33
  def delete(pk)
28
34
  user = User.first(:id => pk)
29
35
  user.destroy
@@ -59,29 +59,50 @@ class TcUser
59
59
  pk = attributes.delete(:pk) if attributes[:pk]
60
60
 
61
61
  email_regexp = /(\A(\s*)\Z)|(\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z)/i
62
- if (attributes['password'] == attributes.delete('password_confirmation') && attributes['email'] =~ email_regexp)
63
- password = attributes.delete('password')
64
- attributes.merge!({'salt' => User.random_string(10)}) if !attributes['salt']
65
- attributes.merge!('hashed_password' => User.encrypt(password, attributes['salt']))
66
- permission_level = attributes['permission_level'] ? attributes['permission_level'] : '1'
67
- attributes.merge!('permission_level' => permission_level)
68
- attributes.merge!('created_at' => Time.now.to_s)
69
- attributes.merge!('created_at_i' => Time.now.to_i.to_s)
70
-
71
- connection = TcUserTable.new
72
- pk ||= connection.genuid.to_s
73
- #site admin if their first
74
- attributes.merge!({'permission_level' => '-2'}) if pk == '1'
75
- result = connection[pk] = attributes
76
- #might not need this in newer version of rufus
77
- result.merge!({:pk => pk})
78
- connection.close
79
- self.new(result)
62
+ if attributes['email'] =~ email_regexp
63
+ if attributes['password'] == attributes.delete('password_confirmation') && attributes['password'] != nil
64
+ password = attributes.delete('password')
65
+ attributes.merge!({'salt' => User.random_string(10)}) if !attributes['salt']
66
+ attributes.merge!('hashed_password' => User.encrypt(password, attributes['salt']))
67
+ permission_level = attributes['permission_level'] ? attributes['permission_level'] : '1'
68
+ attributes.merge!('permission_level' => permission_level)
69
+ unless attributes['created_at']
70
+ attributes.merge!('created_at' => Time.now.to_s)
71
+ attributes.merge!('created_at_i' => Time.now.to_i.to_s)
72
+ end
73
+ end
74
+
75
+ existing_user = TcUser.query do |q|
76
+ q.add 'email', :streq, attributes['email']
77
+ end[0]
78
+
79
+ if existing_user && existing_user['pk'] != attributes['pk']
80
+ return false
81
+ else
82
+ connection = TcUserTable.new
83
+ pk ||= connection.genuid.to_s
84
+ #site admin if their first
85
+ attributes.merge!({'permission_level' => '-2'}) if pk == '1'
86
+ result = connection[pk] = attributes
87
+ #might not need this in newer version of rufus
88
+ result.merge!({:pk => pk})
89
+ connection.close
90
+ self.new(result)
91
+ end
80
92
  else
81
93
  false
82
94
  end
83
95
  end
84
96
 
97
+ def self.set!(attributes)
98
+ connection = TcUserTable.new
99
+ pk = connection.genuid.to_s
100
+ result = connection[pk] = attributes
101
+ result.merge!({:pk => pk})
102
+ connection.close
103
+ self.new(result)
104
+ end
105
+
85
106
  def self.delete(pk)
86
107
  connection = TcUserTable.new
87
108
  connection.delete(pk)
@@ -19,16 +19,22 @@ module TcAdapter
19
19
  end
20
20
 
21
21
  def get(hash)
22
- #because with TcUser email and id are the same because the email is the id
23
- if hash[:email]
24
- result = TcUser.query do |q|
25
- q.add 'email', :streq, hash[:email]
26
- end[0]
27
- #the zero is because this returns an array but get should return the first result
28
- elsif hash[:id]
22
+ if hash[:id]
29
23
  pk = hash[:id]
30
24
  result = TcUser.get(pk)
25
+ else
26
+ result = TcUser.query do |q|
27
+ hash.each do |key, value|
28
+ q.add key.to_s, :streq, value.to_s
29
+ end
30
+ end[0]
31
31
  end
32
+ #elsif hash[:email]
33
+ # result = TcUser.query do |q|
34
+ # q.add 'email', :streq, hash[:email]
35
+ # end[0]
36
+ #the zero is because this returns an array but get should return the first result
37
+ #end
32
38
 
33
39
  if result
34
40
  self.new result
@@ -49,6 +55,10 @@ module TcAdapter
49
55
  end
50
56
  end
51
57
 
58
+ def set!(attributes)
59
+ self.new TcUser.set!(attributes)
60
+ end
61
+
52
62
  def delete(pk)
53
63
  #true or false
54
64
  !!TcUser.delete(pk)
@@ -34,10 +34,6 @@ module Sinatra
34
34
  get '/users/:id' do
35
35
  login_required
36
36
 
37
- #INVESTIGATE
38
- #
39
- #WHY THE HECK WON'T GET RETURN ANYTHING?
40
- #if I user User.get(params[:id]) it returns nil for some inexplicable reason
41
37
  @user = User.get(:id => params[:id])
42
38
  haml get_view_as_string("show.haml"), :layout => use_layout?
43
39
  end
@@ -58,7 +54,13 @@ module Sinatra
58
54
  post '/login' do
59
55
  if user = User.authenticate(params[:email], params[:password])
60
56
  session[:user] = user.id
61
- redirect '/'
57
+ if session[:return_to]
58
+ redirect_url = session[:return_to]
59
+ session[:return_to] = false
60
+ redirect redirect_url
61
+ else
62
+ redirect '/'
63
+ end
62
64
  else
63
65
  redirect '/login'
64
66
  end
@@ -87,7 +89,7 @@ module Sinatra
87
89
 
88
90
  get '/users/:id/edit' do
89
91
  login_required
90
- redirect "/users" unless current_user.admin? || current_user == params[:id]
92
+ redirect "/users" unless current_user.admin? || current_user.id.to_s == params[:id]
91
93
 
92
94
  @user = User.get(:id => params[:id])
93
95
  haml get_view_as_string("edit.haml"), :layout => use_layout?
@@ -95,7 +97,7 @@ module Sinatra
95
97
 
96
98
  post '/users/:id/edit' do
97
99
  login_required
98
- redirect "/users" unless current_user.admin? || current_user == params[:id]
100
+ redirect "/users" unless current_user.admin? || current_user.id.to_s == params[:id]
99
101
 
100
102
  user = User.get(:id => params[:id])
101
103
  user_attributes = params[:user]
@@ -105,15 +107,16 @@ module Sinatra
105
107
  end
106
108
 
107
109
  if user.update(user_attributes)
108
- redirect "/users/#{user.id}"
110
+ redirect '/'
109
111
  else
110
- throw user.errors
112
+ session[:notice] = 'whoops, looks like there were some problems with your updates'
113
+ redirect "/users/#{user.id}/edit"
111
114
  end
112
115
  end
113
116
 
114
117
  get '/users/:id/delete' do
115
118
  login_required
116
- redirect "/users" unless current_user.admin? || current_user == params[:id]
119
+ redirect "/users" unless current_user.admin? || current_user.id.to_s == params[:id]
117
120
 
118
121
  if User.delete(params[:id])
119
122
  session[:flash] = "way to go, you deleted a user"
@@ -122,12 +125,46 @@ module Sinatra
122
125
  end
123
126
  redirect '/'
124
127
  end
128
+
129
+
130
+ if Sinatra.const_defined?('FacebookObject')
131
+ get '/connect' do
132
+ if fb[:user]
133
+ if current_user.class != GuestUser
134
+ user = current_user
135
+ else
136
+ user = User.get(:fb_uid => fb[:user])
137
+ end
138
+
139
+ if user
140
+ if !user.fb_uid || user.fb_uid != fb[:user]
141
+ user.update :fb_uid => fb[:user]
142
+ end
143
+ session[:user] = user.id
144
+ else
145
+ user = User.set!(:fb_uid => fb[:user])
146
+ session[:user] = user.id
147
+ end
148
+ end
149
+ redirect '/'
150
+ end
151
+
152
+ get '/receiver' do
153
+ %[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
154
+ <html xmlns="http://www.w3.org/1999/xhtml" >
155
+ <body>
156
+ <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.js" type="text/javascript"></script>
157
+ </body>
158
+ </html>]
159
+ end
160
+ end
125
161
  end
126
162
  end
127
163
 
128
164
  module Helpers
129
165
  def login_required
130
- if session[:user]
166
+ #not as efficient as checking the session. but this inits the fb_user if they are logged in
167
+ if current_user.class != GuestUser
131
168
  return true
132
169
  else
133
170
  session[:return_to] = request.fullpath
@@ -176,7 +213,15 @@ module Sinatra
176
213
  # a tad janky?
177
214
  logout_parameters.delete(:rel)
178
215
  result += "<a href='/users/#{current_user.id}/edit' class='#{css_classes} sinatra-authentication-edit' #{parameters}>edit account</a> "
179
- result += "<a href='/logout' class='#{css_classes} sinatra-authentication-logout' #{logout_parameters}>logout</a>"
216
+ if Sinatra.const_defined?('FacebookObject')
217
+ if fb[:user]
218
+ result += "<a href='javascript:FB.Connect.logoutAndRedirect(\"/logout\");' class='#{css_classes} sinatra-authentication-logout' #{logout_parameters}>logout</a>"
219
+ else
220
+ result += "<a href='/logout' class='#{css_classes} sinatra-authentication-logout' #{logout_parameters}>logout</a>"
221
+ end
222
+ else
223
+ result += "<a href='/logout' class='#{css_classes} sinatra-authentication-logout' #{logout_parameters}>logout</a>"
224
+ end
180
225
  else
181
226
  result += "<a href='/signup' class='#{css_classes} sinatra-authentication-signup' #{parameters}>signup</a> "
182
227
  result += "<a href='/login' class='#{css_classes} sinatra-authentication-login' #{parameters}>login</a>"
@@ -184,6 +229,16 @@ module Sinatra
184
229
 
185
230
  result += "</div>"
186
231
  end
232
+
233
+ if Sinatra.const_defined?('FacebookObject')
234
+ def render_facebook_connect_link(text = 'Login using facebook')
235
+ %[<a href="#" onclick="FB.Connect.requireSession(function(){document.location = '/connect';}); return false;" class="fbconnect_login_button FBConnectButton FBConnectButton_Small">
236
+ <span id="RES_ID_fb_login_text" class="FBConnectButton_Text">
237
+ #{text}
238
+ </span>
239
+ </a>]
240
+ end
241
+ end
187
242
  end
188
243
 
189
244
  register LilAuthentication
data/lib/views/edit.haml CHANGED
@@ -1,8 +1,19 @@
1
1
  #sinatra_authentication
2
2
  %h1
3
3
  Editing
4
- = @user.email
4
+ - if @user.id == current_user.id
5
+ account
6
+ - else
7
+ - if @user.email
8
+ = @user.email
9
+ - elsif @user.fb_uid
10
+ <fb:name uid=#{@user.fb_uid} linked='false' />
11
+ - else
12
+ account
5
13
  %form{:action => "/users/#{@user.id}/edit", :method => "post"}
14
+ %input{ :id => "user_email", :name => "user[email]", :size => 30, :type => "text", :value => @user.email }
15
+ email
16
+ %br
6
17
  %input{ :id => "user_password", :name => "user[password]", :size => 30, :type => "password" }
7
18
  new password
8
19
  %br
@@ -19,3 +30,7 @@
19
30
  permission level
20
31
  %br
21
32
  %input{ :value => "update", :type => "submit" }
33
+ - if Sinatra.const_defined?('FacebookObject')
34
+ - unless @user.fb_uid
35
+ |
36
+ = render_facebook_connect_link('Link account with facebook')
data/lib/views/index.haml CHANGED
@@ -2,12 +2,18 @@
2
2
  %h1 Users
3
3
  %table
4
4
  %tr
5
- %th email
5
+ %th
6
6
  - if current_user.admin?
7
7
  %th permission level
8
8
  - @users.each do |user|
9
9
  %tr
10
- %td= user.email
10
+ %td
11
+ - if user.email
12
+ = user.email
13
+ - elsif user.fb_uid
14
+ <fb:name uid=#{user.fb_uid} />
15
+ - else
16
+ "user #{user.id}"
11
17
  - if current_user.admin?
12
18
  %td= user.permission_level
13
19
  %td
data/lib/views/login.haml CHANGED
@@ -8,3 +8,6 @@
8
8
  password
9
9
  %br
10
10
  %input{:value => "login", :type => "submit"}
11
+ - if Sinatra.const_defined?('FacebookObject')
12
+ |
13
+ = render_facebook_connect_link
data/lib/views/show.haml CHANGED
@@ -1,6 +1,9 @@
1
1
  #sinatra_authentication
2
- %h1= @user.email
3
- - current_user.admin?
2
+ %h1
3
+ - if @user.email
4
+ = @user.email
5
+ - elsif @user.fb_uid
6
+ <fb:name uid=#{@user.fb_uid} linked='false' />
4
7
  - if current_user.admin?
5
8
  %h2 permission level
6
9
  = @user.permission_level
data/readme.markdown CHANGED
@@ -28,6 +28,11 @@ with a super secret key, like so:
28
28
  * get/post '/users/:id/edit'
29
29
  * get '/users/:id/delete'
30
30
 
31
+ ## ADDITIONAL ROUTES WHEN USING SINBOOK FOR FACEBOOK INTEGRATION:
32
+
33
+ * get '/reciever'
34
+ * get '/connect'
35
+
31
36
  If you fetch any of the user pages using ajax, they will automatically render without a layout
32
37
 
33
38
  ## HELPER METHODS:
@@ -90,3 +95,43 @@ and if you want to open a connection with the cabinet directly, you can do somet
90
95
  q.add 'email', :strinc, 'gmail'
91
96
  end
92
97
  user_connection.close
98
+
99
+ ## FACEBOOK
100
+
101
+ # at present, sinatra authentication supports sinbook for interacting with the facebook api.
102
+
103
+ If you want to allow users to login using facebook, just require 'sinbook' before requiring 'sinatra-authentication'.
104
+ The routes '/reciever' and '/connect' will be added. as well as connect links on the login and edit account pages.
105
+ You'll still have to include and initialize the facebook connect javascript in your layout yourself, like so:
106
+
107
+ (This example layout assumes you're using sinbook)
108
+
109
+ !!!
110
+ %head
111
+ %title Welcome to my Facebook Connect website!
112
+ %script{:type => 'text/javascript', :src => 'http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US'}
113
+ %body
114
+ = yield
115
+ :javascript
116
+ FB.init("#{fb.api_key}", "/receiver")
117
+
118
+ Just remember to specify '/reciever' as the path to the xd-receiver file in your call to 'FB.init'.
119
+
120
+ The render_login_logout helper 'logout' link will log the user out of facebook and your app.
121
+
122
+ I've also included a little helper method 'render_facebook_connect_link' for rendering the facebook connect link with the correct 'onconnect' javascript callback.
123
+ The callback redirects to '/connect' which is important because the way I've implemented facebook connect support is by pinging '/connect' after the user
124
+ successfully connects with facebook. If you choose to render the connect button yourself, be sure to have the 'onconnect' callback include "window.location = '/connect'".
125
+ '/connect' redirects to '/' on completion.
126
+
127
+ The 'render_facebook_connect_link' helper uses html instead of fbml, so ajax requests to '/login' or "/users/#{user.id}/edit"
128
+ will render the connect link without you needing to parse any fbml.
129
+
130
+ If the user is already logged into the app and connects with facebook via the user edit page,
131
+ it adds their fb_uid to their profile in the database.
132
+ which will allow them to log in using their email and password, OR their facebook account.
133
+
134
+ If they aren't already logged in to the app through the normal login form,
135
+ it creates a new user in the database without an email address or password.
136
+ They can later add this data by going to "/users/#{current_user.id}/edit",
137
+ which will allow them to log in using their email address and password, OR their facebook account.
@@ -0,0 +1,87 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{sinatra-authentication}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Max Justus Spransy"]
12
+ s.date = %q{2009-11-27}
13
+ s.description = %q{Simple authentication plugin for sinatra.}
14
+ s.email = %q{maxjustus@gmail.com}
15
+ s.files = [
16
+ ".gitignore",
17
+ "History.txt",
18
+ "Manifest",
19
+ "Rakefile",
20
+ "TODO",
21
+ "lib/models/abstract_user.rb",
22
+ "lib/models/datamapper_user.rb",
23
+ "lib/models/dm_adapter.rb",
24
+ "lib/models/rufus_tokyo_user.rb",
25
+ "lib/models/tc_adapter.rb",
26
+ "lib/sinatra-authentication.rb",
27
+ "lib/views/edit.haml",
28
+ "lib/views/index.haml",
29
+ "lib/views/login.haml",
30
+ "lib/views/show.haml",
31
+ "lib/views/signup.haml",
32
+ "readme.markdown",
33
+ "sinatra-authentication.gemspec",
34
+ "test/datamapper_test.rb",
35
+ "test/lib/dm_app.rb",
36
+ "test/lib/dm_sinbook.rb",
37
+ "test/lib/helper.rb",
38
+ "test/lib/tc_app.rb",
39
+ "test/lib/tc_sinbook.rb",
40
+ "test/route_tests.rb",
41
+ "test/rufus_tokyo_test.rb"
42
+ ]
43
+ s.homepage = %q{http://github.com/maxjustus/sinatra-authentication}
44
+ s.rdoc_options = ["--charset=UTF-8"]
45
+ s.require_paths = ["lib"]
46
+ s.rubygems_version = %q{1.3.5}
47
+ s.summary = %q{Simple authentication plugin for sinatra.}
48
+ s.test_files = [
49
+ "test/lib/dm_sinbook.rb",
50
+ "test/lib/tc_app.rb",
51
+ "test/lib/tc_sinbook.rb",
52
+ "test/lib/helper.rb",
53
+ "test/lib/dm_app.rb",
54
+ "test/datamapper_test.rb",
55
+ "test/rufus_tokyo_test.rb",
56
+ "test/route_tests.rb"
57
+ ]
58
+
59
+ if s.respond_to? :specification_version then
60
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
61
+ s.specification_version = 3
62
+
63
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
64
+ s.add_runtime_dependency(%q<sinatra>, [">= 0"])
65
+ s.add_runtime_dependency(%q<dm-core>, [">= 0"])
66
+ s.add_runtime_dependency(%q<dm-validations>, [">= 0"])
67
+ s.add_runtime_dependency(%q<dm-timestamps>, [">= 0"])
68
+ s.add_runtime_dependency(%q<rufus-tokyo>, [">= 0"])
69
+ s.add_runtime_dependency(%q<sinbook>, [">= 0"])
70
+ else
71
+ s.add_dependency(%q<sinatra>, [">= 0"])
72
+ s.add_dependency(%q<dm-core>, [">= 0"])
73
+ s.add_dependency(%q<dm-validations>, [">= 0"])
74
+ s.add_dependency(%q<dm-timestamps>, [">= 0"])
75
+ s.add_dependency(%q<rufus-tokyo>, [">= 0"])
76
+ s.add_dependency(%q<sinbook>, [">= 0"])
77
+ end
78
+ else
79
+ s.add_dependency(%q<sinatra>, [">= 0"])
80
+ s.add_dependency(%q<dm-core>, [">= 0"])
81
+ s.add_dependency(%q<dm-validations>, [">= 0"])
82
+ s.add_dependency(%q<dm-timestamps>, [">= 0"])
83
+ s.add_dependency(%q<rufus-tokyo>, [">= 0"])
84
+ s.add_dependency(%q<sinbook>, [">= 0"])
85
+ end
86
+ end
87
+
data/test/lib/dm_app.rb CHANGED
@@ -14,5 +14,5 @@ set :public, 'public'
14
14
  set :views, 'views'
15
15
 
16
16
  get '/' do
17
- haml "hi", :layout => :layout
17
+ haml "= render_login_logout", :layout => :layout
18
18
  end
@@ -0,0 +1,55 @@
1
+ require 'rubygems'
2
+ require 'sinatra'
3
+ require 'haml'
4
+ require 'sinbook'
5
+ require 'dm-core'
6
+ require File.join(File.dirname(__FILE__), '../../lib/sinatra-authentication')
7
+
8
+ facebook do
9
+ api_key 'aa2db1b96cb7b57f0c5b1d4d3d8f0a22'
10
+ secret '21d94ee63969ae3b3f833689838ca00f'
11
+ app_id 48652736613
12
+ url 'peoplewithjetpacks.com:4568/'
13
+ callback 'peoplewithjetpacks.com:4568/'
14
+ end
15
+
16
+ set :port, 4568
17
+
18
+ DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/test.db")
19
+ DataMapper.auto_migrate!
20
+
21
+ use Rack::Session::Cookie, :secret => "heyhihello"
22
+
23
+ set :environment, 'development'
24
+ set :public, 'public'
25
+ set :views, 'views'
26
+
27
+ get '/' do
28
+ haml :main
29
+ end
30
+
31
+ get '/test' do
32
+ login_required
33
+ 'hihihi'
34
+ end
35
+
36
+ __END__
37
+
38
+ @@ layout
39
+ %html{:xmlns=>"http://www.w3.org/1999/xhtml", :'xmlns:fb'=>"http://www.facebook.com/2008/fbml"}
40
+ %head
41
+ %title Welcome to my Facebook Connect website!
42
+ %script{:type => 'text/javascript', :src => 'http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US'}
43
+ %body
44
+ = render_login_logout
45
+ = yield
46
+ :javascript
47
+ FB.init("#{fb.api_key}", "/receiver")
48
+
49
+ @@ main
50
+ - if fb[:user]
51
+ Hi,
52
+ %fb:profile-pic{:uid => fb[:user]}
53
+ %fb:name{:uid => fb[:user], :useyou => 'false', :firstnameonly => 'true'}
54
+ !
55
+
data/test/lib/tc_app.rb CHANGED
@@ -12,5 +12,5 @@ set :public, 'public'
12
12
  set :views, 'views'
13
13
 
14
14
  get '/' do
15
- haml "hi", :layout => :layout
15
+ haml "= render_login_logout", :layout => :layout
16
16
  end
@@ -0,0 +1,62 @@
1
+ require 'rubygems'
2
+ require 'haml'
3
+ require 'sinbook'
4
+ require 'rufus/tokyo'
5
+ require 'sinatra'
6
+ require File.join(File.dirname(__FILE__), '../../lib/sinatra-authentication')
7
+
8
+ use Rack::Session::Cookie, :secret => "heyhihello"
9
+ TcUserTable.cabinet_path = File.dirname(__FILE__)
10
+
11
+ facebook do
12
+ api_key 'aa2db1b96cb7b57f0c5b1d4d3d8f0a22'
13
+ secret '21d94ee63969ae3b3f833689838ca00f'
14
+ app_id 48652736613
15
+ url 'peoplewithjetpacks.com:4568/'
16
+ callback 'peoplewithjetpacks.com:4568/'
17
+ end
18
+
19
+ set :port, 4568
20
+
21
+ get '/' do
22
+ haml :main
23
+ end
24
+
25
+ get '/test' do
26
+ login_required
27
+ 'hihihi'
28
+ end
29
+
30
+ __END__
31
+
32
+ @@ layout
33
+ %html{:xmlns=>"http://www.w3.org/1999/xhtml", :'xmlns:fb'=>"http://www.facebook.com/2008/fbml"}
34
+ %head
35
+ %title Welcome to my Facebook Connect website!
36
+ %script{:type => 'text/javascript', :src => 'http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US'}
37
+ %script{:type => 'text/javascript', :src => 'http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'}
38
+ :javascript
39
+ $(document).ready(function(){
40
+ /* test facebook crap works with ajax */
41
+ $('.sinatra-authentication-login').click(function(){
42
+ $.get($(this).attr('href'), {}, function(data){
43
+ $('#test_box').html(data);
44
+ });
45
+ return false;
46
+ });
47
+ });
48
+ %body
49
+ = render_login_logout
50
+ = yield
51
+ :javascript
52
+ FB.init("#{fb.api_key}", "/receiver")
53
+ #test_box
54
+
55
+ @@ main
56
+ - if fb[:user]
57
+ Hi,
58
+ %fb:profile-pic{:uid => fb[:user]}
59
+ %fb:name{:uid => fb[:user], :useyou => 'false', :firstnameonly => 'true'}
60
+ !
61
+ %br/
62
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra-authentication
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Justus Spransy
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-07 00:00:00 -06:00
12
+ date: 2009-11-27 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -62,6 +62,16 @@ dependencies:
62
62
  - !ruby/object:Gem::Version
63
63
  version: "0"
64
64
  version:
65
+ - !ruby/object:Gem::Dependency
66
+ name: sinbook
67
+ type: :runtime
68
+ version_requirement:
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
74
+ version:
65
75
  description: Simple authentication plugin for sinatra.
66
76
  email: maxjustus@gmail.com
67
77
  executables: []
@@ -88,10 +98,13 @@ files:
88
98
  - lib/views/show.haml
89
99
  - lib/views/signup.haml
90
100
  - readme.markdown
101
+ - sinatra-authentication.gemspec
91
102
  - test/datamapper_test.rb
92
103
  - test/lib/dm_app.rb
104
+ - test/lib/dm_sinbook.rb
93
105
  - test/lib/helper.rb
94
106
  - test/lib/tc_app.rb
107
+ - test/lib/tc_sinbook.rb
95
108
  - test/route_tests.rb
96
109
  - test/rufus_tokyo_test.rb
97
110
  has_rdoc: true
@@ -123,7 +136,9 @@ signing_key:
123
136
  specification_version: 3
124
137
  summary: Simple authentication plugin for sinatra.
125
138
  test_files:
139
+ - test/lib/dm_sinbook.rb
126
140
  - test/lib/tc_app.rb
141
+ - test/lib/tc_sinbook.rb
127
142
  - test/lib/helper.rb
128
143
  - test/lib/dm_app.rb
129
144
  - test/datamapper_test.rb