mischa-clearance 0.3.3
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/LICENSE +21 -0
- data/README.textile +136 -0
- data/Rakefile +83 -0
- data/TODO.textile +24 -0
- data/generators/clearance/USAGE +1 -0
- data/generators/clearance/clearance_generator.rb +69 -0
- data/generators/clearance/templates/app/controllers/application.rb +5 -0
- data/generators/clearance/templates/app/controllers/confirmations_controller.rb +3 -0
- data/generators/clearance/templates/app/controllers/passwords_controller.rb +3 -0
- data/generators/clearance/templates/app/controllers/sessions_controller.rb +3 -0
- data/generators/clearance/templates/app/controllers/users_controller.rb +3 -0
- data/generators/clearance/templates/app/models/clearance_mailer.rb +5 -0
- data/generators/clearance/templates/app/models/user.rb +3 -0
- data/generators/clearance/templates/app/views/clearance_mailer/change_password.html.erb +6 -0
- data/generators/clearance/templates/app/views/clearance_mailer/confirmation.html.erb +1 -0
- data/generators/clearance/templates/app/views/confirmations/new.html.erb +6 -0
- data/generators/clearance/templates/app/views/passwords/edit.html.erb +23 -0
- data/generators/clearance/templates/app/views/passwords/new.html.erb +15 -0
- data/generators/clearance/templates/app/views/sessions/new.html.erb +26 -0
- data/generators/clearance/templates/app/views/users/_form.html.erb +13 -0
- data/generators/clearance/templates/app/views/users/edit.html.erb +4 -0
- data/generators/clearance/templates/app/views/users/new.html.erb +4 -0
- data/generators/clearance/templates/test/factories.rb +9 -0
- data/generators/clearance/templates/test/functional/confirmations_controller_test.rb +5 -0
- data/generators/clearance/templates/test/functional/passwords_controller_test.rb +5 -0
- data/generators/clearance/templates/test/functional/sessions_controller_test.rb +5 -0
- data/generators/clearance/templates/test/functional/users_controller_test.rb +5 -0
- data/generators/clearance/templates/test/unit/clearance_mailer_test.rb +6 -0
- data/generators/clearance/templates/test/unit/user_test.rb +5 -0
- data/lib/clearance.rb +15 -0
- data/lib/clearance/app/controllers/application_controller.rb +84 -0
- data/lib/clearance/app/controllers/confirmations_controller.rb +46 -0
- data/lib/clearance/app/controllers/passwords_controller.rb +67 -0
- data/lib/clearance/app/controllers/sessions_controller.rb +79 -0
- data/lib/clearance/app/controllers/users_controller.rb +47 -0
- data/lib/clearance/app/models/clearance_mailer.rb +33 -0
- data/lib/clearance/app/models/user.rb +86 -0
- data/lib/clearance/test/functional/confirmations_controller_test.rb +85 -0
- data/lib/clearance/test/functional/passwords_controller_test.rb +188 -0
- data/lib/clearance/test/functional/sessions_controller_test.rb +148 -0
- data/lib/clearance/test/functional/users_controller_test.rb +69 -0
- data/lib/clearance/test/test_helper.rb +94 -0
- data/lib/clearance/test/unit/clearance_mailer_test.rb +63 -0
- data/lib/clearance/test/unit/user_test.rb +208 -0
- data/lib/clearance/version.rb +7 -0
- metadata +127 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
<%= form.error_messages %>
|
2
|
+
<div class="text_field">
|
3
|
+
<%= form.label :email %>
|
4
|
+
<%= form.text_field :email %>
|
5
|
+
</div>
|
6
|
+
<div class="password_field">
|
7
|
+
<%= form.label :password %>
|
8
|
+
<%= form.password_field :password %>
|
9
|
+
</div>
|
10
|
+
<div class="password_field">
|
11
|
+
<%= form.label :password_confirmation %>
|
12
|
+
<%= form.password_field :password_confirmation %>
|
13
|
+
</div>
|
data/lib/clearance.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'clearance/app/controllers/application_controller'
|
2
|
+
require 'clearance/app/controllers/confirmations_controller'
|
3
|
+
require 'clearance/app/controllers/passwords_controller'
|
4
|
+
require 'clearance/app/controllers/sessions_controller'
|
5
|
+
require 'clearance/app/controllers/users_controller'
|
6
|
+
require 'clearance/app/models/user'
|
7
|
+
require 'clearance/app/models/clearance_mailer'
|
8
|
+
require 'clearance/test/functional/confirmations_controller_test'
|
9
|
+
require 'clearance/test/functional/sessions_controller_test'
|
10
|
+
require 'clearance/test/functional/users_controller_test'
|
11
|
+
require 'clearance/test/functional/passwords_controller_test'
|
12
|
+
require 'clearance/test/test_helper'
|
13
|
+
require 'clearance/test/unit/user_test'
|
14
|
+
require 'clearance/test/unit/clearance_mailer_test'
|
15
|
+
require 'clearance/version'
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Clearance
|
2
|
+
module App
|
3
|
+
module Controllers
|
4
|
+
module ApplicationController
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.class_eval do
|
8
|
+
helper_method :current_user
|
9
|
+
helper_method :logged_in?
|
10
|
+
|
11
|
+
include InstanceMethods
|
12
|
+
|
13
|
+
protected
|
14
|
+
include ProtectedInstanceMethods
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module InstanceMethods
|
19
|
+
def current_user
|
20
|
+
@current_user ||= (user_from_session || user_from_cookie)
|
21
|
+
end
|
22
|
+
|
23
|
+
def logged_in?
|
24
|
+
! current_user.nil?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module ProtectedInstanceMethods
|
29
|
+
def authenticate
|
30
|
+
deny_access unless logged_in?
|
31
|
+
end
|
32
|
+
|
33
|
+
def user_from_session
|
34
|
+
user_model.find_by_id session[:user_id]
|
35
|
+
end
|
36
|
+
|
37
|
+
def user_from_cookie
|
38
|
+
user = user_model.find_by_remember_token(cookies[:auth_token]) if cookies[:auth_token]
|
39
|
+
user && user.remember_token? ? user : nil
|
40
|
+
end
|
41
|
+
|
42
|
+
# Level of indirection so you can easily override this method
|
43
|
+
# but also call #login .
|
44
|
+
def log_user_in(user)
|
45
|
+
login(user)
|
46
|
+
end
|
47
|
+
|
48
|
+
def login(user)
|
49
|
+
session[:user_id] = user.id if user
|
50
|
+
@current_user = user
|
51
|
+
end
|
52
|
+
|
53
|
+
def redirect_back_or(default)
|
54
|
+
session[:return_to] ? redirect_to(session[:return_to]) : redirect_to(default)
|
55
|
+
session[:return_to] = nil
|
56
|
+
end
|
57
|
+
|
58
|
+
def redirect_to_root
|
59
|
+
redirect_to root_url
|
60
|
+
end
|
61
|
+
|
62
|
+
def store_location
|
63
|
+
session[:return_to] = request.request_uri
|
64
|
+
end
|
65
|
+
|
66
|
+
def deny_access(flash_message = nil, opts = {})
|
67
|
+
opts[:redirect] ||= new_session_path
|
68
|
+
store_location
|
69
|
+
flash[:error] = flash_message if flash_message
|
70
|
+
redirect_to opts[:redirect]
|
71
|
+
end
|
72
|
+
|
73
|
+
def user_model
|
74
|
+
User
|
75
|
+
end
|
76
|
+
|
77
|
+
def mailer_model
|
78
|
+
ClearanceMailer
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Clearance
|
2
|
+
module App
|
3
|
+
module Controllers
|
4
|
+
module ConfirmationsController
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.class_eval do
|
8
|
+
before_filter :existing_user?, :only => [:new, :create]
|
9
|
+
|
10
|
+
include InstanceMethods
|
11
|
+
|
12
|
+
private
|
13
|
+
include PrivateInstanceMethods
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module InstanceMethods
|
18
|
+
def new
|
19
|
+
@user = User.find_by_id_and_salt(params[:user_id], params[:salt])
|
20
|
+
end
|
21
|
+
|
22
|
+
def create
|
23
|
+
@user = User.find_by_id_and_salt(params[:user_id], params[:salt])
|
24
|
+
@user.confirm!
|
25
|
+
session[:user_id] = @user.id
|
26
|
+
redirect_to url_after_create
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
module PrivateInstanceMethods
|
31
|
+
def existing_user?
|
32
|
+
user = User.find_by_id_and_salt(params[:user_id], params[:salt])
|
33
|
+
if user.nil?
|
34
|
+
render :nothing => true, :status => :not_found
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def url_after_create
|
39
|
+
root_url
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Clearance
|
2
|
+
module App
|
3
|
+
module Controllers
|
4
|
+
module PasswordsController
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.class_eval do
|
8
|
+
before_filter :existing_user?, :only => [:edit, :update]
|
9
|
+
filter_parameter_logging :password, :password_confirmation
|
10
|
+
|
11
|
+
include InstanceMethods
|
12
|
+
|
13
|
+
private
|
14
|
+
include PrivateInstanceMethods
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module InstanceMethods
|
19
|
+
def new
|
20
|
+
end
|
21
|
+
|
22
|
+
def create
|
23
|
+
user = User.find_by_email params[:password][:email]
|
24
|
+
if user.nil?
|
25
|
+
flash.now[:warning] = 'Unknown email'
|
26
|
+
render :action => :new
|
27
|
+
else
|
28
|
+
ClearanceMailer.deliver_change_password user
|
29
|
+
redirect_to url_after_create
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def edit
|
34
|
+
@user = User.find_by_email_and_crypted_password(params[:email],
|
35
|
+
params[:password])
|
36
|
+
end
|
37
|
+
|
38
|
+
def update
|
39
|
+
@user = User.find_by_email_and_crypted_password(params[:email],
|
40
|
+
params[:password])
|
41
|
+
if @user.update_attributes params[:user]
|
42
|
+
session[:user_id] = @user.id
|
43
|
+
redirect_to @user
|
44
|
+
else
|
45
|
+
render :action => :edit
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
module PrivateInstanceMethods
|
51
|
+
def existing_user?
|
52
|
+
user = User.find_by_email_and_crypted_password(params[:email],
|
53
|
+
params[:password])
|
54
|
+
if user.nil?
|
55
|
+
render :nothing => true, :status => :not_found
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def url_after_create
|
60
|
+
new_session_url
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Clearance
|
2
|
+
module App
|
3
|
+
module Controllers
|
4
|
+
module SessionsController
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.class_eval do
|
8
|
+
skip_before_filter :authenticate
|
9
|
+
protect_from_forgery :except => :create
|
10
|
+
filter_parameter_logging :password
|
11
|
+
|
12
|
+
include InstanceMethods
|
13
|
+
|
14
|
+
private
|
15
|
+
include PrivateInstanceMethods
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module InstanceMethods
|
20
|
+
def create
|
21
|
+
@user = user_model.authenticate(params[:session][:email], params[:session][:password])
|
22
|
+
if @user.nil?
|
23
|
+
login_failure
|
24
|
+
else
|
25
|
+
if @user.confirmed?
|
26
|
+
remember_me = params[:session][:remember_me] if params[:session]
|
27
|
+
remember(@user) if remember_me == '1'
|
28
|
+
log_user_in(@user)
|
29
|
+
login_successful
|
30
|
+
else
|
31
|
+
mailer_model.deliver_confirmation(@user)
|
32
|
+
deny_access('Account not confirmed. Confirmation email sent.')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def destroy
|
38
|
+
forget(current_user)
|
39
|
+
reset_session
|
40
|
+
flash[:notice] = 'You have been logged out.'
|
41
|
+
redirect_to url_after_destroy
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module PrivateInstanceMethods
|
46
|
+
def login_successful
|
47
|
+
flash[:notice] = 'Logged in successfully'
|
48
|
+
redirect_back_or url_after_create
|
49
|
+
end
|
50
|
+
|
51
|
+
def login_failure(message = "Bad email or password.")
|
52
|
+
flash.now[:notice] = message
|
53
|
+
render :action => :new
|
54
|
+
end
|
55
|
+
|
56
|
+
def remember(user)
|
57
|
+
user.remember_me!
|
58
|
+
cookies[:auth_token] = { :value => user.remember_token,
|
59
|
+
:expires => user.remember_token_expires_at }
|
60
|
+
end
|
61
|
+
|
62
|
+
def forget(user)
|
63
|
+
user.forget_me! if user
|
64
|
+
cookies.delete :auth_token
|
65
|
+
end
|
66
|
+
|
67
|
+
def url_after_create
|
68
|
+
root_url
|
69
|
+
end
|
70
|
+
|
71
|
+
def url_after_destroy
|
72
|
+
new_session_url
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Clearance
|
2
|
+
module App
|
3
|
+
module Controllers
|
4
|
+
module UsersController
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.class_eval do
|
8
|
+
before_filter :redirect_to_root, :only => [:new, :create], :if => :logged_in?
|
9
|
+
|
10
|
+
filter_parameter_logging :password
|
11
|
+
|
12
|
+
include InstanceMethods
|
13
|
+
|
14
|
+
private
|
15
|
+
include PrivateInstanceMethods
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module InstanceMethods
|
20
|
+
def new
|
21
|
+
@user = user_model.new(params[:user])
|
22
|
+
end
|
23
|
+
|
24
|
+
def create
|
25
|
+
@user = user_model.new params[:user]
|
26
|
+
if @user.save
|
27
|
+
ClearanceMailer.deliver_confirmation @user
|
28
|
+
flash[:notice] = "You will receive an email within the next few minutes. It contains instructions for you to confirm your account."
|
29
|
+
redirect_to url_after_create
|
30
|
+
else
|
31
|
+
render :action => "new"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module PrivateInstanceMethods
|
37
|
+
|
38
|
+
def url_after_create
|
39
|
+
new_session_url
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Clearance
|
2
|
+
module App
|
3
|
+
module Models
|
4
|
+
module ClearanceMailer
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.class_eval do
|
8
|
+
|
9
|
+
include InstanceMethods
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module InstanceMethods
|
15
|
+
def change_password(user)
|
16
|
+
from DO_NOT_REPLY
|
17
|
+
recipients user.email
|
18
|
+
subject "[#{PROJECT_NAME.humanize}] Change your password"
|
19
|
+
body :user => user
|
20
|
+
end
|
21
|
+
|
22
|
+
def confirmation(user)
|
23
|
+
recipients user.email
|
24
|
+
from DO_NOT_REPLY
|
25
|
+
subject "[#{PROJECT_NAME.humanize}] Account confirmation"
|
26
|
+
body :user => user
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|