rodauth-rails 0.2.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32eea791dff9c98b9e78d209ba375d08095f07ec1d0ba0e852e5af83602e2128
4
- data.tar.gz: f12a2c57d4f3dee31efd10c6ba8fd211af62d8636cda5118fcc949642ded1e29
3
+ metadata.gz: 230b201ad8b9f7c27a9ca00db1a27b4166b7ca0d202f32651fc15ff663bb860e
4
+ data.tar.gz: b6b7205916994f829f8eb74c76d8b6172c52339b157f464afd2cd9bfa96f3f25
5
5
  SHA512:
6
- metadata.gz: c722443088524cfedbffa17336de213dbcb004fe0866cb418f9bdc27a4a3a4b3af0ccd954a991bdc4d5e100278bd4738fc2a17b58a43555ddc725dcc49cca21b
7
- data.tar.gz: a97951dd6653c70af6397633b6628450779497a80be7b7dd294fbd09c8f91b4d82fe722190911d7324af7a3ff2c4b9ff274dd55adde8c8983fbc513e5c81d12d
6
+ metadata.gz: fc5645e124796a66c59c51b3b1ab2f1a3b9d7168b53f0703543e42187bb29470d09d3b1103e543dad66ba9a7f940bd469383d767c7acf8fc1d1c8ac7675848e9
7
+ data.tar.gz: 89cfd6289466b276240ffbb1111fef0b4274ae2479f5a1dbdaaa193333093508ddc692f47e7a8d57ffeafe70a7d25039371a7ebd88646d962f63f577039afc9c
@@ -1,3 +1,37 @@
1
+ # 0.4.2 (2020-11-08)
2
+
3
+ * Drop support for Ruby 2.2 (@janko)
4
+
5
+ * Bump `sequel-activerecord_connection` dependency to 1.1+ (@janko)
6
+
7
+ * Set default bcrypt hash cost to `1` in tests (@janko)
8
+
9
+ * Call `AR::Base.connection_db_config` on Rails 6.1+ in `rodauth:install` generator (@janko)
10
+
11
+ ## 0.4.1 (2020-11-02)
12
+
13
+ * Don't generate `RodauthController` in API-only mode (@janko)
14
+
15
+ * Pass `test: false` to Sequel in the `sequel.rb` initializer (@janko)
16
+
17
+ ## 0.4.0 (2020-11-02)
18
+
19
+ * Support Rails API-only mode (@janko)
20
+
21
+ * Make `rodauth:install` create `rodauth_app.rb` in `app/lib/` directory (@janko)
22
+
23
+ ## 0.3.1 (2020-10-25)
24
+
25
+ * Depend on sequel-activerecord_connection 1.0+ (@janko)
26
+
27
+ ## 0.3.0 (2020-09-18)
28
+
29
+ * Handle custom configured database migration paths in install generator (@janko)
30
+
31
+ * Allow specifying features as plain arguments in `rodauth:views` generator (@janko)
32
+
33
+ * Add some missing foreign key constraints in generated migration file (@janko)
34
+
1
35
  ## 0.2.1 (2020-07-26)
2
36
 
3
37
  * Fix incorrect JDBC connect syntax in `sequel.rb` template on JRuby (@janko)
data/README.md CHANGED
@@ -13,7 +13,12 @@ Provides Rails integration for the [Rodauth] authentication framework.
13
13
  Add the gem to your Gemfile:
14
14
 
15
15
  ```rb
16
- gem "rodauth-rails", "~> 0.2"
16
+ gem "rodauth-rails", "~> 0.4"
17
+
18
+ # gem "jwt", require: false # for JWT feature
19
+ # gem "rotp", require: false # for OTP feature
20
+ # gem "rqrcode", require: false # for OTP feature
21
+ # gem "webauthn", require: false # for WebAuthn feature
17
22
  ```
18
23
 
19
24
  Then run `bundle install`.
@@ -29,7 +34,7 @@ The generator will create the following files:
29
34
  * Rodauth migration at `db/migrate/*_create_rodauth.rb`
