rodauth-rails 1.2.2 → 1.4.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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -0
  3. data/README.md +108 -2
  4. data/lib/generators/rodauth/install_generator.rb +9 -10
  5. data/lib/generators/rodauth/migration/{account_expiration.erb → active_record/account_expiration.erb} +0 -0
  6. data/lib/generators/rodauth/migration/{active_sessions.erb → active_record/active_sessions.erb} +0 -0
  7. data/lib/generators/rodauth/migration/{audit_logging.erb → active_record/audit_logging.erb} +0 -0
  8. data/lib/generators/rodauth/migration/{base.erb → active_record/base.erb} +2 -7
  9. data/lib/generators/rodauth/migration/{disallow_password_reuse.erb → active_record/disallow_password_reuse.erb} +1 -1
  10. data/lib/generators/rodauth/migration/{email_auth.erb → active_record/email_auth.erb} +0 -0
  11. data/lib/generators/rodauth/migration/{jwt_refresh.erb → active_record/jwt_refresh.erb} +0 -0
  12. data/lib/generators/rodauth/migration/{lockout.erb → active_record/lockout.erb} +0 -0
  13. data/lib/generators/rodauth/migration/{otp.erb → active_record/otp.erb} +0 -0
  14. data/lib/generators/rodauth/migration/{password_expiration.erb → active_record/password_expiration.erb} +0 -0
  15. data/lib/generators/rodauth/migration/{recovery_codes.erb → active_record/recovery_codes.erb} +0 -0
  16. data/lib/generators/rodauth/migration/{remember.erb → active_record/remember.erb} +0 -0
  17. data/lib/generators/rodauth/migration/{reset_password.erb → active_record/reset_password.erb} +0 -0
  18. data/lib/generators/rodauth/migration/{single_session.erb → active_record/single_session.erb} +0 -0
  19. data/lib/generators/rodauth/migration/{sms_codes.erb → active_record/sms_codes.erb} +0 -0
  20. data/lib/generators/rodauth/migration/{verify_account.erb → active_record/verify_account.erb} +0 -0
  21. data/lib/generators/rodauth/migration/{verify_login_change.erb → active_record/verify_login_change.erb} +0 -0
  22. data/lib/generators/rodauth/migration/{webauthn.erb → active_record/webauthn.erb} +0 -0
  23. data/lib/generators/rodauth/migration/sequel/account_expiration.erb +7 -0
  24. data/lib/generators/rodauth/migration/sequel/active_sessions.erb +8 -0
  25. data/lib/generators/rodauth/migration/sequel/audit_logging.erb +17 -0
  26. data/lib/generators/rodauth/migration/sequel/base.erb +25 -0
  27. data/lib/generators/rodauth/migration/sequel/disallow_password_reuse.erb +6 -0
  28. data/lib/generators/rodauth/migration/sequel/email_auth.erb +7 -0
  29. data/lib/generators/rodauth/migration/sequel/jwt_refresh.erb +8 -0
  30. data/lib/generators/rodauth/migration/sequel/lockout.erb +11 -0
  31. data/lib/generators/rodauth/migration/sequel/otp.erb +7 -0
  32. data/lib/generators/rodauth/migration/sequel/password_expiration.erb +5 -0
  33. data/lib/generators/rodauth/migration/sequel/recovery_codes.erb +6 -0
  34. data/lib/generators/rodauth/migration/sequel/remember.erb +6 -0
  35. data/lib/generators/rodauth/migration/sequel/reset_password.erb +7 -0
  36. data/lib/generators/rodauth/migration/sequel/single_session.erb +5 -0
  37. data/lib/generators/rodauth/migration/sequel/sms_codes.erb +8 -0
  38. data/lib/generators/rodauth/migration/sequel/verify_account.erb +7 -0
  39. data/lib/generators/rodauth/migration/sequel/verify_login_change.erb +7 -0
  40. data/lib/generators/rodauth/migration/sequel/webauthn.erb +13 -0
  41. data/lib/generators/rodauth/migration_generator.rb +89 -9
  42. data/lib/generators/rodauth/templates/app/mailers/rodauth_mailer.rb +24 -0
  43. data/lib/generators/rodauth/templates/app/misc/rodauth_main.rb +4 -1
  44. data/lib/generators/rodauth/templates/app/models/account.rb +11 -0
  45. data/lib/generators/rodauth/templates/db/migrate/create_rodauth.rb +8 -0
  46. data/lib/rodauth/rails/app.rb +19 -7
  47. data/lib/rodauth/rails/controller_methods.rb +9 -0
  48. data/lib/rodauth/rails/feature/associations.rb +54 -0
  49. data/lib/rodauth/rails/feature/base.rb +10 -0
  50. data/lib/rodauth/rails/feature/instrumentation.rb +8 -0
  51. data/lib/rodauth/rails/feature.rb +2 -0
  52. data/lib/rodauth/rails/middleware.rb +9 -0
  53. data/lib/rodauth/rails/model.rb +8 -8
  54. data/lib/rodauth/rails/railtie.rb +9 -0
  55. data/lib/rodauth/rails/test/controller.rb +41 -0
  56. data/lib/rodauth/rails/test.rb +7 -0
  57. data/lib/rodauth/rails/version.rb +1 -1
  58. data/rodauth-rails.gemspec +2 -1
  59. metadata +57 -26
  60. data/lib/generators/rodauth/migration_helpers.rb +0 -77
  61. data/lib/rodauth/rails/app/flash.rb +0 -45
  62. data/lib/rodauth/rails/app/middleware.rb +0 -36
  63. data/lib/rodauth/rails/model/associations.rb +0 -195
