clearance 0.16.3 → 1.0.0.rc1

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.

Potentially problematic release.


This version of clearance might be problematic. Click here for more details.

Files changed (85) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +0 -2
  3. data/Appraisals +2 -2
  4. data/CONTRIBUTING.md +10 -19
  5. data/Gemfile +1 -1
  6. data/Gemfile.lock +81 -82
  7. data/NEWS.md +17 -4
  8. data/README.md +176 -113
  9. data/app/controllers/clearance/passwords_controller.rb +44 -31
  10. data/app/controllers/clearance/sessions_controller.rb +11 -10
  11. data/app/controllers/clearance/users_controller.rb +8 -12
  12. data/app/mailers/clearance_mailer.rb +4 -5
  13. data/app/views/clearance_mailer/change_password.html.erb +2 -4
  14. data/app/views/layouts/application.html.erb +7 -5
  15. data/app/views/passwords/edit.html.erb +8 -7
  16. data/app/views/passwords/new.html.erb +6 -5
  17. data/app/views/sessions/_form.html.erb +7 -5
  18. data/app/views/sessions/new.html.erb +3 -2
  19. data/app/views/users/_form.html.erb +4 -3
  20. data/clearance.gemspec +29 -27
  21. data/config/routes.rb +10 -13
  22. data/db/migrate/20110111224543_create_clearance_users.rb +18 -0
  23. data/db/schema.rb +4 -5
  24. data/features/engine/visitor_resets_password.feature +0 -7
  25. data/features/engine/visitor_signs_in.feature +7 -0
  26. data/features/engine/visitor_signs_up.feature +2 -2
  27. data/features/integration.feature +0 -1
  28. data/features/integration_with_test_unit.feature +43 -0
  29. data/features/step_definitions/configuration_steps.rb +8 -15
  30. data/features/step_definitions/engine/clearance_steps.rb +38 -38
  31. data/features/support/clearance.rb +1 -1
  32. data/features/support/env.rb +4 -21
  33. data/gemfiles/{3.0.12.gemfile → 3.0.15.gemfile} +1 -1
  34. data/gemfiles/{3.0.12.gemfile.lock → 3.0.15.gemfile.lock} +75 -76
  35. data/gemfiles/{3.2.3.gemfile → 3.1.6.gemfile} +1 -1
  36. data/gemfiles/{3.1.4.gemfile.lock → 3.1.6.gemfile.lock} +79 -80
  37. data/gemfiles/{3.1.4.gemfile → 3.2.6.gemfile} +1 -1
  38. data/gemfiles/{3.2.3.gemfile.lock → 3.2.6.gemfile.lock} +80 -81
  39. data/lib/clearance.rb +1 -0
  40. data/lib/clearance/authentication.rb +37 -69
  41. data/lib/clearance/configuration.rb +3 -18
  42. data/lib/clearance/constraints.rb +2 -0
  43. data/lib/clearance/constraints/signed_in.rb +28 -0
  44. data/lib/clearance/constraints/signed_out.rb +9 -0
  45. data/lib/clearance/engine.rb +4 -4
  46. data/lib/clearance/password_strategies.rb +5 -1
  47. data/lib/clearance/password_strategies/bcrypt.rb +27 -0
  48. data/lib/clearance/password_strategies/bcrypt_migration_from_sha1.rb +52 -0
  49. data/lib/clearance/password_strategies/blowfish.rb +11 -15
  50. data/lib/clearance/password_strategies/fake.rb +23 -0
  51. data/lib/clearance/password_strategies/sha1.rb +15 -21
  52. data/lib/clearance/session.rb +28 -20
  53. data/lib/clearance/testing.rb +8 -3
  54. data/lib/clearance/testing/assertion_error.rb +2 -7
  55. data/lib/clearance/testing/deny_access_matcher.rb +27 -32
  56. data/lib/clearance/testing/helpers.rb +7 -8
  57. data/lib/clearance/user.rb +26 -92
  58. data/lib/clearance/version.rb +1 -1
  59. data/lib/generators/clearance/install/templates/db/migrate/upgrade_clearance_to_diesel.rb +24 -26
  60. data/spec/clearance/constraints/signed_in_spec.rb +51 -0
  61. data/spec/clearance/constraints/signed_out_spec.rb +15 -0
  62. data/spec/clearance/rack_session_spec.rb +8 -7
  63. data/spec/clearance/session_spec.rb +28 -27
  64. data/spec/configuration_spec.rb +7 -6
  65. data/spec/controllers/denies_controller_spec.rb +11 -10
  66. data/spec/controllers/flashes_controller_spec.rb +5 -5
  67. data/spec/controllers/forgeries_controller_spec.rb +9 -9
  68. data/spec/controllers/passwords_controller_spec.rb +42 -55
  69. data/spec/controllers/sessions_controller_spec.rb +26 -33
  70. data/spec/controllers/users_controller_spec.rb +16 -14
  71. data/spec/factories.rb +1 -3
  72. data/spec/mailers/clearance_mailer_spec.rb +4 -4
  73. data/spec/models/bcrypt_migration_from_sha1_spec.rb +71 -0
  74. data/spec/models/bcrypt_spec.rb +40 -0
  75. data/spec/models/blowfish_spec.rb +14 -13
  76. data/spec/models/{clearance_user_spec.rb → password_strategies_spec.rb} +5 -5
  77. data/spec/models/sha1_spec.rb +18 -13
  78. data/spec/models/user_spec.rb +58 -73
  79. data/spec/spec_helper.rb +5 -6
  80. data/spec/support/clearance.rb +0 -4
  81. data/spec/support/cookies.rb +25 -27
  82. data/spec/support/request_with_remember_token.rb +19 -0
  83. metadata +95 -90
  84. data/db/migrate/20110111224543_create_diesel_clearance_users.rb +0 -19
  85. data/init.rb +0 -1
