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.
- data/.gitignore +1 -0
- data/.travis.yml +0 -2
- data/Appraisals +2 -2
- data/CONTRIBUTING.md +10 -19
- data/Gemfile +1 -1
- data/Gemfile.lock +81 -82
- data/NEWS.md +17 -4
- data/README.md +176 -113
- data/app/controllers/clearance/passwords_controller.rb +44 -31
- data/app/controllers/clearance/sessions_controller.rb +11 -10
- data/app/controllers/clearance/users_controller.rb +8 -12
- data/app/mailers/clearance_mailer.rb +4 -5
- data/app/views/clearance_mailer/change_password.html.erb +2 -4
- data/app/views/layouts/application.html.erb +7 -5
- data/app/views/passwords/edit.html.erb +8 -7
- data/app/views/passwords/new.html.erb +6 -5
- data/app/views/sessions/_form.html.erb +7 -5
- data/app/views/sessions/new.html.erb +3 -2
- data/app/views/users/_form.html.erb +4 -3
- data/clearance.gemspec +29 -27
- data/config/routes.rb +10 -13
- data/db/migrate/20110111224543_create_clearance_users.rb +18 -0
- data/db/schema.rb +4 -5
- data/features/engine/visitor_resets_password.feature +0 -7
- data/features/engine/visitor_signs_in.feature +7 -0
- data/features/engine/visitor_signs_up.feature +2 -2
- data/features/integration.feature +0 -1
- data/features/integration_with_test_unit.feature +43 -0
- data/features/step_definitions/configuration_steps.rb +8 -15
- data/features/step_definitions/engine/clearance_steps.rb +38 -38
- data/features/support/clearance.rb +1 -1
- data/features/support/env.rb +4 -21
- data/gemfiles/{3.0.12.gemfile → 3.0.15.gemfile} +1 -1
- data/gemfiles/{3.0.12.gemfile.lock → 3.0.15.gemfile.lock} +75 -76
- data/gemfiles/{3.2.3.gemfile → 3.1.6.gemfile} +1 -1
- data/gemfiles/{3.1.4.gemfile.lock → 3.1.6.gemfile.lock} +79 -80
- data/gemfiles/{3.1.4.gemfile → 3.2.6.gemfile} +1 -1
- data/gemfiles/{3.2.3.gemfile.lock → 3.2.6.gemfile.lock} +80 -81
- data/lib/clearance.rb +1 -0
- data/lib/clearance/authentication.rb +37 -69
- data/lib/clearance/configuration.rb +3 -18
- data/lib/clearance/constraints.rb +2 -0
- data/lib/clearance/constraints/signed_in.rb +28 -0
- data/lib/clearance/constraints/signed_out.rb +9 -0
- data/lib/clearance/engine.rb +4 -4
- data/lib/clearance/password_strategies.rb +5 -1
- data/lib/clearance/password_strategies/bcrypt.rb +27 -0
- data/lib/clearance/password_strategies/bcrypt_migration_from_sha1.rb +52 -0
- data/lib/clearance/password_strategies/blowfish.rb +11 -15
- data/lib/clearance/password_strategies/fake.rb +23 -0
- data/lib/clearance/password_strategies/sha1.rb +15 -21
- data/lib/clearance/session.rb +28 -20
- data/lib/clearance/testing.rb +8 -3
- data/lib/clearance/testing/assertion_error.rb +2 -7
- data/lib/clearance/testing/deny_access_matcher.rb +27 -32
- data/lib/clearance/testing/helpers.rb +7 -8
- data/lib/clearance/user.rb +26 -92
- data/lib/clearance/version.rb +1 -1
- data/lib/generators/clearance/install/templates/db/migrate/upgrade_clearance_to_diesel.rb +24 -26
- data/spec/clearance/constraints/signed_in_spec.rb +51 -0
- data/spec/clearance/constraints/signed_out_spec.rb +15 -0
- data/spec/clearance/rack_session_spec.rb +8 -7
- data/spec/clearance/session_spec.rb +28 -27
- data/spec/configuration_spec.rb +7 -6
- data/spec/controllers/denies_controller_spec.rb +11 -10
- data/spec/controllers/flashes_controller_spec.rb +5 -5
- data/spec/controllers/forgeries_controller_spec.rb +9 -9
- data/spec/controllers/passwords_controller_spec.rb +42 -55
- data/spec/controllers/sessions_controller_spec.rb +26 -33
- data/spec/controllers/users_controller_spec.rb +16 -14
- data/spec/factories.rb +1 -3
- data/spec/mailers/clearance_mailer_spec.rb +4 -4
- data/spec/models/bcrypt_migration_from_sha1_spec.rb +71 -0
- data/spec/models/bcrypt_spec.rb +40 -0
- data/spec/models/blowfish_spec.rb +14 -13
- data/spec/models/{clearance_user_spec.rb → password_strategies_spec.rb} +5 -5
- data/spec/models/sha1_spec.rb +18 -13
- data/spec/models/user_spec.rb +58 -73
- data/spec/spec_helper.rb +5 -6
- data/spec/support/clearance.rb +0 -4
- data/spec/support/cookies.rb +25 -27
- data/spec/support/request_with_remember_token.rb +19 -0
- metadata +95 -90
- data/db/migrate/20110111224543_create_diesel_clearance_users.rb +0 -19
- 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,
|
5
|
-
before_filter :forbid_missing_token,
|
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 =
|
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 =
|
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 =
|
32
|
-
params[:user_id], params[:token].to_s)
|
29
|
+
@user = find_user_for_update
|
33
30
|
|
34
|
-
if @user.update_password
|
35
|
-
sign_in
|
36
|
-
redirect_to
|
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
|
46
|
-
|
47
|
-
|
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
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
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
|
63
|
-
:default =>
|
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
|
69
|
-
:default =>
|
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
|
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 => [:
|
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
|
18
|
-
redirect_back_or
|
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
|
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
|
32
|
-
:default =>
|
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,
|
5
|
-
before_filter :redirect_to_root, :only => [:
|
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
|
16
|
-
redirect_back_or
|
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
|
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
|
5
|
-
|
6
|
-
:
|
7
|
-
|
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,
|
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.
|
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=
|
8
|
+
<div id='header'>
|
9
9
|
<% if signed_in? -%>
|
10
|
-
<%= link_to
|
10
|
+
<%= link_to 'Sign out', sign_out_path, :method => :delete %>
|
11
11
|
<% else -%>
|
12
|
-
<%= link_to
|
12
|
+
<%= link_to 'Sign in', sign_in_path %>
|
13
13
|
<% end -%>
|
14
14
|
</div>
|
15
|
-
|
15
|
+
|
16
|
+
<div id='flash'>
|
16
17
|
<% flash.each do |key, value| -%>
|
17
|
-
<div id=
|
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
|
8
|
-
|
9
|
-
|
10
|
-
<div class=
|
11
|
-
<%= form.label :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
|
-
|
15
|
-
|
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=
|
9
|
-
<%= form.label :email,
|
10
|
-
<%= form.text_field :email, :type =>
|
8
|
+
<div class='text_field'>
|
9
|
+
<%= form.label :email, 'Email address' %>
|
10
|
+
<%= form.text_field :email, :type => 'email' %>
|
11
11
|
</div>
|
12
|
-
|
13
|
-
|
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=
|
2
|
+
<div class='text_field'>
|
3
3
|
<%= form.label :email %>
|
4
|
-
<%= form.text_field :email, :type =>
|
4
|
+
<%= form.text_field :email, :type => 'email' %>
|
5
5
|
</div>
|
6
|
-
|
6
|
+
|
7
|
+
<div class='text_field'>
|
7
8
|
<%= form.label :password %>
|
8
9
|
<%= form.password_field :password %>
|
9
10
|
</div>
|
10
|
-
|
11
|
-
|
11
|
+
|
12
|
+
<div class='submit_field'>
|
13
|
+
<%= form.submit 'Sign in' %>
|
12
14
|
</div>
|
13
15
|
<% end %>
|
@@ -1,8 +1,9 @@
|
|
1
|
-
<div class=
|
1
|
+
<div class='text_field'>
|
2
2
|
<%= form.label :email %>
|
3
|
-
<%= form.text_field :email, :type =>
|
3
|
+
<%= form.text_field :email, :type => 'email' %>
|
4
4
|
</div>
|
5
|
-
|
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
|
7
|
-
s.version
|
8
|
-
s.
|
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.
|
20
|
-
s.
|
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.
|
23
|
-
s.add_dependency('diesel', '~> 0.1.5')
|
23
|
+
s.required_ruby_version = Gem::Requirement.new('>= 1.9.2')
|
24
24
|
|
25
|
-
s.
|
26
|
-
s.
|
27
|
-
s.
|
28
|
-
s.add_development_dependency
|
29
|
-
s.add_development_dependency
|
30
|
-
s.add_development_dependency
|
31
|
-
s.add_development_dependency
|
32
|
-
s.add_development_dependency
|
33
|
-
s.add_development_dependency
|
34
|
-
s.add_development_dependency
|
35
|
-
s.add_development_dependency
|
36
|
-
s.add_development_dependency
|
37
|
-
s.add_development_dependency
|
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
|
-
:
|
4
|
-
:only => [:new, :create]
|
2
|
+
resources :passwords, :controller => 'clearance/passwords',
|
3
|
+
:only => [:create, :new]
|
5
4
|
|
6
|
-
resource :session,
|
7
|
-
:
|
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 => [:
|
11
|
-
resource :password,
|
12
|
-
:
|
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 '
|
17
|
-
match '
|
18
|
-
match '
|
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
|