sinatra-authentication 0.2.4 → 0.3.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.2.3'
9
+ gemspec.version = '0.3.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"
@@ -18,6 +18,7 @@ begin
18
18
  gemspec.add_dependency "dm-timestamps"
19
19
  gemspec.add_dependency "rufus-tokyo"
20
20
  gemspec.add_dependency "sinbook"
21
+ gemspec.add_dependency "rack-flash"
21
22
  end
22
23
  Jeweler::GemcutterTasks.new
23
24
  rescue LoadError
@@ -0,0 +1,25 @@
1
+ require 'rubygems'
2
+ require 'sinatra'
3
+ require 'haml'
4
+ require 'dm-core'
5
+ require 'rack-flash'
6
+ require 'sinatra-authentication'
7
+
8
+ class DmUser
9
+ property :name, String
10
+ end
11
+
12
+ DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/test.db")
13
+ DataMapper.auto_migrate!
14
+
15
+ set :sinatra_authentication_view_path, Pathname(__FILE__).dirname.expand_path + "extend_views/"
16
+ use Rack::Session::Cookie, :secret => "heyhihello"
17
+ use Rack::Flash
18
+
19
+ set :environment, 'development'
20
+ set :public, 'public'
21
+ set :views, 'views'
22
+
23
+ get '/' do
24
+ haml "= render_login_logout", :layout => :layout
25
+ end
@@ -0,0 +1,55 @@
1
+ require 'rubygems'
2
+ require 'sinatra'
3
+ require 'haml'
4
+ require 'sinbook'
5
+ require 'dm-core'
6
+ require '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
+
@@ -0,0 +1,42 @@
1
+ #sinatra_authentication
2
+ #sinatra_authentication_flash= flash[:notice]
3
+ %h1
4
+ Edit
5
+ - if @user.id == current_user.id
6
+ account
7
+ - else
8
+ - if @user.email
9
+ = @user.email
10
+ - elsif @user.fb_uid
11
+ <fb:name uid=#{@user.fb_uid} linked='false' />
12
+ - else
13
+ account
14
+ %form{:action => "/users/#{@user.id}/edit", :method => "post"}
15
+ .field
16
+ .label
17
+ %label{:for => "user_email"} Email
18
+ %input{ :id => "user_email", :name => "user[email]", :size => 30, :type => "text", :value => @user.email }
19
+ .field
20
+ .label
21
+ %label{:for => "user_password"} New password
22
+ %input{ :id => "user_password", :name => "user[password]", :size => 30, :type => "password" }
23
+ .field
24
+ .label
25
+ %label{:for => "user_password_confirmation"} Confirm
26
+ %input{ :id => "user_password_confirmation", :name => "user[password_confirmation]", :size => 30, :type => "password" }
27
+ -# don't render permission field if admin and editing yourself so you don't shoot yourself in the foot
28
+ - if current_user.admin? && current_user.id != @user.id
29
+ .field
30
+ .label
31
+ %label{:for => 'permission_level'} Permission level
32
+ %select{ :id => "permission_level", :name => "user[permission_level]" }
33
+ %option{:value => -1, :selected => @user.admin?}
34
+ Admin
35
+ %option{:value => 1, :selected => @user.permission_level == 1}
36
+ Authenticated user
37
+ .buttons
38
+ %input{ :value => "Update", :type => "submit" }
39
+ - if Sinatra.const_defined?('FacebookObject')
40
+ - unless @user.fb_uid
41
+ |
42
+ = render_facebook_connect_link('Link account with Facebook')
@@ -0,0 +1,31 @@
1
+ #sinatra_authentication
2
+ %h1.page_title Users
3
+ %table
4
+ %tr
5
+ %th
6
+ - if current_user.admin?
7
+ %th permission level
8
+ - @users.each do |user|
9
+ %tr
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}"
17
+ - if current_user.admin?
18
+ %td= user.permission_level
19
+ %td
20
+ = user.name
21
+ %td
22
+ %a{:href => "/users/#{user.id}"} show
23
+ - if current_user.admin?
24
+ %td
25
+ %a{:href => "/users/#{user.id}/edit"} edit
26
+ %td
27
+ -# this doesn't work for tk
28
+ - if !user.site_admin?
29
+ %a{:href => "/users/#{user.id}/delete", :onclick => "return confirm('you sure?')"} delete
30
+ - else
31
+ site admin
@@ -0,0 +1,21 @@
1
+ #sinatra_authentication
2
+ #sinatra_authentication_flash= flash[:notice]
3
+ %h1.page_title Login
4
+ %form{:action => "/login", :method => "post"}
5
+ .field
6
+ .label
7
+ %label{:for => "user_email'"} Email
8
+ %input{:id => "user_email", :name => "email", :size => 30, :type => "text"}
9
+ .field
10
+ .label
11
+ %label{:for => "user_password"} Password
12
+ %input{:id => "user_password", :name => "password", :size => 30, :type => "password"}
13
+ .buttons
14
+ %input{:value => "login", :type => "submit"}
15
+ %a{:href => "/signup", :class => 'sinatra_authentication_link'}
16
+ Signup
17
+ - if Sinatra.const_defined?('FacebookObject')
18
+ .third_party_signup
19
+ %h3.section_title One click login:
20
+ .login_link.facebook_login
21
+ = render_facebook_connect_link('Login using facebook', :size => 'large')
@@ -0,0 +1,9 @@
1
+ #sinatra_authentication
2
+ %h1.page_title
3
+ - if @user.email
4
+ = @user.email
5
+ - elsif @user.fb_uid
6
+ <fb:name uid=#{@user.fb_uid} linked='false' />
7
+ - if current_user.admin?
8
+ %h2 permission level
9
+ = @user.permission_level
@@ -0,0 +1,30 @@
1
+ %h1 This view is overridden
2
+ #sinatra_authentication
3
+ #sinatra_authentication_flash= flash[:notice]
4
+ %h1.page_title Signup
5
+ %form{:action => "/signup", :method => "post"}
6
+ .field
7
+ .label
8
+ %label{:for => "user_email"} Email
9
+ %input{ :id => "user_email", :name => "user[email]", :size => 30, :type => "text" }
10
+ .field
11
+ .label
12
+ %label{:for => "user_password"} Password
13
+ %input{ :id => "user_password", :name => "user[password]", :size => 30, :type => "password" }
14
+ .field
15
+ .label
16
+ %label{:for => "user_name"} Name
17
+ %input{ :id => "user_name", :name => "user[name]", :size => 30, :type => "text" }
18
+ .field
19
+ .label
20
+ %label{:for => "user_password_confirmation"} Confirm Password
21
+ %input{ :id => "user_password_confirmation", :name => "user[password_confirmation]", :size => 30, :type => "password" }
22
+ .buttons
23
+ %input{ :value => "Create account", :type => "submit" }
24
+ %a{:href => "/login", :class => 'sinatra_authentication_link'}
25
+ Login
26
+ - if Sinatra.const_defined?('FacebookObject')
27
+ .third_party_signup
28
+ %h3.section_title One click signup:
29
+ .login_link.facebook_login
30
+ = render_facebook_connect_link('Signup using facebook', :size => 'large')
data/example/mm_app.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'rubygems'
2
+ require 'sinatra/base'
3
+ require 'haml'
4
+ require 'mongo_mapper'
5
+ require 'sinatra-authentication'
6
+
7
+ logger = Logger.new($stdout)
8
+ MongoMapper.connection = Mongo::Connection.new('db.mongohq.com', 27017, :logger => logger)
9
+ MongoMapper.database = "fdbk"
10
+ MongoMapper.database.authenticate(ENV['mongohq_user'], ENV['mongohq_pass'])
11
+
12
+ class TestApp < Sinatra::Base
13
+ use Rack::Session::Cookie, :secret => "heyhihello"
14
+
15
+ set :environment, 'development'
16
+ set :public, 'public'
17
+ set :views, 'views'
18
+
19
+ get '/' do
20
+ haml "= render_login_logout", :layout => :layout
21
+ end
22
+ end
data/example/tc_app.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'rubygems'
2
+ require 'sinatra'
3
+ require 'haml'
4
+ require 'rufus/tokyo'
5
+ require 'sinatra-authentication'
6
+
7
+ use Rack::Session::Cookie, :secret => "heyhihello"
8
+ TcUserTable.cabinet_path = File.dirname(__FILE__)
9
+
10
+ set :environment, 'development'
11
+ set :public, 'public'
12
+ set :views, 'views'
13
+
14
+ get '/' do
15
+ haml "= render_login_logout", :layout => :layout
16
+ end
@@ -0,0 +1,62 @@
1
+ require 'rubygems'
2
+ require 'haml'
3
+ require 'sinbook'
4
+ require 'rufus/tokyo'
5
+ require 'sinatra'
6
+ require '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
+
@@ -31,15 +31,14 @@ module DmAdapter
31
31
  end
