gravis-clearance 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/LICENSE +21 -0
  2. data/README.textile +165 -0
  3. data/Rakefile +46 -0
  4. data/TODO.textile +22 -0
  5. data/generators/clearance/USAGE +1 -0
  6. data/generators/clearance/clearance_generator.rb +73 -0
  7. data/generators/clearance/templates/app/controllers/application.rb +5 -0
  8. data/generators/clearance/templates/app/controllers/confirmations_controller.rb +3 -0
  9. data/generators/clearance/templates/app/controllers/passwords_controller.rb +3 -0
  10. data/generators/clearance/templates/app/controllers/sessions_controller.rb +3 -0
  11. data/generators/clearance/templates/app/controllers/users_controller.rb +3 -0
  12. data/generators/clearance/templates/app/models/clearance_mailer.rb +5 -0
  13. data/generators/clearance/templates/app/models/user.rb +3 -0
  14. data/generators/clearance/templates/app/views/clearance_mailer/change_password.html.erb +6 -0
  15. data/generators/clearance/templates/app/views/clearance_mailer/confirmation.html.erb +1 -0
  16. data/generators/clearance/templates/app/views/confirmations/new.html.erb +6 -0
  17. data/generators/clearance/templates/app/views/passwords/edit.html.erb +23 -0
  18. data/generators/clearance/templates/app/views/passwords/new.html.erb +15 -0
  19. data/generators/clearance/templates/app/views/sessions/new.html.erb +26 -0
  20. data/generators/clearance/templates/app/views/users/_form.html.erb +13 -0
  21. data/generators/clearance/templates/app/views/users/edit.html.erb +4 -0
  22. data/generators/clearance/templates/app/views/users/new.html.erb +4 -0
  23. data/generators/clearance/templates/test/factories.rb +9 -0
  24. data/generators/clearance/templates/test/functional/confirmations_controller_test.rb +5 -0
  25. data/generators/clearance/templates/test/functional/passwords_controller_test.rb +5 -0
  26. data/generators/clearance/templates/test/functional/sessions_controller_test.rb +5 -0
  27. data/generators/clearance/templates/test/functional/users_controller_test.rb +5 -0
  28. data/generators/clearance/templates/test/unit/clearance_mailer_test.rb +6 -0
  29. data/generators/clearance/templates/test/unit/user_test.rb +5 -0
  30. data/lib/clearance.rb +15 -0
  31. data/lib/clearance/app/controllers/application_controller.rb +84 -0
  32. data/lib/clearance/app/controllers/confirmations_controller.rb +46 -0
  33. data/lib/clearance/app/controllers/passwords_controller.rb +67 -0
  34. data/lib/clearance/app/controllers/sessions_controller.rb +79 -0
  35. data/lib/clearance/app/controllers/users_controller.rb +47 -0
  36. data/lib/clearance/app/models/clearance_mailer.rb +33 -0
  37. data/lib/clearance/app/models/user.rb +93 -0
  38. data/lib/clearance/test/functional/confirmations_controller_test.rb +85 -0
  39. data/lib/clearance/test/functional/passwords_controller_test.rb +188 -0
  40. data/lib/clearance/test/functional/sessions_controller_test.rb +148 -0
  41. data/lib/clearance/test/functional/users_controller_test.rb +67 -0
  42. data/lib/clearance/test/test_helper.rb +94 -0
  43. data/lib/clearance/test/unit/clearance_mailer_test.rb +63 -0
  44. data/lib/clearance/test/unit/user_test.rb +222 -0
  45. data/lib/clearance/version.rb +7 -0
  46. 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>
@@ -0,0 +1,4 @@
1
+ <% form_for @user do |form| %>
2
+ <%= render :partial => '/users/form', :object => form %>
3
+ <%= form.submit 'Update', :disable_with => 'Please wait...' %>
4
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <% form_for @user do |form| %>
2
+ <%= render :partial => '/users/form', :object => form %>
3
+ <%= form.submit 'Sign up', :disable_with => 'Please wait...' %>
4
+ <% end %>
@@ -0,0 +1,9 @@
1
+ Factory.sequence :email do |n|
2
+ "user#{n}@example.com"
3
+ end
4
+
5
+ Factory.define :user do |user|
6
+ user.email { Factory.next :email }
7
+ user.password "password"
8
+ user.password_confirmation "password"
9
+ end
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class ConfirmationsControllerTest < ActionController::TestCase
4
+ include Clearance::Test::Functional::ConfirmationsControllerTest
5
+ end
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class PasswordsControllerTest < ActionController::TestCase
4
+ include Clearance::Test::Functional::PasswordsControllerTest
5
+ end
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class SessionsControllerTest < ActionController::TestCase
4
+ include Clearance::Test::Functional::SessionsControllerTest
5
+ end
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class UsersControllerTest < ActionController::TestCase
4
+ include Clearance::Test::Functional::UsersControllerTest
5
+ end
@@ -0,0 +1,6 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class ClearanceMailerTest < ActionMailer::TestCase
4
+ tests ClearanceMailer
5
+ include Clearance::Test::Unit::ClearanceMailerTest
6
+ end
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class UserTest < Test::Unit::TestCase
4
+ include Clearance::Test::Unit::UserTest
5
+ end
@@ -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