thoughtbot-clearance 0.4.5 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|