32
32
 
33
33
  def delete(pk)
34
- user = User.first(:id => pk)
34
+ user = DmUser.first(:id => pk)
35
35
  user.destroy
36
36
  end
37
37
  end
38
38
 
39
39
  module InstanceMethods
40
40
  def update(attributes)
41
- @instance.update_attributes attributes
42
- @instance.save
41
+ @instance.update attributes
43
42
  end
44
43
 
45
44
  def method_missing(meth, *args, &block)
@@ -11,7 +11,7 @@ module Sinatra
11
11
  #sinatra 9.1.1 doesn't have multiple view capability anywhere
12
12
  #so to get around I have to do it totally manually by
13
13
  #loading the view from this path into a string and rendering it
14
- set :lil_authentication_view_path, Pathname(__FILE__).dirname.expand_path + "views/"
14
+ set :sinatra_authentication_view_path, Pathname(__FILE__).dirname.expand_path + "views/"
15
15
 
16
16
  get '/users' do
17
17
  login_required
@@ -48,6 +48,11 @@ module Sinatra
48
48
  post '/login' do
49
49
  if user = User.authenticate(params[:email], params[:password])
50
50
  session[:user] = user.id
51
+
52
+ if Rack.const_defined?('Flash')
53
+ flash[:notice] = "Login successful."
54
+ end
55
+
51
56
  if session[:return_to]
