clearance 2.8.0 → 2.9.0

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: e5f7f15515653096a81f567271c72a5bc138dac396acb3d7727fb7eb95b89540
4
- data.tar.gz: 61b53d47ef673fe4f171aa32c6239c80fca531c4edaa239446bb0f3d8478df18
3
+ metadata.gz: ea787197f1c05708009b5318ed67814d74c11de000e314d87d0d2f9278722ea7
4
+ data.tar.gz: 9def5796663a629edecd2a9ad34aadb3b3430d4f00b4ba1017259bc929321911
5
5
  SHA512:
6
- metadata.gz: a695e60bfb14845d6bb5a1481766f2104f68fc92149fc0de3191af403bc7719803013cb8cb4a93fa74c1d334d1190e7206ba017502d40f109d0e96fb381fb3e0
7
- data.tar.gz: cc12e0563b4106d22e4d4c23a8d2f50621cc1f2a61f905ea82ea697369e1e916bc5e5d69b65900d8b146244fe9a8dbf50e54e752c9b0cbd9243c53c285011226
6
+ metadata.gz: 374df1a9550bb8379625497e010c79d264e328d9763341e6c5a1e1e01a42d3085650b5872d92df32a14d06c1d88f82ae9bcb4912ab717790800bce9237847c4a
7
+ data.tar.gz: 370f291a30b646bb3afcf9bc27fdccf13facec4c9663e44d4efbab0006430066891849c77fe788225a8145636507a8a03ac6360d3e195d7f7f304d8270a28054
@@ -16,20 +16,20 @@ jobs:
16
16
  fail-fast: false
17
17
  matrix:
18
18
  gemfile:
19
- - "6.1"
20
19
  - "7.0"
21
20
  - "7.1"
21
+ - "7.2"
22
22
  ruby:
23
- - "3.0.4"
24
- - "3.1.2"
25
- - "3.2.2"
23
+ - "3.1.6"
24
+ - "3.2.5"
25
+ - "3.3.5"
26
26
 
27
27
  env:
28
28
  BUNDLE_GEMFILE: gemfiles/rails_${{ matrix.gemfile }}.gemfile
29
29
  RAILS_ENV: test
30
30
 
31
31
  steps:
32
- - uses: actions/checkout@v2
32
+ - uses: actions/checkout@v4
33
33
 
34
34
  - name: "Install Ruby ${{ matrix.ruby }}"
35
35
  uses: ruby/setup-ruby@v1
@@ -39,8 +39,8 @@ jobs:
39
39
 
40
40
  - name: "Reset app database"
41
41
  run: |
42
- bundle exec rake dummy:db:drop
43
- bundle exec rake dummy:db:setup
42
+ bundle exec rake db:drop
43
+ bundle exec rake db:setup
44
44
 
45
45
  - name: "Run tests"
46
46
  run: bundle exec rake
data/.gitignore CHANGED
@@ -4,7 +4,10 @@
4
4
  *.swp
5
5
  *~
6
6
  .bundle