30
35
  * Rodauth initializer at `config/initializers/rodauth.rb`
31
36
  * Sequel initializer at `config/initializers/sequel.rb` for ActiveRecord integration
32
- * Rodauth app at `lib/rodauth_app.rb`
37
+ * Rodauth app at `app/lib/rodauth_app.rb`
33
38
  * Rodauth controller at `app/controllers/rodauth_controller.rb`
34
39
  * Account model at `app/models/account.rb`
35
40
 
@@ -82,20 +87,18 @@ ActiveRecord connection.
82
87
  # config/initializers/sequel.rb
83
88
  require "sequel/core"
84
89
 
85
- # initialize the appropriate Sequel adapter without creating a connection
86
- DB = Sequel.postgres(test: false)
87
- # have Sequel use ActiveRecord's connection for database interaction
88
- DB.extension :activerecord_connection
90
+ # initialize Sequel and have it reuse Active Record's database connection
91
+ DB = Sequel.postgres(extensions: :activerecord_connection)
89
92
  ```
90
93
 
91
94
  ### Rodauth app
92
95
 
93
- Your Rodauth app is created in the `lib/` directory, which comes with a default
94
- set of authentication features enabled, as well as extensive examples on ways
95
- you can configure authentication behaviour.
96
+ Your Rodauth app is created in the `app/lib/` directory, and comes with a
97
+ default set of authentication features enabled, as well as extensive examples
98
+ on ways you can configure authentication behaviour.
96
99
 
97
100
  ```rb
98
- # lib/rodauth_app.rb
101
+ # app/lib/rodauth_app.rb
99
102
  class RodauthApp < Rodauth::Rails::App
100
103
  configure do
101
104
  # authentication configuration
@@ -107,19 +110,6 @@ class RodauthApp < Rodauth::Rails::App
107
110
  end