52
57
  redirect_url = session[:return_to]
53
58
  session[:return_to] = false
@@ -56,13 +61,18 @@ module Sinatra
56
61
  redirect '/'
57
62
  end
58
63
  else
64
+ if Rack.const_defined?('Flash')
65
+ flash[:notice] = "The email or password you entered is incorrect."
66
+ end
59
67
  redirect '/login'
60
68
  end
61
69
  end
62
70
 
63
71
  get '/logout' do
64
72
  session[:user] = nil
65
- @message = "in case it weren't obvious, you've logged out"
73
+ if Rack.const_defined?('Flash')
74
+ flash[:notice] = "Logout successful."
75
+ end
66
76
  redirect '/'
67
77
  end
68
78
 
@@ -72,19 +82,23 @@ module Sinatra
72
82
 
73
83
  post '/signup' do
74
84
  @user = User.set(params[:user])
75
- if @user
85
+ if @user && @user.id
76
86
  session[:user] = @user.id
87
+ if Rack.const_defined?('Flash')
88
+ flash[:notice] = "Account created."
89
+ end
77
90
  redirect '/'
78
91
  else
79
- session[:flash] = "failure!"
80
- redirect '/'
92
+ if Rack.const_defined?('Flash')
93
+ flash[:notice] = 'There were some problems creating your account. Please be sure you\'ve entered all your information correctly.'
94
+ end
95
+ redirect '/signup'
81
96
  end
82
97
  end
83
98
 
84
99
  get '/users/:id/edit' do
85
100
  login_required
86
101
  redirect "/users" unless current_user.admin? || current_user.id.to_s == params[:id]
87
-
88
102
  @user = User.get(:id => params[:id])
89
103
  haml get_view_as_string("edit.haml"), :layout => use_layout?
90
104
  end
@@ -101,9 +115,14 @@ module Sinatra
101
115
  end
102
116
 
103
117
  if user.update(user_attributes)
