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.
Files changed (46) hide show
  1. data/LICENSE +21 -0
  2. data/README.textile +136 -0
  3. data/Rakefile +83 -0
  4. data/TODO.textile +24 -0
  5. data/generators/clearance/USAGE +1 -0
  6. data/generators/clearance/clearance_generator.rb +69 -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 +86 -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 +69 -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 +208 -0
  45. data/lib/clearance/version.rb +7 -0
  46. 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>
@@ -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