@@ -1,14 +1,22 @@
1
1
  class RodauthMailer < ApplicationMailer
2
2
  def verify_account(account_id, key)
3
3
  @email_link = rodauth.verify_account_url(key: email_token(account_id, key))
4
+ <% if defined?(ActiveRecord::Railtie) -%>
4
5
  @account = Account.find(account_id)
6
+ <% else -%>
7
+ @account = Account.with_pk!(account_id)
8
+ <% end -%>
5
9
 
6
10
  mail to: @account.email, subject: rodauth.verify_account_email_subject
7
11
  end
8
12
 
9
13
  def reset_password(account_id, key)
10
14
  @email_link = rodauth.reset_password_url(key: email_token(account_id, key))
15
+ <% if defined?(ActiveRecord::Railtie) -%>
11
16
  @account = Account.find(account_id)
17
+ <% else -%>
18
+ @account = Account.with_pk!(account_id)
19
+ <% end -%>
12
20
 
13
21
  mail to: @account.email, subject: rodauth.reset_password_email_subject
14
22
  end
@@ -17,27 +25,43 @@ class RodauthMailer < ApplicationMailer
17
25
  @old_login = old_login
18
26
  @new_login = new_login
19
27
  @email_link = rodauth.verify_login_change_url(key: email_token(account_id, key))
28
+ <% if defined?(ActiveRecord::Railtie) -%>
20
29
  @account = Account.find(account_id)
30
+ <% else -%>
31
+ @account = Account.with_pk!(account_id)
32
+ <% end -%>
21
33
 
22
34
  mail to: new_login, subject: rodauth.verify_login_change_email_subject
23
35
  end
24
36
 
25
37
  def password_changed(account_id)
38
+ <% if defined?(ActiveRecord::Railtie) -%>
26
39
  @account = Account.find(account_id)
40
+ <% else -%>
41
+ @account = Account.with_pk!(account_id)
42
+ <% end -%>
27
43
 
28
44
  mail to: @account.email, subject: rodauth.password_changed_email_subject
29
45
  end
30
46
 
31
47
  # def email_auth(account_id, key)
32
48
  # @email_link = rodauth.email_auth_url(key: email_token(account_id, key))
49
+ <% if defined?(ActiveRecord::Railtie) -%>
33
50
  # @account = Account.find(account_id)
51
+ <% else -%>
52
+ # @account = Account.with_pk!(account_id)
53
+ <% end -%>
34
54
 