118
+ if Rack.const_defined?('Flash')
119
+ flash[:notice] = 'Account updated.'
120
+ end
104
121
  redirect '/'
105
122
  else
106
- session[:notice] = 'whoops, looks like there were some problems with your updates'
123
+ if Rack.const_defined?('Flash')
124
+ flash[:notice] = 'Whoops, looks like there were some problems with your updates.'
125
+ end
107
126
  redirect "/users/#{user.id}/edit"
108
127
  end
109
128
  end
@@ -113,9 +132,13 @@ module Sinatra
113
132
  redirect "/users" unless current_user.admin? || current_user.id.to_s == params[:id]
114
133
 
115
134
  if User.delete(params[:id])
116
- session[:flash] = "way to go, you deleted a user"
135
+ if Rack.const_defined?('Flash')
136
+ flash[:notice] = "User deleted."
137
+ end
117
138
  else
118
- session[:flash] = "deletion failed, for whatever reason"
139
+ if Rack.const_defined?('Flash')
140
+ flash[:notice] = "Deletion failed."
141
+ end
119
142
  end
120
143
  redirect '/'
121
144
  end
@@ -185,7 +208,7 @@ module Sinatra
185
208
 
186
209
  #BECAUSE sinatra 9.1.1 can't load views from different paths properly
187
210
  def get_view_as_string(filename)
188
- view = options.lil_authentication_view_path + filename
211
+ view = options.sinatra_authentication_view_path + filename
189
212
  data = ""
190
213
  f = File.open(view, "r")
191
214
  f.each_line do |line|
data/lib/views/edit.haml CHANGED
@@ -1,4 +1,6 @@
1
1
  #sinatra_authentication
2
+ - if Rack.const_defined?('Flash')
3
+ #sinatra_authentication_flash= flash[:notice]
2
4
  %h1
3
5
  Edit
4
6
  - if @user.id == current_user.id
data/lib/views/login.haml CHANGED
@@ -1,4 +1,6 @@
1
1
  #sinatra_authentication
2
+ - if Rack.const_defined?('Flash')
3
+ #sinatra_authentication_flash= flash[:notice]
2
4
  %h1.page_title Login
3
5
  %form{:action => "/login", :method => "post"}
4
6
  .field
@@ -1,4 +1,6 @@
1
1
  #sinatra_authentication
2
+ - if Rack.const_defined?('Flash')
3
+ #sinatra_authentication_flash= flash[:notice]
2
4
  %h1.page_title Signup
3
5
  %form{:action => "/signup", :method => "post"}
4
6
  .field
data/readme.markdown CHANGED
@@ -2,23 +2,31 @@
2
2
 
3
3
  ## INSTALLATION:
4
4
 
5
- in your sinatra app simply require either "dm-core", "rufus-tokyo" or "mongo_mapper", "digest/sha1" and then "sinatra-authentication" and turn on session storage
5
+ in your sinatra app simply require either "dm-core", "rufus-tokyo" or "mongo_mapper", "digest/sha1", 'rack-flash' (if you want flash messages) and then "sinatra-authentication" and turn on session storage
6
6
  with a super secret key, like so:
7
7
 
8
8
  require "dm-core"
9
9
  require "digest/sha1"
10
+ require 'rack-flash'
10
11
  require "sinatra-authentication"
11
12
 
12
13
  use Rack::Session::Cookie, :secret => 'A1 sauce 1s so good you should use 1t on a11 yr st34ksssss'
14
+ #if you want flash messages
15
+ use Rack::Flash
13
16
 
14
17
  If you're using rufus-tokyo, you also need to set the database path for Users. like so:
15
18
 
16
19
  require "rufus_tokyo"
17
20
  require "digest/sha1"
21
+ require 'rack-flash'
18
22
  require "sinatra-authentication"
23
+
24
+ #Setting the database path for Users
19
25
  TcUserTable.cabinet_path = File.dirname(__FILE__) + 'folder/where/you/wanna/store/your/database'
20
26
 
21
27
  use Rack::Session::Cookie, :secret => 'A1 sauce 1s so good you should use 1t on a11 yr st34ksssss'
