janova-clearance 0.8.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/CHANGELOG.md +278 -0
  2. data/LICENSE +21 -0
  3. data/README.md +129 -0
  4. data/Rakefile +87 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/clearance/confirmations_controller.rb +76 -0
  7. data/app/controllers/clearance/passwords_controller.rb +85 -0
  8. data/app/controllers/clearance/sessions_controller.rb +67 -0
  9. data/app/controllers/clearance/users_controller.rb +35 -0
  10. data/app/models/clearance_mailer.rb +21 -0
  11. data/app/views/clearance_mailer/change_password.html.erb +9 -0
  12. data/app/views/clearance_mailer/confirmation.html.erb +5 -0
  13. data/app/views/passwords/edit.html.erb +23 -0
  14. data/app/views/passwords/new.html.erb +15 -0
  15. data/app/views/sessions/new.html.erb +24 -0
  16. data/app/views/users/_form.html.erb +13 -0
  17. data/app/views/users/new.html.erb +6 -0
  18. data/generators/clearance/USAGE +1 -0
  19. data/generators/clearance/clearance_generator.rb +68 -0
  20. data/generators/clearance/lib/insert_commands.rb +33 -0
  21. data/generators/clearance/lib/rake_commands.rb +22 -0
  22. data/generators/clearance/templates/README +24 -0
  23. data/generators/clearance/templates/clearance.rb +3 -0
  24. data/generators/clearance/templates/factories.rb +13 -0
  25. data/generators/clearance/templates/migrations/create_users.rb +21 -0
  26. data/generators/clearance/templates/migrations/update_users.rb +41 -0
  27. data/generators/clearance/templates/user.rb +3 -0
  28. data/generators/clearance_features/USAGE +1 -0
  29. data/generators/clearance_features/clearance_features_generator.rb +19 -0
  30. data/generators/clearance_features/templates/features/password_reset.feature +33 -0
  31. data/generators/clearance_features/templates/features/sign_in.feature +35 -0
  32. data/generators/clearance_features/templates/features/sign_out.feature +15 -0
  33. data/generators/clearance_features/templates/features/sign_up.feature +45 -0
  34. data/generators/clearance_features/templates/features/step_definitions/clearance_steps.rb +122 -0
  35. data/generators/clearance_features/templates/features/support/paths.rb +23 -0
  36. data/generators/clearance_views/USAGE +0 -0
  37. data/generators/clearance_views/clearance_views_generator.rb +27 -0
  38. data/generators/clearance_views/templates/formtastic/passwords/edit.html.erb +21 -0
  39. data/generators/clearance_views/templates/formtastic/passwords/new.html.erb +15 -0
  40. data/generators/clearance_views/templates/formtastic/sessions/new.html.erb +21 -0
  41. data/generators/clearance_views/templates/formtastic/users/_inputs.html.erb +6 -0
  42. data/generators/clearance_views/templates/formtastic/users/new.html.erb +10 -0
  43. data/lib/clearance/authentication.rb +131 -0
  44. data/lib/clearance/configuration.rb +25 -0
  45. data/lib/clearance/extensions/errors.rb +6 -0
  46. data/lib/clearance/extensions/rescue.rb +5 -0
  47. data/lib/clearance/routes.rb +49 -0
  48. data/lib/clearance/user.rb +207 -0
  49. data/lib/clearance.rb +7 -0
  50. data/rails/init.rb +1 -0
  51. data/shoulda_macros/clearance.rb +266 -0
  52. data/test/controllers/confirmations_controller_test.rb +104 -0
  53. data/test/controllers/passwords_controller_test.rb +183 -0
  54. data/test/controllers/sessions_controller_test.rb +146 -0
  55. data/test/controllers/users_controller_test.rb +65 -0
  56. data/test/models/clearance_mailer_test.rb +55 -0
  57. data/test/models/user_test.rb +260 -0
  58. data/test/rails_root/app/controllers/accounts_controller.rb +10 -0
  59. data/test/rails_root/app/controllers/application_controller.rb +6 -0
  60. data/test/rails_root/app/helpers/application_helper.rb +5 -0
  61. data/test/rails_root/app/helpers/confirmations_helper.rb +2 -0
  62. data/test/rails_root/app/helpers/passwords_helper.rb +2 -0
  63. data/test/rails_root/config/boot.rb +110 -0
  64. data/test/rails_root/config/environment.rb +17 -0
  65. data/test/rails_root/config/environments/development.rb +19 -0
  66. data/test/rails_root/config/environments/production.rb +1 -0
  67. data/test/rails_root/config/environments/test.rb +36 -0
  68. data/test/rails_root/config/initializers/clearance.rb +3 -0
  69. data/test/rails_root/config/initializers/inflections.rb +10 -0
  70. data/test/rails_root/config/initializers/mime_types.rb +5 -0
  71. data/test/rails_root/config/initializers/requires.rb +13 -0
  72. data/test/rails_root/config/initializers/time_formats.rb +4 -0
  73. data/test/rails_root/config/routes.rb +6 -0
  74. data/test/rails_root/features/step_definitions/web_steps.rb +259 -0
  75. data/test/rails_root/features/support/env.rb +47 -0
  76. data/test/rails_root/public/dispatch.rb +10 -0
  77. data/test/rails_root/script/create_project.rb +52 -0
  78. data/test/rails_root/test/functional/accounts_controller_test.rb +23 -0
  79. data/test/rails_root/vendor/gems/justinfrench-formtastic-0.2.1/generators/formtastic_stylesheets/formtastic_stylesheets_generator.rb +21 -0
  80. data/test/rails_root/vendor/gems/justinfrench-formtastic-0.2.1/lib/formtastic.rb +1236 -0
  81. data/test/rails_root/vendor/gems/justinfrench-formtastic-0.2.1/lib/justin_french/formtastic.rb +10 -0
  82. data/test/rails_root/vendor/gems/justinfrench-formtastic-0.2.1/rails/init.rb +3 -0
  83. data/test/rails_root/vendor/gems/justinfrench-formtastic-0.2.1/spec/formtastic_spec.rb +2900 -0
  84. data/test/rails_root/vendor/gems/justinfrench-formtastic-0.2.1/spec/test_helper.rb +14 -0
  85. data/test/test_helper.rb +19 -0
  86. metadata +202 -0
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.8.8
@@ -0,0 +1,76 @@
1
+ class Clearance::ConfirmationsController < ApplicationController
2
+ unloadable
3
+
4
+ skip_before_filter :authenticate, :only => [:new, :create]
5
+ before_filter :redirect_signed_in_confirmed_user, :only => [:new, :create]
6
+ before_filter :redirect_signed_out_confirmed_user, :only => [:new, :create]
7
+ before_filter :forbid_missing_token, :only => [:new, :create]
8
+ before_filter :forbid_non_existent_user, :only => [:new, :create]
9
+
10
+ filter_parameter_logging :token
11
+
12
+ def new
13
+ create
14
+ end
15
+
16
+ def create
17
+ @user = ::User.find_by_id_and_confirmation_token(
18
+ params[:user_id], params[:token])
19
+ @user.confirm_email!
20
+
21
+ sign_in(@user)
22
+ flash_success_after_create
23
+ redirect_to(url_after_create)
24
+ end
25
+
26
+ private
27
+
28
+ def redirect_signed_in_confirmed_user
29
+ user = ::User.find_by_id(params[:user_id])
30
+ if user && user.email_confirmed? && current_user == user
31
+ flash_success_after_create
32
+ redirect_to(url_after_create)
33
+ end
34
+ end
35
+
36
+ def redirect_signed_out_confirmed_user
37
+ user = ::User.find_by_id(params[:user_id])
38
+ if user && user.email_confirmed? && signed_out?
39
+ flash_already_confirmed
40
+ redirect_to(url_already_confirmed)
41
+ end
42
+ end
43
+
44
+ def forbid_missing_token
45
+ if params[:token].blank?
46
+ raise ActionController::Forbidden, "missing token"
47
+ end
48
+ end
49
+
50
+ def forbid_non_existent_user
51
+ unless ::User.find_by_id_and_confirmation_token(
52
+ params[:user_id], params[:token])
53
+ raise ActionController::Forbidden, "non-existent user"
54
+ end
55
+ end
56
+
57
+ def flash_success_after_create
58
+ flash[:success] = translate(:confirmed_email,
59
+ :scope => [:clearance, :controllers, :confirmations],
60
+ :default => "Confirmed email and signed in.")
61
+ end
62
+
63
+ def flash_already_confirmed
64
+ flash[:success] = translate(:already_confirmed_email,
65
+ :scope => [:clearance, :controllers, :confirmations],
66
+ :default => "Already confirmed email. Please sign in.")
67
+ end
68
+
69
+ def url_after_create
70
+ '/'
71
+ end
72
+
73
+ def url_already_confirmed
74
+ sign_in_url
75
+ end
76
+ end
@@ -0,0 +1,85 @@
1
+ class Clearance::PasswordsController < ApplicationController
2
+ unloadable
3
+
4
+ skip_before_filter :authenticate, :only => [:new, :create, :edit, :update]
5
+ before_filter :forbid_missing_token, :only => [:edit, :update]
6
+ before_filter :forbid_non_existent_user, :only => [:edit, :update]
7
+ filter_parameter_logging :password, :password_confirmation
8
+
9
+ def new
10
+ render :template => 'passwords/new'
11
+ end
12
+
13
+ def create
14
+ if user = ::User.find_by_email(params[:password][:email])
15
+ user.forgot_password!
16
+ ::ClearanceMailer.deliver_change_password user
17
+ flash_notice_after_create
18
+ redirect_to(url_after_create)
19
+ else
20
+ flash_failure_after_create
21
+ render :template => 'passwords/new'
22
+ end
23
+ end
24
+
25
+ def edit
26
+ @user = ::User.find_by_id_and_confirmation_token(
27
+ params[:user_id], params[:token])
28
+ render :template => 'passwords/edit'
29
+ end
30
+
31
+ def update
32
+ @user = ::User.find_by_id_and_confirmation_token(
33
+ params[:user_id], params[:token])
34
+
35
+ if @user.update_password(params[:user][:password],
36
+ params[:user][:password_confirmation])
37
+ @user.confirm_email!
38
+ sign_in(@user)
39
+ flash_success_after_update
40
+ redirect_to(url_after_update)
41
+ else
42
+ render :template => 'passwords/edit'
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def forbid_missing_token
49
+ if params[:token].blank?
50
+ raise ActionController::Forbidden, "missing token"
51
+ end
52
+ end
53
+
54
+ def forbid_non_existent_user
55
+ unless ::User.find_by_id_and_confirmation_token(
56
+ params[:user_id], params[:token])
57
+ raise ActionController::Forbidden, "non-existent user"
58
+ end
59
+ end
60
+
61
+ def flash_notice_after_create
62
+ flash[:notice] = translate(:deliver_change_password,
63
+ :scope => [:clearance, :controllers, :passwords],
64
+ :default => "You will receive an email within the next few minutes. " <<
65
+ "It contains instructions for changing your password.")
66
+ end
67
+
68
+ def flash_failure_after_create
69
+ flash.now[:failure] = translate(:unknown_email,
70
+ :scope => [:clearance, :controllers, :passwords],
71
+ :default => "Unknown email.")
72
+ end
73
+
74
+ def url_after_create
75
+ sign_in_url
76
+ end
77
+
78
+ def flash_success_after_update
79
+ flash[:success] = translate(:signed_in, :default => "Signed in.")
80
+ end
81
+
82
+ def url_after_update
83
+ '/'
84
+ end
85
+ end
@@ -0,0 +1,67 @@
1
+ class Clearance::SessionsController < ApplicationController
2
+ unloadable
3
+
4
+ skip_before_filter :authenticate, :only => [:new, :create, :destroy]
5
+ protect_from_forgery :except => :create
6
+ filter_parameter_logging :password
7
+
8
+ def new
9
+ render :template => 'sessions/new'
10
+ end
11
+
12
+ def create
13
+ @user = ::User.authenticate(params[:session][:email],
14
+ params[:session][:password])
15
+ if @user.nil?
16
+ flash_failure_after_create
17
+ render :template => 'sessions/new', :status => :unauthorized
18
+ else
19
+ if @user.email_confirmed?
20
+ sign_in(@user)
21
+ flash_success_after_create
22
+ redirect_back_or(url_after_create)
23
+ else
24
+ ::ClearanceMailer.deliver_confirmation(@user)
25
+ flash_notice_after_create
26
+ redirect_to(sign_in_url)
27
+ end
28
+ end
29
+ end
30
+
31
+ def destroy
32
+ sign_out
33
+ flash_success_after_destroy
34
+ redirect_to(url_after_destroy)
35
+ end
36
+
37
+ private
38
+
39
+ def flash_failure_after_create
40
+ flash.now[:failure] = translate(:bad_email_or_password,
41
+ :scope => [:clearance, :controllers, :sessions],
42
+ :default => "Bad email or password.")
43
+ end
44
+
45
+ def flash_success_after_create
46
+ flash[:success] = translate(:signed_in, :default => "Signed in.")
47
+ end
48
+
49
+ def flash_notice_after_create
50
+ flash[:notice] = translate(:unconfirmed_email,
51
+ :scope => [:clearance, :controllers, :sessions],
52
+ :default => "User has not confirmed email. " <<
53
+ "Confirmation email will be resent.")
54
+ end
55
+
56
+ def url_after_create
57
+ '/'
58
+ end
59
+
60
+ def flash_success_after_destroy
61
+ flash[:success] = translate(:signed_out, :default => "Signed out.")
62
+ end
63
+
64
+ def url_after_destroy
65
+ sign_in_url
66
+ end
67
+ end
@@ -0,0 +1,35 @@
1
+ class Clearance::UsersController < ApplicationController
2
+ unloadable
3
+
4
+ skip_before_filter :authenticate, :only => [:new, :create]
5
+ before_filter :redirect_to_root, :only => [:new, :create], :if => :signed_in?
6
+ filter_parameter_logging :password
7
+
8
+ def new
9
+ @user = ::User.new(params[:user])
10
+ render :template => 'users/new'
11
+ end
12
+
13
+ def create
14
+ @user = ::User.new params[:user]
15
+ if @user.save
16
+ flash_notice_after_create
17
+ redirect_to(url_after_create)
18
+ else
19
+ render :template => 'users/new'
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def flash_notice_after_create
26
+ flash[:notice] = translate(:deliver_confirmation,
27
+ :scope => [:clearance, :controllers, :users],
28
+ :default => "You will receive an email within the next few minutes. " <<
29
+ "It contains instructions for confirming your account.")
30
+ end
31
+
32
+ def url_after_create
33
+ sign_in_url
34
+ end
35
+ end
@@ -0,0 +1,21 @@
1
+ class ClearanceMailer < ActionMailer::Base
2
+
3
+ def change_password(user)
4
+ from Clearance.configuration.mailer_sender
5
+ recipients user.email
6
+ subject I18n.t(:change_password,
7
+ :scope => [:clearance, :models, :clearance_mailer],
8
+ :default => "Change your password")
9
+ body :user => user
10
+ end
11
+
12
+ def confirmation(user)
13
+ from Clearance.configuration.mailer_sender
14
+ recipients user.email
15
+ subject I18n.t(:confirmation,
16
+ :scope => [:clearance, :models, :clearance_mailer],
17
+ :default => "Account confirmation")
18
+ body :user => user
19
+ end
20
+
21
+ end
@@ -0,0 +1,9 @@
1
+ Someone, hopefully you, has requested that we send you a link to change your password.
2
+
3
+ Here's the link:
4
+
5
+ <%= edit_user_password_url(@user,
6
+ :token => @user.confirmation_token,
7
+ :escape => false) %>
8
+
9
+ If you didn't request this, ignore this email. Don't worry. Your password hasn't been changed.
@@ -0,0 +1,5 @@
1
+
2
+ <%= new_user_confirmation_url(
3
+ :user_id => @user,
4
+ :token => @user.confirmation_token,
5
+ :encode => false) %>
@@ -0,0 +1,23 @@
1
+ <h2>Change your password</h2>
2
+
3
+ <p>
4
+ Your password has been reset. Choose a new password below.
5
+ </p>
6
+
7
+ <%= error_messages_for :user %>
8
+
9
+ <% form_for(:user,
10
+ :url => user_password_path(@user, :token => @user.confirmation_token),
11
+ :html => { :method => :put }) do |form| %>
12
+ <div class="password_field">
13
+ <%= form.label :password, "Choose password" %>
14
+ <%= form.password_field :password %>
15
+ </div>
16
+ <div class="password_field">
17
+ <%= form.label :password_confirmation, "Confirm password" %>
18
+ <%= form.password_field :password_confirmation %>
19
+ </div>
20
+ <div class="submit_field">
21
+ <%= form.submit "Save this password", :disable_with => "Please wait..." %>
22
+ </div>
23
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <h2>Change your password</h2>
2
+
3
+ <p>
4
+ We will email you a link to change your password.
5
+ </p>
6
+
7
+ <% form_for :password, :url => passwords_path do |form| %>
8
+ <div class="text_field">
9
+ <%= form.label :email, "Email address" %>
10
+ <%= form.text_field :email %>
11
+ </div>
12
+ <div class="submit_field">
13
+ <%= form.submit "Reset password", :disable_with => "Please wait..." %>
14
+ </div>
15
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <h2>Sign in</h2>
2
+
3
+ <% form_for :session, :url => session_path do |form| %>
4
+ <div class="text_field">
5
+ <%= form.label :email %>
6
+ <%= form.text_field :email %>
7
+ </div>
8
+ <div class="text_field">
9
+ <%= form.label :password %>
10
+ <%= form.password_field :password %>
11
+ </div>
12
+ <div class="submit_field">
13
+ <%= form.submit "Sign in", :disable_with => "Please wait..." %>
14
+ </div>
15
+ <% end %>
16
+
17
+ <ul>
18
+ <li>
19
+ <%= link_to "Sign up", sign_up_path %>
20
+ </li>
21
+ <li>
22
+ <%= link_to "Forgot password?", new_password_path %>
23
+ </li>
24
+ </ul>
@@ -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, "Confirm password" %>
12
+ <%= form.password_field :password_confirmation %>
13
+ </div>
@@ -0,0 +1,6 @@
1
+ <h2>Sign up</h2>
2
+
3
+ <% form_for @user do |form| %>
4
+ <%= render :partial => '/users/form', :object => form %>
5
+ <%= form.submit 'Sign up', :disable_with => 'Please wait...' %>
6
+ <% end %>
@@ -0,0 +1 @@
1
+ script/generate clearance
@@ -0,0 +1,68 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/lib/insert_commands.rb")
2
+ require File.expand_path(File.dirname(__FILE__) + "/lib/rake_commands.rb")
3
+
4
+ class ClearanceGenerator < Rails::Generator::Base
5
+
6
+ def manifest
7
+ record do |m|
8
+ m.directory File.join("config", "initializers")
9
+ m.file "clearance.rb", "config/initializers/clearance.rb"
10
+
11
+ m.insert_into "app/controllers/application_controller.rb",
12
+ "include Clearance::Authentication"
13
+
14
+ user_model = "app/models/user.rb"
15
+ if File.exists?(user_model)
16
+ m.insert_into user_model, "include Clearance::User"
17
+ else
18
+ m.directory File.join("app", "models")
19
+ m.file "user.rb", user_model
20
+ end
21
+
22
+ m.insert_into "config/routes.rb",
23
+ "Clearance::Routes.draw(map)"
24
+
25
+ m.directory File.join("test", "factories")
26
+ m.file "factories.rb", "test/factories/clearance.rb"
27
+
28
+ m.migration_template "migrations/#{migration_source_name}.rb",
29
+ 'db/migrate',
30
+ :migration_file_name => "clearance_#{migration_target_name}"
31
+
32
+ m.readme "README"
33
+ end
34
+ end
35
+
36
+ def schema_version_constant
37
+ if upgrading_clearance_again?
38
+ "To#{schema_version.gsub('_', '')}"
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def migration_source_name
45
+ if ActiveRecord::Base.connection.table_exists?(:users)
46
+ 'update_users'
47
+ else
48
+ 'create_users'
49
+ end
50
+ end
51
+
52
+ def migration_target_name
53
+ if upgrading_clearance_again?
54
+ "update_users_to_#{schema_version}"
55
+ else
56
+ 'create_users'
57
+ end
58
+ end
59
+
60
+ def schema_version
61
+ IO.read(File.join(File.dirname(__FILE__), '..', '..', 'VERSION')).strip.gsub(/[^\d]/, '_')
62
+ end
63
+
64
+ def upgrading_clearance_again?
65
+ ActiveRecord::Base.connection.table_exists?(:users)
66
+ end
67
+
68
+ end