35
55
  # mail to: @account.email, subject: rodauth.email_auth_email_subject
36
56
  # end
37
57
 
38
58
  # def unlock_account(account_id, key)
39
59
  # @email_link = rodauth.unlock_account_url(key: email_token(account_id, key))
60
+ <% if defined?(ActiveRecord::Railtie) -%>
40
61
  # @account = Account.find(account_id)
62
+ <% else -%>
63
+ # @account = Account.with_pk!(account_id)
64
+ <% end -%>
41
65
 
42
66
  # mail to: @account.email, subject: rodauth.unlock_account_email_subject
43
67
  # end
@@ -35,7 +35,7 @@ class RodauthMain < Rodauth::Rails::Auth
35
35
  account_status_column :status
36
36
 
37
37
  # Store password hash in a column instead of a separate table.
38
- # account_password_hash_column :password_digest
38
+ account_password_hash_column :password_hash
39
39
 
40
40
  # Set password when creating account instead of when verifying.
41
41
  verify_account_set_password? false
@@ -138,6 +138,9 @@ class RodauthMain < Rodauth::Rails::Auth
138
138
 
139
139
  # Redirect to login page after password reset.
140
140
  reset_password_redirect { login_path }
141
+
142
+ # Ensure requiring login follows login route changes.
143
+ require_login_redirect { login_path }
141
144
  <% end -%>
142
145
 
143
146
  # ==> Deadlines
@@ -1,4 +1,15 @@
1
+ <% if defined?(ActiveRecord::Railtie) -%>
1
2
  class Account < ApplicationRecord
2
3
  include Rodauth::Rails.model
4
+ <% if ActiveRecord.version >= Gem::Version.new("7.0") -%>
3
5
  enum :status, unverified: 1, verified: 2, closed: 3
6
+ <% else -%>
7
+ enum status: { unverified: 1, verified: 2, closed: 3 }
8
+ <% end -%>
4
9
  end
10
+ <% else -%>
11
+ class Account < Sequel::Model
12
+ plugin :enum
13
+ enum :status, unverified: 1, verified: 2, closed: 3
14
+ end
15
+ <% end -%>
@@ -1,5 +1,13 @@
1
+ <% if defined?(::ActiveRecord::Railtie) -%>
1
2
  class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version %>
2
3
  def change
3
4
  <%= migration_content -%>
4
5
  end
5
6
  end
7
+ <% else -%>
8
+ Sequel.migration do
9
+ change do
10
+ <%= migration_content -%>
11
+ end
12
+ end
13
+ <% end -%>
@@ -5,17 +5,21 @@ module Rodauth
5
5
  module Rails
6
6
  # The superclass for creating a Rodauth middleware.
7
7
  class App < Roda
8
- require "rodauth/rails/app/middleware"
9
- plugin Middleware
8
+ plugin :middleware, forward_response_headers: true do |middleware|
9
+ middleware.class_eval do
10
+ def self.inspect
11
+ "#{superclass}::Middleware"
12
+ end
13
+
14
+ def inspect
15
+ "#<#{self.class.inspect} request=#{request.inspect} response=#{response.inspect}>"
16
+ end
17
+ end
18
+ end
10
19
 
11
20
  plugin :hooks
12
21
  plugin :render, layout: false
13
22
 
14
- unless Rodauth::Rails.api_only?
15
- require "rodauth/rails/app/flash"
16
- plugin Flash
17
- end
18
-
19
23
  def self.configure(*args, **options, &block)
20
24
  auth_class = args.shift if args[0].is_a?(Class)
21
25
  name = args.shift if args[0].is_a?(Symbol)
@@ -35,6 +39,14 @@ module Rodauth
35
39
  end
36
40
  end
37
41
 
42
+ after do
43
+ rails_request.commit_flash
44
+ end unless ActionPack.version < Gem::Version.new("5.0")
45
+
46
+ def flash
47
+ rails_request.flash
48
+ end
49
+
38
50
  def rails_routes
39
51
  ::Rails.application.routes.url_helpers