28
+ #if you want flash messages
29
+ use Rack::Flash
22
30
 
23
31
  ## DEFAULT ROUTES:
24
32
 
@@ -37,6 +45,20 @@ If you fetch any of the user pages using ajax, they will automatically render wi
37
45
  * get '/reciever'
38
46
  * get '/connect'
39
47
 
48
+ ## FLASH MESSAGES
49
+
50
+ Flash messages are implemented using rack-flash. To set them up add this to your code:
51
+
52
+ require 'rack-flash'
53
+
54
+ #be sure and do this after after 'use Rack:Session:Cookie...'
55
+ use Rack::Flash
56
+
57
+ And then sinatra-authentication related flash messages will be made available through flash[:notice]
58
+
59
+ -# somewhere in a haml view:
60
+ = flash[:notice]
61
+
40
62
  ## HELPER METHODS:
41
63
 
42
64
  This plugin provides the following helper methods for your sinatra app:
@@ -141,3 +163,53 @@ If they aren't already logged in to the app through the normal login form,
141
163
  it creates a new user in the database without an email address or password.
142
164
  They can later add this data by going to "/users/#{current_user.id}/edit",
143
165
  which will allow them to log in using their email address and password, OR their facebook account.
166
+
167
+ ## OVERRIDING DEFAULT VIEWS
168
+
169
+ Right now if you're going to override sinatra-authentication's views, you have to override all of them.
170
+ This is something I hope to change in a future release.
171
+
172
+ To override the default view path do something like this:
173
+
174
+ set :sinatra_authentication_view_path, Pathname(__FILE__).dirname.expand_path + "my_views/"
175
+
176
+ And then the views you'll need to define are:
177
+
178
+ * show.haml
179
+ * index.haml
180
+ * signup.haml
181
+ * login.haml
182
+ * edit.haml
183
+
184
+ The signup and edit form fields are named so they pass a hash called 'user' to the server:
185
+
186
+ %input{:name => "user[email]", :size => 30, :type => "text", :value => @user.email}
187
+ %input{:name => "user[password]", :size => 30, :type => "password"}
188
+ %input{:name => "user[password_confirmation]", :size => 30, :type => "password"}
189
+
190
+ %select{:name => "user[permission_level]"}
191
+ %option{:value => -1, :selected => @user.admin?}
192
+ Admin
193
+ %option{:value => 1, :selected => @user.permission_level == 1}
194
+ Authenticated user
195
+
196
+ The login form fields just pass a field called email and a field called password:
197
+
198
+ %input{:name => "email", :size => 30, :type => "text"}
199
+ %input{:name => "password", :size => 30, :type => "password"}
200
+
201
+ To add methods or properties to the User class, you have to access the underlying database user class, like so:
202
+
203
+ class DmUser
204
+ property :name, String
205
+ property :has_dog, Boolean, :default => false
206
+ end
207
+
208
+ The database user classes are named as follows:
209
+
210
+ * for Datamapper:
211
+ > DmUser
212
+ * for Rufus Tokyo:
213
+ > TcUser
214
+ * for Mongomapper:
215
+ > MmUser
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sinatra-authentication}
8
- s.version = "0.2.4"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Max Justus Spransy"]
12
- s.date = %q{2010-01-14}
12
+ s.date = %q{2010-04-17}
13
13
  s.description = %q{Simple authentication plugin for sinatra.}
