deviseOne 1.0.0
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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.travis.yml +38 -0
- data/.yardopts +9 -0
- data/CHANGELOG.md +1117 -0
- data/CONTRIBUTING.md +14 -0
- data/Gemfile +29 -0
- data/Gemfile.lock +199 -0
- data/MIT-LICENSE +20 -0
- data/README.md +529 -0
- data/Rakefile +35 -0
- data/app/controllers/devise/confirmations_controller.rb +47 -0
- data/app/controllers/devise/omniauth_callbacks_controller.rb +30 -0
- data/app/controllers/devise/passwords_controller.rb +71 -0
- data/app/controllers/devise/registrations_controller.rb +143 -0
- data/app/controllers/devise/sessions_controller.rb +166 -0
- data/app/controllers/devise/unlocks_controller.rb +46 -0
- data/app/controllers/devise_controller.rb +193 -0
- data/app/helpers/devise_helper.rb +25 -0
- data/app/mailers/devise/mailer.rb +20 -0
- data/app/views/devise/confirmations/new.html.erb +16 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise/passwords/edit.html.erb +25 -0
- data/app/views/devise/passwords/new.html.erb +16 -0
- data/app/views/devise/registrations/edit.html.erb +39 -0
- data/app/views/devise/registrations/new.html.erb +29 -0
- data/app/views/devise/sessions/new.html.erb +27 -0
- data/app/views/devise/shared/_links.html.erb +21 -0
- data/app/views/devise/unlocks/new.html.erb +16 -0
- data/config/locales/en.yml +70 -0
- data/devise.gemspec +33 -0
- data/devise.png +0 -0
- data/gemfiles/Gemfile.rails-3.2-stable +29 -0
- data/gemfiles/Gemfile.rails-3.2-stable.lock +169 -0
- data/gemfiles/Gemfile.rails-4.0-stable +29 -0
- data/gemfiles/Gemfile.rails-4.0-stable.lock +165 -0
- data/gemfiles/Gemfile.rails-4.1-stable +29 -0
- data/gemfiles/Gemfile.rails-4.1-stable.lock +170 -0
- data/lib/devise.rb +499 -0
- data/lib/devise/controllers/helpers.rb +284 -0
- data/lib/devise/controllers/rememberable.rb +47 -0
- data/lib/devise/controllers/scoped_views.rb +17 -0
- data/lib/devise/controllers/sign_in_out.rb +102 -0
- data/lib/devise/controllers/store_location.rb +58 -0
- data/lib/devise/controllers/url_helpers.rb +69 -0
- data/lib/devise/delegator.rb +16 -0
- data/lib/devise/failure_app.rb +212 -0
- data/lib/devise/hooks/activatable.rb +10 -0
- data/lib/devise/hooks/csrf_cleaner.rb +7 -0
- data/lib/devise/hooks/forgetable.rb +9 -0
- data/lib/devise/hooks/lockable.rb +7 -0
- data/lib/devise/hooks/proxy.rb +21 -0
- data/lib/devise/hooks/rememberable.rb +7 -0
- data/lib/devise/hooks/timeoutable.rb +35 -0
- data/lib/devise/hooks/trackable.rb +9 -0
- data/lib/devise/mailers/helpers.rb +90 -0
- data/lib/devise/mapping.rb +175 -0
- data/lib/devise/models.rb +119 -0
- data/lib/devise/models/authenticatable.rb +290 -0
- data/lib/devise/models/confirmable.rb +305 -0
- data/lib/devise/models/database_authenticatable.rb +164 -0
- data/lib/devise/models/lockable.rb +196 -0
- data/lib/devise/models/omniauthable.rb +27 -0
- data/lib/devise/models/recoverable.rb +157 -0
- data/lib/devise/models/registerable.rb +25 -0
- data/lib/devise/models/rememberable.rb +142 -0
- data/lib/devise/models/timeoutable.rb +49 -0
- data/lib/devise/models/trackable.rb +38 -0
- data/lib/devise/models/validatable.rb +66 -0
- data/lib/devise/modules.rb +28 -0
- data/lib/devise/omniauth.rb +28 -0
- data/lib/devise/omniauth/config.rb +45 -0
- data/lib/devise/omniauth/url_helpers.rb +18 -0
- data/lib/devise/orm/active_record.rb +3 -0
- data/lib/devise/orm/mongoid.rb +3 -0
- data/lib/devise/parameter_filter.rb +40 -0
- data/lib/devise/parameter_sanitizer.rb +99 -0
- data/lib/devise/rails.rb +56 -0
- data/lib/devise/rails/routes.rb +495 -0
- data/lib/devise/rails/warden_compat.rb +22 -0
- data/lib/devise/strategies/authenticatable.rb +173 -0
- data/lib/devise/strategies/base.rb +20 -0
- data/lib/devise/strategies/database_authenticatable.rb +24 -0
- data/lib/devise/strategies/rememberable.rb +59 -0
- data/lib/devise/test_helpers.rb +132 -0
- data/lib/devise/time_inflector.rb +14 -0
- data/lib/devise/token_generator.rb +70 -0
- data/lib/devise/version.rb +3 -0
- data/lib/generators/active_record/devise_generator.rb +91 -0
- data/lib/generators/active_record/templates/migration.rb +18 -0
- data/lib/generators/active_record/templates/migration_existing.rb +25 -0
- data/lib/generators/devise/controllers_generator.rb +44 -0
- data/lib/generators/devise/devise_generator.rb +26 -0
- data/lib/generators/devise/install_generator.rb +29 -0
- data/lib/generators/devise/orm_helpers.rb +51 -0
- data/lib/generators/devise/views_generator.rb +135 -0
- data/lib/generators/mongoid/devise_generator.rb +55 -0
- data/lib/generators/templates/README +35 -0
- data/lib/generators/templates/controllers/README +14 -0
- data/lib/generators/templates/controllers/confirmations_controller.rb +28 -0
- data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +28 -0
- data/lib/generators/templates/controllers/passwords_controller.rb +32 -0
- data/lib/generators/templates/controllers/registrations_controller.rb +60 -0
- data/lib/generators/templates/controllers/sessions_controller.rb +25 -0
- data/lib/generators/templates/controllers/unlocks_controller.rb +28 -0
- data/lib/generators/templates/devise.rb +263 -0
- data/lib/generators/templates/markerb/confirmation_instructions.markerb +5 -0
- data/lib/generators/templates/markerb/reset_password_instructions.markerb +8 -0
- data/lib/generators/templates/markerb/unlock_instructions.markerb +7 -0
- data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +16 -0
- data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +19 -0
- data/lib/generators/templates/simple_form_for/passwords/new.html.erb +15 -0
- data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +27 -0
- data/lib/generators/templates/simple_form_for/registrations/new.html.erb +17 -0
- data/lib/generators/templates/simple_form_for/sessions/new.html.erb +15 -0
- data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +16 -0
- data/script/cached-bundle +49 -0
- data/script/s3-put +71 -0
- data/test/controllers/custom_registrations_controller_test.rb +35 -0
- data/test/controllers/custom_strategy_test.rb +62 -0
- data/test/controllers/helpers_test.rb +316 -0
- data/test/controllers/internal_helpers_test.rb +129 -0
- data/test/controllers/load_hooks_controller_test.rb +19 -0
- data/test/controllers/passwords_controller_test.rb +31 -0
- data/test/controllers/sessions_controller_test.rb +102 -0
- data/test/controllers/url_helpers_test.rb +65 -0
- data/test/delegator_test.rb +19 -0
- data/test/devise_test.rb +107 -0
- data/test/failure_app_test.rb +275 -0
- data/test/generators/active_record_generator_test.rb +109 -0
- data/test/generators/controllers_generator_test.rb +48 -0
- data/test/generators/devise_generator_test.rb +39 -0
- data/test/generators/install_generator_test.rb +13 -0
- data/test/generators/mongoid_generator_test.rb +23 -0
- data/test/generators/views_generator_test.rb +96 -0
- data/test/helpers/devise_helper_test.rb +49 -0
- data/test/integration/authenticatable_test.rb +731 -0
- data/test/integration/confirmable_test.rb +324 -0
- data/test/integration/database_authenticatable_test.rb +94 -0
- data/test/integration/http_authenticatable_test.rb +105 -0
- data/test/integration/lockable_test.rb +239 -0
- data/test/integration/omniauthable_test.rb +133 -0
- data/test/integration/recoverable_test.rb +334 -0
- data/test/integration/registerable_test.rb +361 -0
- data/test/integration/rememberable_test.rb +176 -0
- data/test/integration/timeoutable_test.rb +189 -0
- data/test/integration/trackable_test.rb +92 -0
- data/test/mailers/confirmation_instructions_test.rb +115 -0
- data/test/mailers/reset_password_instructions_test.rb +96 -0
- data/test/mailers/unlock_instructions_test.rb +91 -0
- data/test/mapping_test.rb +128 -0
- data/test/models/authenticatable_test.rb +23 -0
- data/test/models/confirmable_test.rb +461 -0
- data/test/models/database_authenticatable_test.rb +249 -0
- data/test/models/lockable_test.rb +328 -0
- data/test/models/omniauthable_test.rb +7 -0
- data/test/models/recoverable_test.rb +205 -0
- data/test/models/registerable_test.rb +7 -0
- data/test/models/rememberable_test.rb +198 -0
- data/test/models/serializable_test.rb +49 -0
- data/test/models/timeoutable_test.rb +51 -0
- data/test/models/trackable_test.rb +41 -0
- data/test/models/validatable_test.rb +127 -0
- data/test/models_test.rb +144 -0
- data/test/omniauth/config_test.rb +57 -0
- data/test/omniauth/url_helpers_test.rb +54 -0
- data/test/orm/active_record.rb +10 -0
- data/test/orm/mongoid.rb +13 -0
- data/test/parameter_sanitizer_test.rb +81 -0
- data/test/rails_app/Rakefile +6 -0
- data/test/rails_app/app/active_record/admin.rb +6 -0
- data/test/rails_app/app/active_record/shim.rb +2 -0
- data/test/rails_app/app/active_record/user.rb +6 -0
- data/test/rails_app/app/active_record/user_on_engine.rb +7 -0
- data/test/rails_app/app/active_record/user_on_main_app.rb +7 -0
- data/test/rails_app/app/controllers/admins/sessions_controller.rb +6 -0
- data/test/rails_app/app/controllers/admins_controller.rb +11 -0
- data/test/rails_app/app/controllers/application_controller.rb +12 -0
- data/test/rails_app/app/controllers/application_with_fake_engine.rb +30 -0
- data/test/rails_app/app/controllers/custom/registrations_controller.rb +21 -0
- data/test/rails_app/app/controllers/home_controller.rb +25 -0
- data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
- data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
- data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
- data/test/rails_app/app/controllers/users_controller.rb +31 -0
- data/test/rails_app/app/helpers/application_helper.rb +3 -0
- data/test/rails_app/app/mailers/users/from_proc_mailer.rb +3 -0
- data/test/rails_app/app/mailers/users/mailer.rb +3 -0
- data/test/rails_app/app/mailers/users/reply_to_mailer.rb +4 -0
- data/test/rails_app/app/mongoid/admin.rb +29 -0
- data/test/rails_app/app/mongoid/shim.rb +23 -0
- data/test/rails_app/app/mongoid/user.rb +39 -0
- data/test/rails_app/app/mongoid/user_on_engine.rb +39 -0
- data/test/rails_app/app/mongoid/user_on_main_app.rb +39 -0
- data/test/rails_app/app/views/admins/index.html.erb +1 -0
- data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
- data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -0
- data/test/rails_app/app/views/home/index.html.erb +1 -0
- data/test/rails_app/app/views/home/join.html.erb +1 -0
- data/test/rails_app/app/views/home/private.html.erb +1 -0
- data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -0
- data/test/rails_app/app/views/layouts/application.html.erb +24 -0
- data/test/rails_app/app/views/users/edit_form.html.erb +1 -0
- data/test/rails_app/app/views/users/index.html.erb +1 -0
- data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
- data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
- data/test/rails_app/bin/bundle +3 -0
- data/test/rails_app/bin/rails +4 -0
- data/test/rails_app/bin/rake +4 -0
- data/test/rails_app/config.ru +4 -0
- data/test/rails_app/config/application.rb +40 -0
- data/test/rails_app/config/boot.rb +14 -0
- data/test/rails_app/config/database.yml +18 -0
- data/test/rails_app/config/environment.rb +5 -0
- data/test/rails_app/config/environments/development.rb +30 -0
- data/test/rails_app/config/environments/production.rb +80 -0
- data/test/rails_app/config/environments/test.rb +36 -0
- data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/test/rails_app/config/initializers/devise.rb +180 -0
- data/test/rails_app/config/initializers/inflections.rb +2 -0
- data/test/rails_app/config/initializers/secret_token.rb +8 -0
- data/test/rails_app/config/initializers/session_store.rb +1 -0
- data/test/rails_app/config/routes.rb +122 -0
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +71 -0
- data/test/rails_app/db/schema.rb +55 -0
- data/test/rails_app/lib/shared_admin.rb +17 -0
- data/test/rails_app/lib/shared_user.rb +29 -0
- data/test/rails_app/lib/shared_user_without_omniauth.rb +13 -0
- data/test/rails_app/public/404.html +26 -0
- data/test/rails_app/public/422.html +26 -0
- data/test/rails_app/public/500.html +26 -0
- data/test/rails_app/public/favicon.ico +0 -0
- data/test/routes_test.rb +264 -0
- data/test/support/action_controller/record_identifier.rb +10 -0
- data/test/support/assertions.rb +39 -0
- data/test/support/helpers.rb +73 -0
- data/test/support/integration.rb +92 -0
- data/test/support/locale/en.yml +8 -0
- data/test/support/mongoid.yml +6 -0
- data/test/support/webrat/integrations/rails.rb +24 -0
- data/test/test_helper.rb +34 -0
- data/test/test_helpers_test.rb +163 -0
- data/test/test_models.rb +33 -0
- metadata +531 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Deprecate: Copied verbatim from Rails source, remove once we move to Rails 4 only.
|
|
2
|
+
require 'thread_safe'
|
|
3
|
+
require 'openssl'
|
|
4
|
+
require 'securerandom'
|
|
5
|
+
|
|
6
|
+
module Devise
|
|
7
|
+
class TokenGenerator
|
|
8
|
+
def initialize(key_generator, digest="SHA256")
|
|
9
|
+
@key_generator = key_generator
|
|
10
|
+
@digest = digest
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def digest(klass, column, value)
|
|
14
|
+
value.present? && OpenSSL::HMAC.hexdigest(@digest, key_for(column), value.to_s)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def generate(klass, column)
|
|
18
|
+
key = key_for(column)
|
|
19
|
+
|
|
20
|
+
loop do
|
|
21
|
+
raw = Devise.friendly_token
|
|
22
|
+
enc = OpenSSL::HMAC.hexdigest(@digest, key, raw)
|
|
23
|
+
break [raw, enc] unless klass.to_adapter.find_first({ column => enc })
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def key_for(column)
|
|
30
|
+
@key_generator.generate_key("Devise #{column}")
|
|
31
|
+
end
|
|
32
|
+
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
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require 'rails/generators/active_record'
|
|
2
|
+
require 'generators/devise/orm_helpers'
|
|
3
|
+
|
|
4
|
+
module ActiveRecord
|
|
5
|
+
module Generators
|
|
6
|
+
class DeviseGenerator < ActiveRecord::Generators::Base
|
|
7
|
+
argument :attributes, type: :array, default: [], banner: "field:type field:type"
|
|
8
|
+
|
|
9
|
+
include Devise::Generators::OrmHelpers
|
|
10
|
+
source_root File.expand_path("../templates", __FILE__)
|
|
11
|
+
|
|
12
|
+
def copy_devise_migration
|
|
13
|
+
if (behavior == :invoke && model_exists?) || (behavior == :revoke && migration_exists?(table_name))
|
|
14
|
+
migration_template "migration_existing.rb", "db/migrate/add_devise_to_#{table_name}.rb"
|
|
15
|
+
else
|
|
16
|
+
migration_template "migration.rb", "db/migrate/devise_create_#{table_name}.rb"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def generate_model
|
|
21
|
+
invoke "active_record:model", [name], migration: false unless model_exists? && behavior == :invoke
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def inject_devise_content
|
|
25
|
+
content = model_contents
|
|
26
|
+
|
|
27
|
+
class_path = if namespaced?
|
|
28
|
+
class_name.to_s.split("::")
|
|
29
|
+
else
|
|
30
|
+
[class_name]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
indent_depth = class_path.size - 1
|
|
34
|
+
content = content.split("\n").map { |line| " " * indent_depth + line } .join("\n") << "\n"
|
|
35
|
+
|
|
36
|
+
inject_into_class(model_path, class_path.last, content) if model_exists?
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def migration_data
|
|
40
|
+
<<RUBY
|
|
41
|
+
## Database authenticatable
|
|
42
|
+
t.string :email, null: false, default: ""
|
|
43
|
+
t.string :encrypted_password, null: false, default: ""
|
|
44
|
+
|
|
45
|
+
## Recoverable
|
|
46
|
+
t.string :reset_password_token
|
|
47
|
+
t.datetime :reset_password_sent_at
|
|
48
|
+
|
|
49
|
+
## Rememberable
|
|
50
|
+
t.datetime :remember_created_at
|
|
51
|
+
|
|
52
|
+
## Trackable
|
|
53
|
+
t.integer :sign_in_count, default: 0, null: false
|
|
54
|
+
t.datetime :current_sign_in_at
|
|
55
|
+
t.datetime :last_sign_in_at
|
|
56
|
+
t.#{ip_column} :current_sign_in_ip
|
|
57
|
+
t.#{ip_column} :last_sign_in_ip
|
|
58
|
+
|
|
59
|
+
## Confirmable
|
|
60
|
+
# t.string :confirmation_token
|
|
61
|
+
# t.datetime :confirmed_at
|
|
62
|
+
# t.datetime :confirmation_sent_at
|
|
63
|
+
# t.string :unconfirmed_email # Only if using reconfirmable
|
|
64
|
+
|
|
65
|
+
## Lockable
|
|
66
|
+
# t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
|
|
67
|
+
# t.string :unlock_token # Only if unlock strategy is :email or :both
|
|
68
|
+
# t.datetime :locked_at
|
|
69
|
+
RUBY
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def ip_column
|
|
73
|
+
# Padded with spaces so it aligns nicely with the rest of the columns.
|
|
74
|
+
"%-8s" % (inet? ? "inet" : "string")
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def inet?
|
|
78
|
+
rails4? && postgresql?
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def rails4?
|
|
82
|
+
Rails.version.start_with? '4'
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def postgresql?
|
|
86
|
+
config = ActiveRecord::Base.configurations[Rails.env]
|
|
87
|
+
config && config['adapter'] == 'postgresql'
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
class DeviseCreate<%= table_name.camelize %> < ActiveRecord::Migration
|
|
2
|
+
def change
|
|
3
|
+
create_table(:<%= table_name %>) do |t|
|
|
4
|
+
<%= migration_data -%>
|
|
5
|
+
|
|
6
|
+
<% attributes.each do |attribute| -%>
|
|
7
|
+
t.<%= attribute.type %> :<%= attribute.name %>
|
|
8
|
+
<% end -%>
|
|
9
|
+
|
|
10
|
+
t.timestamps
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
add_index :<%= table_name %>, :email, unique: true
|
|
14
|
+
add_index :<%= table_name %>, :reset_password_token, unique: true
|
|
15
|
+
# add_index :<%= table_name %>, :confirmation_token, unique: true
|
|
16
|
+
# add_index :<%= table_name %>, :unlock_token, unique: true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class AddDeviseTo<%= table_name.camelize %> < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
change_table(:<%= table_name %>) do |t|
|
|
4
|
+
<%= migration_data -%>
|
|
5
|
+
|
|
6
|
+
<% attributes.each do |attribute| -%>
|
|
7
|
+
t.<%= attribute.type %> :<%= attribute.name %>
|
|
8
|
+
<% end -%>
|
|
9
|
+
|
|
10
|
+
# Uncomment below if timestamps were not included in your original model.
|
|
11
|
+
# t.timestamps
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
add_index :<%= table_name %>, :email, unique: true
|
|
15
|
+
add_index :<%= table_name %>, :reset_password_token, unique: true
|
|
16
|
+
# add_index :<%= table_name %>, :confirmation_token, unique: true
|
|
17
|
+
# add_index :<%= table_name %>, :unlock_token, unique: true
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.down
|
|
21
|
+
# By default, we don't want to make any assumption about how to roll back a migration when your
|
|
22
|
+
# model already existed. Please edit below which fields you would like to remove in this migration.
|
|
23
|
+
raise ActiveRecord::IrreversibleMigration
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'rails/generators/base'
|
|
2
|
+
|
|
3
|
+
module Devise
|
|
4
|
+
module Generators
|
|
5
|
+
class ControllersGenerator < Rails::Generators::Base
|
|
6
|
+
CONTROLLERS = %w(confirmations passwords registrations sessions unlocks omniauth_callbacks).freeze
|
|
7
|
+
|
|
8
|
+
desc <<-DESC.strip_heredoc
|
|
9
|
+
Create inherited Devise controllers in your app/controllers folder.
|
|
10
|
+
|
|
11
|
+
Use -c to specify which controller you want to overwrite.
|
|
12
|
+
If you do no specify a controller, all controllers will be created.
|
|
13
|
+
For example:
|
|
14
|
+
|
|
15
|
+
rails generate devise:controllers users -c=sessions
|
|
16
|
+
|
|
17
|
+
This will create a controller class at app/controllers/users/sessions_controller.rb like this:
|
|
18
|
+
|
|
19
|
+
class Users::ConfirmationsController < Devise::ConfirmationsController
|
|
20
|
+
content...
|
|
21
|
+
end
|
|
22
|
+
DESC
|
|
23
|
+
|
|
24
|
+
source_root File.expand_path("../../templates/controllers", __FILE__)
|
|
25
|
+
argument :scope, required: true,
|
|
26
|
+
desc: "The scope to create controllers in, e.g. users, admins"
|
|
27
|
+
class_option :controllers, aliases: "-c", type: :array,
|
|
28
|
+
desc: "Select specific controllers to generate (#{CONTROLLERS.join(', ')})"
|
|
29
|
+
|
|
30
|
+
def create_controllers
|
|
31
|
+
@scope_prefix = scope.blank? ? '' : (scope.camelize + '::')
|
|
32
|
+
controllers = options[:controllers] || CONTROLLERS
|
|
33
|
+
controllers.each do |name|
|
|
34
|
+
template "#{name}_controller.rb",
|
|
35
|
+
"app/controllers/#{scope}/#{name}_controller.rb"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def show_readme
|
|
40
|
+
readme "README" if behavior == :invoke
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'rails/generators/named_base'
|
|
2
|
+
|
|
3
|
+
module Devise
|
|
4
|
+
module Generators
|
|
5
|
+
class DeviseGenerator < Rails::Generators::NamedBase
|
|
6
|
+
include Rails::Generators::ResourceHelpers
|
|
7
|
+
|
|
8
|
+
namespace "devise"
|
|
9
|
+
source_root File.expand_path("../templates", __FILE__)
|
|
10
|
+
|
|
11
|
+
desc "Generates a model with the given NAME (if one does not exist) with devise " <<
|
|
12
|
+
"configuration plus a migration file and devise routes."
|
|
13
|
+
|
|
14
|
+
hook_for :orm
|
|
15
|
+
|
|
16
|
+
class_option :routes, desc: "Generate routes", type: :boolean, default: true
|
|
17
|
+
|
|
18
|
+
def add_devise_routes
|
|
19
|
+
devise_route = "devise_for :#{plural_name}"
|
|
20
|
+
devise_route << %Q(, class_name: "#{class_name}") if class_name.include?("::")
|
|
21
|
+
devise_route << %Q(, skip: :all) unless options.routes?
|
|
22
|
+
route devise_route
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'rails/generators/base'
|
|
2
|
+
require 'securerandom'
|
|
3
|
+
|
|
4
|
+
module Devise
|
|
5
|
+
module Generators
|
|
6
|
+
class InstallGenerator < Rails::Generators::Base
|
|
7
|
+
source_root File.expand_path("../../templates", __FILE__)
|
|
8
|
+
|
|
9
|
+
desc "Creates a Devise initializer and copy locale files to your application."
|
|
10
|
+
class_option :orm
|
|
11
|
+
|
|
12
|
+
def copy_initializer
|
|
13
|
+
template "devise.rb", "config/initializers/devise.rb"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def copy_locale
|
|
17
|
+
copy_file "../../../config/locales/en.yml", "config/locales/devise.en.yml"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def show_readme
|
|
21
|
+
readme "README" if behavior == :invoke
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def rails_4?
|
|
25
|
+
Rails::VERSION::MAJOR == 4
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module Devise
|
|
2
|
+
module Generators
|
|
3
|
+
module OrmHelpers
|
|
4
|
+
def model_contents
|
|
5
|
+
buffer = <<-CONTENT
|
|
6
|
+
# Include default devise modules. Others available are:
|
|
7
|
+
# :confirmable, :lockable, :timeoutable and :omniauthable
|
|
8
|
+
devise :database_authenticatable, :registerable,
|
|
9
|
+
:recoverable, :rememberable, :trackable, :validatable
|
|
10
|
+
|
|
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
|
+
CONTENT
|
|
17
|
+
buffer
|
|
18
|
+
end
|
|
19
|
+
|
|
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
|
+
private
|
|
33
|
+
|
|
34
|
+
def model_exists?
|
|
35
|
+
File.exists?(File.join(destination_root, model_path))
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def migration_exists?(table_name)
|
|
39
|
+
Dir.glob("#{File.join(destination_root, migration_path)}/[0-9]*_*.rb").grep(/\d+_add_devise_to_#{table_name}.rb$/).first
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def migration_path
|
|
43
|
+
@migration_path ||= File.join("db", "migrate")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def model_path
|
|
47
|
+
@model_path ||= File.join("app", "models", "#{file_path}.rb")
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
require 'rails/generators/base'
|
|
2
|
+
|
|
3
|
+
module Devise
|
|
4
|
+
module Generators
|
|
5
|
+
# Include this module in your generator to generate Devise views.
|
|
6
|
+
# `copy_views` is the main method and by default copies all views
|
|
7
|
+
# with forms.
|
|
8
|
+
module ViewPathTemplates #:nodoc:
|
|
9
|
+
extend ActiveSupport::Concern
|
|
10
|
+
|
|
11
|
+
included do
|
|
12
|
+
argument :scope, required: false, default: nil,
|
|
13
|
+
desc: "The scope to copy views to"
|
|
14
|
+
|
|
15
|
+
# Le sigh, ensure Thor won't handle opts as args
|
|
16
|
+
# It should be fixed in future Rails releases
|
|
17
|
+
class_option :form_builder, aliases: "-b"
|
|
18
|
+
class_option :markerb
|
|
19
|
+
class_option :views, aliases: "-v", type: :array, desc: "Select specific view directories to generate (confirmations, passwords, registrations, sessions, unlocks, mailer)"
|
|
20
|
+
|
|
21
|
+
public_task :copy_views
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# TODO: Add this to Rails itself
|
|
25
|
+
module ClassMethods
|
|
26
|
+
def hide!
|
|
27
|
+
Rails::Generators.hide_namespace self.namespace
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def copy_views
|
|
32
|
+
if options[:views]
|
|
33
|
+
options[:views].each do |directory|
|
|
34
|
+
view_directory directory.to_sym
|
|
35
|
+
end
|
|
36
|
+
else
|
|
37
|
+
view_directory :confirmations
|
|
38
|
+
view_directory :passwords
|
|
39
|
+
view_directory :registrations
|
|
40
|
+
view_directory :sessions
|
|
41
|
+
view_directory :unlocks
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
protected
|
|
46
|
+
|
|
47
|
+
def view_directory(name, _target_path = nil)
|
|
48
|
+
directory name.to_s, _target_path || "#{target_path}/#{name}" do |content|
|
|
49
|
+
if scope
|
|
50
|
+
content.gsub "devise/shared/links", "#{scope}/shared/links"
|
|
51
|
+
else
|
|
52
|
+
content
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def target_path
|
|
58
|
+
@target_path ||= "app/views/#{scope || :devise}"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
class SharedViewsGenerator < Rails::Generators::Base #:nodoc:
|
|
63
|
+
include ViewPathTemplates
|
|
64
|
+
source_root File.expand_path("../../../../app/views/devise", __FILE__)
|
|
65
|
+
desc "Copies shared Devise views to your application."
|
|
66
|
+
hide!
|
|
67
|
+
|
|
68
|
+
# Override copy_views to just copy mailer and shared.
|
|
69
|
+
def copy_views
|
|
70
|
+
view_directory :shared
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
class FormForGenerator < Rails::Generators::Base #:nodoc:
|
|
75
|
+
include ViewPathTemplates
|
|
76
|
+
source_root File.expand_path("../../../../app/views/devise", __FILE__)
|
|
77
|
+
desc "Copies default Devise views to your application."
|
|
78
|
+
hide!
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
class SimpleFormForGenerator < Rails::Generators::Base #:nodoc:
|
|
82
|
+
include ViewPathTemplates
|
|
83
|
+
source_root File.expand_path("../../templates/simple_form_for", __FILE__)
|
|
84
|
+
desc "Copies simple form enabled views to your application."
|
|
85
|
+
hide!
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
class ErbGenerator < Rails::Generators::Base #:nodoc:
|
|
89
|
+
include ViewPathTemplates
|
|
90
|
+
source_root File.expand_path("../../../../app/views/devise", __FILE__)
|
|
91
|
+
desc "Copies Devise mail erb views to your application."
|
|
92
|
+
hide!
|
|
93
|
+
|
|
94
|
+
def copy_views
|
|
95
|
+
if !options[:views] || options[:views].include?('mailer')
|
|
96
|
+
view_directory :mailer
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
class MarkerbGenerator < Rails::Generators::Base #:nodoc:
|
|
102
|
+
include ViewPathTemplates
|
|
103
|
+
source_root File.expand_path("../../templates", __FILE__)
|
|
104
|
+
desc "Copies Devise mail markerb views to your application."
|
|
105
|
+
hide!
|
|
106
|
+
|
|
107
|
+
def copy_views
|
|
108
|
+
if !options[:views] || options[:views].include?('mailer')
|
|
109
|
+
view_directory :markerb, target_path
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def target_path
|
|
114
|
+
"app/views/#{scope || :devise}/mailer"
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
class ViewsGenerator < Rails::Generators::Base
|
|
119
|
+
desc "Copies Devise views to your application."
|
|
120
|
+
|
|
121
|
+
argument :scope, required: false, default: nil,
|
|
122
|
+
desc: "The scope to copy views to"
|
|
123
|
+
|
|
124
|
+
invoke SharedViewsGenerator
|
|
125
|
+
|
|
126
|
+
hook_for :form_builder, aliases: "-b",
|
|
127
|
+
desc: "Form builder to be used",
|
|
128
|
+
default: defined?(SimpleForm) ? "simple_form_for" : "form_for"
|
|
129
|
+
|
|
130
|
+
hook_for :markerb, desc: "Generate markerb instead of erb mail views",
|
|
131
|
+
default: defined?(Markerb) ? :markerb : :erb,
|
|
132
|
+
type: :boolean
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|