40
52
  end
@@ -18,6 +18,15 @@ module Rodauth
18
18
 
19
19
  private
20
20
 
21
+ # Adds response status to instrumentation payload for logging,
22
+ # when calling a halting rodauth method inside a controller.
23
+ def append_info_to_payload(payload)
24
+ super
25
+ if request.env["rodauth.rails.status"]
26
+ payload[:status] = request.env.delete("rodauth.rails.status")
27
+ end
28
+ end
29
+
21
30
  def rodauth_response
22
31
  res = catch(:halt) { return yield }
23
32
 
@@ -0,0 +1,54 @@
1
+ module Rodauth
2
+ module Rails
3
+ module Feature
4
+ module Associations
5
+ def associations
6
+ list = []
7
+
8
+ features.each do |feature|
9
+ case feature
10
+ when :remember
11
+ list << { name: :remember_key, type: :one, table: remember_table, foreign_key: remember_id_column }
12
+ when :verify_account
13
+ list << { name: :verification_key, type: :one, table: verify_account_table, foreign_key: verify_account_id_column }
14
+ when :reset_password
15
+ list << { name: :password_reset_key, type: :one, table: reset_password_table, foreign_key: reset_password_id_column }
16
+ when :verify_login_change
17
+ list << { name: :login_change_key, type: :one, table: verify_login_change_table, foreign_key: verify_login_change_id_column }
18
+ when :lockout
19
+ list << { name: :lockout, type: :one, table: account_lockouts_table, foreign_key: account_lockouts_id_column }
20
+ list << { name: :login_failure, type: :one, table: account_login_failures_table, foreign_key: account_login_failures_id_column }
21
+ when :email_auth
22
+ list << { name: :email_auth_key, type: :one, table: email_auth_table, foreign_key: email_auth_id_column }
23
+ when :account_expiration
24
+ list << { name: :activity_time, type: :one, table: account_activity_table, foreign_key: account_activity_id_column }
25
+ when :active_sessions
26
+ list << { name: :active_session_keys, type: :many, table: active_sessions_table, foreign_key: active_sessions_account_id_column }
27
+ when :audit_logging
28
+ list << { name: :authentication_audit_logs, type: :many, table: audit_logging_table, foreign_key: audit_logging_account_id_column }
29
+ when :disallow_password_reuse
30
+ list << { name: :previous_password_hashes, type: :many, table: previous_password_hash_table, foreign_key: previous_password_account_id_column }
31
+ when :jwt_refresh
32
+ list << { name: :jwt_refresh_keys, type: :many, table: jwt_refresh_token_table, foreign_key: jwt_refresh_token_account_id_column }
33
+ when :password_expiration
34
+ list << { name: :password_change_time, type: :one, table: password_expiration_table, foreign_key: password_expiration_id_column }
35
+ when :single_session
36
+ list << { name: :session_key, type: :one, table: single_session_table, foreign_key: single_session_id_column }
37
+ when :otp
38
+ list << { name: :otp_key, type: :one, table: otp_keys_table, foreign_key: otp_keys_id_column }
39
+ when :sms_codes
40
+ list << { name: :sms_code, type: :one, table: sms_codes_table, foreign_key: sms_id_column }
41
+ when :recovery_codes
42
+ list << { name: :recovery_codes, type: :many, table: recovery_codes_table, foreign_key: recovery_codes_id_column }
43
+ when :webauthn
44
+ list << { name: :webauthn_user_id, type: :one, table: webauthn_user_ids_table, foreign_key: webauthn_user_ids_account_id_column }
45
+ list << { name: :webauthn_keys, type: :many, table: webauthn_keys_table, foreign_key: webauthn_keys_account_id_column }
46
+ end
47
+ end
48
+
49
+ list
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -54,6 +54,16 @@ module Rodauth
54
54
 
55
55
  private
56
56
 