14
14
  s.email = %q{maxjustus@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -21,6 +21,16 @@ Gem::Specification.new do |s|
21
21
  "Manifest",
22
22
  "Rakefile",
23
23
  "TODO",
24
+ "example/dm_extend_app.rb",
25
+ "example/dm_sinbook.rb",
26
+ "example/extend_views/edit.haml",
27
+ "example/extend_views/index.haml",
28
+ "example/extend_views/login.haml",
29
+ "example/extend_views/show.haml",
30
+ "example/extend_views/signup.haml",
31
+ "example/mm_app.rb",
32
+ "example/tc_app.rb",
33
+ "example/tc_sinbook.rb",
24
34
  "lib/models/abstract_user.rb",
25
35
  "lib/models/datamapper_user.rb",
26
36
  "lib/models/dm_adapter.rb",
@@ -38,7 +48,13 @@ Gem::Specification.new do |s|
38
48
  "sinatra-authentication.gemspec",
39
49
  "test/datamapper_test.rb",
40
50
  "test/lib/dm_app.rb",
51
+ "test/lib/dm_extend_app.rb",
41
52
  "test/lib/dm_sinbook.rb",
53
+ "test/lib/extend_views/edit.haml",
54
+ "test/lib/extend_views/index.haml",
55
+ "test/lib/extend_views/login.haml",
56
+ "test/lib/extend_views/show.haml",
57
+ "test/lib/extend_views/signup.haml",
42
58
  "test/lib/helper.rb",
43
59
  "test/lib/mm_app.rb",
44
60
  "test/lib/tc_app.rb",
@@ -58,6 +74,7 @@ Gem::Specification.new do |s|
58
74
  "test/lib/mm_app.rb",
59
75
  "test/lib/tc_sinbook.rb",
60
76
  "test/lib/helper.rb",
77
+ "test/lib/dm_extend_app.rb",
61
78
  "test/lib/dm_app.rb",
62
79
  "test/datamapper_test.rb",
63
80
  "test/mongomapper_test.rb",
@@ -76,6 +93,7 @@ Gem::Specification.new do |s|
76
93
  s.add_runtime_dependency(%q<dm-timestamps>, [">= 0"])
77
94
  s.add_runtime_dependency(%q<rufus-tokyo>, [">= 0"])
78
95
  s.add_runtime_dependency(%q<sinbook>, [">= 0"])
96
+ s.add_runtime_dependency(%q<rack-flash>, [">= 0"])
79
97
  else
80
98
  s.add_dependency(%q<sinatra>, [">= 0"])
81
99
  s.add_dependency(%q<dm-core>, [">= 0"])
@@ -83,6 +101,7 @@ Gem::Specification.new do |s|
83
101
  s.add_dependency(%q<dm-timestamps>, [">= 0"])
84
102
  s.add_dependency(%q<rufus-tokyo>, [">= 0"])
85
103
  s.add_dependency(%q<sinbook>, [">= 0"])
104
+ s.add_dependency(%q<rack-flash>, [">= 0"])
86
105
  end
87
106
  else
88
107
  s.add_dependency(%q<sinatra>, [">= 0"])
@@ -91,6 +110,7 @@ Gem::Specification.new do |s|
91
110
  s.add_dependency(%q<dm-timestamps>, [">= 0"])
92
111
  s.add_dependency(%q<rufus-tokyo>, [">= 0"])
93
112
  s.add_dependency(%q<sinbook>, [">= 0"])
113
+ s.add_dependency(%q<rack-flash>, [">= 0"])
94
114
  end
95
115
  end
96
116
 
data/test/lib/dm_app.rb CHANGED
@@ -2,12 +2,14 @@ require 'rubygems'
2
2
  require 'sinatra'
3
3
  require 'haml'
4
4
  require 'dm-core'
5
+ require 'rack-flash'
5
6
  require File.join(File.dirname(__FILE__), '../../lib/sinatra-authentication')
6
7
 
7
8
  DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/test.db")
8
9
  DataMapper.auto_migrate!
9
10
 
10
11
  use Rack::Session::Cookie, :secret => "heyhihello"
12
+ use Rack::Flash
11
13
 
12
14
  set :environment, 'development'
13
15
  set :public, 'public'
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ require 'sinatra'
3
+ require 'haml'
4
+ require 'dm-core'
5
+ require 'rack-flash'
6
+ require File.join(File.dirname(__FILE__), '../../lib/sinatra-authentication')
7
+
8
+
9
+ class DmUser
10
+ property :name, String
11
+ end
12
+
13
+ DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/test.db")
14
+ DataMapper.auto_migrate!
15
+
16
+ set :lil_authentication_view_path, Pathname(__FILE__).dirname.expand_path + "extend_views/"
17
+ use Rack::Session::Cookie, :secret => "heyhihello"
18
+ use Rack::Flash
19
+
20
+ set :environment, 'development'
21
+ set :public, 'public'
22
+ set :views, 'views'
23
+
24
+ get '/' do
25
+ haml "= render_login_logout", :layout => :layout
26
+ end
@@ -0,0 +1,42 @@
1
+ #sinatra_authentication
2
+ #sinatra_authentication_flash= session[:flash]
3
+ %h1
4
+ Edit
5
+ - if @user.id == current_user.id
6
+ account
7
+ - else
8
+ - if @user.email
9
+ = @user.email
10
+ - elsif @user.fb_uid
11
+ <fb:name uid=#{@user.fb_uid} linked='false' />
12
+ - else
13
+ account
14
+ %form{:action => "/users/#{@user.id}/edit", :method => "post"}
15
+ .field
16
+ .label
17
+ %label{:for => "user_email"} Email
18
+ %input{ :id => "user_email", :name => "user[email]", :size => 30, :type => "text", :value => @user.email }
19
+ .field
20
+ .label
21
+ %label{:for => "user_password"} New password
22
+ %input{ :id => "user_password", :name => "user[password]", :size => 30, :type => "password" }
23
+ .field
24
+ .label
25
+ %label{:for => "user_password_confirmation"} Confirm
26
+ %input{ :id => "user_password_confirmation", :name => "user[password_confirmation]", :size => 30, :type => "password" }
27
+ -# don't render permission field if admin and editing yourself so you don't shoot yourself in the foot
28
+ - if current_user.admin? && current_user.id != @user.id
29
+ .field
30
+ .label
31
+ %label{:for => 'permission_level'} Permission level
32
+ %select{ :id => "permission_level", :name => "user[permission_level]" }
33
+ %option{:value => -1, :selected => @user.admin?}
34
+ Admin
35
+ %option{:value => 1, :selected => @user.permission_level == 1}
36
+ Authenticated user
37
+ .buttons
38
+ %input{ :value => "Update", :type => "submit" }
39
+ - if Sinatra.const_defined?('FacebookObject')
40
+ - unless @user.fb_uid
41
+ |
42
+ = render_facebook_connect_link('Link account with Facebook')
@@ -0,0 +1,31 @@
1
+ #sinatra_authentication
2
+ %h1.page_title Users
3
+ %table
4
+ %tr
5
+ %th
6
+ - if current_user.admin?
7
+ %th permission level
8
+ - @users.each do |user|
9
+ %tr
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}"
17
+ - if current_user.admin?
18
+ %td= user.permission_level
19
+ %td
20
+ = user.name
21
+ %td
22
+ %a{:href => "/users/#{user.id}"} show
23
+ - if current_user.admin?
24
+ %td
25
+ %a{:href => "/users/#{user.id}/edit"} edit
26
+ %td
27
+ -# this doesn't work for tk
28
+ - if !user.site_admin?
29
+ %a{:href => "/users/#{user.id}/delete", :onclick => "return confirm('you sure?')"} delete
30
+ - else
31
+ site admin
@@ -0,0 +1,21 @@
1
+ #sinatra_authentication
2
+ #sinatra_authentication_flash= session[:flash]
3
+ %h1.page_title Login
4
+ %form{:action => "/login", :method => "post"}
5
+ .field
6
+ .label
7
+ %label{:for => "user_email'"} Email
8
+ %input{:id => "user_email", :name => "email", :size => 30, :type => "text"}
9
+ .field
10
+ .label
11
+ %label{:for => "user_password"} Password
12
+ %input{:id => "user_password", :name => "password", :size => 30, :type => "password"}
13
+ .buttons
14
+ %input{:value => "login", :type => "submit"}
15
+ %a{:href => "/signup", :class => 'sinatra_authentication_link'}
16
+ Signup
17
+ - if Sinatra.const_defined?('FacebookObject')
18
+ .third_party_signup
19
+ %h3.section_title One click login:
20
+ .login_link.facebook_login
21
+ = render_facebook_connect_link('Login using facebook', :size => 'large')
@@ -0,0 +1,9 @@
1
+ #sinatra_authentication
2
+ %h1.page_title
3
+ - if @user.email
4
+ = @user.email
5
+ - elsif @user.fb_uid
6
+ <fb:name uid=#{@user.fb_uid} linked='false' />
7
+ - if current_user.admin?
8
+ %h2 permission level
9
+ = @user.permission_level
@@ -0,0 +1,29 @@
1
+ #sinatra_authentication
2
+ #sinatra_authentication_flash= session[:flash]
3
+ %h1.page_title Signup
4
+ %form{:action => "/signup", :method => "post"}
5
+ .field
6
+ .label
7
+ %label{:for => "user_email"} Email
8
+ %input{ :id => "user_email", :name => "user[email]", :size => 30, :type => "text" }
9
+ .field
10
+ .label
11
+ %label{:for => "user_password"} Password
12
+ %input{ :id => "user_password", :name => "user[password]", :size => 30, :type => "password" }
13
+ .field
14
+ .label
15
+ %label{:for => "user_name"} Name
16
+ %input{ :id => "user_name", :name => "user[name]", :size => 30, :type => "text" }
17
+ .field
18
+ .label
19
+ %label{:for => "user_password_confirmation"} Confirm Password
20
+ %input{ :id => "user_password_confirmation", :name => "user[password_confirmation]", :size => 30, :type => "password" }
21
+ .buttons
22
+ %input{ :value => "Create account", :type => "submit" }
23
+ %a{:href => "/login", :class => 'sinatra_authentication_link'}
24
+ Login
25
+ - if Sinatra.const_defined?('FacebookObject')
26
+ .third_party_signup
27
+ %h3.section_title One click signup:
28
+ .login_link.facebook_login
29
+ = render_facebook_connect_link('Signup using facebook', :size => 'large')
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.2.4
4
+ version: 0.3.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: 2010-01-14 00:00:00 -06:00
12
+ date: 2010-04-17 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -72,6 +72,16 @@ dependencies:
72
72
  - !ruby/object:Gem::Version