@@ -1,17 +1,12 @@
1
1
  class Clearance::PasswordsController < ApplicationController
2
2
  unloadable
3
3
 
4
- skip_before_filter :authorize, :only => [:new, :create, :edit, :update]
5
- before_filter :forbid_missing_token, :only => [:edit, :update]
4
+ skip_before_filter :authorize, :only => [:create, :edit, :new, :update]
5
+ before_filter :forbid_missing_token, :only => [:edit, :update]
6
6
  before_filter :forbid_non_existent_user, :only => [:edit, :update]
7
7
 
8
- def new
9
- render :template => 'passwords/new'
10
- end
11
-
12
8
  def create
13
- if user = Clearance.configuration.user_model.find_by_email(
14
- params[:password][:email])
9
+ if user = find_user_for_create
15
10
  user.forgot_password!
16
11
  ::ClearanceMailer.change_password(user).deliver
17
12
  render :template => 'passwords/create'
@@ -22,18 +17,20 @@ class Clearance::PasswordsController < ApplicationController
22
17
  end
23
18
 
24
19
  def edit
25
- @user = Clearance.configuration.user_model.find_by_id_and_confirmation_token(
26
- params[:user_id], params[:token].to_s)
20
+ @user = find_user_for_edit
27
21
  render :template => 'passwords/edit'
28
22
  end
29
23
 
24
+ def new
25
+ render :template => 'passwords/new'
26
+ end
27
+
30
28
  def update
31
- @user = Clearance.configuration.user_model.find_by_id_and_confirmation_token(
32
- params[:user_id], params[:token].to_s)
29
+ @user = find_user_for_update
33
30
 
34
- if @user.update_password(params[:user][:password])
35
- sign_in(@user)
36
- redirect_to(url_after_update)
31
+ if @user.update_password params[:user][:password]
32
+ sign_in @user
33
+ redirect_to url_after_update
37
34
  else
38
35
  flash_failure_after_update
39
36
  render :template => 'passwords/edit'
@@ -42,39 +39,55 @@ class Clearance::PasswordsController < ApplicationController
42
39
 
43
40
  private
44
41
 
45
- def forbid_missing_token
46
- if params[:token].to_s.blank?
47
- flash_failure_when_forbidden
48
- render :template => 'passwords/new'
49
- end
42
+ def find_user_by_id_and_confirmation_token
43
+ Clearance.configuration.user_model.
44
+ find_by_id_and_confirmation_token params[:user_id], params[:token].to_s
50
45
  end
