thoughtbot-clearance 0.4.5 → 0.4.6
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.
- data/CHANGELOG.textile +6 -1
- data/KNOWN_ISSUES.textile +11 -0
- data/README.textile +1 -1
- data/Rakefile +1 -1
- data/lib/clearance/app/controllers/application_controller.rb +52 -51
- data/lib/clearance/app/controllers/confirmations_controller.rb +35 -30
- data/lib/clearance/app/controllers/passwords_controller.rb +47 -42
- data/lib/clearance/app/controllers/sessions_controller.rb +50 -45
- data/lib/clearance/app/controllers/users_controller.rb +26 -21
- data/lib/clearance/app/models/clearance_mailer.rb +11 -17
- data/lib/clearance/app/models/user.rb +81 -76
- data/lib/clearance/test/test_helper.rb +10 -16
- metadata +3 -2
data/CHANGELOG.textile
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
h2. 0.4.
|
1
|
+
h2. 0.4.6 (2/11/2009)
|
2
|
+
|
3
|
+
* making the modules behave like mixins again. (hat-tip Eloy Duran)
|
4
|
+
* created Actions and PrivateMethods modules on controllers for future RDoc reasons.
|
5
|
+
|
6
|
+
h2. 0.4.5 (2/9/2009)
|
2
7
|
|
3
8
|
* [#43] Removed email downcasing. (local-part is case sensitive per RFC5321)
|
4
9
|
* [#42] Removed dependency on Mocha.
|
@@ -0,0 +1,11 @@
|
|
1
|
+
h1. Known Issues
|
2
|
+
|
3
|
+
h2. Rails 2.3
|
4
|
+
|
5
|
+
* default_test failures - this is a "Rails 2.3 bug":http://is.gd/iZkY
|
6
|
+
* CGI::Cookie.new('token', 'value') returns nil "[#42]":http://is.gd/iZlO
|
7
|
+
* application.rb/application_controller.rb "[#44]":http://is.gd/iZl5
|
8
|
+
|
9
|
+
h2. i18n
|
10
|
+
|
11
|
+
* flash messages are in English-only "[#40]":http://is.gd/iZmq & "[#24]":http://is.gd/iZmz
|
data/README.textile
CHANGED
data/Rakefile
CHANGED
@@ -50,7 +50,7 @@ task :default => ['test:all', 'test:features']
|
|
50
50
|
|
51
51
|
gem_spec = Gem::Specification.new do |gem_spec|
|
52
52
|
gem_spec.name = "clearance"
|
53
|
-
gem_spec.version = "0.4.
|
53
|
+
gem_spec.version = "0.4.6"
|
54
54
|
gem_spec.summary = "Rails authentication for developers who write tests."
|
55
55
|
gem_spec.email = "support@thoughtbot.com"
|
56
56
|
gem_spec.homepage = "http://github.com/thoughtbot/clearance"
|
@@ -4,76 +4,77 @@ module Clearance
|
|
4
4
|
module ApplicationController
|
5
5
|
|
6
6
|
def self.included(controller)
|
7
|
+
controller.send(:include, InstanceMethods)
|
8
|
+
|
7
9
|
controller.class_eval do
|
8
|
-
|
9
10
|
helper_method :current_user
|
10
11
|
helper_method :signed_in?
|
11
12
|
|
12
13
|
hide_action :current_user, :signed_in?
|
14
|
+
end
|
15
|
+
end
|
13
16
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
+
module InstanceMethods
|
18
|
+
def current_user
|
19
|
+
@_current_user ||= (user_from_session || user_from_cookie)
|
20
|
+
end
|
17
21
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
def signed_in?
|
23
|
+
! current_user.nil?
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
def authenticate
|
29
|
+
deny_access unless signed_in?
|
30
|
+
end
|
27
31
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
32
|
+
def user_from_session
|
33
|
+
if session[:user_id]
|
34
|
+
user = User.find_by_id(session[:user_id])
|
35
|
+
user && user.email_confirmed? ? user : nil
|
33
36
|
end
|
37
|
+
end
|
34
38
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
39
|
+
def user_from_cookie
|
40
|
+
if cookies[:remember_token]
|
41
|
+
user = User.find_by_token(cookies[:remember_token])
|
42
|
+
user && user.remember? ? user : nil
|
40
43
|
end
|
44
|
+
end
|
41
45
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
+
def sign_user_in(user)
|
47
|
+
sign_in(user)
|
48
|
+
end
|
46
49
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
50
|
+
def sign_in(user)
|
51
|
+
if user
|
52
|
+
session[:user_id] = user.id
|
51
53
|
end
|
54
|
+
end
|
52
55
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
end
|
60
|
-
session[:return_to] = nil
|
56
|
+
def redirect_back_or(default)
|
57
|
+
session[:return_to] ||= params[:return_to]
|
58
|
+
if session[:return_to]
|
59
|
+
redirect_to(session[:return_to])
|
60
|
+
else
|
61
|
+
redirect_to(default)
|
61
62
|
end
|
63
|
+
session[:return_to] = nil
|
64
|
+
end
|
62
65
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
+
def redirect_to_root
|
67
|
+
redirect_to root_url
|
68
|
+
end
|
66
69
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
+
def store_location
|
71
|
+
session[:return_to] = request.request_uri if request.get?
|
72
|
+
end
|
70
73
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
end
|
76
|
-
|
74
|
+
def deny_access(flash_message = nil, opts = {})
|
75
|
+
store_location
|
76
|
+
flash[:failure] = flash_message if flash_message
|
77
|
+
render :template => "/sessions/new", :status => :unauthorized
|
77
78
|
end
|
78
79
|
end
|
79
80
|
|
@@ -4,45 +4,50 @@ module Clearance
|
|
4
4
|
module ConfirmationsController
|
5
5
|
|
6
6
|
def self.included(controller)
|
7
|
+
controller.send(:include, Actions)
|
8
|
+
controller.send(:include, PrivateMethods)
|
9
|
+
|
7
10
|
controller.class_eval do
|
8
|
-
|
9
11
|
before_filter :email_confirmed_user?, :only => :new
|
10
12
|
before_filter :existing_user?, :only => :new
|
11
|
-
filter_parameter_logging :token
|
13
|
+
filter_parameter_logging :token
|
14
|
+
end
|
15
|
+
end
|
12
16
|
|
13
|
-
|
14
|
-
|
15
|
-
|
17
|
+
module Actions
|
18
|
+
def new
|
19
|
+
create
|
20
|
+
end
|
16
21
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
22
|
+
def create
|
23
|
+
@user.confirm_email!
|
24
|
+
sign_user_in(@user)
|
25
|
+
flash[:success] = "Confirmed email and signed in."
|
26
|
+
redirect_to url_after_create
|
27
|
+
end
|
28
|
+
end
|
23
29
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
module PrivateMethods
|
31
|
+
private
|
32
|
+
|
33
|
+
def email_confirmed_user?
|
34
|
+
@user = User.find_by_id(params[:user_id])
|
35
|
+
if @user.nil?
|
36
|
+
render :nothing => true, :status => :not_found
|
37
|
+
elsif @user.email_confirmed?
|
38
|
+
redirect_to new_session_url
|
33
39
|
end
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
+
end
|
41
|
+
|
42
|
+
def existing_user?
|
43
|
+
@user = User.find_by_id_and_token(params[:user_id], params[:token])
|
44
|
+
if @user.nil?
|
45
|
+
render :nothing => true, :status => :not_found
|
40
46
|
end
|
47
|
+
end
|
41
48
|
|
42
|
-
|
43
|
-
|
44
|
-
end
|
45
|
-
|
49
|
+
def url_after_create
|
50
|
+
root_url
|
46
51
|
end
|
47
52
|
end
|
48
53
|
|
@@ -4,57 +4,62 @@ module Clearance
|
|
4
4
|
module PasswordsController
|
5
5
|
|
6
6
|
def self.included(controller)
|
7
|
-
controller.
|
8
|
-
|
7
|
+
controller.send(:include, Actions)
|
8
|
+
controller.send(:include, PrivateMethods)
|
9
|
+
|
10
|
+
controller.class_eval do
|
9
11
|
before_filter :existing_user?, :only => [:edit, :update]
|
10
12
|
filter_parameter_logging :password, :password_confirmation
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Actions
|
17
|
+
def new
|
18
|
+
end
|
14
19
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end
|
20
|
+
def create
|
21
|
+
user = User.find_by_email(params[:password][:email])
|
22
|
+
if user.nil?
|
23
|
+
flash.now[:notice] = "Unknown email"
|
24
|
+
render :action => :new
|
25
|
+
else
|
26
|
+
user.forgot_password!
|
27
|
+
ClearanceMailer.deliver_change_password user
|
28
|
+
flash[:notice] = "Details for changing your password " <<
|
29
|
+
"have been sent to #{user.email}"
|
30
|
+
redirect_to url_after_create
|
27
31
|
end
|
32
|
+
end
|
28
33
|
|
29
|
-
|
30
|
-
|
34
|
+
def edit
|
35
|
+
end
|
31
36
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
37
|
+
def update
|
38
|
+
if @user.update_password(params[:user])
|
39
|
+
sign_user_in(@user)
|
40
|
+
redirect_to url_after_update
|
41
|
+
else
|
42
|
+
render :action => :edit
|
39
43
|
end
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module PrivateMethods
|
48
|
+
private
|
49
|
+
|
50
|
+
def existing_user?
|
51
|
+
@user = User.find_by_id_and_token(params[:user_id], params[:token])
|
52
|
+
if @user.nil?
|
53
|
+
render :nothing => true, :status => :not_found
|
48
54
|
end
|
55
|
+
end
|
49
56
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
57
|
-
|
57
|
+
def url_after_create
|
58
|
+
new_session_url
|
59
|
+
end
|
60
|
+
|
61
|
+
def url_after_update
|
62
|
+
root_url
|
58
63
|
end
|
59
64
|
end
|
60
65
|
|
@@ -4,62 +4,67 @@ module Clearance
|
|
4
4
|
module SessionsController
|
5
5
|
|
6
6
|
def self.included(controller)
|
7
|
+
controller.send(:include, Actions)
|
8
|
+
controller.send(:include, PrivateMethods)
|
9
|
+
|
7
10
|
controller.class_eval do
|
8
|
-
|
9
11
|
protect_from_forgery :except => :create
|
10
|
-
filter_parameter_logging :password
|
12
|
+
filter_parameter_logging :password
|
13
|
+
end
|
14
|
+
end
|
11
15
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
module Actions
|
17
|
+
def create
|
18
|
+
@user = User.authenticate(params[:session][:email],
|
19
|
+
params[:session][:password])
|
20
|
+
if @user.nil?
|
21
|
+
flash.now[:notice] = "Bad email or password."
|
22
|
+
render :action => :new
|
23
|
+
else
|
24
|
+
if @user.email_confirmed?
|
25
|
+
remember(@user) if remember?
|
26
|
+
sign_user_in(@user)
|
27
|
+
flash[:notice] = "Signed in successfully"
|
28
|
+
redirect_back_or url_after_create
|
18
29
|
else
|
19
|
-
|
20
|
-
|
21
|
-
sign_user_in(@user)
|
22
|
-
flash[:notice] = "Signed in successfully"
|
23
|
-
redirect_back_or url_after_create
|
24
|
-
else
|
25
|
-
ClearanceMailer.deliver_confirmation(@user)
|
26
|
-
deny_access("User has not confirmed email. Confirmation email will be resent.")
|
27
|
-
end
|
30
|
+
ClearanceMailer.deliver_confirmation(@user)
|
31
|
+
deny_access("User has not confirmed email. Confirmation email will be resent.")
|
28
32
|
end
|
29
33
|
end
|
34
|
+
end
|
30
35
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
36
|
+
def destroy
|
37
|
+
forget(current_user)
|
38
|
+
reset_session
|
39
|
+
flash[:notice] = "You have been signed out."
|
40
|
+
redirect_to url_after_destroy
|
41
|
+
end
|
42
|
+
end
|
37
43
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
module PrivateMethods
|
45
|
+
private
|
46
|
+
|
47
|
+
def remember?
|
48
|
+
params[:session] && params[:session][:remember_me] == "1"
|
49
|
+
end
|
50
|
+
|
51
|
+
def remember(user)
|
52
|
+
user.remember_me!
|
53
|
+
cookies[:remember_token] = { :value => user.token,
|
54
|
+
:expires => user.token_expires_at }
|
55
|
+
end
|
49
56
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
57
|
+
def forget(user)
|
58
|
+
user.forget_me! if user
|
59
|
+
cookies.delete :remember_token
|
60
|
+
end
|
54
61
|
|
55
|
-
|
56
|
-
|
57
|
-
|
62
|
+
def url_after_create
|
63
|
+
root_url
|
64
|
+
end
|
58
65
|
|
59
|
-
|
60
|
-
|
61
|
-
end
|
62
|
-
|
66
|
+
def url_after_destroy
|
67
|
+
new_session_url
|
63
68
|
end
|
64
69
|
end
|
65
70
|
|
@@ -4,33 +4,38 @@ module Clearance
|
|
4
4
|
module UsersController
|
5
5
|
|
6
6
|
def self.included(controller)
|
7
|
+
controller.send(:include, Actions)
|
8
|
+
controller.send(:include, PrivateMethods)
|
9
|
+
|
7
10
|
controller.class_eval do
|
8
|
-
|
9
11
|
before_filter :redirect_to_root, :only => [:new, :create], :if => :signed_in?
|
10
|
-
filter_parameter_logging :password
|
12
|
+
filter_parameter_logging :password
|
13
|
+
end
|
14
|
+
end
|
11
15
|
|
12
|
-
|
13
|
-
|
14
|
-
|
16
|
+
module Actions
|
17
|
+
def new
|
18
|
+
@user = User.new(params[:user])
|
19
|
+
end
|
15
20
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
21
|
+
def create
|
22
|
+
@user = User.new params[:user]
|
23
|
+
if @user.save
|
24
|
+
ClearanceMailer.deliver_confirmation @user
|
25
|
+
flash[:notice] = "You will receive an email within the next few minutes. " <<
|
26
|
+
"It contains instructions for you to confirm your account."
|
27
|
+
redirect_to url_after_create
|
28
|
+
else
|
29
|
+
render :action => "new"
|
26
30
|
end
|
31
|
+
end
|
32
|
+
end
|
27
33
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
+
module PrivateMethods
|
35
|
+
private
|
36
|
+
|
37
|
+
def url_after_create
|
38
|
+
new_session_url
|
34
39
|
end
|
35
40
|
end
|
36
41
|
|
@@ -2,25 +2,19 @@ module Clearance
|
|
2
2
|
module App
|
3
3
|
module Models
|
4
4
|
module ClearanceMailer
|
5
|
-
|
6
|
-
def self.included(mailer)
|
7
|
-
mailer.class_eval do
|
8
5
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
6
|
+
def change_password(user)
|
7
|
+
from DO_NOT_REPLY
|
8
|
+
recipients user.email
|
9
|
+
subject "Change your password"
|
10
|
+
body :user => user
|
11
|
+
end
|
15
12
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
13
|
+
def confirmation(user)
|
14
|
+
from DO_NOT_REPLY
|
15
|
+
recipients user.email
|
16
|
+
subject "Account confirmation"
|
17
|
+
body :user => user
|
24
18
|
end
|
25
19
|
|
26
20
|
end
|
@@ -6,8 +6,10 @@ module Clearance
|
|
6
6
|
module User
|
7
7
|
|
8
8
|
def self.included(model)
|
9
|
+
model.extend ClassMethods
|
10
|
+
model.send(:include, InstanceMethods)
|
11
|
+
|
9
12
|
model.class_eval do
|
10
|
-
|
11
13
|
attr_accessible :email, :password, :password_confirmation
|
12
14
|
attr_accessor :password, :password_confirmation
|
13
15
|
|
@@ -18,95 +20,98 @@ module Clearance
|
|
18
20
|
validates_format_of :email, :with => %r{.+@.+\..+}
|
19
21
|
|
20
22
|
before_save :initialize_salt, :encrypt_password, :initialize_token
|
23
|
+
end
|
24
|
+
end
|
21
25
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
+
module InstanceMethods
|
27
|
+
def authenticated?(password)
|
28
|
+
encrypted_password == encrypt(password)
|
29
|
+
end
|
26
30
|
|
27
|
-
|
28
|
-
|
29
|
-
|
31
|
+
def encrypt(string)
|
32
|
+
generate_hash("--#{salt}--#{string}--")
|
33
|
+
end
|
30
34
|
|
31
|
-
|
32
|
-
|
33
|
-
|
35
|
+
def remember?
|
36
|
+
token_expires_at && Time.now.utc < token_expires_at
|
37
|
+
end
|
34
38
|
|
35
|
-
|
36
|
-
|
37
|
-
|
39
|
+
def remember_me!
|
40
|
+
remember_me_until 2.weeks.from_now.utc
|
41
|
+
end
|
38
42
|
|
39
|
-
|
40
|
-
|
41
|
-
|
43
|
+
def remember_me_until(time)
|
44
|
+
self.token_expires_at = time
|
45
|
+
self.token = encrypt("--#{token_expires_at}--#{password}--")
|
46
|
+
save(false)
|
47
|
+
end
|
42
48
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
49
|
+
def forget_me!
|
50
|
+
clear_token
|
51
|
+
save(false)
|
52
|
+
end
|
48
53
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
54
|
+
def confirm_email!
|
55
|
+
self.email_confirmed = true
|
56
|
+
self.token = nil
|
57
|
+
save(false)
|
58
|
+
end
|
53
59
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
def forgot_password!
|
61
|
-
generate_token
|
62
|
-
save(false)
|
63
|
-
end
|
64
|
-
|
65
|
-
def update_password(attrs)
|
66
|
-
clear_token
|
67
|
-
returning update_attributes(attrs) do |r|
|
68
|
-
reload unless r
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
protected
|
73
|
-
|
74
|
-
def generate_hash(string)
|
75
|
-
Digest::SHA1.hexdigest(string)
|
76
|
-
end
|
60
|
+
def forgot_password!
|
61
|
+
generate_token
|
62
|
+
save(false)
|
63
|
+
end
|
77
64
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
65
|
+
def update_password(attrs)
|
66
|
+
clear_token
|
67
|
+
returning update_attributes(attrs) do |r|
|
68
|
+
reload unless r
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
protected
|
73
|
+
|
74
|
+
def generate_hash(string)
|
75
|
+
Digest::SHA1.hexdigest(string)
|
76
|
+
end
|
83
77
|
|
84
|
-
|
85
|
-
|
86
|
-
self.
|
87
|
-
end
|
88
|
-
|
89
|
-
def generate_token
|
90
|
-
self.token = encrypt("--#{Time.now.utc.to_s}--#{password}--")
|
91
|
-
self.token_expires_at = nil
|
92
|
-
end
|
93
|
-
|
94
|
-
def clear_token
|
95
|
-
self.token = nil
|
96
|
-
self.token_expires_at = nil
|
97
|
-
end
|
98
|
-
|
99
|
-
def initialize_token
|
100
|
-
generate_token if new_record?
|
78
|
+
def initialize_salt
|
79
|
+
if new_record?
|
80
|
+
self.salt = generate_hash("--#{Time.now.utc.to_s}--#{password}--")
|
101
81
|
end
|
82
|
+
end
|
102
83
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
84
|
+
def encrypt_password
|
85
|
+
return if password.blank?
|
86
|
+
self.encrypted_password = encrypt(password)
|
87
|
+
end
|
88
|
+
|
89
|
+
def generate_token
|
90
|
+
self.token = encrypt("--#{Time.now.utc.to_s}--#{password}--")
|
91
|
+
self.token_expires_at = nil
|
92
|
+
end
|
93
|
+
|
94
|
+
def clear_token
|
95
|
+
self.token = nil
|
96
|
+
self.token_expires_at = nil
|
97
|
+
end
|
98
|
+
|
99
|
+
def initialize_token
|
100
|
+
generate_token if new_record?
|
101
|
+
end
|
102
|
+
|
103
|
+
def password_required?
|
104
|
+
encrypted_password.blank? || !password.blank?
|
107
105
|
end
|
108
106
|
end
|
109
|
-
|
107
|
+
|
108
|
+
module ClassMethods
|
109
|
+
def authenticate(email, password)
|
110
|
+
user = find(:first, :conditions => ['email = ?', email.to_s])
|
111
|
+
user && user.authenticated?(password) ? user : nil
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
110
115
|
end
|
111
116
|
end
|
112
117
|
end
|
@@ -2,23 +2,17 @@ module Clearance
|
|
2
2
|
module Test
|
3
3
|
module TestHelper
|
4
4
|
|
5
|
-
def
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
unless user
|
10
|
-
user = Factory(:user)
|
11
|
-
user.confirm_email!
|
12
|
-
end
|
13
|
-
@request.session[:user_id] = user.id
|
14
|
-
return user
|
15
|
-
end
|
16
|
-
|
17
|
-
def sign_out
|
18
|
-
@request.session[:user_id] = nil
|
19
|
-
end
|
20
|
-
|
5
|
+
def sign_in_as(user = nil)
|
6
|
+
unless user
|
7
|
+
user = Factory(:user)
|
8
|
+
user.confirm_email!
|
21
9
|
end
|
10
|
+
@request.session[:user_id] = user.id
|
11
|
+
return user
|
12
|
+
end
|
13
|
+
|
14
|
+
def sign_out
|
15
|
+
@request.session[:user_id] = nil
|
22
16
|
end
|
23
17
|
|
24
18
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thoughtbot-clearance
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- thoughtbot, inc.
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2009-02-
|
18
|
+
date: 2009-02-10 21:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -29,6 +29,7 @@ extra_rdoc_files: []
|
|
29
29
|
|
30
30
|
files:
|
31
31
|
- CHANGELOG.textile
|
32
|
+
- KNOWN_ISSUES.textile
|
32
33
|
- LICENSE
|
33
34
|
- Rakefile
|
34
35
|
- README.textile
|