73
73
  version: "0"
74
74
  version:
75
+ - !ruby/object:Gem::Dependency
76
+ name: rack-flash
77
+ type: :runtime
78
+ version_requirement:
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: "0"
84
+ version:
75
85
  description: Simple authentication plugin for sinatra.
76
86
  email: maxjustus@gmail.com
77
87
  executables: []
@@ -86,6 +96,16 @@ files:
86
96
  - Manifest
87
97
  - Rakefile
88
98
  - TODO
99
+ - example/dm_extend_app.rb
100
+ - example/dm_sinbook.rb
101
+ - example/extend_views/edit.haml
102
+ - example/extend_views/index.haml
103
+ - example/extend_views/login.haml
104
+ - example/extend_views/show.haml
105
+ - example/extend_views/signup.haml
106
+ - example/mm_app.rb
107
+ - example/tc_app.rb
108
+ - example/tc_sinbook.rb
89
109
  - lib/models/abstract_user.rb
90
110
  - lib/models/datamapper_user.rb
91
111
  - lib/models/dm_adapter.rb
@@ -103,7 +123,13 @@ files:
103
123
  - sinatra-authentication.gemspec
104
124
  - test/datamapper_test.rb
105
125
  - test/lib/dm_app.rb
126
+ - test/lib/dm_extend_app.rb
106
127
  - test/lib/dm_sinbook.rb
128
+ - test/lib/extend_views/edit.haml
129
+ - test/lib/extend_views/index.haml
130
+ - test/lib/extend_views/login.haml
131
+ - test/lib/extend_views/show.haml
132
+ - test/lib/extend_views/signup.haml
107
133
  - test/lib/helper.rb
108
134
  - test/lib/mm_app.rb
109
135
  - test/lib/tc_app.rb
@@ -145,6 +171,7 @@ test_files:
145
171
  - test/lib/mm_app.rb
146
172
  - test/lib/tc_sinbook.rb
147
173
  - test/lib/helper.rb
174
+ - test/lib/dm_extend_app.rb
148
175
  - test/lib/dm_app.rb
149
176
  - test/datamapper_test.rb
150
177
  - test/mongomapper_test.rb