51
46
 
52
- def forbid_non_existent_user
53
- unless Clearance.configuration.user_model.find_by_id_and_confirmation_token(
54
- params[:user_id], params[:token].to_s)
55
- flash_failure_when_forbidden
56
- render :template => 'passwords/new'
57
- end
47
+ def find_user_for_create
48
+ Clearance.configuration.user_model.find_by_email params[:password][:email]
49
+ end
50
+
51
+ def find_user_for_edit
52
+ find_user_by_id_and_confirmation_token
53
+ end
54
+
55
+ def find_user_for_update
56
+ find_user_by_id_and_confirmation_token
58
57
  end
59
58
 
60
59
  def flash_failure_when_forbidden
61
60
  flash.now[:notice] = translate(:forbidden,
62
- :scope => [:clearance, :controllers, :passwords],
63
- :default => "Please double check the URL or try submitting the form again.")
61
+ :scope => [:clearance, :controllers, :passwords],
62
+ :default => 'Please double check the URL or try submitting the form again.')
64
63
  end
65
64
 
66
65
  def flash_failure_after_create
67
66
  flash.now[:notice] = translate(:unknown_email,
68
- :scope => [:clearance, :controllers, :passwords],
69
- :default => "Unknown email.")
67
+ :scope => [:clearance, :controllers, :passwords],
68
+ :default => 'Unknown email.')
70
69
  end
71
70
 
72
71
  def flash_failure_after_update
73
72
  flash.now[:notice] = translate(:blank_password,
74
- :scope => [:clearance, :controllers, :passwords],
73
+ :scope => [:clearance, :controllers, :passwords],
75
74
  :default => "Password can't be blank.")
76
75
  end
77
76
 
77
+ def forbid_missing_token
78
+ if params[:token].to_s.blank?
79
+ flash_failure_when_forbidden
80
+ render :template => 'passwords/new'
81
+ end
82
+ end
83
+
84
+ def forbid_non_existent_user
85
+ unless find_user_by_id_and_confirmation_token
86
+ flash_failure_when_forbidden
87
+ render :template => 'passwords/new'
88
+ end
89
+ end
90
+
78
91
  def url_after_create
79
92
  sign_in_url
80
93
  end
@@ -1,35 +1,36 @@
1
1
  class Clearance::SessionsController < ApplicationController
2
2
  unloadable
3
3
 
4
- skip_before_filter :authorize, :only => [:new, :create, :destroy]
4
+ skip_before_filter :authorize, :only => [:create, :new, :destroy]
5
5
  protect_from_forgery :except => :create
6
6
 
7
- def new
8
- render :template => 'sessions/new'
9
- end
10
-
11
7
  def create
12
8
  @user = authenticate(params)
9
+
13
10
  if @user.nil?
14
11
  flash_failure_after_create
15
12
  render :template => 'sessions/new', :status => :unauthorized
16
13
  else
17
- sign_in(@user)
18
- redirect_back_or(url_after_create)
14
+ sign_in @user
15
+ redirect_back_or url_after_create
19
16
  end
20
17
  end
21
18
 
22
19
  def destroy
23
20
  sign_out
24
- redirect_to(url_after_destroy)
21
+ redirect_to url_after_destroy
22
+ end
23
+
24
+ def new
25
+ render :template => 'sessions/new'
25
26
  end
26
27
 
27
28
  private
28
29
 
29
30
  def flash_failure_after_create
30
31
  flash.now[:notice] = translate(:bad_email_or_password,
31
- :scope => [:clearance, :controllers, :sessions],
32
- :default => "Bad email or password.")
32
+ :scope => [:clearance, :controllers, :sessions],
33
+ :default => %{Bad email or password. Are you trying to register a new account? <a href="#{sign_up_path}">Sign up</a>.}.html_safe)
33
34
  end
34
35
 
35
36
  def url_after_create
@@ -1,8 +1,8 @@
1
1
  class Clearance::UsersController < ApplicationController
2
2
  unloadable
3
3
 