7
- db/*.sqlite3
7
+ .idea
8
+ .tool-versions
9
+ spec/dummy/db/*.sqlite3*
10
+ spec/dummy/log
8
11
  gemfiles/*.lock
9
12
  gemfiles/vendor/
10
13
  log/*.log
data/Appraisals CHANGED
@@ -1,12 +1,16 @@
1
- appraise "rails_6.1" do
2
- gem "railties", "~> 6.1.0"
3
- gem "net-smtp", require: false # not bundled in ruby 3.1
4
- end
5
-
6
1
  appraise "rails_7.0" do
7
2
  gem "railties", "~> 7.0.0"
3
+ # The following gems will not be bundled with Ruby 3.4
4
+ gem "base64", require: false
5
+ gem "bigdecimal", require: false
6
+ gem "drb", require: false
7
+ gem "mutex_m", require: false
8
8
  end
9
9
 
10
10
  appraise "rails_7.1" do
11
11
  gem "railties", "~> 7.1.0"
12
12
  end
13
+
14
+ appraise "rails_7.2" do
15
+ gem "railties", "~> 7.2.0"
16
+ end
data/CHANGELOG.md CHANGED
@@ -5,7 +5,14 @@ complete changelog, see the git history for each version via the version links.
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
- [Unreleased]: https://github.com/thoughtbot/clearance/compare/v2.8.0...main
8
+ [Unreleased]: https://github.com/thoughtbot/clearance/compare/v2.9.0...main
9
+
10
+ ## [2.9.0] - October 29, 2024
11
+ - Added Rails 7.2 and Ruby 3.3 to testing matrix
12
+ and overhauled dummy app (#1032) Hamed Asghari
13
+ - Droped support for Ruby 3.0 and Rails 6.1 (#1036)
14
+
15
+ [2.9.0]: https://github.com/thoughtbot/clearance/compare/v2.8.0...v2.9.0
9
16
 
10
17
  ## [2.8.0] - August 9, 2024
11
18
  - Feature: Added allow_password_resets config option (#1019) Jos O'shea
data/Gemfile CHANGED
@@ -15,4 +15,3 @@ gem 'rails-controller-testing'
15
15
  gem 'rspec-rails'
16
16
  gem 'shoulda-matchers'
17
17
  gem 'sqlite3', '~> 1.7'
18
- gem 'timecop'
data/Gemfile.lock CHANGED
@@ -13,49 +13,57 @@ PATH
13
13
  GEM
14
14
  remote: https://rubygems.org/
15
15
  specs:
16
- actionmailer (7.0.3)
17
- actionpack (= 7.0.3)
18
- actionview (= 7.0.3)
19
- activejob (= 7.0.3)
20
- activesupport (= 7.0.3)
21
- mail (~> 2.5, >= 2.5.4)
22
- net-imap
23
- net-pop
24
- net-smtp
25
- rails-dom-testing (~> 2.0)
26
- actionpack (7.0.3)
27
- actionview (= 7.0.3)
28
- activesupport (= 7.0.3)
29
- rack (~> 2.0, >= 2.2.0)
16
+ actionmailer (7.2.0)
17
+ actionpack (= 7.2.0)
18
+ actionview (= 7.2.0)
19
+ activejob (= 7.2.0)
20
+ activesupport (= 7.2.0)
21
+ mail (>= 2.8.0)
22
+ rails-dom-testing (~> 2.2)
23
+ actionpack (7.2.0)
24
+ actionview (= 7.2.0)
25
+ activesupport (= 7.2.0)
26
+ nokogiri (>= 1.8.5)
27
+ racc
28
+ rack (>= 2.2.4, < 3.2)
29
+ rack-session (>= 1.0.1)
30
30
  rack-test (>= 0.6.3)
31
- rails-dom-testing (~> 2.0)
32
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
33
- actionview (7.0.3)
34
- activesupport (= 7.0.3)
31
+ rails-dom-testing (~> 2.2)
32
+ rails-html-sanitizer (~> 1.6)
33
+ useragent (~> 0.16)
34
+ actionview (7.2.0)
35
+ activesupport (= 7.2.0)
35
36
  builder (~> 3.1)
36
- erubi (~> 1.4)
37
- rails-dom-testing (~> 2.0)
38
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
39
- activejob (7.0.3)
40
- activesupport (= 7.0.3)
37
+ erubi (~> 1.11)
38
+ rails-dom-testing (~> 2.2)
39
+ rails-html-sanitizer (~> 1.6)
40
+ activejob (7.2.0)
41
+ activesupport (= 7.2.0)
41
42
  globalid (>= 0.3.6)
42
- activemodel (7.0.3)
43
- activesupport (= 7.0.3)
44
- activerecord (7.0.3)
45
- activemodel (= 7.0.3)
46
- activesupport (= 7.0.3)
47
- activesupport (7.0.3)
48
- concurrent-ruby (~> 1.0, >= 1.0.2)
43
+ activemodel (7.2.0)
44
+ activesupport (= 7.2.0)
45
+ activerecord (7.2.0)
46
+ activemodel (= 7.2.0)
47
+ activesupport (= 7.2.0)
48
+ timeout (>= 0.4.0)
49
+ activesupport (7.2.0)
50
+ base64
51
+ bigdecimal
52
+ concurrent-ruby (~> 1.0, >= 1.3.1)
53
+ connection_pool (>= 2.2.5)
54
+ drb
49
55
  i18n (>= 1.6, < 2)
56
+ logger (>= 1.4.2)
50
57
  minitest (>= 5.1)
51
- tzinfo (~> 2.0)
52
- addressable (2.8.0)
53
- public_suffix (>= 2.0.2, < 5.0)
54
- ammeter (1.1.5)
58
+ securerandom (>= 0.3)
59
+ tzinfo (~> 2.0, >= 2.0.5)
60
+ addressable (2.8.7)
61
+ public_suffix (>= 2.0.2, < 7.0)
62
+ ammeter (1.1.7)
55
63
  activesupport (>= 3.0)
56
64
  railties (>= 3.0)
57
65
  rspec-rails (>= 2.2)
58
- appraisal (2.4.1)
66
+ appraisal (2.5.0)
59
67
  bundler
60
68
  rake
61
69
  thor (>= 0.14.0)
@@ -63,6 +71,7 @@ GEM
63
71
  ffi (~> 1.15)
64
72
  ffi-compiler (~> 1.0)
65
73
  ast (2.4.2)
74
+ base64 (0.2.0)
66
75
  bcrypt (3.1.20)
67
76
  better_html (2.1.1)
68
77
  actionview (>= 6.0)
@@ -71,41 +80,44 @@ GEM
71
80
  erubi (~> 1.4)
72
81
  parser (>= 2.4)
73
82
  smart_properties
74
- builder (3.2.4)
75
- capybara (3.37.1)
83
+ bigdecimal (3.1.8)
84
+ builder (3.3.0)
85
+ capybara (3.40.0)
76
86
  addressable
77
87
  matrix
78
88
  mini_mime (>= 0.1.3)
79
- nokogiri (~> 1.8)
89
+ nokogiri (~> 1.11)
80
90
  rack (>= 1.6.0)
81
91
  rack-test (>= 0.6.3)
82
92
  regexp_parser (>= 1.5, < 3.0)
83
93
  xpath (~> 3.2)
84
94
  coderay (1.1.3)
85
- concurrent-ruby (1.2.3)
95
+ concurrent-ruby (1.3.4)
96
+ connection_pool (2.4.1)
86
97
  crass (1.0.6)
87
- database_cleaner (2.0.1)
88
- database_cleaner-active_record (~> 2.0.0)
89
- database_cleaner-active_record (2.0.1)
98
+ database_cleaner (2.0.2)
99
+ database_cleaner-active_record (>= 2, < 3)
100
+ database_cleaner-active_record (2.2.0)
90
101
  activerecord (>= 5.a)
91
102
  database_cleaner-core (~> 2.0.0)
92
103
  database_cleaner-core (2.0.1)
93
104
  date (3.3.4)
94
- diff-lcs (1.5.0)
105
+ diff-lcs (1.5.1)
106
+ drb (2.2.1)
95
107
  email_validator (2.2.4)
96
108
  activemodel
97
- erb_lint (0.5.0)
109
+ erb_lint (0.6.0)
98
110
  activesupport
99
111
  better_html (>= 2.0.1)
100
112
  parser (>= 2.7.1.4)
101
113
  rainbow
102
- rubocop
114
+ rubocop (>= 1)
103
115
  smart_properties
104
- erubi (1.12.0)
105
- factory_bot (6.2.1)
116
+ erubi (1.13.0)
117
+ factory_bot (6.4.6)
106
118
  activesupport (>= 5.0.0)
107
- factory_bot_rails (6.2.0)
108
- factory_bot (~> 6.2.0)
119
+ factory_bot_rails (6.4.3)
120
+ factory_bot (~> 6.4)
109
121
  railties (>= 5.0.0)
110
122
  ffi (1.17.0)
111
123
  ffi-compiler (1.3.2)
@@ -115,8 +127,13 @@ GEM
115
127
  activesupport (>= 6.1)
116
128
  i18n (1.14.5)
117
129
  concurrent-ruby (~> 1.0)
130
+ io-console (0.7.2)
131
+ irb (1.14.0)
132
+ rdoc (>= 4.0.0)
133
+ reline (>= 0.4.2)
118
134
  json (2.7.2)
119
135
  language_server-protocol (3.17.0.3)
136
+ logger (1.6.0)
120
137
  loofah (2.22.0)
121
138
  crass (~> 1.0.2)
122
139
  nokogiri (>= 1.12.0)
@@ -126,10 +143,10 @@ GEM
126
143
  net-pop
127
144
  net-smtp
128
145
  matrix (0.4.2)
129
- method_source (1.0.0)
130
- mini_mime (1.1.2)
131
- mini_portile2 (2.8.6)
132
- minitest (5.22.3)
146
+ method_source (1.1.0)
147
+ mini_mime (1.1.5)
148
+ mini_portile2 (2.8.7)
149
+ minitest (5.25.1)
133
150
  net-imap (0.4.14)
134
151
  date
135
152
  net-protocol
@@ -139,21 +156,28 @@ GEM
139
156
  timeout
140
157
  net-smtp (0.5.0)
141
158
  net-protocol
142
- nokogiri (1.16.4)
159
+ nokogiri (1.16.7)
143
160
  mini_portile2 (~> 2.8.2)
144
161
  racc (~> 1.4)
145
- parallel (1.24.0)
146
- parser (3.3.1.0)
162
+ parallel (1.26.3)
163
+ parser (3.3.4.2)
147
164
  ast (~> 2.4.1)
148
165
  racc
149
- pry (0.14.1)
166
+ pry (0.14.2)
150
167
  coderay (~> 1.1)
151
168
  method_source (~> 1.0)
152
- public_suffix (4.0.7)
153
- racc (1.7.3)
154
- rack (2.2.3.1)
155
- rack-test (1.1.0)
156
- rack (>= 1.0, < 3)
169
+ psych (5.1.2)
170
+ stringio
171
+ public_suffix (6.0.1)
172
+ racc (1.8.1)
173
+ rack (3.1.7)
174
+ rack-session (2.0.0)
175
+ rack (>= 3.0.0)
176
+ rack-test (2.1.0)
177
+ rack (>= 1.3)
178
+ rackup (2.1.0)
179
+ rack (>= 3)
180
+ webrick (~> 1.8)
157
181
  rails-controller-testing (1.0.5)
158
182
  actionpack (>= 5.0.1.rc1)
159
183
  actionview (>= 5.0.1.rc1)
@@ -165,62 +189,72 @@ GEM
165
189
  rails-html-sanitizer (1.6.0)
166
190
  loofah (~> 2.21)
167
191
  nokogiri (~> 1.14)
168
- railties (7.0.3)
169
- actionpack (= 7.0.3)
170
- activesupport (= 7.0.3)
171
- method_source
192
+ railties (7.2.0)
193
+ actionpack (= 7.2.0)
194
+ activesupport (= 7.2.0)
195
+ irb (~> 1.13)
196
+ rackup (>= 1.0.0)
172
197
  rake (>= 12.2)
173
- thor (~> 1.0)
174
- zeitwerk (~> 2.5)
198
+ thor (~> 1.0, >= 1.2.2)
199
+ zeitwerk (~> 2.6)
175
200
  rainbow (3.1.1)
176
- rake (13.1.0)
177
- regexp_parser (2.9.0)
178
- rexml (3.2.6)
179
- rspec-core (3.11.0)
180
- rspec-support (~> 3.11.0)
181
- rspec-expectations (3.11.0)
201
+ rake (13.2.1)
202
+ rdoc (6.7.0)
203
+ psych (>= 4.0.0)
204
+ regexp_parser (2.9.2)
205
+ reline (0.5.9)
206
+ io-console (~> 0.5)
207
+ rexml (3.3.5)
208
+ strscan
209
+ rspec-core (3.13.0)
210
+ rspec-support (~> 3.13.0)
211
+ rspec-expectations (3.13.1)
182
212
  diff-lcs (>= 1.2.0, < 2.0)
183
- rspec-support (~> 3.11.0)
184
- rspec-mocks (3.11.1)
213
+ rspec-support (~> 3.13.0)
214
+ rspec-mocks (3.13.1)
185
215
  diff-lcs (>= 1.2.0, < 2.0)
186
- rspec-support (~> 3.11.0)
187
- rspec-rails (5.1.2)
188
- actionpack (>= 5.2)
189
- activesupport (>= 5.2)
190
- railties (>= 5.2)
191
- rspec-core (~> 3.10)
192
- rspec-expectations (~> 3.10)
193
- rspec-mocks (~> 3.10)
194
- rspec-support (~> 3.10)
195
- rspec-support (3.11.0)
196
- rubocop (1.63.4)
216
+ rspec-support (~> 3.13.0)
217
+ rspec-rails (6.1.4)
218
+ actionpack (>= 6.1)
219
+ activesupport (>= 6.1)
220
+ railties (>= 6.1)
221
+ rspec-core (~> 3.13)
222
+ rspec-expectations (~> 3.13)
223
+ rspec-mocks (~> 3.13)
224
+ rspec-support (~> 3.13)
225
+ rspec-support (3.13.1)
226
+ rubocop (1.65.1)
197
227
  json (~> 2.3)
198
228
  language_server-protocol (>= 3.17.0)
199
229
  parallel (~> 1.10)
200
230
  parser (>= 3.3.0.2)
201
231
  rainbow (>= 2.2.2, < 4.0)
202
- regexp_parser (>= 1.8, < 3.0)
232
+ regexp_parser (>= 2.4, < 3.0)
203
233
  rexml (>= 3.2.5, < 4.0)
204
234
  rubocop-ast (>= 1.31.1, < 2.0)
205
235
  ruby-progressbar (~> 1.7)
206
236
  unicode-display_width (>= 2.4.0, < 3.0)
207
- rubocop-ast (1.31.3)
237
+ rubocop-ast (1.32.1)
208
238
  parser (>= 3.3.1.0)
209
239
  ruby-progressbar (1.13.0)
210
- shoulda-matchers (5.1.0)
240
+ securerandom (0.3.1)
241
+ shoulda-matchers (6.4.0)
211
242
  activesupport (>= 5.2.0)
212
243
  smart_properties (1.17.0)
213
244
  sqlite3 (1.7.3)
214
245
  mini_portile2 (~> 2.8.0)
215
- thor (1.2.1)
216
- timecop (0.9.5)
246
+ stringio (3.1.1)
247
+ strscan (3.1.0)
248
+ thor (1.3.1)
217
249
  timeout (0.4.1)
218
250
  tzinfo (2.0.6)
219
251
  concurrent-ruby (~> 1.0)
220
252
  unicode-display_width (2.5.0)
253
+ useragent (0.16.10)
254
+ webrick (1.8.1)
221
255
  xpath (3.2.0)
222
256
  nokogiri (~> 1.8)
223
- zeitwerk (2.5.4)
257
+ zeitwerk (2.6.17)
224
258
 
225
259
  PLATFORMS
226
260
  ruby
@@ -240,7 +274,6 @@ DEPENDENCIES
240
274
  rspec-rails
241
275
  shoulda-matchers
242
276
  sqlite3 (~> 1.7)
243
- timecop
244
277
 
245
278
  BUNDLED WITH
246
279
  2.3.15
data/README.md CHANGED
@@ -18,7 +18,7 @@ monitored by contributors.
18
18
 
19
19
  ## Getting Started
20
20
 
21
- Clearance is a Rails engine tested against Rails `>= 6.1` and Ruby `>= 3.0.0`.
21
+ Clearance is a Rails engine tested against Rails `>= 7.0` and Ruby `>= 3.1.6`.
22
22
 
23
23
  You can add it to your Gemfile with:
24
24
 
data/Rakefile CHANGED
@@ -1,15 +1,12 @@
1
- require "rubygems"
2
1
  require "bundler/setup"
2
+
3
+ APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
4
+ load "rails/tasks/engine.rake"
5
+
3
6
  require "bundler/gem_tasks"
4
7
 
5
- require "rake"
6
8
  require "rspec/core/rake_task"
7
9
 
8
- namespace :dummy do
9
- require_relative "spec/dummy/application"
10
- Dummy::Application.load_tasks
11
- end
12
-
13
10
  desc "Run specs other than spec/acceptance"
14
11
  RSpec::Core::RakeTask.new("spec") do |task|
15
12
  task.exclude_pattern = "spec/acceptance/**/*_spec.rb"