57
+ unless ActionPack.version < Gem::Version.new("5.0")
58
+ # When calling a Rodauth method that redirects inside the Rails
59
+ # router, Roda's after hook that commits the flash would never get
60
+ # called, so we make sure to commit the flash beforehand.
61
+ def redirect(*)
62
+ rails_request.commit_flash
63
+ super
64
+ end
65
+ end
66
+
57
67
  def instantiate_rails_account
58
68
  if defined?(ActiveRecord::Base) && rails_account_model < ActiveRecord::Base
59
69
  rails_account_model.instantiate(account.stringify_keys)
@@ -10,6 +10,14 @@ module Rodauth
10
10
 
11
11
  def redirect(*)
12
12
  rails_instrument_redirection { super }
13
+ ensure
14
+ request.env["rodauth.rails.status"] = response.status
15
+ end
16
+
17
+ def return_response(*)
18
+ super
19
+ ensure
20
+ request.env["rodauth.rails.status"] = response.status
13
21
  end
14
22
 
15
23
  def rails_render(*)
@@ -11,6 +11,7 @@ module Rodauth
11
11
  require "rodauth/rails/feature/email"
12
12
  require "rodauth/rails/feature/instrumentation"
13
13
  require "rodauth/rails/feature/internal_request"
14
+ require "rodauth/rails/feature/associations"
14
15
 
15
16
  include Rodauth::Rails::Feature::Base
16
17
  include Rodauth::Rails::Feature::Callbacks
@@ -19,5 +20,6 @@ module Rodauth
19
20
  include Rodauth::Rails::Feature::Email
20
21
  include Rodauth::Rails::Feature::Instrumentation
21
22
  include Rodauth::Rails::Feature::InternalRequest
23
+ include Rodauth::Rails::Feature::Associations
22
24
  end
23
25
  end
@@ -9,6 +9,8 @@ module Rodauth
9
9
  end
10
10
 
11
11
  def call(env)
12
+ return @app.call(env) if asset_request?(env)
13
+
12
14
  app = Rodauth::Rails.app.new(@app)
13
15
 
14
16
  # allow the Rails app to call Rodauth methods that throw :halt
@@ -16,6 +18,13 @@ module Rodauth
16
18
  app.call(env)
17
19
  end
18
20
  end