4
- skip_before_filter :authorize, :only => [:new, :create]
5
- before_filter :redirect_to_root, :only => [:new, :create], :if => :signed_in?
4
+ skip_before_filter :authorize, :only => [:create, :new]
5
+ before_filter :redirect_to_root, :only => [:create, :new], :if => :signed_in?
6
6
 
7
7
  def new
8
8
  @user = user_from_params
@@ -11,30 +11,26 @@ class Clearance::UsersController < ApplicationController
11
11
 
12
12
  def create
13
13
  @user = user_from_params
14
+
14
15
  if @user.save
15
- sign_in(@user)
16
- redirect_back_or(url_after_create)
16
+ sign_in @user
17
+ redirect_back_or url_after_create
17
18
  else
18
- flash_failure_after_create
19
19
  render :template => 'users/new'
20
20
  end
21
21
  end
22
22
 
23
23
  private
24
24
 
25
- def flash_failure_after_create
26
- flash.now[:notice] = translate(:bad_email_or_password,
27
- :scope => [:clearance, :controllers, :passwords],
28
- :default => "Must be a valid email address. Password can't be blank.")
29
- end
30
-
31
25
  def url_after_create
32
26
  '/'
33
27
  end
34
28
 
35
29
  def user_from_params
36
30
  user_params = params[:user] || Hash.new
37
- email, password = user_params.delete(:email), user_params.delete(:password)
31
+ email = user_params.delete(:email)
32
+ password = user_params.delete(:password)
33
+
38
34
  Clearance.configuration.user_model.new(user_params).tap do |user|
39
35
  user.email = email
40
36
  user.password = password
@@ -1,10 +1,9 @@
1
1
  class ClearanceMailer < ActionMailer::Base
2
2
  def change_password(user)
3
3
  @user = user
4
- mail :from => Clearance.configuration.mailer_sender,
5
- :to => @user.email,
6
- :subject => I18n.t(:change_password,
7
- :scope => [:clearance, :models, :clearance_mailer],
8
- :default => "Change your password")
4
+ mail :from => Clearance.configuration.mailer_sender, :to => @user.email,
5
+ :subject => I18n.t(:change_password,
6
+ :scope => [:clearance, :models, :clearance_mailer],
7
+ :default => 'Change your password')
9
8
  end
10
9
  end
@@ -1,7 +1,5 @@
1
- Someone, hopefully you, has requested that we send you a link to change your password.
2
-
3
- Here's the link:
1
+ Someone, hopefully you, requested we send you a link to change your password:
4
2
 
5
3
  <%= edit_user_password_url(@user, :token => @user.confirmation_token.html_safe) %>
6
4
 
7
- If you didn't request this, ignore this email. Don't worry. Your password hasn't been changed.
5
+ If you didn't request this, ignore this email. Your password hasn't been changed.
@@ -5,18 +5,20 @@
5
5
  <%= csrf_meta_tag %>
6
6
  </head>
7
7
  <body>
8
- <div id="header">
8
+ <div id='header'>
9
9
  <% if signed_in? -%>
10
- <%= link_to "Sign out", sign_out_path, :method => :delete %>
10
+ <%= link_to 'Sign out', sign_out_path, :method => :delete %>
11
11
  <% else -%>
12
- <%= link_to "Sign in", sign_in_path %>
12
+ <%= link_to 'Sign in', sign_in_path %>
13
13
  <% end -%>
14
14
  </div>
15
- <div id="flash">
15
+
16
+ <div id='flash'>
16
17
  <% flash.each do |key, value| -%>
17
- <div id="flash_<%= key %>"><%=h value %></div>
18
+ <div id='flash_<%= key %>'><%=h value %></div>
18
19
  <% end %>
19
20
  </div>
21
+
20
22
  <%= yield %>
21
23
  </body>
22
24
  </html>
@@ -4,14 +4,15 @@
4
4
  Your password has been reset. Choose a new password below.
5
5
  </p>
6
6
 
7
- <%= form_for(:user,
8
- :url => user_password_path(@user, :token => @user.confirmation_token),
9
- :html => { :method => :put }) do |form| %>
10
- <div class="password_field">
11
- <%= form.label :password, "Choose password" %>
7
+ <%= form_for :user,
8
+ :url => user_password_path(@user, :token => @user.confirmation_token),
9
+ :html => { :method => :put } do |form| %>
10
+ <div class='password_field'>
11
+ <%= form.label :password, 'Choose password' %>
12
12
  <%= form.password_field :password %>