108
111
  ```
109
112
 
110
- Note that Rails doesn't autoload files in the `lib/` directory by default, so
111
- make sure to add `lib/` to your `config.autoload_paths`:
112
-
113
- ```rb
114
- # config/application.rb
115
- module YourApp
116
- class Application < Rails::Application
117
- # ...
118
- config.autoload_paths += %W[#{config.root}/lib]
119
- end
120
- end
121
- ```
122
-
123
113
  ### Controller
124
114
 
125
115
  Your Rodauth app will by default use `RodauthController` for view rendering
@@ -162,17 +152,24 @@ These links are fully functional, feel free to visit them and interact with the
162
152
  pages. The templates that ship with Rodauth aim to provide a complete
163
153
  authentication experience, and the forms use [Bootstrap] markup.
164
154
 
165
- Let's also add the `#current_account` method for retrieving the account of the
166
- the authenticated session:
155
+ Let's also load the account record for authenticated requests and expose it via
156
+ `#current_account`:
167
157
 
168
158
  ```rb
169
159
  # app/controllers/application_controller.rb
170
160
  class ApplicationController < ActionController::Base
161
+ before_action :load_account, if: -> { rodauth.authenticated? }
162
+
171
163
  private
172
164
 
173
- def current_account
174
- @current_account ||= Account.find(rodauth.session_value)
165
+ def load_account
166
+ @current_account = Account.find(rodauth.session_value)
167
+ rescue ActiveRecord::RecordNotFound
168
+ rodauth.logout
169
+ rodauth.login_required
175
170
  end
171
+
172
+ attr_reader :current_account
176
173
  helper_method :current_account
177
174
  end
178
175
  ```
@@ -187,7 +184,7 @@ our app. We can do this in our Rodauth app's routing block, which helps keep
187
184
  the authentication logic encapsulated:
188
185
 
189
186
  ```rb
190
- # lib/rodauth_app.rb
187
+ # app/lib/rodauth_app.rb
191
188
  class RodauthApp < Rodauth::Rails::App
192
189
  # ...
193
190
  route do |r|
@@ -258,7 +255,7 @@ You can pass a list of Rodauth features to the generator to create views for
258
255
  these features (this will not remove any existing views):
259
256
 
260
257
  ```sh
261
- $ rails generate rodauth:views --features login create_account lockout otp
258
+ $ rails generate rodauth:views login create_account lockout otp
262
259
  ```
263
260
 
264
261
  Or you can generate views for all features:
@@ -307,7 +304,7 @@ Rodauth may send emails as part of the authentication flow. Most email settings
307
304
  can be customized:
308
305
 
309
306
  ```rb
310
- # lib/rodauth_app.rb
307
+ # app/lib/rodauth_app.rb
311
308
  class RodauthApp < Rodauth::Rails::App
312
309
  # ...
313
310
  configure do
@@ -352,7 +349,7 @@ your mailer. If you've enabled additional authentication features, make sure to
352
349
  override their `send_*_email` methods as well.
353
350
 
354
351
  ```rb
355
- # lib/rodauth_app.rb
352
+ # app/lib/rodauth_app.rb
356
353
  class RodauthApp < Rodauth::Rails::App
357
354
  # ...
358
355
  configure do
@@ -388,6 +385,37 @@ class RodauthApp < Rodauth::Rails::App
388
385
  end
389
386
  ```
390
387
 
388
+ ### JSON API
389
+
390
+ JSON API support in Rodauth is provided by the [JWT feature]. First you'll need
391
+ to add the [JWT gem] to your Gemfile:
392
+
393
+ ```rb
394
+ gem "jwt"
395
+ ```
396
+
397
+ The following configuration will enable the Rodauth endpoints to be accessed
398
+ via JSON requests (in addition to HTML requests):
399
+
400
+ ```rb
401
+ # app/lib/rodauth_app.rb
402
+ class RodauthApp < Rodauth::Rails::App
403
+ configure(json: true) do
404
+ # ...
405
+ enable :jwt
406
+ jwt_secret "...your secret key..."
407
+ # ...
408
+ end
409
+ end
410
+ ```
411
+
412
+ If you want the endpoints to be only accessible via JSON requests, or if your
413
+ Rails app is in API-only mode, instead of `json: true` pass `json: :only` to
414
+ the configure method.
415
+
416
+ Make sure to store the `jwt_secret` in a secure place, such as Rails
417
+ credentials or environment variables.
418
+
391
419
  ## How it works
392
420
 
393
421
  ### Middleware
@@ -493,20 +521,6 @@ Rodauth::Rails.configure do |config|
493
521
  end
494
522
  ```
495
523
 
496
- ## Working with JWT
497
-
498
- To use Rodauth's [JWT feature], you'll need to load Roda's JSON support:
499
-
500
- ```rb
501
- # lib/rodauth_app.rb
502
- class RodauthApp < Rodauth::Rails::App
503
- configure(json: true) do
504
- enable :jwt
505
- # your configuration
506
- end
507
- end
508
- ```
509
-
510
524
  ## Testing
511
525
 
512
526
  If you're writing system tests, it's generally better to go through the actual
@@ -629,6 +643,7 @@ conduct](https://github.com/janko/rodauth-rails/blob/master/CODE_OF_CONDUCT.md).
629
643
  [rendering views outside of controllers]: https://blog.bigbinary.com/2016/01/08/rendering-views-outside-of-controllers-in-rails-5.html
630
644
  [feature documentation]: http://rodauth.jeremyevans.net/documentation.html
631
645
  [JWT feature]: http://rodauth.jeremyevans.net/rdoc/files/doc/jwt_rdoc.html
646
+ [JWT gem]: https://github.com/jwt/ruby-jwt
632
647
  [Bootstrap]: https://getbootstrap.com/
633
648
  [Roda]: http://roda.jeremyevans.net/
634
649
  [HMAC]: http://rodauth.jeremyevans.net/rdoc/files/README_rdoc.html#label-HMAC
@@ -1,12 +1,13 @@
1
1
  require "rails/generators/base"
2
- require "rails/generators/migration"
3
- require "rails/generators/active_record"
2
+ require "rails/generators/active_record/migration"
3
+
4
+ require "securerandom"
4
5
 
5
6
  module Rodauth
6
7
  module Rails
7
8
  module Generators
8
9
  class InstallGenerator < ::Rails::Generators::Base
9
- include ::Rails::Generators::Migration
10
+ include ::ActiveRecord::Generators::Migration
10
11
 
11
12
  source_root "#{__dir__}/templates"
12
13
  namespace "rodauth:install"
@@ -14,7 +15,7 @@ module Rodauth
14
15
  def create_rodauth_migration
15
16
  return unless defined?(ActiveRecord::Base)
16
17
 
17
- migration_template "db/migrate/create_rodauth.rb", "db/migrate/create_rodauth.rb"
18
+ migration_template "db/migrate/create_rodauth.rb", File.join(db_migrate_path, "create_rodauth.rb")
18
19
  end
19
20
 
20
21
  def create_rodauth_initializer
@@ -30,10 +31,12 @@ module Rodauth
30
31
  end
31
32
 
32
33
  def create_rodauth_app
33
- template "lib/rodauth_app.rb"
34
+ template "app/lib/rodauth_app.rb"
34
35
  end
35
36
 
36
37
  def create_rodauth_controller
38
+ return if api_only?
39
+
37
40
  template "app/controllers/rodauth_controller.rb"
38
41
  end
39
42
 
@@ -45,37 +48,38 @@ module Rodauth
45
48
 
46
49
  private
47
50
 
48
- # required by #migration_template action
49
- def self.next_migration_number(dirname)
50
- ActiveRecord::Generators::Base.next_migration_number(dirname)
51
+ def db_migrate_path
52
+ return "db/migrate" unless ActiveRecord.version >= Gem::Version.new("5.0")
53
+
54
+ super
51
55
  end
52
56
 
53
57
  def migration_version
54
- if ActiveRecord.version >= Gem::Version.new("5.0.0")
58
+ if ActiveRecord.version >= Gem::Version.new("5.0")
55
59
  "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
56
60
  end
57
61
  end
58
62
 
59
- if RUBY_ENGINE == "jruby"
60
- def sequel_adapter
61
- case activerecord_adapter
62
- when "postgresql" then "postgresql"
63
- when "mysql2" then "mysql"
64
- when "sqlite3" then "sqlite"
65
- end
66
- end
67
- else
68
- def sequel_adapter
69
- case activerecord_adapter
70
- when "postgresql" then "postgres"
71
- when "mysql2" then "mysql2"
72
- when "sqlite3" then "sqlite"
73
- end
63
+ def sequel_adapter
64
+ case activerecord_adapter
65
+ when "postgresql" then "postgres#{"ql" if RUBY_ENGINE == "jruby"}"
66
+ when "mysql2" then "mysql#{"2" unless RUBY_ENGINE == "jruby"}"
67
+ when "sqlite3" then "sqlite"
74
68
  end
75
69
  end
76
70
 
77
71
  def activerecord_adapter
78
- ActiveRecord::Base.connection_config.fetch(:adapter)
72
+ if ActiveRecord::Base.respond_to?(:connection_db_config)
73
+ ActiveRecord::Base.connection_db_config.adapter
74
+ else
75
+ ActiveRecord::Base.connection_config.fetch(:adapter)
76
+ end
77
+ end
78
+
79
+ def api_only?
80
+ return false if ::Rails.gem_version < Gem::Version.new("5.0")
81
+
82
+ ::Rails.application.config.api_only
79
83
  end
80
84
  end
81
85
  end
@@ -1,8 +1,8 @@
1
1
  class RodauthApp < Rodauth::Rails::App
2
- configure do
2
+ configure<%= " json: :only" if api_only? %> do
3
3
  # List of authentication features that are loaded.
4
4
  enable :create_account, :verify_account, :verify_account_grace_period,
5
- :login, :remember, :logout,
5
+ :login, :logout, <%= api_only? ? ":jwt" : ":remember" %>,
6
6
  :reset_password, :change_password, :change_password_notify,
7
7
  :change_login, :verify_login_change,
8
8
  :close_account
@@ -11,9 +11,11 @@ class RodauthApp < Rodauth::Rails::App
11
11
  # http://rodauth.jeremyevans.net/documentation.html
12
12
 
13
13
  # ==> General
14
+ <% unless api_only? -%>
14
15
  # Specify the controller used for view rendering and CSRF verification.
15
16
  rails_controller { RodauthController }
16
17
 
18
+ <% end -%>
17
19
  # Store account status in a text column.
18
20
  account_status_column :status
19
21
  account_unverified_status_value "unverified"
@@ -38,6 +40,18 @@ class RodauthApp < Rodauth::Rails::App
38
40
 
39
41
  # Redirect to the app from login and registration pages if already logged in.
40
42
  # already_logged_in { redirect login_redirect }
43
+ <% if api_only? -%>
44
+
45
+ # ==> JWT
46
+ # Set JWT secret, which is used to cryptographically protect the token.
47
+ jwt_secret "<%= SecureRandom.hex(64) %>"
48
+
49
+ # Don't require login confirmation param.
50
+ require_login_confirmation? false
51
+
52
+ # Don't require password confirmation param.
53
+ require_password_confirmation? false
54
+ <% end -%>
41
55
 
42
56
  # ==> Emails
43
57
  # Uncomment the lines below once you've imported mailer views.
@@ -75,10 +89,12 @@ class RodauthApp < Rodauth::Rails::App
75
89
  # reset_password_email_body { "Click here to reset your password: #{reset_password_email_link}" }
76
90
 
77
91
  # ==> Flash
92
+ <% unless api_only? -%>
78
93
  # Match flash keys with ones already used in the Rails app.
79
94
  # flash_notice_key :success # default is :notice
80
95
  # flash_error_key :error # default is :alert
81
96
 
97
+ <% end -%>
82
98
  # Override default flash messages.
83
99
  # create_account_notice_flash "Your account has been created. Please verify your account by visiting the confirmation link sent to your email address."
84
100
  # require_login_error_flash "Login is required for accessing this page"
@@ -93,6 +109,7 @@ class RodauthApp < Rodauth::Rails::App
93
109
 
94
110
  # Change minimum number of password characters required when creating an account.
95
111
  # password_minimum_length 8
112
+ <% unless api_only? -%>
96
113
 
97
114
  # ==> Remember Feature
98
115
  # Remember all logged in users.
@@ -103,6 +120,7 @@ class RodauthApp < Rodauth::Rails::App
103
120
 
104
121
  # Extend user's remember period when remembered via a cookie
105
122
  extend_remember_deadline? true
123
+ <% end -%>
106
124
 
107
125
  # ==> Hooks
108
126
  # Validate custom fields in the create account form.
@@ -147,8 +165,10 @@ class RodauthApp < Rodauth::Rails::App
147
165
  # end
148
166
 
149
167
  route do |r|
168
+ <% unless api_only? -%>
150
169
  rodauth.load_memory # autologin remembered users
151
170
 
171
+ <% end -%>
152
172
  r.rodauth # route rodauth requests
153
173
 
154
174
  # ==> Authenticating Requests
@@ -1,10 +1,8 @@
1
1
  require "sequel/core"
2
2
 
3
- # initialize the appropriate Sequel adapter without creating a connection
4
- <%- if RUBY_ENGINE == "jruby" -%>
5
- DB = Sequel.connect("jdbc:<%= sequel_adapter %>://", test: false)
3
+ # initialize Sequel and have it reuse Active Record's database connection
4
+ <% if RUBY_ENGINE == "jruby" -%>
5
+ DB = Sequel.connect("jdbc:<%= sequel_adapter %>://", extensions: :activerecord_connection)
6
6
  <% else -%>
7
- DB = Sequel.<%= sequel_adapter %>(test: false)
7
+ DB = Sequel.<%= sequel_adapter %>(extensions: :activerecord_connection)
8
8
  <% end -%>
9
- # have Sequel use ActiveRecord's connection for database interaction
10
- DB.extension :activerecord_connection
@@ -44,16 +44,25 @@ class CreateRodauth < ActiveRecord::Migration<%= migration_version %>
44
44
  t.datetime :deadline, null: false
45
45
  end
46
46
 
47
+ <% unless api_only? -%>
47
48
  # Used by the remember me feature
48
49
  create_table :account_remember_keys do |t|
49
50
  t.foreign_key :accounts, column: :id
50
51
  t.string :key, null: false
51
52
  t.datetime :deadline, null: false
52
53
  end
54
+ <% else -%>
55
+ # # Used by the remember me feature
56
+ # create_table :account_remember_keys do |t|
57
+ # t.foreign_key :accounts, column: :id
58
+ # t.string :key, null: false
59
+ # t.datetime :deadline, null: false
60
+ # end
61
+ <% end -%>
53
62
 
54
63
  # # Used by the audit logging feature
55
64
  # create_table :account_authentication_audit_logs do |t|
56
- # t.references :account, null: false
65
+ # t.references :account, foreign_key: true, null: false
57
66
  # t.datetime :at, null: false, default: -> { "CURRENT_TIMESTAMP" }
58
67
  # t.text :message, null: false
59
68
  <% case activerecord_adapter -%>
@@ -70,7 +79,7 @@ class CreateRodauth < ActiveRecord::Migration<%= migration_version %>
70
79
 
71
80
  # # Used by the jwt refresh feature
72
81
  # create_table :account_jwt_refresh_keys do |t|
73
- # t.references :account, null: false
82
+ # t.references :account, foreign_key: true, null: false
74
83
  # t.string :key, null: false
75
84
  # t.datetime :deadline, null: false
76
85
  # t.index :account_id, name: "account_jwt_rk_account_id_idx"
@@ -78,7 +87,7 @@ class CreateRodauth < ActiveRecord::Migration<%= migration_version %>
78
87
 
79
88
  # # Used by the disallow_password_reuse feature
80
89
  # create_table :account_previous_password_hashes do |t|
81
- # t.references :account
90
+ # t.references :account, foreign_key: true
82
91
  # t.string :password_hash, null: false
83
92
  # end
84
93
 
@@ -124,7 +133,7 @@ class CreateRodauth < ActiveRecord::Migration<%= migration_version %>
124
133
 
125
134
  # # Used by the active sessions feature
126
135
  # create_table :account_active_session_keys, primary_key: [:account_id, :session_id] do |t|
127
- # t.references :account
136
+ # t.references :account, foreign_key: true
128
137
  # t.string :session_id
129
138
  # t.datetime :created_at, null: false, default: -> { "CURRENT_TIMESTAMP" }
130
139
  # t.datetime :last_use, null: false, default: -> { "CURRENT_TIMESTAMP" }
@@ -136,7 +145,7 @@ class CreateRodauth < ActiveRecord::Migration<%= migration_version %>
136
145
  # t.string :webauthn_id, null: false
137
146
  # end
138
147
  # create_table :account_webauthn_keys, primary_key: [:account_id, :webauthn_id] do |t|
139
- # t.references :account
148
+ # t.references :account, foreign_key: true
140
149
  # t.string :webauthn_id
141
150
  # t.string :public_key, null: false
142
151
  # t.integer :sign_count, null: false
@@ -7,6 +7,21 @@ module Rodauth
7
7
  source_root "#{__dir__}/templates"
8
8
  namespace "rodauth:views"
9
9
 
10
+ argument :features, optional: true, type: :array,
11
+ desc: "Rodauth features to generate views for (login, create_account, reset_password, verify_account etc.)",
12
+ default: %w[login logout create_account verify_account reset_password change_password change_login verify_login_change close_account]
13
+
14
+ class_option :features, type: :array,
15
+ desc: "[DEPRECATED] Rodauth features to generate views for (login, create_account, reset_password, verify_account etc.)"
16
+
17
+ class_option :all, aliases: "-a", type: :boolean,
18
+ desc: "Generates views for all Rodauth features",
19
+ default: false
20
+
21
+ class_option :directory, aliases: "-d", type: :string,
22
+ desc: "The directory under app/views/* into which to create views",
23
+ default: "rodauth"
24
+
10
25
  VIEWS = {
11
26
  login: %w[
12
27
  _field _field_error _login_field _login_display _password_field
@@ -83,20 +98,12 @@ module Rodauth
83
98
  webauthn: :two_factor_base,
84
99
  }
85
100
 
86
- class_option :features, type: :array,
87
- desc: "Rodauth features to generate views for (login, create_account, reset_password, verify_account etc.)",
88
- default: %w[login logout create_account verify_account reset_password change_password change_login verify_login_change close_account]
89
-
90
- class_option :all, aliases: "-a", type: :boolean,
91
- desc: "Generates views for all Rodauth features",
92
- default: false
93
-
94
- class_option :directory, aliases: "-d", type: :string,
95
- desc: "The directory under app/views/* into which to create views",
96
- default: "rodauth"
97
-
98
101
  def create_views
99
- features = options[:all] ? VIEWS.keys : options[:features].map(&:to_sym)
102
+ if options[:all]
103
+ features = VIEWS.keys
104
+ else
105
+ features = (options[:features] || self.features).map(&:to_sym)
106
+ end
100
107
 
101
108
  views = features.inject([]) do |list, feature|
102
109
  list |= VIEWS[feature] || []
@@ -1,4 +1,4 @@
1
- require "rodauth/version"
1
+ require "rodauth/rails/version"
2
2
  require "rodauth/rails/railtie"
3
3
 
4
4
  module Rodauth
@@ -4,15 +4,16 @@ module Rodauth
4
4
  module Rails
5
5
  # The superclass for creating a Rodauth middleware.
6
6
  class App < Roda
7
- require "rodauth/rails/app/flash"
8
-
9
7
  plugin :middleware
10
8
  plugin :hooks
11
9
  plugin :render, layout: false
12
10
 
13
- plugin Flash
14
-
15
11
  def self.configure(name = nil, **options, &block)
12
+ unless options[:json] == :only
13
+ require "rodauth/rails/app/flash"
14
+ plugin Flash
15
+ end
16
+
16
17
  plugin :rodauth, name: name, csrf: false, flash: false, **options do
17
18
  # load the Rails integration
18
19
  enable :rails
@@ -31,7 +31,7 @@ module Rodauth
31
31
  end
32
32
 
33
33
  def commit_flash
34
- if ActionPack.version >= Gem::Version.new("5.0.0")
34
+ if ActionPack.version >= Gem::Version.new("5.0")
35
35
  rails_request.commit_flash
36
36
  else
37
37
  # ActionPack 4.2 automatically commits flash
@@ -62,9 +62,13 @@ module Rodauth
62
62
 
63
63
  # Calls the Rails renderer, returning nil if a template is missing.
64
64
  def rails_render(*args)
65
- rails_controller_instance.render_to_string(*args)
66
- rescue ActionView::MissingTemplate
67
- nil
65
+ return if only_json?
66
+
67
+ begin
68
+ rails_controller_instance.render_to_string(*args)
69
+ rescue ActionView::MissingTemplate
70
+ nil
71
+ end
68
72
  end
69
73
 
70
74
  # Hidden tag with Rails CSRF token inserted into Rodauth templates.
@@ -92,7 +96,7 @@ module Rodauth
92
96
  request = ActionDispatch::Request.new(scope.env)
93
97
  instance = rails_controller.new
94
98
 
95
- if ActionPack.version >= Gem::Version.new("5.0.0")
99
+ if ActionPack.version >= Gem::Version.new("5.0")
96
100
  instance.set_request! request
97
101
  instance.set_response! rails_controller.make_response!(request)
98
102
  else
@@ -13,6 +13,11 @@ module Rodauth
13
13
  include Rodauth::Rails::ControllerMethods
14
14
  end
15
15
  end
16
+
17
+ initializer "rodauth.test" do
18
+ # Rodauth uses RACK_ENV to set the default bcrypt hash cost
19
+ ENV["RACK_ENV"] = "test" if ::Rails.env.test?
20
+ end
16
21
  end
17
22
  end
18
23
  end
@@ -0,0 +1,5 @@
1
+ module Rodauth
2
+ module Rails
3
+ VERSION = "0.4.2"
4
+ end
5
+ end
@@ -1,6 +1,8 @@
1
+ require_relative "lib/rodauth/rails/version"
2
+
1
3
  Gem::Specification.new do |spec|
2
4
  spec.name = "rodauth-rails"
3
- spec.version = "0.2.1"
5
+ spec.version = Rodauth::Rails::VERSION
4
6
  spec.authors = ["Janko Marohnić"]
5
7
  spec.email = ["janko.marohnic@gmail.com"]
6
8
 
@@ -9,14 +11,14 @@ Gem::Specification.new do |spec|
9
11
  spec.homepage = "https://github.com/janko/rodauth-rails"
10
12
  spec.license = "MIT"
11
13
 
12
- spec.required_ruby_version = ">= 2.2.0"
14
+ spec.required_ruby_version = ">= 2.3"
13
15
 
14
16
  spec.files = Dir["README.md", "LICENSE.txt", "CHANGELOG.md", "lib/**/*", "*.gemspec"]
15
17
  spec.require_paths = ["lib"]
16
18
 
17
19
  spec.add_dependency "railties", ">= 4.2", "< 7"
18
20
  spec.add_dependency "rodauth", "~> 2.1"
19
- spec.add_dependency "sequel-activerecord_connection", "~> 0.3"
21
+ spec.add_dependency "sequel-activerecord_connection", "~> 1.1"
20
22
  spec.add_dependency "tilt"
21
23
  spec.add_dependency "bcrypt"
22
24
  end
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: 0.2.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janko Marohnić
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-26 00:00:00.000000000 Z
11
+ date: 2020-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -50,14 +50,14 @@ dependencies:
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0.3'
53
+ version: '1.1'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '0.3'
60
+ version: '1.1'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: tilt
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -99,6 +99,7 @@ files:
99
99
  - lib/generators/rodauth/install_generator.rb
100
100
  - lib/generators/rodauth/mailer_generator.rb
101
101
  - lib/generators/rodauth/templates/app/controllers/rodauth_controller.rb
102
+ - lib/generators/rodauth/templates/app/lib/rodauth_app.rb
102
103
  - lib/generators/rodauth/templates/app/mailers/rodauth_mailer.rb
103
104
  - lib/generators/rodauth/templates/app/models/account.rb
104
105
  - lib/generators/rodauth/templates/app/views/rodauth/_email_auth_request_form.html.erb
@@ -164,7 +165,6 @@ files:
164
165
  - lib/generators/rodauth/templates/config/initializers/rodauth.rb
165
166
  - lib/generators/rodauth/templates/config/initializers/sequel.rb
166
167
  - lib/generators/rodauth/templates/db/migrate/create_rodauth.rb
167
- - lib/generators/rodauth/templates/lib/rodauth_app.rb
168
168
  - lib/generators/rodauth/views_generator.rb
169
169
  - lib/rodauth-rails.rb
170
170
  - lib/rodauth/features/rails.rb
@@ -175,6 +175,7 @@ files:
175
175
  - lib/rodauth/rails/feature.rb
176
176
  - lib/rodauth/rails/middleware.rb
177
177
  - lib/rodauth/rails/railtie.rb
178
+ - lib/rodauth/rails/version.rb
178
179
  - rodauth-rails.gemspec
179
180
  homepage: https://github.com/janko/rodauth-rails
180
181
  licenses:
@@ -188,14 +189,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
188
189
  requirements:
189
190
  - - ">="
190
191
  - !ruby/object:Gem::Version
191
- version: 2.2.0
192
+ version: '2.3'
192
193
  required_rubygems_version: !ruby/object:Gem::Requirement
193
194
  requirements:
194
195
  - - ">="
195
196
  - !ruby/object:Gem::Version
196
197
  version: '0'
197
198
  requirements: []
198
- rubygems_version: 3.1.1
199
+ rubygems_version: 3.1.4
199
200
  signing_key:
200
201
  specification_version: 4
201
202
  summary: Provides Rails integration for Rodauth.