21
+
22
+ # Check whether it's a request to an asset managed by Sprockets or Propshaft.
23
+ def asset_request?(env)
24
+ return false unless ::Rails.application.config.respond_to?(:assets)
25
+
26
+ env["PATH_INFO"] =~ %r(\A/{0,2}#{::Rails.application.config.assets.prefix})
27
+ end
19
28
  end
20
29
  end
21
30
  end
@@ -1,7 +1,7 @@
1
1
  module Rodauth
2
2
  module Rails
3
3
  class Model < Module
4
- require "rodauth/rails/model/associations"
4
+ ASSOCIATION_TYPES = { one: :has_one, many: :has_many }
5
5
 
6
6
  def initialize(auth_class, association_options: {})
7
7
  @auth_class = auth_class
@@ -46,8 +46,8 @@ module Rodauth
46
46
  def define_associations(model)
47
47
  define_password_hash_association(model) unless rodauth.account_password_hash_column
48
48
 
49
- feature_associations.each do |association|
50
- define_association(model, **association)
49
+ rodauth.associations.each do |association|
50
+ define_association(model, **association, type: ASSOCIATION_TYPES.fetch(association[:type]))
51
51
  end
52
52
  end
53
53
 
@@ -74,19 +74,19 @@ module Rodauth
74
74
 
75
75
  model.const_set(name.to_s.singularize.camelize, associated_model)
76
76
 
77
+ unless name == :authentication_audit_logs
78
+ dependent = type == :has_many ? :delete_all : :delete
79
+ end
80
+
77
81
  model.public_send type, name, scope,
78
82
  class_name: associated_model.name,
79
83
  foreign_key: foreign_key,
80
- dependent: type == :has_many ? :delete_all : :delete,
84
+ dependent: dependent,
81
85
  inverse_of: :account,
82
86
  **options,
83
87
  **association_options(name)
84
88
  end
85
89
 
86
- def feature_associations
87
- Rodauth::Rails::Model::Associations.call(rodauth)
88
- end
89
-
90
90
  def association_options(name)
91
91
  options = @association_options
92
92
  options = options.call(name) if options.respond_to?(:call)
@@ -1,5 +1,6 @@
1
1
  require "rodauth/rails/middleware"
2
2
  require "rodauth/rails/controller_methods"
3
+ require "rodauth/rails/test"
3
4
 
4
5
  require "rails"
5
6
 
@@ -21,6 +22,14 @@ module Rodauth
21
22
  initializer "rodauth.test" do
22
23
  # Rodauth uses RACK_ENV to set the default bcrypt hash cost
23
24
  ENV["RACK_ENV"] = "test" if ::Rails.env.test?
25
+
26
+ if ActionPack.version >= Gem::Version.new("5.0")
27
+ ActiveSupport.on_load(:action_controller_test_case) do
28
+ include Rodauth::Rails::Test::Controller
29
+ end
30
+ else
31
+ ActionController::TestCase.include Rodauth::Rails::Test::Controller
32
+ end
24
33
  end
25
34
 
26
35
  rake_tasks do
@@ -0,0 +1,41 @@
1
+ require "active_support/concern"
2
+
3
+ module Rodauth
4
+ module Rails
5
+ module Test
6
+ module Controller
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ setup :setup_rodauth
11
+ end
12
+
13
+ def process(*)
14
+ catch_rodauth { super }
15
+ end
16
+ ruby2_keywords(:process) if respond_to?(:ruby2_keywords, true)
17
+
18
+ private
19
+
20
+ def setup_rodauth
21
+ Rodauth::Rails.app.opts[:rodauths].each do |name, auth_class|
22
+ scope = auth_class.roda_class.new(request.env)
23
+ request.env[["rodauth", *name].join(".")] = auth_class.new(scope)
24
+ end
25
+ end
26
+
27
+ def catch_rodauth(&block)
28
+ result = catch(:halt, &block)
29
+
30
+ if result.is_a?(Array) # rodauth response
31
+ response.status = result[0]
32
+ response.headers.merge! result[1]
33
+ response.body = result[2]
34
+ end
35
+
36
+ response
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,7 @@
1
+ module Rodauth
2
+ module Rails
3
+ module Test
4
+ autoload :Controller, "rodauth/rails/test/controller"
5
+ end
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
1
  module Rodauth
2
2
  module Rails
3
- VERSION = "1.2.2"
3
+ VERSION = "1.4.0"
4
4
  end
5
5
  end
@@ -17,7 +17,8 @@ Gem::Specification.new do |spec|
17
17
  spec.require_paths = ["lib"]
18
18
 
19
19
  spec.add_dependency "railties", ">= 4.2", "< 8"
20
- spec.add_dependency "rodauth", "~> 2.19"
20
+ spec.add_dependency "rodauth", "~> 2.23"
21
+ spec.add_dependency "roda", "~> 3.55"
21
22
  spec.add_dependency "sequel-activerecord_connection", "~> 1.1"
22
23
  spec.add_dependency "tilt"
23
24
  spec.add_dependency "bcrypt"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rodauth-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janko Marohnić
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-22 00:00:00.000000000 Z
11
+ date: 2022-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -36,14 +36,28 @@ dependencies:
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '2.19'
39
+ version: '2.23'
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '2.19'
46
+ version: '2.23'
47
+ - !ruby/object:Gem::Dependency
48
+ name: roda
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.55'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.55'
47
61
  - !ruby/object:Gem::Dependency
48
62
  name: sequel-activerecord_connection
49
63
  requirement: !ruby/object:Gem::Requirement
@@ -153,26 +167,43 @@ files:
153
167
  - LICENSE.txt
154
168
  - README.md
155
169
  - lib/generators/rodauth/install_generator.rb
156
- - lib/generators/rodauth/migration/account_expiration.erb
157
- - lib/generators/rodauth/migration/active_sessions.erb
158
- - lib/generators/rodauth/migration/audit_logging.erb
159
- - lib/generators/rodauth/migration/base.erb
160
- - lib/generators/rodauth/migration/disallow_password_reuse.erb
161
- - lib/generators/rodauth/migration/email_auth.erb
162
- - lib/generators/rodauth/migration/jwt_refresh.erb
163
- - lib/generators/rodauth/migration/lockout.erb
164
- - lib/generators/rodauth/migration/otp.erb
165
- - lib/generators/rodauth/migration/password_expiration.erb
166
- - lib/generators/rodauth/migration/recovery_codes.erb
167
- - lib/generators/rodauth/migration/remember.erb
168
- - lib/generators/rodauth/migration/reset_password.erb
169
- - lib/generators/rodauth/migration/single_session.erb
170
- - lib/generators/rodauth/migration/sms_codes.erb
171
- - lib/generators/rodauth/migration/verify_account.erb
172
- - lib/generators/rodauth/migration/verify_login_change.erb
173
- - lib/generators/rodauth/migration/webauthn.erb
170
+ - lib/generators/rodauth/migration/active_record/account_expiration.erb
171
+ - lib/generators/rodauth/migration/active_record/active_sessions.erb
172
+ - lib/generators/rodauth/migration/active_record/audit_logging.erb
173
+ - lib/generators/rodauth/migration/active_record/base.erb
174
+ - lib/generators/rodauth/migration/active_record/disallow_password_reuse.erb
175
+ - lib/generators/rodauth/migration/active_record/email_auth.erb
176
+ - lib/generators/rodauth/migration/active_record/jwt_refresh.erb
177
+ - lib/generators/rodauth/migration/active_record/lockout.erb
178
+ - lib/generators/rodauth/migration/active_record/otp.erb
179
+ - lib/generators/rodauth/migration/active_record/password_expiration.erb
180
+ - lib/generators/rodauth/migration/active_record/recovery_codes.erb
181
+ - lib/generators/rodauth/migration/active_record/remember.erb
182
+ - lib/generators/rodauth/migration/active_record/reset_password.erb
183
+ - lib/generators/rodauth/migration/active_record/single_session.erb
184
+ - lib/generators/rodauth/migration/active_record/sms_codes.erb
185
+ - lib/generators/rodauth/migration/active_record/verify_account.erb
186
+ - lib/generators/rodauth/migration/active_record/verify_login_change.erb
187
+ - lib/generators/rodauth/migration/active_record/webauthn.erb
188
+ - lib/generators/rodauth/migration/sequel/account_expiration.erb
189
+ - lib/generators/rodauth/migration/sequel/active_sessions.erb
190
+ - lib/generators/rodauth/migration/sequel/audit_logging.erb
191
+ - lib/generators/rodauth/migration/sequel/base.erb
192
+ - lib/generators/rodauth/migration/sequel/disallow_password_reuse.erb
193
+ - lib/generators/rodauth/migration/sequel/email_auth.erb
194
+ - lib/generators/rodauth/migration/sequel/jwt_refresh.erb
195
+ - lib/generators/rodauth/migration/sequel/lockout.erb
196
+ - lib/generators/rodauth/migration/sequel/otp.erb
197
+ - lib/generators/rodauth/migration/sequel/password_expiration.erb
198
+ - lib/generators/rodauth/migration/sequel/recovery_codes.erb
199
+ - lib/generators/rodauth/migration/sequel/remember.erb
200
+ - lib/generators/rodauth/migration/sequel/reset_password.erb
201
+ - lib/generators/rodauth/migration/sequel/single_session.erb
202
+ - lib/generators/rodauth/migration/sequel/sms_codes.erb
203
+ - lib/generators/rodauth/migration/sequel/verify_account.erb
204
+ - lib/generators/rodauth/migration/sequel/verify_login_change.erb
205
+ - lib/generators/rodauth/migration/sequel/webauthn.erb
174
206
  - lib/generators/rodauth/migration_generator.rb
175
- - lib/generators/rodauth/migration_helpers.rb
176
207
  - lib/generators/rodauth/templates/INSTRUCTIONS
177
208
  - lib/generators/rodauth/templates/app/controllers/rodauth_controller.rb
178
209
  - lib/generators/rodauth/templates/app/mailers/rodauth_mailer.rb
@@ -230,11 +261,10 @@ files:
230
261
  - lib/rodauth-rails.rb
231
262
  - lib/rodauth/rails.rb
232
263
  - lib/rodauth/rails/app.rb
233
- - lib/rodauth/rails/app/flash.rb
234
- - lib/rodauth/rails/app/middleware.rb
235
264
  - lib/rodauth/rails/auth.rb
236
265
  - lib/rodauth/rails/controller_methods.rb
237
266
  - lib/rodauth/rails/feature.rb
267
+ - lib/rodauth/rails/feature/associations.rb
238
268
  - lib/rodauth/rails/feature/base.rb
239
269
  - lib/rodauth/rails/feature/callbacks.rb
240
270
  - lib/rodauth/rails/feature/csrf.rb
@@ -244,9 +274,10 @@ files:
244
274
  - lib/rodauth/rails/feature/render.rb
245
275
  - lib/rodauth/rails/middleware.rb
246
276
  - lib/rodauth/rails/model.rb
247
- - lib/rodauth/rails/model/associations.rb
248
277
  - lib/rodauth/rails/railtie.rb
249
278
  - lib/rodauth/rails/tasks.rake
279
+ - lib/rodauth/rails/test.rb
280
+ - lib/rodauth/rails/test/controller.rb
250
281
  - lib/rodauth/rails/version.rb
251
282
  - rodauth-rails.gemspec
252
283
  homepage: https://github.com/janko/rodauth-rails
@@ -1,77 +0,0 @@
1
- require "erb"
2
-
3
- module Rodauth
4
- module Rails
5
- module Generators
6
- module MigrationHelpers
7
- attr_reader :migration_class_name
8
-
9
- def migration_template(source, destination = File.basename(source))
10
- @migration_class_name = destination.chomp(".rb").camelize
11
-
12
- super source, File.join(db_migrate_path, destination)
13
- end
14
-
15
- private
16
-
17
- def migration_content
18
- migration_features
19
- .select { |feature| File.exist?("#{__dir__}/migration/#{feature}.erb") }
20
- .map { |feature| File.read("#{__dir__}/migration/#{feature}.erb") }
21
- .map { |content| erb_eval(content) }
22
- .join("\n")
23
- .indent(4)
24
- end
25
-
26
- def activerecord_adapter
27
- if ActiveRecord::Base.respond_to?(:connection_db_config)
28
- ActiveRecord::Base.connection_db_config.adapter
29
- else
30
- ActiveRecord::Base.connection_config.fetch(:adapter)
31
- end
32
- end
33
-
34
- def migration_version
35
- return unless ActiveRecord.version >= Gem::Version.new("5.0")
36
-
37
- "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
38
- end
39
-
40
- def db_migrate_path
41
- return "db/migrate" unless ActiveRecord.version >= Gem::Version.new("5.0")
42
-
43
- super
44
- end
45
-
46
- def primary_key_type(key = :id)
47
- generators = ::Rails.application.config.generators
48
- column_type = generators.options[:active_record][:primary_key_type]
49
-
50
- return unless column_type
51
-
52
- if key
53
- ", #{key}: :#{column_type}"
54
- else
55
- column_type
56
- end
57
- end
58
-
59
- def erb_eval(content)
60
- if ERB.version[/\d+\.\d+\.\d+/].to_s >= "2.2.0"
61
- ERB.new(content, trim_mode: "-").result(binding)
62
- else
63
- ERB.new(content, 0, "-").result(binding)
64
- end
65
- end
66
-
67
- def current_timestamp
68
- if ActiveRecord.version >= Gem::Version.new("5.0")
69
- %(-> { "CURRENT_TIMESTAMP" })
70
- else
71
- %(OpenStruct.new(quoted_id: "CURRENT_TIMESTAMP"))
72
- end
73
- end
74
- end
75
- end
76
- end
77
- end