data/bin/setup CHANGED
@@ -12,5 +12,5 @@ if [ -z "$CI" ]; then
12
12
  fi
13
13
 
14
14
  # Set up database for the application that Clearance tests against
15
- RAILS_ENV=test bundle exec rake dummy:db:drop
16
- RAILS_ENV=test bundle exec rake dummy:db:setup
15
+ RAILS_ENV=test bundle exec rake db:drop
16
+ RAILS_ENV=test bundle exec rake db:setup
data/clearance.gemspec CHANGED
@@ -1,14 +1,13 @@
1
- $LOAD_PATH.push File.expand_path('../lib', __FILE__)
2
- require 'clearance/version'
1
+ require_relative 'lib/clearance/version'
3
2
 
4
3
  Gem::Specification.new do |s|
5
- s.add_dependency 'bcrypt', '>= 3.1.1'
4
+ s.add_dependency 'bcrypt', '~> 3.1', '>= 3.1.1'
6
5
  s.add_dependency 'argon2', '~> 2.0', '>= 2.0.2'
7
6
  s.add_dependency 'email_validator', '~> 2.0'
8
- s.add_dependency 'railties', '>= 5.0'
9
- s.add_dependency 'activemodel', '>= 5.0'
10
- s.add_dependency 'activerecord', '>= 5.0'
11
- s.add_dependency 'actionmailer', '>= 5.0'
7
+ s.add_dependency 'railties', '~> 5.0'
8
+ s.add_dependency 'activemodel', '~> 5.0'
9
+ s.add_dependency 'activerecord', '~> 5.0'
10
+ s.add_dependency 'actionmailer', '~> 5.0'
12
11
  s.authors = [
13
12
  'Dan Croak',
14
13
  'Eugene Bolshakov',
@@ -46,7 +45,7 @@ Gem::Specification.new do |s|
46
45
  s.name = %q{clearance}
47
46
  s.rdoc_options = ['--charset=UTF-8']
48
47
  s.require_paths = ['lib']
49
- s.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
48
+ s.required_ruby_version = Gem::Requirement.new('>= 3.1.6')
50
49
  s.summary = 'Rails authentication & authorization with email & password.'
51
50
  s.test_files = `git ls-files -- {spec}/*`.split("\n")
52
51
  s.version = Clearance::VERSION
@@ -15,7 +15,10 @@ gem "rails-controller-testing"
15
15
  gem "rspec-rails"
16
16
  gem "shoulda-matchers"
17
17
  gem "sqlite3", "~> 1.7"
18
- gem "timecop"
19
18
  gem "railties", "~> 7.0.0"
19
+ gem "base64", require: false
20
+ gem "bigdecimal", require: false
21
+ gem "drb", require: false
22
+ gem "mutex_m", require: false
20
23
 
21
24
  gemspec path: "../"
@@ -15,7 +15,6 @@ gem "rails-controller-testing"
15
15
  gem "rspec-rails"
16
16
  gem "shoulda-matchers"
17
17
  gem "sqlite3", "~> 1.7"
18
- gem "timecop"
19
18
  gem "railties", "~> 7.1.0"
20
19
 
21
20
  gemspec path: "../"
@@ -15,8 +15,6 @@ gem "rails-controller-testing"
15
15
  gem "rspec-rails"
16
16
  gem "shoulda-matchers"
17
17
  gem "sqlite3", "~> 1.7"
18
- gem "timecop"
19
- gem "railties", "~> 6.1.0"
20
- gem "net-smtp", require: false
18
+ gem "railties", "~> 7.2.0"
21
19
 
22
20
  gemspec path: "../"
@@ -48,11 +48,13 @@ module Clearance
48
48
 
49
49
  # @api private
50
50
  def sign_in_through_the_back_door(env)
51
- params = Rack::Utils.parse_query(env["QUERY_STRING"])
51
+ params = Rack::Utils.parse_query(env[Rack::QUERY_STRING])
52
52
  user_param = params.delete("as")
53
53
 
54
54
  if user_param.present?
55
- env["QUERY_STRING"] = Rack::Utils.build_query(params)
55
+ query_string = Rack::Utils.build_query(params)
56
+ env[Rack::QUERY_STRING] = query_string
57
+ env[Rack::RACK_REQUEST_QUERY_STRING] = query_string
56
58
  user = find_user(user_param)
57
59
  env[:clearance].sign_in(user)
58
60
  end
@@ -1,3 +1,3 @@
1
1
  module Clearance
2
- VERSION = "2.8.0".freeze
2
+ VERSION = "2.9.0".freeze
3
3
  end
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Clearance::Session do
4
- before { Timecop.freeze }
5
- after { Timecop.return }
4
+ before { freeze_time }
5
+ after { unfreeze_time }
6
6
 
7
7
  let(:session) { Clearance::Session.new(env_without_remember_token) }
8
8
  let(:user) { create(:user) }
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require_relative "config/application"
5
+
6
+ Rails.application.load_tasks
File without changes
@@ -0,0 +1,13 @@
1
+ require_relative "boot"
2
+
3
+ require "rails/all"
4
+
5
+ # Require the gems listed in Gemfile, including any gems
6
+ # you've limited to :test, :development, or :production.
7
+ Bundler.require(*Rails.groups)
8
+
9
+ module Dummy
10
+ class Application < Rails::Application
11
+ config.load_defaults Rails::VERSION::STRING.to_f
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ # Set up gems listed in the Gemfile.
2
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../Gemfile", __dir__)
3
+
4
+ require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"])
5
+ $LOAD_PATH.unshift File.expand_path("../../../lib", __dir__)
@@ -0,0 +1,5 @@
1
+ # Load the Rails application.
2
+ require_relative "application"
3
+
4
+ # Initialize the Rails application.
5
+ Rails.application.initialize!
@@ -0,0 +1,31 @@
1
+ require "active_support/core_ext/integer/time"
2
+
3
+ Rails.application.configure do
4
+ config.enable_reloading = false
5
+
6
+ config.eager_load = ENV["CI"].present?
7
+
8
+ config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{1.hour.to_i}" }
9
+
10
+ # Show full error reports and disable caching.
11
+ config.consider_all_requests_local = true
12
+ config.action_controller.perform_caching = false
13
+ config.cache_store = :null_store
14
+
15
+ config.action_dispatch.show_exceptions = :rescuable
16
+
17
+ config.action_controller.allow_forgery_protection = false
18
+
19
+ config.action_mailer.perform_caching = false
20
+ config.action_mailer.delivery_method = :test
21
+
22
+ config.action_mailer.default_url_options = { host: "www.example.com" }
23
+
24
+ config.active_support.deprecation = :stderr
25
+ config.active_support.disallowed_deprecation = :raise
26
+ config.active_support.disallowed_deprecation_warnings = []
27
+
28
+ config.factory_bot.definition_file_paths = [File.expand_path('../../../factories', __dir__)]
29
+
30
+ config.middleware.use Clearance::BackDoor
31
+ end
@@ -0,0 +1,6 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require_relative "config/environment"
4
+
5
+ run Rails.application
6
+ Rails.application.load_server
@@ -1,4 +1,4 @@
1
- class CreateClearanceUsers < ActiveRecord::Migration
1
+ class CreateClearanceUsers < ActiveRecord::Migration[Rails::VERSION::STRING.to_f]
2
2
  def self.up
3
3
  create_table :users do |t|
4
4
  t.timestamps null: false
@@ -9,7 +9,8 @@ class CreateClearanceUsers < ActiveRecord::Migration
9
9
  end
10
10
 
11
11
  add_index :users, :email
12
- add_index :users, :remember_token
12
+ add_index :users, :confirmation_token, unique: true
13
+ add_index :users, :remember_token, unique: true
13
14
  end
14
15
 
15
16
  def self.down
@@ -0,0 +1,25 @@
1
+ # This file is auto-generated from the current state of the database. Instead
2
+ # of editing this file, please use the migrations feature of Active Record to
3
+ # incrementally modify your database, and then regenerate this schema definition.
4
+ #
5
+ # This file is the source Rails uses to define your schema when running `bin/rails
6
+ # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
7
+ # be faster and is potentially less error prone than running all of your
8
+ # migrations from scratch. Old migrations may fail to apply correctly if those
9
+ # migrations use external dependencies or application code.
10
+ #
11
+ # It's strongly recommended that you check this file into your version control system.
12
+
13
+ ActiveRecord::Schema.define(version: 2011_01_11_224543) do
14
+ create_table "users", force: :cascade do |t|
15
+ t.datetime "created_at", null: false
16
+ t.datetime "updated_at", null: false
17
+ t.string "email", null: false
18
+ t.string "encrypted_password", limit: 128, null: false
19
+ t.string "confirmation_token", limit: 128
20
+ t.string "remember_token", limit: 128, null: false
21
+ t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
22
+ t.index ["email"], name: "index_users_on_email"
23
+ t.index ["remember_token"], name: "index_users_on_remember_token", unique: true
24
+ end
25
+ end
@@ -2,10 +2,6 @@ require "spec_helper"
2
2
  require "generators/clearance/install/install_generator"
3
3
 
4
4
  describe Clearance::Generators::InstallGenerator, :generator do
5
- def get_migration(path)
6
- Pathname.new(migration_file(path))
7
- end
8
-
9
5
  describe "initializer" do
10
6
  it "is copied to the application" do
11
7
  provide_existing_application_controller
@@ -70,7 +66,7 @@ describe Clearance::Generators::InstallGenerator, :generator do
70
66
  table_does_not_exist(:users)
71
67
 
72
68
  run_generator
73
- migration = get_migration("db/migrate/create_users.rb")
69
+ migration = migration_file("db/migrate/create_users.rb")
74
70
 
75
71
  expect(migration).to exist
76
72
  expect(migration).to have_correct_syntax
@@ -92,7 +88,7 @@ describe Clearance::Generators::InstallGenerator, :generator do
92
88
  table_does_not_exist(:users)
93
89
 
94
90
  run_generator
95
- migration = get_migration("db/migrate/create_users.rb")
91
+ migration = migration_file("db/migrate/create_users.rb")
96
92
 
97
93
  expect(migration).to exist
98
94
  expect(migration).to have_correct_syntax
@@ -106,8 +102,8 @@ describe Clearance::Generators::InstallGenerator, :generator do
106
102
  provide_existing_application_controller
107
103
 
108
104
  run_generator
109
- create_migration = get_migration("db/migrate/create_users.rb")
110
- add_migration = get_migration("db/migrate/add_clearance_to_users.rb")
105
+ create_migration = migration_file("db/migrate/create_users.rb")
106
+ add_migration = migration_file("db/migrate/add_clearance_to_users.rb")
111
107
 
112
108
  expect(create_migration).not_to exist
113
109
  expect(add_migration).not_to exist
@@ -130,7 +126,7 @@ describe Clearance::Generators::InstallGenerator, :generator do
130
126
  and_return(existing_indexes)
131
127
 
132
128
  run_generator
133
- migration = get_migration("db/migrate/add_clearance_to_users.rb")
129
+ migration = migration_file("db/migrate/add_clearance_to_users.rb")
134
130
 
135
131
  expect(migration).to exist
136
132
  expect(migration).to have_correct_syntax
@@ -0,0 +1,11 @@
1
+ require "spec_helper"
2
+
3
+ describe "Backdoor Middleware" do
4
+ it "allows signing in using query parameter" do
5
+ user = create(:user)
6
+
7
+ get root_path(as: user.to_param)
8
+
9
+ expect(cookies["remember_token"]).to eq user.remember_token
10
+ end
11
+ end
@@ -16,7 +16,7 @@ describe "CSRF Rotation" do
16
16
  original_token = csrf_token
17
17
 
18
18
  post session_path, params: {
19
- session: session_params(user, "password"),
19
+ authenticity_token: csrf_token, session: { email: user.email, password: "password" }
20
20
  }
21
21
 
22
22
  expect(csrf_token).not_to eq original_token
@@ -28,8 +28,4 @@ describe "CSRF Rotation" do
28
28
  def csrf_token
29
29
  session[:_csrf_token]
30
30
  end
31
-
32
- def session_params(user, password)
33
- { email: user.email, password: password, authenticity_token: csrf_token }
34
- end
35
31
  end
@@ -3,13 +3,13 @@ require "spec_helper"
3
3
  describe "Token expiration" do
4
4
  describe "after signing in" do
5
5
  before do
6
- Timecop.freeze
6
+ freeze_time
7
7
  create_user_and_sign_in
8
8
  @initial_cookies = remember_token_cookies
9
9
  end
10
10
 
11
11
  after do
12
- Timecop.return
12
+ unfreeze_time
13
13
  end
14
14
 
15
15
  it "should have a remember_token cookie with a future expiration" do
@@ -25,7 +25,7 @@ describe "Token expiration" do
25
25
  create_user_and_sign_in
26
26
  @initial_cookies = remember_token_cookies
27
27
 
28
- Timecop.travel(1.minute.from_now) do
28
+ travel_to(1.minute.from_now) do
29
29
  get root_path
30
30
  @followup_cookies = remember_token_cookies
31
31
  end
data/spec/spec_helper.rb CHANGED
@@ -1,20 +1,13 @@
1
1
  ENV["RAILS_ENV"] ||= "test"
2
+ require_relative "dummy/config/environment"
2
3
 
3
- require "rails/all"
4
- require "dummy/application"
5
-
6
- require "clearance/rspec"
7
- require "factory_bot_rails"
8
- require "rails-controller-testing"
9
4
  require "rspec/rails"
10
- require "shoulda-matchers"
11
- require "timecop"
12
-
13
- Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
5
+ require "clearance/rspec"
14
6
 
15
- Dummy::Application.initialize!
7
+ Dir[File.expand_path("spec/support/**/*.rb")].each { |f| require f }
16
8
 
17
9
  RSpec.configure do |config|
10
+ config.include ActiveSupport::Testing::TimeHelpers
18
11
  config.include FactoryBot::Syntax::Methods
19
12
  config.infer_spec_type_from_file_location!
20
13
  config.order = :random
@@ -3,6 +3,16 @@ require "ammeter/rspec/generator/matchers.rb"
3
3
  require "ammeter/init"
4
4
 
5
5
  module GeneratorSpecHelpers
6
+ module FileMethods
7
+ def file(path)
8
+ Pathname.new(super)
9
+ end
10
+
11
+ def migration_file(path)
12
+ Pathname.new(super)
13
+ end
14
+ end
15
+
6
16
  TEMPLATE_PATH = File.expand_path("../../app_templates", __FILE__)
7
17
 
8
18
  def provide_existing_routes_file
@@ -36,6 +46,7 @@ end
36
46
 
37
47
  RSpec.configure do |config|
38
48
  config.include GeneratorSpecHelpers
49
+ config.prepend GeneratorSpecHelpers::FileMethods
39
50
 
40
51
  config.before(:example, :generator) do
41
52
  destination File.expand_path("../../../tmp", __FILE__)
@@ -1,6 +1,6 @@
1
1
  module HTMLEscapeHelper
2
2
  def translated_string(key)
3
- if Rails.version >= "7.0"
3
+ if [7.0].include?(Rails::VERSION::STRING.to_f)
4
4
  ERB::Util.html_escape_once(I18n.t(key))
5
5
  else
6
6
  I18n.t(key)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clearance
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.0
4
+ version: 2.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Croak
@@ -27,12 +27,15 @@ authors:
27
27
  autorequire:
28
28
  bindir: bin
29
29
  cert_chain: []
30
- date: 2024-08-09 00:00:00.000000000 Z
30
+ date: 2024-10-29 00:00:00.000000000 Z
31
31
  dependencies:
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: bcrypt
34
34
  requirement: !ruby/object:Gem::Requirement
35
35
  requirements:
36
+ - - "~>"
37
+ - !ruby/object:Gem::Version
38
+ version: '3.1'
36
39
  - - ">="
37
40
  - !ruby/object:Gem::Version
38
41
  version: 3.1.1
@@ -40,6 +43,9 @@ dependencies:
40
43
  prerelease: false
41
44
  version_requirements: !ruby/object:Gem::Requirement
42
45
  requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.1'
43
49
  - - ">="
44
50
  - !ruby/object:Gem::Version
45
51
  version: 3.1.1
@@ -81,56 +87,56 @@ dependencies:
81
87
  name: railties
82
88
  requirement: !ruby/object:Gem::Requirement
83
89
  requirements:
84
- - - ">="
90
+ - - "~>"
85
91
  - !ruby/object:Gem::Version
86
92
  version: '5.0'
87
93
  type: :runtime
88
94
  prerelease: false
89
95
  version_requirements: !ruby/object:Gem::Requirement
90
96
  requirements:
91
- - - ">="
97
+ - - "~>"
92
98
  - !ruby/object:Gem::Version
93
99
  version: '5.0'
94
100
  - !ruby/object:Gem::Dependency
95
101
  name: activemodel
96
102
  requirement: !ruby/object:Gem::Requirement
97
103
  requirements:
98
- - - ">="
104
+ - - "~>"
99
105
  - !ruby/object:Gem::Version
100
106
  version: '5.0'
101
107
  type: :runtime
102
108
  prerelease: false
103
109
  version_requirements: !ruby/object:Gem::Requirement
104
110
  requirements:
105
- - - ">="
111
+ - - "~>"
106
112
  - !ruby/object:Gem::Version
107
113
  version: '5.0'
108
114
  - !ruby/object:Gem::Dependency
109
115
  name: activerecord
110
116
  requirement: !ruby/object:Gem::Requirement
111
117
  requirements:
112
- - - ">="
118
+ - - "~>"
113
119
  - !ruby/object:Gem::Version
114
120
  version: '5.0'
115
121
  type: :runtime
116
122
  prerelease: false
117
123
  version_requirements: !ruby/object:Gem::Requirement
118
124
  requirements:
119
- - - ">="
125
+ - - "~>"
120
126
  - !ruby/object:Gem::Version
121
127
  version: '5.0'
122
128
  - !ruby/object:Gem::Dependency
123
129
  name: actionmailer
124
130
  requirement: !ruby/object:Gem::Requirement
125
131
  requirements:
126
- - - ">="
132
+ - - "~>"
127
133
  - !ruby/object:Gem::Version
128
134
  version: '5.0'
129
135
  type: :runtime
130
136
  prerelease: false
131
137
  version_requirements: !ruby/object:Gem::Requirement
132
138
  requirements:
133
- - - ">="
139
+ - - "~>"
134
140
  - !ruby/object:Gem::Version
135
141
  version: '5.0'
136
142
  description: |2
@@ -185,11 +191,9 @@ files:
185
191
  - clearance.gemspec
186
192
  - config/locales/clearance.en.yml
187
193
  - config/routes.rb
188
- - db/migrate/20110111224543_create_clearance_users.rb
189
- - db/schema.rb
190
- - gemfiles/rails_6.1.gemfile
191
194
  - gemfiles/rails_7.0.gemfile
192
195
  - gemfiles/rails_7.1.gemfile
196
+ - gemfiles/rails_7.2.gemfile
193
197
  - lib/clearance.rb
194
198
  - lib/clearance/authentication.rb
195
199
  - lib/clearance/authorization.rb
@@ -265,14 +269,22 @@ files:
265
269
  - spec/controllers/permissions_controller_spec.rb
266
270
  - spec/controllers/sessions_controller_spec.rb
267
271
  - spec/controllers/users_controller_spec.rb
272
+ - spec/dummy/Rakefile
273
+ - spec/dummy/app/assets/config/manifest.js
268
274
  - spec/dummy/app/controllers/application_controller.rb
269
275
  - spec/dummy/app/models/user.rb
270
276
  - spec/dummy/app/models/user_with_optional_password.rb
271
- - spec/dummy/application.rb
277
+ - spec/dummy/config.ru
278
+ - spec/dummy/config/application.rb
279
+ - spec/dummy/config/boot.rb
272
280
  - spec/dummy/config/database.yml
281
+ - spec/dummy/config/environment.rb
282
+ - spec/dummy/config/environments/test.rb
273
283
  - spec/dummy/config/routes.rb
274
284
  - spec/dummy/db/.keep
275
- - spec/factories.rb
285
+ - spec/dummy/db/migrate/20110111224543_create_clearance_users.rb
286
+ - spec/dummy/db/schema.rb
287
+ - spec/factories/users.rb
276
288
  - spec/generators/clearance/install/install_generator_spec.rb
277
289
  - spec/generators/clearance/routes/routes_generator_spec.rb
278
290
  - spec/generators/clearance/specs/specs_generator_spec.rb
@@ -284,6 +296,7 @@ files:
284
296
  - spec/password_strategies/bcrypt_spec.rb
285
297
  - spec/password_strategies/password_strategies_spec.rb
286
298
  - spec/requests/authentication_cookie_spec.rb
299
+ - spec/requests/backdoor_spec.rb
287
300
  - spec/requests/cookie_options_spec.rb
288
301
  - spec/requests/csrf_rotation_spec.rb
289
302
  - spec/requests/password_maintenance_spec.rb
@@ -291,7 +304,6 @@ files:
291
304
  - spec/routing/clearance_routes_spec.rb
292
305
  - spec/spec_helper.rb
293
306
  - spec/support/clearance.rb
294
- - spec/support/cookies.rb
295
307
  - spec/support/fake_model_with_password_strategy.rb
296
308
  - spec/support/fake_model_without_password_strategy.rb
297
309
  - spec/support/generator_spec_helpers.rb
@@ -311,14 +323,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
311
323
  requirements:
312
324
  - - ">="
313
325
  - !ruby/object:Gem::Version
314
- version: 2.4.0
326
+ version: 3.1.6
315
327
  required_rubygems_version: !ruby/object:Gem::Requirement
316
328
  requirements:
317
329
  - - ">="
318
330
  - !ruby/object:Gem::Version
319
331
  version: '0'
320
332
  requirements: []
321
- rubygems_version: 3.5.15
333
+ rubygems_version: 3.5.16
322
334
  signing_key:
323
335
  specification_version: 4
324
336
  summary: Rails authentication & authorization with email & password.
data/db/schema.rb DELETED
@@ -1,28 +0,0 @@
1
- # encoding: UTF-8
2
- # This file is auto-generated from the current state of the database. Instead
3
- # of editing this file, please use the migrations feature of Active Record to
4
- # incrementally modify your database, and then regenerate this schema definition.
5
- #
6
- # Note that this schema.rb definition is the authoritative source for your
7
- # database schema. If you need to create the application database on another
8
- # system, you should be using db:schema:load, not running all the migrations
9
- # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
- # you'll amass, the slower it'll run and the greater likelihood for issues).
11
- #
12
- # It's strongly recommended that you check this file into your version control system.
13
-
14
- ActiveRecord::Schema.define(version: 20110111224543) do
15
-
16
- create_table "users", force: true do |t|
17
- t.datetime "created_at", null: false
18
- t.datetime "updated_at", null: false
19
- t.string "email", null: false
20
- t.string "encrypted_password", limit: 128, null: false
21
- t.string "confirmation_token", limit: 128
22
- t.string "remember_token", limit: 128, null: false
23
- end
24
-
25
- add_index "users", ["email"], name: "index_users_on_email"
26
- add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
27
- add_index "users", ["remember_token"], name: "index_users_on_remember_token", unique: true
28
- end
@@ -1,33 +0,0 @@
1
- require "rails/all"
2
-
3
- require "clearance"
4
-
5
- module Dummy
6
- APP_ROOT = File.expand_path("..", __FILE__).freeze
7
-
8
- class Application < Rails::Application
9
- config.action_controller.perform_caching = false
10
- config.action_mailer.default_url_options = { host: "dummy.example.com" }
11
- config.action_mailer.delivery_method = :test
12
- if Rails.version.match?(/(6.1|7.0)/)
13
- config.active_record.legacy_connection_handling = false
14
- end
15
- config.active_support.deprecation = :stderr
16
- config.eager_load = false
17
-
18
- config.paths["app/controllers"] << "#{APP_ROOT}/app/controllers"
19
- config.paths["app/models"] << "#{APP_ROOT}/app/models"
20
- config.paths["app/views"] << "#{APP_ROOT}/app/views"
21
- config.paths["config/database"] = "#{APP_ROOT}/config/database.yml"
22
- config.paths["log"] = "tmp/log/development.log"
23
- config.paths.add "config/routes.rb", with: "#{APP_ROOT}/config/routes.rb"
24
-
25
- def require_environment!
26
- initialize!
27
- end
28
-
29
- def initialize!(&block)
30
- super unless @initialized
31
- end
32
- end
33
- end
@@ -1,74 +0,0 @@
1
- RSpec::Matchers.define :set_cookie do |name, expected_value, expected_expires_at|
2
- failure_message do
3
- "Expected #{expectation} got #{result}"
4
- end
5
-
6
- match do |subject|
7
- @headers = subject
8
- @expected_name = name
9
- @expected_value = expected_value
10
- @expected_expires_at = expected_expires_at
11
- extract_cookies
12
- find_expected_cookie
13
- parse_expiration
14
- parse_value
15
- parse_path
16
- ensure_cookie_set
17
- ensure_expiration_correct
18
- ensure_path_is_correct
19
- end
20
-
21
- def ensure_cookie_set
22
- expect(@value).to eq @expected_value
23
- end
24
-
25
- def ensure_expiration_correct
26
- expect(@expires_at).not_to be_nil
27
- expect(@expires_at).to be_within(100).of(@expected_expires_at)
28
- end
29
-
30
- def ensure_path_is_correct
31
- expect(@path).to eq '/'
32
- end
33
-
34
- def expectation
35
- "a cookie named #{@expected_name} with value #{@expected_value.inspect} expiring at #{@expected_expires_at.inspect}"
36
- end
37
-
38
- def extract_cookies
39
- @cookie_headers = @headers["Set-Cookie"] || @headers["set-cookie"] || []
40
- @cookie_headers = [@cookie_headers] if @cookie_headers.respond_to?(:to_str)
41
- end
42
-
43
- def find_expected_cookie
44
- @cookie = @cookie_headers.detect do |header|
45
- header =~ /^#{@expected_name}=[^;]*(;|$)/
46
- end
47
- end
48
-
49
- def parse_expiration
50
- if @cookie && result = @cookie.match(/; expires=(.*?)(;|$)/)
51
- @expires_at = Time.parse(result[1])
52
- end
53
- end
54
-
55
- def parse_path
56
- if @cookie && result = @cookie.match(/; path=(.*?)(;|$)/)
57
- @path = result[1]
58
- end
59
- end
60
-
61
- def parse_value
62
- if @cookie && result = @cookie.match(/=(.*?)(?:;|$)/)
63
- @value = result[1]
64
- end
65
- end
66
-
67
- def result
68
- if @cookie
69
- @cookie
70
- else
71
- @cookie_headers.join("; ")
72
- end
73
- end
74
- end
File without changes