devise 3.2.1 → 4.4.3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of devise might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/.travis.yml +58 -10
- data/CHANGELOG.md +199 -979
- data/CODE_OF_CONDUCT.md +22 -0
- data/CONTRIBUTING.md +73 -8
- data/Gemfile +19 -11
- data/Gemfile.lock +152 -119
- data/ISSUE_TEMPLATE.md +19 -0
- data/MIT-LICENSE +1 -1
- data/README.md +347 -93
- data/Rakefile +4 -2
- data/app/controllers/devise/confirmations_controller.rb +11 -5
- data/app/controllers/devise/omniauth_callbacks_controller.rb +12 -6
- data/app/controllers/devise/passwords_controller.rb +20 -8
- data/app/controllers/devise/registrations_controller.rb +34 -19
- data/app/controllers/devise/sessions_controller.rb +47 -17
- data/app/controllers/devise/unlocks_controller.rb +9 -4
- data/app/controllers/devise_controller.rb +67 -31
- data/app/helpers/devise_helper.rb +4 -2
- data/app/mailers/devise/mailer.rb +10 -0
- data/app/views/devise/confirmations/new.html.erb +8 -4
- data/app/views/devise/mailer/confirmation_instructions.html.erb +1 -1
- data/app/views/devise/mailer/email_changed.html.erb +7 -0
- data/app/views/devise/mailer/password_change.html.erb +3 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +1 -1
- data/app/views/devise/mailer/unlock_instructions.html.erb +1 -1
- data/app/views/devise/passwords/edit.html.erb +15 -6
- data/app/views/devise/passwords/new.html.erb +8 -4
- data/app/views/devise/registrations/edit.html.erb +28 -14
- data/app/views/devise/registrations/new.html.erb +19 -8
- data/app/views/devise/sessions/new.html.erb +17 -8
- data/app/views/devise/shared/{_links.erb → _links.html.erb} +2 -2
- data/app/views/devise/unlocks/new.html.erb +8 -4
- data/bin/test +13 -0
- data/config/locales/en.yml +22 -17
- data/devise.gemspec +7 -6
- data/gemfiles/Gemfile.rails-4.1-stable +32 -0
- data/gemfiles/Gemfile.rails-4.1-stable.lock +171 -0
- data/gemfiles/Gemfile.rails-4.2-stable +32 -0
- data/gemfiles/Gemfile.rails-4.2-stable.lock +192 -0
- data/gemfiles/Gemfile.rails-5.0-stable +33 -0
- data/gemfiles/Gemfile.rails-5.0-stable.lock +192 -0
- data/gemfiles/Gemfile.rails-5.2-rc1 +26 -0
- data/gemfiles/Gemfile.rails-5.2-rc1.lock +201 -0
- data/guides/bug_report_templates/integration_test.rb +106 -0
- data/lib/devise.rb +107 -84
- data/lib/devise/controllers/helpers.rb +111 -31
- data/lib/devise/controllers/rememberable.rb +15 -6
- data/lib/devise/controllers/scoped_views.rb +3 -1
- data/lib/devise/controllers/sign_in_out.rb +39 -26
- data/lib/devise/controllers/store_location.rb +31 -2
- data/lib/devise/controllers/url_helpers.rb +9 -7
- data/lib/devise/delegator.rb +2 -0
- data/lib/devise/encryptor.rb +24 -0
- data/lib/devise/failure_app.rb +98 -39
- data/lib/devise/hooks/activatable.rb +7 -6
- data/lib/devise/hooks/csrf_cleaner.rb +5 -1
- data/lib/devise/hooks/forgetable.rb +2 -0
- data/lib/devise/hooks/lockable.rb +7 -2
- data/lib/devise/hooks/proxy.rb +4 -2
- data/lib/devise/hooks/rememberable.rb +4 -2
- data/lib/devise/hooks/timeoutable.rb +16 -9
- data/lib/devise/hooks/trackable.rb +3 -1
- data/lib/devise/mailers/helpers.rb +15 -12
- data/lib/devise/mapping.rb +8 -2
- data/lib/devise/models.rb +3 -1
- data/lib/devise/models/authenticatable.rb +63 -36
- data/lib/devise/models/confirmable.rb +121 -41
- data/lib/devise/models/database_authenticatable.rb +66 -23
- data/lib/devise/models/lockable.rb +30 -17
- data/lib/devise/models/omniauthable.rb +3 -1
- data/lib/devise/models/recoverable.rb +62 -26
- data/lib/devise/models/registerable.rb +2 -0
- data/lib/devise/models/rememberable.rb +62 -33
- data/lib/devise/models/timeoutable.rb +4 -8
- data/lib/devise/models/trackable.rb +12 -3
- data/lib/devise/models/validatable.rb +16 -9
- data/lib/devise/modules.rb +12 -10
- data/lib/devise/omniauth.rb +2 -0
- data/lib/devise/omniauth/config.rb +2 -0
- data/lib/devise/omniauth/url_helpers.rb +14 -5
- data/lib/devise/orm/active_record.rb +5 -1
- data/lib/devise/orm/mongoid.rb +6 -2
- data/lib/devise/parameter_filter.rb +2 -0
- data/lib/devise/parameter_sanitizer.rb +131 -69
- data/lib/devise/rails.rb +10 -13
- data/lib/devise/rails/routes.rb +147 -116
- data/lib/devise/rails/warden_compat.rb +3 -10
- data/lib/devise/secret_key_finder.rb +25 -0
- data/lib/devise/strategies/authenticatable.rb +20 -9
- data/lib/devise/strategies/base.rb +3 -1
- data/lib/devise/strategies/database_authenticatable.rb +8 -5
- data/lib/devise/strategies/rememberable.rb +15 -3
- data/lib/devise/test/controller_helpers.rb +165 -0
- data/lib/devise/test/integration_helpers.rb +63 -0
- data/lib/devise/test_helpers.rb +7 -124
- data/lib/devise/time_inflector.rb +4 -2
- data/lib/devise/token_generator.rb +3 -41
- data/lib/devise/version.rb +3 -1
- data/lib/generators/active_record/devise_generator.rb +47 -10
- data/lib/generators/active_record/templates/migration.rb +9 -7
- data/lib/generators/active_record/templates/migration_existing.rb +9 -7
- data/lib/generators/devise/controllers_generator.rb +46 -0
- data/lib/generators/devise/devise_generator.rb +9 -5
- data/lib/generators/devise/install_generator.rb +22 -0
- data/lib/generators/devise/orm_helpers.rb +8 -19
- data/lib/generators/devise/views_generator.rb +51 -28
- data/lib/generators/mongoid/devise_generator.rb +22 -19
- data/lib/generators/templates/README +5 -12
- data/lib/generators/templates/controllers/README +14 -0
- data/lib/generators/templates/controllers/confirmations_controller.rb +30 -0
- data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +30 -0
- data/lib/generators/templates/controllers/passwords_controller.rb +34 -0
- data/lib/generators/templates/controllers/registrations_controller.rb +62 -0
- data/lib/generators/templates/controllers/sessions_controller.rb +27 -0
- data/lib/generators/templates/controllers/unlocks_controller.rb +30 -0
- data/lib/generators/templates/devise.rb +64 -35
- data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
- data/lib/generators/templates/markerb/email_changed.markerb +7 -0
- data/lib/generators/templates/markerb/password_change.markerb +3 -0
- data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
- data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
- data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +2 -2
- data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +4 -4
- data/lib/generators/templates/simple_form_for/passwords/new.html.erb +2 -2
- data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +6 -6
- data/lib/generators/templates/simple_form_for/registrations/new.html.erb +4 -4
- data/lib/generators/templates/simple_form_for/sessions/new.html.erb +6 -6
- data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +2 -2
- data/test/controllers/custom_registrations_controller_test.rb +42 -0
- data/test/controllers/custom_strategy_test.rb +10 -6
- data/test/controllers/helper_methods_test.rb +24 -0
- data/test/controllers/helpers_test.rb +88 -40
- data/test/controllers/inherited_controller_i18n_messages_test.rb +53 -0
- data/test/controllers/internal_helpers_test.rb +31 -22
- data/test/controllers/load_hooks_controller_test.rb +21 -0
- data/test/controllers/passwords_controller_test.rb +8 -5
- data/test/controllers/sessions_controller_test.rb +42 -33
- data/test/controllers/url_helpers_test.rb +13 -5
- data/test/delegator_test.rb +3 -1
- data/test/devise_test.rb +34 -19
- data/test/failure_app_test.rb +150 -42
- data/test/generators/active_record_generator_test.rb +58 -31
- data/test/generators/controllers_generator_test.rb +50 -0
- data/test/generators/devise_generator_test.rb +4 -2
- data/test/generators/install_generator_test.rb +16 -3
- data/test/generators/mongoid_generator_test.rb +5 -3
- data/test/generators/views_generator_test.rb +40 -2
- data/test/helpers/devise_helper_test.rb +20 -20
- data/test/integration/authenticatable_test.rb +134 -141
- data/test/integration/confirmable_test.rb +109 -67
- data/test/integration/database_authenticatable_test.rb +36 -23
- data/test/integration/http_authenticatable_test.rb +29 -20
- data/test/integration/lockable_test.rb +52 -49
- data/test/integration/mounted_engine_test.rb +38 -0
- data/test/integration/omniauthable_test.rb +30 -15
- data/test/integration/recoverable_test.rb +76 -61
- data/test/integration/registerable_test.rb +107 -91
- data/test/integration/rememberable_test.rb +82 -30
- data/test/integration/timeoutable_test.rb +48 -40
- data/test/integration/trackable_test.rb +15 -8
- data/test/mailers/confirmation_instructions_test.rb +16 -14
- data/test/mailers/email_changed_test.rb +132 -0
- data/test/mailers/mailer_test.rb +20 -0
- data/test/mailers/reset_password_instructions_test.rb +13 -11
- data/test/mailers/unlock_instructions_test.rb +12 -10
- data/test/mapping_test.rb +15 -6
- data/test/models/authenticatable_test.rb +15 -3
- data/test/models/confirmable_test.rb +190 -95
- data/test/models/database_authenticatable_test.rb +75 -41
- data/test/models/lockable_test.rb +115 -61
- data/test/models/omniauthable_test.rb +3 -1
- data/test/models/recoverable_test.rb +116 -37
- data/test/models/registerable_test.rb +3 -1
- data/test/models/rememberable_test.rb +95 -94
- data/test/models/serializable_test.rb +19 -8
- data/test/models/timeoutable_test.rb +10 -8
- data/test/models/trackable_test.rb +50 -1
- data/test/models/validatable_test.rb +24 -30
- data/test/models_test.rb +19 -8
- data/test/omniauth/config_test.rb +15 -11
- data/test/omniauth/url_helpers_test.rb +8 -9
- data/test/orm/active_record.rb +16 -2
- data/test/orm/mongoid.rb +4 -2
- data/test/parameter_sanitizer_test.rb +53 -57
- data/test/rails_app/app/active_record/admin.rb +2 -0
- data/test/rails_app/app/active_record/shim.rb +3 -1
- data/test/rails_app/app/active_record/user.rb +14 -0
- data/test/rails_app/app/active_record/user_on_engine.rb +9 -0
- data/test/rails_app/app/active_record/user_on_main_app.rb +9 -0
- data/test/rails_app/app/active_record/user_with_validations.rb +12 -0
- data/test/rails_app/app/active_record/user_without_email.rb +10 -0
- data/test/rails_app/app/controllers/admins/sessions_controller.rb +3 -1
- data/test/rails_app/app/controllers/admins_controller.rb +3 -6
- data/test/rails_app/app/controllers/application_controller.rb +7 -3
- data/test/rails_app/app/controllers/application_with_fake_engine.rb +32 -0
- data/test/rails_app/app/controllers/custom/registrations_controller.rb +33 -0
- data/test/rails_app/app/controllers/home_controller.rb +7 -1
- data/test/rails_app/app/controllers/publisher/registrations_controller.rb +3 -1
- data/test/rails_app/app/controllers/publisher/sessions_controller.rb +3 -1
- data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +7 -5
- data/test/rails_app/app/controllers/users_controller.rb +8 -6
- data/test/rails_app/app/helpers/application_helper.rb +2 -0
- data/test/rails_app/app/mailers/users/from_proc_mailer.rb +5 -0
- data/test/rails_app/app/mailers/users/mailer.rb +3 -10
- data/test/rails_app/app/mailers/users/reply_to_mailer.rb +6 -0
- data/test/rails_app/app/mongoid/admin.rb +13 -11
- data/test/rails_app/app/mongoid/shim.rb +4 -2
- data/test/rails_app/app/mongoid/user.rb +30 -19
- data/test/rails_app/app/mongoid/user_on_engine.rb +41 -0
- data/test/rails_app/app/mongoid/user_on_main_app.rb +41 -0
- data/test/rails_app/app/mongoid/user_with_validations.rb +37 -0
- data/test/rails_app/app/mongoid/user_without_email.rb +35 -0
- data/test/rails_app/app/views/admins/sessions/new.html.erb +1 -1
- data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -1
- data/test/rails_app/app/views/home/index.html.erb +1 -1
- data/test/rails_app/app/views/home/join.html.erb +1 -1
- data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -1
- data/test/rails_app/app/views/layouts/application.html.erb +1 -1
- data/test/rails_app/config/application.rb +13 -5
- data/test/rails_app/config/boot.rb +17 -4
- data/test/rails_app/config/environment.rb +2 -0
- data/test/rails_app/config/environments/development.rb +2 -0
- data/test/rails_app/config/environments/production.rb +10 -2
- data/test/rails_app/config/environments/test.rb +14 -3
- data/test/rails_app/config/initializers/backtrace_silencers.rb +2 -0
- data/test/rails_app/config/initializers/devise.rb +22 -21
- data/test/rails_app/config/initializers/inflections.rb +2 -0
- data/test/rails_app/config/initializers/secret_token.rb +3 -6
- data/test/rails_app/config/initializers/session_store.rb +2 -0
- data/test/rails_app/config/routes.rb +67 -43
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +16 -10
- data/test/rails_app/db/schema.rb +2 -0
- data/test/rails_app/lib/shared_admin.rb +10 -4
- data/test/rails_app/lib/shared_user.rb +4 -1
- data/test/rails_app/lib/shared_user_without_email.rb +28 -0
- data/test/rails_app/lib/shared_user_without_omniauth.rb +15 -0
- data/test/rails_test.rb +11 -0
- data/test/routes_test.rb +92 -61
- data/test/secret_key_finder_test.rb +97 -0
- data/test/support/action_controller/record_identifier.rb +12 -0
- data/test/support/assertions.rb +4 -14
- data/test/support/helpers.rb +23 -10
- data/test/support/http_method_compatibility.rb +53 -0
- data/test/support/integration.rb +19 -16
- data/test/support/mongoid.yml +6 -0
- data/test/support/webrat/integrations/rails.rb +11 -0
- data/test/{test_helpers_test.rb → test/controller_helpers_test.rb} +60 -40
- data/test/test/integration_helpers_test.rb +34 -0
- data/test/test_helper.rb +9 -0
- data/test/test_models.rb +8 -6
- metadata +123 -53
- data/gemfiles/Gemfile.rails-3.2.x +0 -31
- data/gemfiles/Gemfile.rails-3.2.x.lock +0 -159
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/module/delegation"
|
2
4
|
|
3
5
|
module Devise
|
@@ -6,9 +8,9 @@ module Devise
|
|
6
8
|
|
7
9
|
class << self
|
8
10
|
attr_reader :instance
|
9
|
-
delegate :time_ago_in_words, :
|
11
|
+
delegate :time_ago_in_words, to: :instance
|
10
12
|
end
|
11
13
|
|
12
14
|
@instance = new
|
13
15
|
end
|
14
|
-
end
|
16
|
+
end
|
@@ -1,11 +1,10 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
3
|
require 'openssl'
|
4
|
-
require 'securerandom'
|
5
4
|
|
6
5
|
module Devise
|
7
6
|
class TokenGenerator
|
8
|
-
def initialize(key_generator, digest="SHA256")
|
7
|
+
def initialize(key_generator, digest = "SHA256")
|
9
8
|
@key_generator = key_generator
|
10
9
|
@digest = digest
|
11
10
|
end
|
@@ -30,41 +29,4 @@ module Devise
|
|
30
29
|
@key_generator.generate_key("Devise #{column}")
|
31
30
|
end
|
32
31
|
end
|
33
|
-
|
34
|
-
# KeyGenerator is a simple wrapper around OpenSSL's implementation of PBKDF2
|
35
|
-
# It can be used to derive a number of keys for various purposes from a given secret.
|
36
|
-
# This lets Rails applications have a single secure secret, but avoid reusing that
|
37
|
-
# key in multiple incompatible contexts.
|
38
|
-
class KeyGenerator
|
39
|
-
def initialize(secret, options = {})
|
40
|
-
@secret = secret
|
41
|
-
# The default iterations are higher than required for our key derivation uses
|
42
|
-
# on the off chance someone uses this for password storage
|
43
|
-
@iterations = options[:iterations] || 2**16
|
44
|
-
end
|
45
|
-
|
46
|
-
# Returns a derived key suitable for use. The default key_size is chosen
|
47
|
-
# to be compatible with the default settings of ActiveSupport::MessageVerifier.
|
48
|
-
# i.e. OpenSSL::Digest::SHA1#block_length
|
49
|
-
def generate_key(salt, key_size=64)
|
50
|
-
OpenSSL::PKCS5.pbkdf2_hmac_sha1(@secret, salt, @iterations, key_size)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# CachingKeyGenerator is a wrapper around KeyGenerator which allows users to avoid
|
55
|
-
# re-executing the key generation process when it's called using the same salt and
|
56
|
-
# key_size
|
57
|
-
class CachingKeyGenerator
|
58
|
-
def initialize(key_generator)
|
59
|
-
@key_generator = key_generator
|
60
|
-
@cache_keys = ThreadSafe::Cache.new
|
61
|
-
end
|
62
|
-
|
63
|
-
# Returns a derived key suitable for use. The default key_size is chosen
|
64
|
-
# to be compatible with the default settings of ActiveSupport::MessageVerifier.
|
65
|
-
# i.e. OpenSSL::Digest::SHA1#block_length
|
66
|
-
def generate_key(salt, key_size=64)
|
67
|
-
@cache_keys["#{salt}#{key_size}"] ||= @key_generator.generate_key(salt, key_size)
|
68
|
-
end
|
69
|
-
end
|
70
32
|
end
|
data/lib/devise/version.rb
CHANGED
@@ -1,24 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rails/generators/active_record'
|
2
4
|
require 'generators/devise/orm_helpers'
|
3
5
|
|
4
6
|
module ActiveRecord
|
5
7
|
module Generators
|
6
8
|
class DeviseGenerator < ActiveRecord::Generators::Base
|
7
|
-
argument :attributes, :
|
9
|
+
argument :attributes, type: :array, default: [], banner: "field:type field:type"
|
10
|
+
|
11
|
+
class_option :primary_key_type, type: :string, desc: "The type for primary key"
|
8
12
|
|
9
13
|
include Devise::Generators::OrmHelpers
|
10
14
|
source_root File.expand_path("../templates", __FILE__)
|
11
15
|
|
12
16
|
def copy_devise_migration
|
13
17
|
if (behavior == :invoke && model_exists?) || (behavior == :revoke && migration_exists?(table_name))
|
14
|
-
migration_template "migration_existing.rb", "
|
18
|
+
migration_template "migration_existing.rb", "#{migration_path}/add_devise_to_#{table_name}.rb", migration_version: migration_version
|
15
19
|
else
|
16
|
-
migration_template "migration.rb", "
|
20
|
+
migration_template "migration.rb", "#{migration_path}/devise_create_#{table_name}.rb", migration_version: migration_version
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
20
24
|
def generate_model
|
21
|
-
invoke "active_record:model", [name], :
|
25
|
+
invoke "active_record:model", [name], migration: false unless model_exists? && behavior == :invoke
|
22
26
|
end
|
23
27
|
|
24
28
|
def inject_devise_content
|
@@ -39,8 +43,8 @@ module ActiveRecord
|
|
39
43
|
def migration_data
|
40
44
|
<<RUBY
|
41
45
|
## Database authenticatable
|
42
|
-
t.string :email, :
|
43
|
-
t.string :encrypted_password, :
|
46
|
+
t.string :email, null: false, default: ""
|
47
|
+
t.string :encrypted_password, null: false, default: ""
|
44
48
|
|
45
49
|
## Recoverable
|
46
50
|
t.string :reset_password_token
|
@@ -50,11 +54,11 @@ module ActiveRecord
|
|
50
54
|
t.datetime :remember_created_at
|
51
55
|
|
52
56
|
## Trackable
|
53
|
-
t.integer :sign_in_count, :
|
57
|
+
t.integer :sign_in_count, default: 0, null: false
|
54
58
|
t.datetime :current_sign_in_at
|
55
59
|
t.datetime :last_sign_in_at
|
56
|
-
t
|
57
|
-
t
|
60
|
+
t.#{ip_column} :current_sign_in_ip
|
61
|
+
t.#{ip_column} :last_sign_in_ip
|
58
62
|
|
59
63
|
## Confirmable
|
60
64
|
# t.string :confirmation_token
|
@@ -63,11 +67,44 @@ module ActiveRecord
|
|
63
67
|
# t.string :unconfirmed_email # Only if using reconfirmable
|
64
68
|
|
65
69
|
## Lockable
|
66
|
-
# t.integer :failed_attempts, :
|
70
|
+
# t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
|
67
71
|
# t.string :unlock_token # Only if unlock strategy is :email or :both
|
68
72
|
# t.datetime :locked_at
|
69
73
|
RUBY
|
70
74
|
end
|
75
|
+
|
76
|
+
def ip_column
|
77
|
+
# Padded with spaces so it aligns nicely with the rest of the columns.
|
78
|
+
"%-8s" % (inet? ? "inet" : "string")
|
79
|
+
end
|
80
|
+
|
81
|
+
def inet?
|
82
|
+
postgresql?
|
83
|
+
end
|
84
|
+
|
85
|
+
def rails5?
|
86
|
+
Rails.version.start_with? '5'
|
87
|
+
end
|
88
|
+
|
89
|
+
def postgresql?
|
90
|
+
config = ActiveRecord::Base.configurations[Rails.env]
|
91
|
+
config && config['adapter'] == 'postgresql'
|
92
|
+
end
|
93
|
+
|
94
|
+
def migration_version
|
95
|
+
if rails5?
|
96
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def primary_key_type
|
101
|
+
primary_key_string if rails5?
|
102
|
+
end
|
103
|
+
|
104
|
+
def primary_key_string
|
105
|
+
key_string = options[:primary_key_type]
|
106
|
+
", id: :#{key_string}" if key_string
|
107
|
+
end
|
71
108
|
end
|
72
109
|
end
|
73
110
|
end
|
@@ -1,18 +1,20 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class DeviseCreate<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
|
2
4
|
def change
|
3
|
-
create_table
|
5
|
+
create_table :<%= table_name %><%= primary_key_type %> do |t|
|
4
6
|
<%= migration_data -%>
|
5
7
|
|
6
8
|
<% attributes.each do |attribute| -%>
|
7
9
|
t.<%= attribute.type %> :<%= attribute.name %>
|
8
10
|
<% end -%>
|
9
11
|
|
10
|
-
t.timestamps
|
12
|
+
t.timestamps null: false
|
11
13
|
end
|
12
14
|
|
13
|
-
add_index :<%= table_name %>, :email, :
|
14
|
-
add_index :<%= table_name %>, :reset_password_token, :
|
15
|
-
# add_index :<%= table_name %>, :confirmation_token, :
|
16
|
-
# add_index :<%= table_name %>, :unlock_token, :
|
15
|
+
add_index :<%= table_name %>, :email, unique: true
|
16
|
+
add_index :<%= table_name %>, :reset_password_token, unique: true
|
17
|
+
# add_index :<%= table_name %>, :confirmation_token, unique: true
|
18
|
+
# add_index :<%= table_name %>, :unlock_token, unique: true
|
17
19
|
end
|
18
20
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class AddDeviseTo<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
|
2
4
|
def self.up
|
3
|
-
change_table
|
5
|
+
change_table :<%= table_name %> do |t|
|
4
6
|
<%= migration_data -%>
|
5
7
|
|
6
8
|
<% attributes.each do |attribute| -%>
|
@@ -8,13 +10,13 @@ class AddDeviseTo<%= table_name.camelize %> < ActiveRecord::Migration
|
|
8
10
|
<% end -%>
|
9
11
|
|
10
12
|
# Uncomment below if timestamps were not included in your original model.
|
11
|
-
# t.timestamps
|
13
|
+
# t.timestamps null: false
|
12
14
|
end
|
13
15
|
|
14
|
-
add_index :<%= table_name %>, :email, :
|
15
|
-
add_index :<%= table_name %>, :reset_password_token, :
|
16
|
-
# add_index :<%= table_name %>, :confirmation_token, :
|
17
|
-
# add_index :<%= table_name %>, :unlock_token, :
|
16
|
+
add_index :<%= table_name %>, :email, unique: true
|
17
|
+
add_index :<%= table_name %>, :reset_password_token, unique: true
|
18
|
+
# add_index :<%= table_name %>, :confirmation_token, unique: true
|
19
|
+
# add_index :<%= table_name %>, :unlock_token, unique: true
|
18
20
|
end
|
19
21
|
|
20
22
|
def self.down
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/base'
|
4
|
+
|
5
|
+
module Devise
|
6
|
+
module Generators
|
7
|
+
class ControllersGenerator < Rails::Generators::Base
|
8
|
+
CONTROLLERS = %w(confirmations passwords registrations sessions unlocks omniauth_callbacks).freeze
|
9
|
+
|
10
|
+
desc <<-DESC.strip_heredoc
|
11
|
+
Create inherited Devise controllers in your app/controllers folder.
|
12
|
+
|
13
|
+
Use -c to specify which controller you want to overwrite.
|
14
|
+
If you do no specify a controller, all controllers will be created.
|
15
|
+
For example:
|
16
|
+
|
17
|
+
rails generate devise:controllers users -c=sessions
|
18
|
+
|
19
|
+
This will create a controller class at app/controllers/users/sessions_controller.rb like this:
|
20
|
+
|
21
|
+
class Users::ConfirmationsController < Devise::ConfirmationsController
|
22
|
+
content...
|
23
|
+
end
|
24
|
+
DESC
|
25
|
+
|
26
|
+
source_root File.expand_path("../../templates/controllers", __FILE__)
|
27
|
+
argument :scope, required: true,
|
28
|
+
desc: "The scope to create controllers in, e.g. users, admins"
|
29
|
+
class_option :controllers, aliases: "-c", type: :array,
|
30
|
+
desc: "Select specific controllers to generate (#{CONTROLLERS.join(', ')})"
|
31
|
+
|
32
|
+
def create_controllers
|
33
|
+
@scope_prefix = scope.blank? ? '' : (scope.camelize + '::')
|
34
|
+
controllers = options[:controllers] || CONTROLLERS
|
35
|
+
controllers.each do |name|
|
36
|
+
template "#{name}_controller.rb",
|
37
|
+
"app/controllers/#{scope}/#{name}_controller.rb"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def show_readme
|
42
|
+
readme "README" if behavior == :invoke
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -1,3 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/named_base'
|
4
|
+
|
1
5
|
module Devise
|
2
6
|
module Generators
|
3
7
|
class DeviseGenerator < Rails::Generators::NamedBase
|
@@ -6,17 +10,17 @@ module Devise
|
|
6
10
|
namespace "devise"
|
7
11
|
source_root File.expand_path("../templates", __FILE__)
|
8
12
|
|
9
|
-
desc "Generates a model with the given NAME (if one does not exist) with devise "
|
13
|
+
desc "Generates a model with the given NAME (if one does not exist) with devise " \
|
10
14
|
"configuration plus a migration file and devise routes."
|
11
15
|
|
12
16
|
hook_for :orm
|
13
17
|
|
14
|
-
class_option :routes, :
|
18
|
+
class_option :routes, desc: "Generate routes", type: :boolean, default: true
|
15
19
|
|
16
20
|
def add_devise_routes
|
17
|
-
devise_route = "devise_for :#{plural_name}"
|
18
|
-
devise_route << %Q(, :
|
19
|
-
devise_route << %Q(, :
|
21
|
+
devise_route = "devise_for :#{plural_name}".dup
|
22
|
+
devise_route << %Q(, class_name: "#{class_name}") if class_name.include?("::")
|
23
|
+
devise_route << %Q(, skip: :all) unless options.routes?
|
20
24
|
route devise_route
|
21
25
|
end
|
22
26
|
end
|
@@ -1,7 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/base'
|
1
4
|
require 'securerandom'
|
2
5
|
|
3
6
|
module Devise
|
4
7
|
module Generators
|
8
|
+
MissingORMError = Class.new(Thor::Error)
|
9
|
+
|
5
10
|
class InstallGenerator < Rails::Generators::Base
|
6
11
|
source_root File.expand_path("../../templates", __FILE__)
|
7
12
|
|
@@ -9,6 +14,19 @@ module Devise
|
|
9
14
|
class_option :orm
|
10
15
|
|
11
16
|
def copy_initializer
|
17
|
+
unless options[:orm]
|
18
|
+
raise MissingORMError, <<-ERROR.strip_heredoc
|
19
|
+
An ORM must be set to install Devise in your application.
|
20
|
+
|
21
|
+
Be sure to have an ORM like Active Record or Mongoid loaded in your
|
22
|
+
app or configure your own at `config/application.rb`.
|
23
|
+
|
24
|
+
config.generators do |g|
|
25
|
+
g.orm :your_orm_gem
|
26
|
+
end
|
27
|
+
ERROR
|
28
|
+
end
|
29
|
+
|
12
30
|
template "devise.rb", "config/initializers/devise.rb"
|
13
31
|
end
|
14
32
|
|
@@ -19,6 +37,10 @@ module Devise
|
|
19
37
|
def show_readme
|
20
38
|
readme "README" if behavior == :invoke
|
21
39
|
end
|
40
|
+
|
41
|
+
def rails_4?
|
42
|
+
Rails::VERSION::MAJOR == 4
|
43
|
+
end
|
22
44
|
end
|
23
45
|
end
|
24
46
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Devise
|
2
4
|
module Generators
|
3
5
|
module OrmHelpers
|
@@ -8,31 +10,14 @@ module Devise
|
|
8
10
|
devise :database_authenticatable, :registerable,
|
9
11
|
:recoverable, :rememberable, :trackable, :validatable
|
10
12
|
|
11
|
-
CONTENT
|
12
|
-
buffer += <<-CONTENT if needs_attr_accessible?
|
13
|
-
# Setup accessible (or protected) attributes for your model
|
14
|
-
attr_accessible :email, :password, :password_confirmation, :remember_me
|
15
|
-
|
16
13
|
CONTENT
|
17
14
|
buffer
|
18
15
|
end
|
19
16
|
|
20
|
-
def needs_attr_accessible?
|
21
|
-
rails_3? && !strong_parameters_enabled?
|
22
|
-
end
|
23
|
-
|
24
|
-
def rails_3?
|
25
|
-
Rails::VERSION::MAJOR == 3
|
26
|
-
end
|
27
|
-
|
28
|
-
def strong_parameters_enabled?
|
29
|
-
defined?(ActionController::StrongParameters)
|
30
|
-
end
|
31
|
-
|
32
17
|
private
|
33
18
|
|
34
19
|
def model_exists?
|
35
|
-
File.
|
20
|
+
File.exist?(File.join(destination_root, model_path))
|
36
21
|
end
|
37
22
|
|
38
23
|
def migration_exists?(table_name)
|
@@ -40,7 +25,11 @@ CONTENT
|
|
40
25
|
end
|
41
26
|
|
42
27
|
def migration_path
|
43
|
-
|
28
|
+
if Rails.version >= '5.0.3'
|
29
|
+
db_migrate_path
|
30
|
+
else
|
31
|
+
@migration_path ||= File.join("db", "migrate")
|
32
|
+
end
|
44
33
|
end
|
45
34
|
|
46
35
|
def model_path
|
@@ -1,3 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/base'
|
4
|
+
|
1
5
|
module Devise
|
2
6
|
module Generators
|
3
7
|
# Include this module in your generator to generate Devise views.
|
@@ -7,30 +11,30 @@ module Devise
|
|
7
11
|
extend ActiveSupport::Concern
|
8
12
|
|
9
13
|
included do
|
10
|
-
argument :scope, :
|
11
|
-
:
|
14
|
+
argument :scope, required: false, default: nil,
|
15
|
+
desc: "The scope to copy views to"
|
12
16
|
|
13
17
|
# Le sigh, ensure Thor won't handle opts as args
|
14
18
|
# It should be fixed in future Rails releases
|
15
|
-
class_option :form_builder, :
|
19
|
+
class_option :form_builder, aliases: "-b"
|
16
20
|
class_option :markerb
|
21
|
+
class_option :views, aliases: "-v", type: :array, desc: "Select specific view directories to generate (confirmations, passwords, registrations, sessions, unlocks, mailer)"
|
17
22
|
|
18
23
|
public_task :copy_views
|
19
24
|
end
|
20
25
|
|
21
|
-
# TODO: Add this to Rails itself
|
22
|
-
module ClassMethods
|
23
|
-
def hide!
|
24
|
-
Rails::Generators.hide_namespace self.namespace
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
26
|
def copy_views
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
27
|
+
if options[:views]
|
28
|
+
options[:views].each do |directory|
|
29
|
+
view_directory directory.to_sym
|
30
|
+
end
|
31
|
+
else
|
32
|
+
view_directory :confirmations
|
33
|
+
view_directory :passwords
|
34
|
+
view_directory :registrations
|
35
|
+
view_directory :sessions
|
36
|
+
view_directory :unlocks
|
37
|
+
end
|
34
38
|
end
|
35
39
|
|
36
40
|
protected
|
@@ -38,7 +42,7 @@ module Devise
|
|
38
42
|
def view_directory(name, _target_path = nil)
|
39
43
|
directory name.to_s, _target_path || "#{target_path}/#{name}" do |content|
|
40
44
|
if scope
|
41
|
-
content.gsub "devise/shared/links", "#{
|
45
|
+
content.gsub "devise/shared/links", "#{plural_scope}/shared/links"
|
42
46
|
else
|
43
47
|
content
|
44
48
|
end
|
@@ -46,7 +50,11 @@ module Devise
|
|
46
50
|
end
|
47
51
|
|
48
52
|
def target_path
|
49
|
-
@target_path ||= "app/views/#{
|
53
|
+
@target_path ||= "app/views/#{plural_scope || :devise}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def plural_scope
|
57
|
+
@plural_scope ||= scope.presence && scope.underscore.pluralize
|
50
58
|
end
|
51
59
|
end
|
52
60
|
|
@@ -74,6 +82,13 @@ module Devise
|
|
74
82
|
source_root File.expand_path("../../templates/simple_form_for", __FILE__)
|
75
83
|
desc "Copies simple form enabled views to your application."
|
76
84
|
hide!
|
85
|
+
|
86
|
+
def copy_views
|
87
|
+
if options[:views]
|
88
|
+
options[:views].delete('mailer')
|
89
|
+
end
|
90
|
+
super
|
91
|
+
end
|
77
92
|
end
|
78
93
|
|
79
94
|
class ErbGenerator < Rails::Generators::Base #:nodoc:
|
@@ -83,7 +98,9 @@ module Devise
|
|
83
98
|
hide!
|
84
99
|
|
85
100
|
def copy_views
|
86
|
-
|
101
|
+
if !options[:views] || options[:views].include?('mailer')
|
102
|
+
view_directory :mailer
|
103
|
+
end
|
87
104
|
end
|
88
105
|
end
|
89
106
|
|
@@ -94,29 +111,35 @@ module Devise
|
|
94
111
|
hide!
|
95
112
|
|
96
113
|
def copy_views
|
97
|
-
|
114
|
+
if !options[:views] || options[:views].include?('mailer')
|
115
|
+
view_directory :markerb, target_path
|
116
|
+
end
|
98
117
|
end
|
99
118
|
|
100
119
|
def target_path
|
101
|
-
"app/views/#{
|
120
|
+
"app/views/#{plural_scope || :devise}/mailer"
|
102
121
|
end
|
103
122
|
end
|
104
123
|
|
105
124
|
class ViewsGenerator < Rails::Generators::Base
|
106
125
|
desc "Copies Devise views to your application."
|
107
126
|
|
108
|
-
argument :scope, :
|
109
|
-
:
|
127
|
+
argument :scope, required: false, default: nil,
|
128
|
+
desc: "The scope to copy views to"
|
110
129
|
|
111
130
|
invoke SharedViewsGenerator
|
112
131
|
|
113
|
-
hook_for :form_builder, :
|
114
|
-
:
|
115
|
-
:
|
132
|
+
hook_for :form_builder, aliases: "-b",
|
133
|
+
desc: "Form builder to be used",
|
134
|
+
default: defined?(SimpleForm) ? "simple_form_for" : "form_for"
|
135
|
+
|
136
|
+
hook_for :markerb, desc: "Generate markerb instead of erb mail views",
|
137
|
+
default: defined?(Markerb),
|
138
|
+
type: :boolean
|
116
139
|
|
117
|
-
hook_for :
|
118
|
-
:
|
119
|
-
:
|
140
|
+
hook_for :erb, desc: "Generate erb mail views",
|
141
|
+
default: !defined?(Markerb),
|
142
|
+
type: :boolean
|
120
143
|
end
|
121
144
|
end
|
122
145
|
end
|