gravis-clearance 0.3.7
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +21 -0
- data/README.textile +165 -0
- data/Rakefile +46 -0
- data/TODO.textile +22 -0
- data/generators/clearance/USAGE +1 -0
- data/generators/clearance/clearance_generator.rb +73 -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 +93 -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 +67 -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 +222 -0
- data/lib/clearance/version.rb +7 -0
- metadata +120 -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
|