rodauth-rails 0.8.1 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +44 -0
- data/README.md +446 -108
- data/lib/generators/rodauth/install_generator.rb +26 -15
- data/lib/generators/rodauth/migration/base.erb +2 -2
- data/lib/generators/rodauth/templates/app/lib/rodauth_app.rb +50 -49
- data/lib/generators/rodauth/templates/app/mailers/rodauth_mailer.rb +3 -3
- data/lib/generators/rodauth/templates/app/views/rodauth_mailer/unlock_account.text.erb +1 -1
- data/lib/rodauth/rails.rb +20 -0
- data/lib/rodauth/rails/app.rb +23 -31
- data/lib/rodauth/rails/app/flash.rb +7 -11
- data/lib/rodauth/rails/app/middleware.rb +20 -10
- data/lib/rodauth/rails/auth.rb +40 -0
- data/lib/rodauth/rails/controller_methods.rb +1 -5
- data/lib/rodauth/rails/feature.rb +43 -10
- data/lib/rodauth/rails/log_subscriber.rb +34 -0
- data/lib/rodauth/rails/railtie.rb +5 -0
- data/lib/rodauth/rails/version.rb +1 -1
- data/rodauth-rails.gemspec +1 -1
- metadata +10 -9
- data/lib/generators/rodauth/mailer_generator.rb +0 -37
@@ -0,0 +1,40 @@
|
|
1
|
+
require "rodauth"
|
2
|
+
require "rodauth/rails/feature"
|
3
|
+
|
4
|
+
module Rodauth
|
5
|
+
module Rails
|
6
|
+
# Base auth class that applies some default configuration and supports
|
7
|
+
# multi-level inheritance.
|
8
|
+
class Auth < Rodauth::Auth
|
9
|
+
class << self
|
10
|
+
attr_writer :features
|
11
|
+
attr_writer :routes
|
12
|
+
attr_accessor :configuration
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.inherited(auth_class)
|
16
|
+
super
|
17
|
+
auth_class.roda_class = Rodauth::Rails.app
|
18
|
+
auth_class.features = features.dup
|
19
|
+
auth_class.routes = routes.dup
|
20
|
+
auth_class.route_hash = route_hash.dup
|
21
|
+
auth_class.configuration = configuration.clone
|
22
|
+
auth_class.configuration.instance_variable_set(:@auth, auth_class)
|
23
|
+
end
|
24
|
+
|
25
|
+
# apply default configuration
|
26
|
+
configure do
|
27
|
+
enable :rails
|
28
|
+
|
29
|
+
# database functions are more complex to set up, so disable them by default
|
30
|
+
use_database_authentication_functions? false
|
31
|
+
|
32
|
+
# avoid having to set deadline values in column default values
|
33
|
+
set_deadline_values? true
|
34
|
+
|
35
|
+
# use HMACs for additional security
|
36
|
+
hmac_secret { Rodauth::Rails.secret_key_base }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -44,6 +44,11 @@ module Rodauth
|
|
44
44
|
true
|
45
45
|
end
|
46
46
|
|
47
|
+
# Reset Rails session to protect from session fixation attacks.
|
48
|
+
def clear_session
|
49
|
+
rails_controller_instance.reset_session
|
50
|
+
end
|
51
|
+
|
47
52
|
# Default the flash error key to Rails' default :alert.
|
48
53
|
def flash_error_key
|
49
54
|
:alert
|
@@ -58,24 +63,33 @@ module Rodauth
|
|
58
63
|
super.html_safe
|
59
64
|
end
|
60
65
|
|
66
|
+
delegate :rails_routes, :rails_request, to: :scope
|
67
|
+
|
61
68
|
private
|
62
69
|
|
63
70
|
# Runs controller callbacks and rescue handlers around Rodauth actions.
|
64
71
|
def _around_rodauth(&block)
|
65
72
|
result = nil
|
66
73
|
|
67
|
-
|
68
|
-
|
69
|
-
|
74
|
+
rails_instrument_request do
|
75
|
+
rails_controller_rescue do
|
76
|
+
rails_controller_callbacks do
|
77
|
+
result = catch(:halt) { super(&block) }
|
78
|
+
end
|
70
79
|
end
|
80
|
+
|
81
|
+
result = handle_rails_controller_response(result)
|
71
82
|
end
|
72
83
|
|
84
|
+
throw :halt, result if result
|
85
|
+
end
|
86
|
+
|
87
|
+
# Handles controller rendering a response or setting response headers.
|
88
|
+
def handle_rails_controller_response(result)
|
73
89
|
if rails_controller_instance.performed?
|
74
90
|
rails_controller_response
|
75
91
|
elsif result
|
76
92
|
result[1].merge!(rails_controller_instance.response.headers)
|
77
|
-
throw :halt, result
|
78
|
-
else
|
79
93
|
result
|
80
94
|
end
|
81
95
|
end
|
@@ -104,6 +118,20 @@ module Rodauth
|
|
104
118
|
end
|
105
119
|
end
|
106
120
|
|
121
|
+
def rails_instrument_request
|
122
|
+
ActiveSupport::Notifications.instrument("start_processing.rodauth", rodauth: self)
|
123
|
+
ActiveSupport::Notifications.instrument("process_request.rodauth", rodauth: self) do |payload|
|
124
|
+
begin
|
125
|
+
status, headers, body = yield
|
126
|
+
payload[:status] = status || 404
|
127
|
+
payload[:headers] = headers
|
128
|
+
payload[:body] = body
|
129
|
+
ensure
|
130
|
+
rails_controller_instance.send(:append_info_to_payload, payload)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
107
135
|
# Returns Roda response from controller response if set.
|
108
136
|
def rails_controller_response
|
109
137
|
controller_response = rails_controller_instance.response
|
@@ -112,7 +140,7 @@ module Rodauth
|
|
112
140
|
response.headers.merge! controller_response.headers
|
113
141
|
response.write controller_response.body
|
114
142
|
|
115
|
-
|
143
|
+
response.finish
|
116
144
|
end
|
117
145
|
|
118
146
|
# Create emails with ActionMailer which uses configured delivery method.
|
@@ -163,11 +191,8 @@ module Rodauth
|
|
163
191
|
|
164
192
|
# Instances of the configured controller with current request's env hash.
|
165
193
|
def _rails_controller_instance
|
166
|
-
controller
|
167
|
-
rails_request = ActionDispatch::Request.new(scope.env)
|
168
|
-
|
194
|
+
controller = rails_controller.new
|
169
195
|
prepare_rails_controller(controller, rails_request)
|
170
|
-
|
171
196
|
controller
|
172
197
|
end
|
173
198
|
|
@@ -187,6 +212,14 @@ module Rodauth
|
|
187
212
|
defined?(ActionController::API) && rails_controller <= ActionController::API
|
188
213
|
end
|
189
214
|
|
215
|
+
def rails_controller
|
216
|
+
if only_json? && Rodauth::Rails.api_only?
|
217
|
+
ActionController::API
|
218
|
+
else
|
219
|
+
ActionController::Base
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
190
223
|
# ActionMailer subclass for correct email delivering.
|
191
224
|
class Mailer < ActionMailer::Base
|
192
225
|
def create_email(**options)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Rodauth
|
2
|
+
module Rails
|
3
|
+
class LogSubscriber < ActiveSupport::LogSubscriber
|
4
|
+
def start_processing(event)
|
5
|
+
rodauth = event.payload[:rodauth]
|
6
|
+
app_class = rodauth.scope.class.superclass
|
7
|
+
format = rodauth.rails_request.format.ref
|
8
|
+
format = format.to_s.upcase if format.is_a?(Symbol)
|
9
|
+
format = "*/*" if format.nil?
|
10
|
+
|
11
|
+
info "Processing by #{app_class} as #{format}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def process_request(event)
|
15
|
+
status = event.payload[:status]
|
16
|
+
|
17
|
+
additions = ActionController::Base.log_process_action(event.payload)
|
18
|
+
if ::Rails.gem_version >= Gem::Version.new("6.0")
|
19
|
+
additions << "Allocations: #{event.allocations}"
|
20
|
+
end
|
21
|
+
|
22
|
+
message = "Completed #{status} #{Rack::Utils::HTTP_STATUS_CODES[status]} in #{event.duration.round}ms"
|
23
|
+
message << " (#{additions.join(" | ")})"
|
24
|
+
message << "\n\n" if defined?(::Rails.env) && ::Rails.env.development?
|
25
|
+
|
26
|
+
info message
|
27
|
+
end
|
28
|
+
|
29
|
+
def logger
|
30
|
+
::Rails.logger
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "rodauth/rails/middleware"
|
2
2
|
require "rodauth/rails/controller_methods"
|
3
|
+
require "rodauth/rails/log_subscriber"
|
3
4
|
|
4
5
|
require "rails"
|
5
6
|
|
@@ -16,6 +17,10 @@ module Rodauth
|
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
20
|
+
initializer "rodauth.log_subscriber" do
|
21
|
+
Rodauth::Rails::LogSubscriber.attach_to :rodauth
|
22
|
+
end
|
23
|
+
|
19
24
|
initializer "rodauth.test" do
|
20
25
|
# Rodauth uses RACK_ENV to set the default bcrypt hash cost
|
21
26
|
ENV["RACK_ENV"] = "test" if ::Rails.env.test?
|
data/rodauth-rails.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.require_paths = ["lib"]
|
18
18
|
|
19
19
|
spec.add_dependency "railties", ">= 4.2", "< 7"
|
20
|
-
spec.add_dependency "rodauth", "~> 2.
|
20
|
+
spec.add_dependency "rodauth", "~> 2.11"
|
21
21
|
spec.add_dependency "sequel-activerecord_connection", "~> 1.1"
|
22
22
|
spec.add_dependency "tilt"
|
23
23
|
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: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Janko Marohnić
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -36,14 +36,14 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: '2.
|
39
|
+
version: '2.11'
|
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.
|
46
|
+
version: '2.11'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: sequel-activerecord_connection
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -111,7 +111,6 @@ files:
|
|
111
111
|
- LICENSE.txt
|
112
112
|
- README.md
|
113
113
|
- lib/generators/rodauth/install_generator.rb
|
114
|
-
- lib/generators/rodauth/mailer_generator.rb
|
115
114
|
- lib/generators/rodauth/migration/account_expiration.erb
|
116
115
|
- lib/generators/rodauth/migration/active_sessions.erb
|
117
116
|
- lib/generators/rodauth/migration/audit_logging.erb
|
@@ -205,8 +204,10 @@ files:
|
|
205
204
|
- lib/rodauth/rails/app.rb
|
206
205
|
- lib/rodauth/rails/app/flash.rb
|
207
206
|
- lib/rodauth/rails/app/middleware.rb
|
207
|
+
- lib/rodauth/rails/auth.rb
|
208
208
|
- lib/rodauth/rails/controller_methods.rb
|
209
209
|
- lib/rodauth/rails/feature.rb
|
210
|
+
- lib/rodauth/rails/log_subscriber.rb
|
210
211
|
- lib/rodauth/rails/middleware.rb
|
211
212
|
- lib/rodauth/rails/railtie.rb
|
212
213
|
- lib/rodauth/rails/tasks.rake
|
@@ -216,7 +217,7 @@ homepage: https://github.com/janko/rodauth-rails
|
|
216
217
|
licenses:
|
217
218
|
- MIT
|
218
219
|
metadata: {}
|
219
|
-
post_install_message:
|
220
|
+
post_install_message:
|
220
221
|
rdoc_options: []
|
221
222
|
require_paths:
|
222
223
|
- lib
|
@@ -231,8 +232,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
231
232
|
- !ruby/object:Gem::Version
|
232
233
|
version: '0'
|
233
234
|
requirements: []
|
234
|
-
rubygems_version: 3.
|
235
|
-
signing_key:
|
235
|
+
rubygems_version: 3.2.3
|
236
|
+
signing_key:
|
236
237
|
specification_version: 4
|
237
238
|
summary: Provides Rails integration for Rodauth.
|
238
239
|
test_files: []
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require "rails/generators/base"
|
2
|
-
|
3
|
-
module Rodauth
|
4
|
-
module Rails
|
5
|
-
module Generators
|
6
|
-
class MailerGenerator < ::Rails::Generators::Base
|
7
|
-
source_root "#{__dir__}/templates"
|
8
|
-
namespace "rodauth:mailer"
|
9
|
-
|
10
|
-
VIEWS = %w[
|
11
|
-
email_auth
|
12
|
-
password_changed
|
13
|
-
reset_password
|
14
|
-
unlock_account
|
15
|
-
verify_account
|
16
|
-
verify_login_change
|
17
|
-
]
|
18
|
-
|
19
|
-
class_option :name,
|
20
|
-
desc: "The name for the mailer and the views directory",
|
21
|
-
default: "rodauth"
|
22
|
-
|
23
|
-
def copy_mailer
|
24
|
-
template "app/mailers/rodauth_mailer.rb",
|
25
|
-
"app/mailers/#{options[:name].underscore}_mailer.rb"
|
26
|
-
end
|
27
|
-
|
28
|
-
def copy_mailer_views
|
29
|
-
VIEWS.each do |view|
|
30
|
-
template "app/views/rodauth_mailer/#{view}.text.erb",
|
31
|
-
"app/views/#{options[:name].underscore}_mailer/#{view}.text.erb"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|