janova-clearance 0.8.8
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +278 -0
- data/LICENSE +21 -0
- data/README.md +129 -0
- data/Rakefile +87 -0
- data/VERSION +1 -0
- data/app/controllers/clearance/confirmations_controller.rb +76 -0
- data/app/controllers/clearance/passwords_controller.rb +85 -0
- data/app/controllers/clearance/sessions_controller.rb +67 -0
- data/app/controllers/clearance/users_controller.rb +35 -0
- data/app/models/clearance_mailer.rb +21 -0
- data/app/views/clearance_mailer/change_password.html.erb +9 -0
- data/app/views/clearance_mailer/confirmation.html.erb +5 -0
- data/app/views/passwords/edit.html.erb +23 -0
- data/app/views/passwords/new.html.erb +15 -0
- data/app/views/sessions/new.html.erb +24 -0
- data/app/views/users/_form.html.erb +13 -0
- data/app/views/users/new.html.erb +6 -0
- data/generators/clearance/USAGE +1 -0
- data/generators/clearance/clearance_generator.rb +68 -0
- data/generators/clearance/lib/insert_commands.rb +33 -0
- data/generators/clearance/lib/rake_commands.rb +22 -0
- data/generators/clearance/templates/README +24 -0
- data/generators/clearance/templates/clearance.rb +3 -0
- data/generators/clearance/templates/factories.rb +13 -0
- data/generators/clearance/templates/migrations/create_users.rb +21 -0
- data/generators/clearance/templates/migrations/update_users.rb +41 -0
- data/generators/clearance/templates/user.rb +3 -0
- data/generators/clearance_features/USAGE +1 -0
- data/generators/clearance_features/clearance_features_generator.rb +19 -0
- data/generators/clearance_features/templates/features/password_reset.feature +33 -0
- data/generators/clearance_features/templates/features/sign_in.feature +35 -0
- data/generators/clearance_features/templates/features/sign_out.feature +15 -0
- data/generators/clearance_features/templates/features/sign_up.feature +45 -0
- data/generators/clearance_features/templates/features/step_definitions/clearance_steps.rb +122 -0
- data/generators/clearance_features/templates/features/support/paths.rb +23 -0
- data/generators/clearance_views/USAGE +0 -0
- data/generators/clearance_views/clearance_views_generator.rb +27 -0
- data/generators/clearance_views/templates/formtastic/passwords/edit.html.erb +21 -0
- data/generators/clearance_views/templates/formtastic/passwords/new.html.erb +15 -0
- data/generators/clearance_views/templates/formtastic/sessions/new.html.erb +21 -0
- data/generators/clearance_views/templates/formtastic/users/_inputs.html.erb +6 -0
- data/generators/clearance_views/templates/formtastic/users/new.html.erb +10 -0
- data/lib/clearance/authentication.rb +131 -0
- data/lib/clearance/configuration.rb +25 -0
- data/lib/clearance/extensions/errors.rb +6 -0
- data/lib/clearance/extensions/rescue.rb +5 -0
- data/lib/clearance/routes.rb +49 -0
- data/lib/clearance/user.rb +207 -0
- data/lib/clearance.rb +7 -0
- data/rails/init.rb +1 -0
- data/shoulda_macros/clearance.rb +266 -0
- data/test/controllers/confirmations_controller_test.rb +104 -0
- data/test/controllers/passwords_controller_test.rb +183 -0
- data/test/controllers/sessions_controller_test.rb +146 -0
- data/test/controllers/users_controller_test.rb +65 -0
- data/test/models/clearance_mailer_test.rb +55 -0
- data/test/models/user_test.rb +260 -0
- data/test/rails_root/app/controllers/accounts_controller.rb +10 -0
- data/test/rails_root/app/controllers/application_controller.rb +6 -0
- data/test/rails_root/app/helpers/application_helper.rb +5 -0
- data/test/rails_root/app/helpers/confirmations_helper.rb +2 -0
- data/test/rails_root/app/helpers/passwords_helper.rb +2 -0
- data/test/rails_root/config/boot.rb +110 -0
- data/test/rails_root/config/environment.rb +17 -0
- data/test/rails_root/config/environments/development.rb +19 -0
- data/test/rails_root/config/environments/production.rb +1 -0
- data/test/rails_root/config/environments/test.rb +36 -0
- data/test/rails_root/config/initializers/clearance.rb +3 -0
- data/test/rails_root/config/initializers/inflections.rb +10 -0
- data/test/rails_root/config/initializers/mime_types.rb +5 -0
- data/test/rails_root/config/initializers/requires.rb +13 -0
- data/test/rails_root/config/initializers/time_formats.rb +4 -0
- data/test/rails_root/config/routes.rb +6 -0
- data/test/rails_root/features/step_definitions/web_steps.rb +259 -0
- data/test/rails_root/features/support/env.rb +47 -0
- data/test/rails_root/public/dispatch.rb +10 -0
- data/test/rails_root/script/create_project.rb +52 -0
- data/test/rails_root/test/functional/accounts_controller_test.rb +23 -0
- data/test/rails_root/vendor/gems/justinfrench-formtastic-0.2.1/generators/formtastic_stylesheets/formtastic_stylesheets_generator.rb +21 -0
- data/test/rails_root/vendor/gems/justinfrench-formtastic-0.2.1/lib/formtastic.rb +1236 -0
- data/test/rails_root/vendor/gems/justinfrench-formtastic-0.2.1/lib/justin_french/formtastic.rb +10 -0
- data/test/rails_root/vendor/gems/justinfrench-formtastic-0.2.1/rails/init.rb +3 -0
- data/test/rails_root/vendor/gems/justinfrench-formtastic-0.2.1/spec/formtastic_spec.rb +2900 -0
- data/test/rails_root/vendor/gems/justinfrench-formtastic-0.2.1/spec/test_helper.rb +14 -0
- data/test/test_helper.rb +19 -0
- 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,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 @@
|
|
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
|