13
13
  </div>
14
- <div class="submit_field">
15
- <%= form.submit "Save this password" %>
14
+
15
+ <div class='submit_field'>
16
+ <%= form.submit 'Save this password' %>
16
17
  </div>
17
18
  <% end %>
@@ -5,11 +5,12 @@
5
5
  </p>
6
6
 
7
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, :type => "email" %>
8
+ <div class='text_field'>
9
+ <%= form.label :email, 'Email address' %>
10
+ <%= form.text_field :email, :type => 'email' %>
11
11
  </div>
12
- <div class="submit_field">
13
- <%= form.submit "Reset password" %>
12
+
13
+ <div class='submit_field'>
14
+ <%= form.submit 'Reset password' %>
14
15
  </div>
15
16
  <% end %>
@@ -1,13 +1,15 @@
1
1
  <%= form_for :session, :url => session_path do |form| %>
2
- <div class="text_field">
2
+ <div class='text_field'>
3
3
  <%= form.label :email %>
4
- <%= form.text_field :email, :type => "email" %>
4
+ <%= form.text_field :email, :type => 'email' %>
5
5
  </div>
6
- <div class="text_field">
6
+
7
+ <div class='text_field'>
7
8
  <%= form.label :password %>
8
9
  <%= form.password_field :password %>
9
10
  </div>
10
- <div class="submit_field">
11
- <%= form.submit "Sign in" %>
11
+
12
+ <div class='submit_field'>
13
+ <%= form.submit 'Sign in' %>
12
14
  </div>
13
15
  <% end %>
@@ -4,9 +4,10 @@
4
4
 
5
5
  <ul>
6
6
  <li>
7
- <%= link_to "Sign up", sign_up_path %>
7
+ <%= link_to 'Sign up', sign_up_path %>
8
8
  </li>
9
+
9
10
  <li>
10
- <%= link_to "Forgot password?", new_password_path %>
11
+ <%= link_to 'Forgot password?', new_password_path %>
11
12
  </li>
12
13
  </ul>
@@ -1,8 +1,9 @@
1
- <div class="text_field">
1
+ <div class='text_field'>
2
2
  <%= form.label :email %>
3
- <%= form.text_field :email, :type => "email" %>
3
+ <%= form.text_field :email, :type => 'email' %>
4
4
  </div>
5
- <div class="password_field">
5
+
6
+ <div class='password_field'>
6
7
  <%= form.label :password %>
7
8
  <%= form.password_field :password %>
8
9
  </div>
data/clearance.gemspec CHANGED
@@ -3,36 +3,38 @@ require 'clearance/version'
3
3
  require 'date'
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = %q{clearance}
7
- s.version = Clearance::VERSION
8
- s.email = %q{support@thoughtbot.com}
6
+ s.name = %q{clearance}
7
+ s.version = Clearance::VERSION
8
+ s.authors = [
9
+ 'Dan Croak', 'Mike Burns', 'Jason Morrison', 'Joe Ferris', 'Eugene Bolshakov',
10
+ 'Nick Quaranto', 'Josh Nichols', 'Mike Breen', 'Jon Yurek', 'Chad Pytel'
11
+ ]
12
+ s.email = %q{support@thoughtbot.com}
9
13
  s.homepage = %q{http://github.com/thoughtbot/clearance}
10
-
11
- s.authors = ["Dan Croak", "Mike Burns", "Jason Morrison", "Joe Ferris", "Eugene Bolshakov", "Nick Quaranto", "Josh Nichols", "Mike Breen", "Jon Yurek", "Chad Pytel"]
12
- s.date = Date.today.to_s
13
- s.summary = %q{Rails authentication & authorization with email & password.}
14
+ s.summary = %q{Rails authentication & authorization with email & password.}
14
15
  s.description = %q{Rails authentication & authorization with email & password.}
15
- s.extra_rdoc_files = %w(LICENSE README.md)
16
- s.files = `git ls-files`.split("\n")
17
- s.test_files = `git ls-files -- {test,features}/*`.split("\n")
18
16
 
19
- s.rdoc_options = ["--charset=UTF-8"]
20
- s.require_paths = ["lib"]
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {features,spec}/*`.split("\n")
19
+ s.extra_rdoc_files = %w(LICENSE README.md)
20
+ s.rdoc_options = ['--charset=UTF-8']
21
+ s.require_paths = ['lib']
21
22
 
22
- s.add_dependency('rails', '>= 3.0')
23
- s.add_dependency('diesel', '~> 0.1.5')
23
+ s.required_ruby_version = Gem::Requirement.new('>= 1.9.2')
24
24
 
25
- s.add_development_dependency('bundler', '~> 1.1.0')
26
- s.add_development_dependency('appraisal', '~> 0.4.1')
27
- s.add_development_dependency('cucumber-rails', '~> 1.1.1')
28
- s.add_development_dependency('rspec-rails', '~> 2.9.0')
29
- s.add_development_dependency('sqlite3')
30
- s.add_development_dependency('bourne', '~> 1.1.2')
31
- s.add_development_dependency('timecop')
32
- s.add_development_dependency('capybara', '~> 1.1.2')
33
- s.add_development_dependency('factory_girl_rails', '~> 3.1.0')
34
- s.add_development_dependency('shoulda-matchers', '~> 1.1.0')
35
- s.add_development_dependency('database_cleaner')
36
- s.add_development_dependency('launchy')
37
- s.add_development_dependency('aruba', '~> 0.4.11')
25
+ s.add_dependency 'bcrypt-ruby'
26
+ s.add_dependency 'diesel', '0.1.5'
27
+ s.add_dependency 'rails', '>= 3.0'
28
+ s.add_development_dependency 'appraisal', '0.4.1'
29
+ s.add_development_dependency 'aruba', '0.4.11'
30
+ s.add_development_dependency 'bourne', '1.1.2'
31
+ s.add_development_dependency 'bundler', '1.1.3'
32
+ s.add_development_dependency 'capybara', '1.1.2'
33
+ s.add_development_dependency 'cucumber-rails', '1.1.1'
34
+ s.add_development_dependency 'database_cleaner', '0.8.0'
35
+ s.add_development_dependency 'factory_girl_rails', '3.5.0'
36
+ s.add_development_dependency 'rspec-rails', '2.11.0'
37
+ s.add_development_dependency 'shoulda-matchers', '1.2.0'
38
+ s.add_development_dependency 'sqlite3', '1.3.6'
39
+ s.add_development_dependency 'timecop', '0.3.5'
38
40
  end
data/config/routes.rb CHANGED
@@ -1,19 +1,16 @@
1
1
  Rails.application.routes.draw do
2
- resources :passwords,
3
- :controller => 'clearance/passwords',
4
- :only => [:new, :create]
2
+ resources :passwords, :controller => 'clearance/passwords',
3
+ :only => [:create, :new]
5
4
 
6
- resource :session,
7
- :controller => 'clearance/sessions',
8
- :only => [:new, :create, :destroy]
5
+ resource :session, :controller => 'clearance/sessions',
6
+ :only => [:create, :new, :destroy]
9
7
 
10
- resources :users, :controller => 'clearance/users', :only => [:new, :create] do
11
- resource :password,
12
- :controller => 'clearance/passwords',
13
- :only => [:create, :edit, :update]
8
+ resources :users, :controller => 'clearance/users', :only => [:create, :new] do
9
+ resource :password, :controller => 'clearance/passwords',
10
+ :only => [:create, :edit, :update]
14
11
  end
15
12
 
16
- match 'sign_up' => 'clearance/users#new', :as => 'sign_up'
17
- match 'sign_in' => 'clearance/sessions#new', :as => 'sign_in'
18
- match 'sign_out' => 'clearance/sessions#destroy', :via => :delete, :as => 'sign_out'
13
+ match 'sign_in' => 'clearance/sessions#new', :as => 'sign_in'
14
+ match 'sign_out' => 'clearance/sessions#destroy', :as => 'sign_out', :via => :delete
15
+ match 'sign_up' => 'clearance/users#new', :as => 'sign_up'
19
16
  end