sorcery-jwt 0.2.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +3 -3
- data/CHANGELOG.md +16 -0
- data/Gemfile.lock +97 -1
- data/README.md +86 -36
- data/gemfiles/sorcery_0.16.5.gemfile +4 -0
- data/gemfiles/sorcery_0.16.5.gemfile.lock +278 -0
- data/gemfiles/sorcery_0.17.0.gemfile +4 -0
- data/gemfiles/sorcery_0.17.0.gemfile.lock +278 -0
- data/gemfiles/sorcery_0.18.0.gemfile +4 -0
- data/gemfiles/sorcery_0.18.0.gemfile.lock +307 -0
- data/lib/sorcery/controller/submodules/jwt.rb +7 -0
- data/lib/sorcery/jwt/version.rb +1 -1
- data/lib/sorcery/model/submodules/jwt.rb +23 -2
- data/sorcery-jwt.gemspec +5 -0
- metadata +51 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f3291049e9e9a71c2160d00cbc1d83d574e2fcf17d37e93f915f7dd1a71f0d1e
|
|
4
|
+
data.tar.gz: d89a4edc63c58948f8b8382827f9e9a96e5644df46c5740909197ab70dee456e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d8e54c1b75b564bf861734cc3cd289237a92288e1adbe9190de1b7349ef180d9592c659aa6cd443ac4fa2f342a0a8e6011e37f0a3b1cff99c3e5842ba394fcaa
|
|
7
|
+
data.tar.gz: 2b7ad9a0a38719960a50602520e7bb5d109980d2bf520577d6620688b99b7389e444df2e9c3630ae060fa8badbb3cf5a8d8b743fdceb6b644252e408d4cacea2
|
data/.github/workflows/ci.yml
CHANGED
|
@@ -13,11 +13,11 @@ jobs:
|
|
|
13
13
|
ruby: ["3.2", "3.3", "3.4"]
|
|
14
14
|
sorcery: ["0.16.5", "0.17.0", "0.18.0"]
|
|
15
15
|
env:
|
|
16
|
-
BUNDLE_GEMFILE: gemfiles/sorcery_${{ matrix.sorcery }}.gemfile
|
|
16
|
+
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/sorcery_${{ matrix.sorcery }}.gemfile
|
|
17
17
|
steps:
|
|
18
|
-
- uses: actions/checkout@
|
|
18
|
+
- uses: actions/checkout@v6
|
|
19
19
|
- uses: ruby/setup-ruby@v1
|
|
20
20
|
with:
|
|
21
21
|
ruby-version: ${{ matrix.ruby }}
|
|
22
|
-
|
|
22
|
+
- run: bundle install
|
|
23
23
|
- run: bundle exec rspec
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.0 (2026-09-03)
|
|
4
|
+
|
|
5
|
+
First stable release. The public API is identical to 0.1.x — tokens issued
|
|
6
|
+
by earlier versions remain valid; no forced re-login.
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- `exp_leeway` config: optional clock-skew tolerance (seconds) applied when
|
|
11
|
+
verifying `exp`. Default nil (previous behavior).
|
|
12
|
+
- `iat` claim on issued tokens.
|
|
13
|
+
- Integration spec exercising the real sorcery include path
|
|
14
|
+
(`authenticates_with_sorcery!`) — the path where failures were previously
|
|
15
|
+
swallowed silently by sorcery's `rescue NameError`.
|
|
16
|
+
- Yard documentation for the public API; README rewritten (claim contract,
|
|
17
|
+
security notes, upgrade guide, tested matrix).
|
|
18
|
+
|
|
3
19
|
## 0.2.1 (2026-09-03)
|
|
4
20
|
|
|
5
21
|
### Changed
|
data/Gemfile.lock
CHANGED
|
@@ -1,13 +1,35 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
sorcery-jwt (0.
|
|
4
|
+
sorcery-jwt (1.0.0)
|
|
5
5
|
jwt (>= 1.0, < 3.0)
|
|
6
6
|
sorcery (>= 0.16.5, < 0.19)
|
|
7
7
|
|
|
8
8
|
GEM
|
|
9
9
|
remote: https://rubygems.org/
|
|
10
10
|
specs:
|
|
11
|
+
action_text-trix (2.1.19)
|
|
12
|
+
railties
|
|
13
|
+
actioncable (8.1.3.1)
|
|
14
|
+
actionpack (= 8.1.3.1)
|
|
15
|
+
activesupport (= 8.1.3.1)
|
|
16
|
+
nio4r (~> 2.0)
|
|
17
|
+
websocket-driver (>= 0.6.1)
|
|
18
|
+
zeitwerk (~> 2.6)
|
|
19
|
+
actionmailbox (8.1.3.1)
|
|
20
|
+
actionpack (= 8.1.3.1)
|
|
21
|
+
activejob (= 8.1.3.1)
|
|
22
|
+
activerecord (= 8.1.3.1)
|
|
23
|
+
activestorage (= 8.1.3.1)
|
|
24
|
+
activesupport (= 8.1.3.1)
|
|
25
|
+
mail (>= 2.8.0)
|
|
26
|
+
actionmailer (8.1.3.1)
|
|
27
|
+
actionpack (= 8.1.3.1)
|
|
28
|
+
actionview (= 8.1.3.1)
|
|
29
|
+
activejob (= 8.1.3.1)
|
|
30
|
+
activesupport (= 8.1.3.1)
|
|
31
|
+
mail (>= 2.8.0)
|
|
32
|
+
rails-dom-testing (~> 2.2)
|
|
11
33
|
actionpack (8.1.3.1)
|
|
12
34
|
actionview (= 8.1.3.1)
|
|
13
35
|
activesupport (= 8.1.3.1)
|
|
@@ -18,12 +40,35 @@ GEM
|
|
|
18
40
|
rails-dom-testing (~> 2.2)
|
|
19
41
|
rails-html-sanitizer (~> 1.6)
|
|
20
42
|
useragent (~> 0.16)
|
|
43
|
+
actiontext (8.1.3.1)
|
|
44
|
+
action_text-trix (~> 2.1.15)
|
|
45
|
+
actionpack (= 8.1.3.1)
|
|
46
|
+
activerecord (= 8.1.3.1)
|
|
47
|
+
activestorage (= 8.1.3.1)
|
|
48
|
+
activesupport (= 8.1.3.1)
|
|
49
|
+
globalid (>= 0.6.0)
|
|
50
|
+
nokogiri (>= 1.8.5)
|
|
21
51
|
actionview (8.1.3.1)
|
|
22
52
|
activesupport (= 8.1.3.1)
|
|
23
53
|
builder (~> 3.1)
|
|
24
54
|
erubi (~> 1.11)
|
|
25
55
|
rails-dom-testing (~> 2.2)
|
|
26
56
|
rails-html-sanitizer (~> 1.6)
|
|
57
|
+
activejob (8.1.3.1)
|
|
58
|
+
activesupport (= 8.1.3.1)
|
|
59
|
+
globalid (>= 0.3.6)
|
|
60
|
+
activemodel (8.1.3.1)
|
|
61
|
+
activesupport (= 8.1.3.1)
|
|
62
|
+
activerecord (8.1.3.1)
|
|
63
|
+
activemodel (= 8.1.3.1)
|
|
64
|
+
activesupport (= 8.1.3.1)
|
|
65
|
+
timeout (>= 0.4.0)
|
|
66
|
+
activestorage (8.1.3.1)
|
|
67
|
+
actionpack (= 8.1.3.1)
|
|
68
|
+
activejob (= 8.1.3.1)
|
|
69
|
+
activerecord (= 8.1.3.1)
|
|
70
|
+
activesupport (= 8.1.3.1)
|
|
71
|
+
marcel (~> 1.0)
|
|
27
72
|
activesupport (8.1.3.1)
|
|
28
73
|
base64
|
|
29
74
|
bigdecimal
|
|
@@ -48,6 +93,7 @@ GEM
|
|
|
48
93
|
concurrent-ruby (1.3.8)
|
|
49
94
|
connection_pool (3.0.2)
|
|
50
95
|
crass (1.0.7)
|
|
96
|
+
date (3.5.1)
|
|
51
97
|
diff-lcs (1.6.2)
|
|
52
98
|
drb (2.2.3)
|
|
53
99
|
erb (6.0.7)
|
|
@@ -58,6 +104,8 @@ GEM
|
|
|
58
104
|
logger
|
|
59
105
|
faraday-net_http (3.4.4)
|
|
60
106
|
net-http (~> 0.5)
|
|
107
|
+
globalid (1.4.0)
|
|
108
|
+
activesupport (>= 6.1)
|
|
61
109
|
hashie (5.1.0)
|
|
62
110
|
logger
|
|
63
111
|
i18n (1.15.2)
|
|
@@ -75,6 +123,14 @@ GEM
|
|
|
75
123
|
loofah (2.25.2)
|
|
76
124
|
crass (~> 1.0.2)
|
|
77
125
|
nokogiri (>= 1.12.0)
|
|
126
|
+
mail (2.9.1)
|
|
127
|
+
logger
|
|
128
|
+
mini_mime (>= 0.1.1)
|
|
129
|
+
net-imap
|
|
130
|
+
net-pop
|
|
131
|
+
net-smtp
|
|
132
|
+
marcel (1.2.1)
|
|
133
|
+
mini_mime (1.1.5)
|
|
78
134
|
minitest (6.0.6)
|
|
79
135
|
drb (~> 2.0)
|
|
80
136
|
prism (~> 1.5)
|
|
@@ -82,6 +138,16 @@ GEM
|
|
|
82
138
|
bigdecimal (>= 3.1, < 5)
|
|
83
139
|
net-http (0.9.1)
|
|
84
140
|
uri (>= 0.11.1)
|
|
141
|
+
net-imap (0.6.6)
|
|
142
|
+
date
|
|
143
|
+
net-protocol
|
|
144
|
+
net-pop (0.1.2)
|
|
145
|
+
net-protocol
|
|
146
|
+
net-protocol (0.3.0)
|
|
147
|
+
timeout
|
|
148
|
+
net-smtp (0.5.1)
|
|
149
|
+
net-protocol
|
|
150
|
+
nio4r (2.7.5)
|
|
85
151
|
nokogiri (1.19.4-aarch64-linux-gnu)
|
|
86
152
|
racc (~> 1.4)
|
|
87
153
|
nokogiri (1.19.4-aarch64-linux-musl)
|
|
@@ -132,6 +198,20 @@ GEM
|
|
|
132
198
|
rack (>= 1.3)
|
|
133
199
|
rackup (2.3.1)
|
|
134
200
|
rack (>= 3)
|
|
201
|
+
rails (8.1.3.1)
|
|
202
|
+
actioncable (= 8.1.3.1)
|
|
203
|
+
actionmailbox (= 8.1.3.1)
|
|
204
|
+
actionmailer (= 8.1.3.1)
|
|
205
|
+
actionpack (= 8.1.3.1)
|
|
206
|
+
actiontext (= 8.1.3.1)
|
|
207
|
+
actionview (= 8.1.3.1)
|
|
208
|
+
activejob (= 8.1.3.1)
|
|
209
|
+
activemodel (= 8.1.3.1)
|
|
210
|
+
activerecord (= 8.1.3.1)
|
|
211
|
+
activestorage (= 8.1.3.1)
|
|
212
|
+
activesupport (= 8.1.3.1)
|
|
213
|
+
bundler (>= 1.15.0)
|
|
214
|
+
railties (= 8.1.3.1)
|
|
135
215
|
rails-dom-testing (2.3.0)
|
|
136
216
|
activesupport (>= 5.0.0)
|
|
137
217
|
minitest
|
|
@@ -182,13 +262,26 @@ GEM
|
|
|
182
262
|
oauth (>= 0.6)
|
|
183
263
|
oauth2 (~> 2.0)
|
|
184
264
|
railties (>= 7.1)
|
|
265
|
+
sqlite3 (2.9.6-aarch64-linux-gnu)
|
|
266
|
+
sqlite3 (2.9.6-aarch64-linux-musl)
|
|
267
|
+
sqlite3 (2.9.6-arm-linux-gnu)
|
|
268
|
+
sqlite3 (2.9.6-arm-linux-musl)
|
|
269
|
+
sqlite3 (2.9.6-arm64-darwin)
|
|
270
|
+
sqlite3 (2.9.6-x86_64-darwin)
|
|
271
|
+
sqlite3 (2.9.6-x86_64-linux-gnu)
|
|
272
|
+
sqlite3 (2.9.6-x86_64-linux-musl)
|
|
185
273
|
thor (1.5.0)
|
|
274
|
+
timeout (0.6.1)
|
|
186
275
|
tsort (0.2.0)
|
|
187
276
|
tzinfo (2.0.6)
|
|
188
277
|
concurrent-ruby (~> 1.0)
|
|
189
278
|
uri (1.1.1)
|
|
190
279
|
useragent (0.16.11)
|
|
191
280
|
version_gem (1.1.15)
|
|
281
|
+
websocket-driver (0.8.2)
|
|
282
|
+
base64
|
|
283
|
+
websocket-extensions (>= 0.1.0)
|
|
284
|
+
websocket-extensions (0.1.5)
|
|
192
285
|
zeitwerk (2.8.3)
|
|
193
286
|
|
|
194
287
|
PLATFORMS
|
|
@@ -202,9 +295,12 @@ PLATFORMS
|
|
|
202
295
|
x86_64-linux-musl
|
|
203
296
|
|
|
204
297
|
DEPENDENCIES
|
|
298
|
+
activerecord (~> 8.0)
|
|
299
|
+
rails (~> 8.0)
|
|
205
300
|
rake (~> 13.0)
|
|
206
301
|
rspec (~> 3.0)
|
|
207
302
|
sorcery-jwt!
|
|
303
|
+
sqlite3 (~> 2.0)
|
|
208
304
|
|
|
209
305
|
BUNDLED WITH
|
|
210
306
|
2.6.9
|
data/README.md
CHANGED
|
@@ -1,82 +1,132 @@
|
|
|
1
1
|
# Sorcery::Jwt
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://github.com/hayfever/sorcery-jwt/actions)
|
|
4
|
+
[](https://rubygems.org/gems/sorcery-jwt)
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
Jwt extension for the [Sorcery](https://github.com/Sorcery/sorcery) authentication
|
|
7
|
+
library, for API-only Rails apps.
|
|
8
|
+
|
|
9
|
+
> **NOTE:** Sorcery v1 is being developed and JWT is planned as a core plugin.
|
|
10
|
+
> See https://github.com/Sorcery/sorcery-rework/issues/9. This gem targets the
|
|
11
|
+
> current (0.16–0.18) sorcery line.
|
|
6
12
|
|
|
7
13
|
## Installation
|
|
8
14
|
|
|
9
15
|
Add this line to your application's Gemfile:
|
|
10
16
|
|
|
11
17
|
```ruby
|
|
12
|
-
gem
|
|
18
|
+
gem "sorcery-jwt"
|
|
13
19
|
```
|
|
14
20
|
|
|
15
21
|
And then execute:
|
|
16
22
|
|
|
17
23
|
$ bundle
|
|
18
24
|
|
|
19
|
-
Or install it yourself as:
|
|
20
|
-
|
|
21
|
-
$ gem install sorcery-jwt
|
|
22
|
-
|
|
23
25
|
## Usage
|
|
24
26
|
|
|
25
27
|
First, include the `:jwt` submodule in your list of configured Sorcery submodules:
|
|
26
28
|
|
|
27
|
-
```
|
|
29
|
+
```ruby
|
|
28
30
|
Rails.application.config.sorcery.submodules = [:jwt, ...]
|
|
29
31
|
```
|
|
30
32
|
|
|
31
|
-
Next, in the Sorcery `user_config`, set the secret and algorithm
|
|
33
|
+
Next, in the Sorcery `user_config`, set the secret and algorithm used to sign
|
|
34
|
+
tokens, the token lifetime in seconds, and (optionally) clock-skew tolerance:
|
|
32
35
|
|
|
33
|
-
```
|
|
36
|
+
```ruby
|
|
34
37
|
Rails.application.config.sorcery.configure do |config|
|
|
35
38
|
# ...
|
|
36
39
|
config.user_config do |user|
|
|
37
|
-
|
|
38
|
-
user.
|
|
39
|
-
user.
|
|
40
|
-
user.
|
|
40
|
+
user.jwt_secret = Rails.application.secrets.secret_key_base
|
|
41
|
+
user.jwt_algorithm = "HS256" # default; see jwt/ruby-jwt for options
|
|
42
|
+
user.session_expiry = 60 * 60 * 24 * 7 * 2 # default: 2 weeks (seconds)
|
|
43
|
+
user.exp_leeway = 30 # optional; default nil = no leeway
|
|
41
44
|
end
|
|
42
45
|
end
|
|
43
46
|
```
|
|
44
47
|
|
|
45
|
-
|
|
48
|
+
With the submodule included, each request checks the `Authorization` header
|
|
49
|
+
for a bearer JWT. If the token is validly signed, unexpired, and its claims
|
|
50
|
+
match a user, `current_user` is set. Handling invalid tokens (401s, etc.) is
|
|
51
|
+
up to your application.
|
|
46
52
|
|
|
47
|
-
|
|
53
|
+
To log a user in and issue a token:
|
|
48
54
|
|
|
49
|
-
|
|
55
|
+
```ruby
|
|
56
|
+
class SessionsController < ApplicationController
|
|
57
|
+
def create
|
|
58
|
+
token = login_and_issue_token(params[:email], params[:password])
|
|
59
|
+
|
|
60
|
+
if token
|
|
61
|
+
render json: { token: token }, status: :created
|
|
62
|
+
else
|
|
63
|
+
render json: { error: "invalid credentials" }, status: :unauthorized
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
```
|
|
50
68
|
|
|
51
|
-
|
|
69
|
+
### Claim contract
|
|
52
70
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
71
|
+
Tokens issued by `login_and_issue_token` carry the user's `id` and `email`,
|
|
72
|
+
plus the standard `exp` and `iat` claims. Authentication via
|
|
73
|
+
`login_from_jwt` requires **all** of the following, evaluated in one place:
|
|
56
74
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
75
|
+
1. a valid signature under the configured secret and algorithm
|
|
76
|
+
2. an unexpired `exp` (within `exp_leeway`, if configured)
|
|
77
|
+
3. `id` and `email` claims are present
|
|
78
|
+
4. the claims match an existing user
|
|
79
|
+
|
|
80
|
+
A validly-signed token that fails any check authenticates nobody — notably,
|
|
81
|
+
a token missing its identity claims can never fall through to an unfiltered
|
|
82
|
+
lookup.
|
|
83
|
+
|
|
84
|
+
### Token issuance API
|
|
85
|
+
|
|
86
|
+
You can also issue tokens directly from the user model:
|
|
87
|
+
|
|
88
|
+
```ruby
|
|
89
|
+
User.issue_token(id: user.id, email: user.email) # => signed JWT string
|
|
90
|
+
User.decode_token(token) # => [payload, header]; raises JWT::DecodeError
|
|
91
|
+
User.token_valid?(token) # => boolean; never raises
|
|
62
92
|
```
|
|
63
93
|
|
|
64
|
-
|
|
94
|
+
## Security notes
|
|
65
95
|
|
|
66
|
-
|
|
96
|
+
- **No revocation is built in.** Tokens are valid until `exp`. If you need
|
|
97
|
+
logout, invalidation on password change, or single-session enforcement, see
|
|
98
|
+
[JWT revocation strategies](https://waiting-for-dev.github.io/blog/2017/01/24/jwt_revocation_strategies/)
|
|
99
|
+
— any denylist/token-version approach can be layered on top by your app.
|
|
100
|
+
- The algorithm is pinned on decode: `alg: none` and key-confusion attacks
|
|
101
|
+
are rejected.
|
|
102
|
+
- The signing secret should be at least as strong as `secret_key_base`
|
|
103
|
+
rotated from your credentials store.
|
|
67
104
|
|
|
68
|
-
|
|
105
|
+
## Upgrading from 0.1.x
|
|
69
106
|
|
|
70
|
-
|
|
107
|
+
No API changes: `issue_token`, `decode_token`, `token_valid?`,
|
|
108
|
+
`login_and_issue_token`, and the `login_from_jwt` login source all behave as
|
|
109
|
+
before, and **tokens issued by 0.1.x remain valid** — no forced re-login.
|
|
110
|
+
Behavior fixes in the 0.2+ line:
|
|
71
111
|
|
|
72
|
-
|
|
112
|
+
- tokens with no `id`/`email` claims are rejected (previously authenticated
|
|
113
|
+
the first user in the table)
|
|
114
|
+
- the `email` claim must match the looked-up user
|
|
115
|
+
- failed JWT login sets `current_user` to `nil` (sorcery convention)
|
|
116
|
+
- the model submodule actually registers on modern Rubies (see
|
|
117
|
+
[CHANGELOG](CHANGELOG.md) — before 0.2, sorcery's `rescue NameError`
|
|
118
|
+
could silently skip it, leaving `issue_token` undefined at runtime)
|
|
73
119
|
|
|
74
|
-
|
|
120
|
+
## Compatibility
|
|
75
121
|
|
|
76
|
-
|
|
122
|
+
Tested matrix (CI): Ruby 3.2 / 3.3 / 3.4 × sorcery 0.16.5 / 0.17 / 0.18.
|
|
77
123
|
|
|
78
|
-
|
|
124
|
+
## Contributing
|
|
79
125
|
|
|
80
|
-
|
|
126
|
+
Bug reports and pull requests are welcome at
|
|
127
|
+
https://github.com/hayfever/sorcery-jwt.
|
|
128
|
+
|
|
129
|
+
## License
|
|
81
130
|
|
|
82
|
-
|
|
131
|
+
The gem is available as open source under the terms of the
|
|
132
|
+
[MIT License](LICENSE.txt).
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: ..
|
|
3
|
+
specs:
|
|
4
|
+
sorcery-jwt (0.2.1)
|
|
5
|
+
jwt (>= 1.0, < 3.0)
|
|
6
|
+
sorcery (>= 0.16.5, < 0.19)
|
|
7
|
+
|
|
8
|
+
GEM
|
|
9
|
+
remote: https://rubygems.org/
|
|
10
|
+
specs:
|
|
11
|
+
action_text-trix (2.1.19)
|
|
12
|
+
railties
|
|
13
|
+
actioncable (8.1.3.1)
|
|
14
|
+
actionpack (= 8.1.3.1)
|
|
15
|
+
activesupport (= 8.1.3.1)
|
|
16
|
+
nio4r (~> 2.0)
|
|
17
|
+
websocket-driver (>= 0.6.1)
|
|
18
|
+
zeitwerk (~> 2.6)
|
|
19
|
+
actionmailbox (8.1.3.1)
|
|
20
|
+
actionpack (= 8.1.3.1)
|
|
21
|
+
activejob (= 8.1.3.1)
|
|
22
|
+
activerecord (= 8.1.3.1)
|
|
23
|
+
activestorage (= 8.1.3.1)
|
|
24
|
+
activesupport (= 8.1.3.1)
|
|
25
|
+
mail (>= 2.8.0)
|
|
26
|
+
actionmailer (8.1.3.1)
|
|
27
|
+
actionpack (= 8.1.3.1)
|
|
28
|
+
actionview (= 8.1.3.1)
|
|
29
|
+
activejob (= 8.1.3.1)
|
|
30
|
+
activesupport (= 8.1.3.1)
|
|
31
|
+
mail (>= 2.8.0)
|
|
32
|
+
rails-dom-testing (~> 2.2)
|
|
33
|
+
actionpack (8.1.3.1)
|
|
34
|
+
actionview (= 8.1.3.1)
|
|
35
|
+
activesupport (= 8.1.3.1)
|
|
36
|
+
nokogiri (>= 1.8.5)
|
|
37
|
+
rack (>= 2.2.4)
|
|
38
|
+
rack-session (>= 1.0.1)
|
|
39
|
+
rack-test (>= 0.6.3)
|
|
40
|
+
rails-dom-testing (~> 2.2)
|
|
41
|
+
rails-html-sanitizer (~> 1.6)
|
|
42
|
+
useragent (~> 0.16)
|
|
43
|
+
actiontext (8.1.3.1)
|
|
44
|
+
action_text-trix (~> 2.1.15)
|
|
45
|
+
actionpack (= 8.1.3.1)
|
|
46
|
+
activerecord (= 8.1.3.1)
|
|
47
|
+
activestorage (= 8.1.3.1)
|
|
48
|
+
activesupport (= 8.1.3.1)
|
|
49
|
+
globalid (>= 0.6.0)
|
|
50
|
+
nokogiri (>= 1.8.5)
|
|
51
|
+
actionview (8.1.3.1)
|
|
52
|
+
activesupport (= 8.1.3.1)
|
|
53
|
+
builder (~> 3.1)
|
|
54
|
+
erubi (~> 1.11)
|
|
55
|
+
rails-dom-testing (~> 2.2)
|
|
56
|
+
rails-html-sanitizer (~> 1.6)
|
|
57
|
+
activejob (8.1.3.1)
|
|
58
|
+
activesupport (= 8.1.3.1)
|
|
59
|
+
globalid (>= 0.3.6)
|
|
60
|
+
activemodel (8.1.3.1)
|
|
61
|
+
activesupport (= 8.1.3.1)
|
|
62
|
+
activerecord (8.1.3.1)
|
|
63
|
+
activemodel (= 8.1.3.1)
|
|
64
|
+
activesupport (= 8.1.3.1)
|
|
65
|
+
timeout (>= 0.4.0)
|
|
66
|
+
activestorage (8.1.3.1)
|
|
67
|
+
actionpack (= 8.1.3.1)
|
|
68
|
+
activejob (= 8.1.3.1)
|
|
69
|
+
activerecord (= 8.1.3.1)
|
|
70
|
+
activesupport (= 8.1.3.1)
|
|
71
|
+
marcel (~> 1.0)
|
|
72
|
+
activesupport (8.1.3.1)
|
|
73
|
+
base64
|
|
74
|
+
bigdecimal
|
|
75
|
+
concurrent-ruby (~> 1.0, >= 1.3.1)
|
|
76
|
+
connection_pool (>= 2.2.5)
|
|
77
|
+
drb
|
|
78
|
+
i18n (>= 1.6, < 2)
|
|
79
|
+
json
|
|
80
|
+
logger (>= 1.4.2)
|
|
81
|
+
minitest (>= 5.1)
|
|
82
|
+
securerandom (>= 0.3)
|
|
83
|
+
tzinfo (~> 2.0, >= 2.0.5)
|
|
84
|
+
uri (>= 0.13.1)
|
|
85
|
+
anonymous_loader (0.1.3)
|
|
86
|
+
version_gem (~> 1.1, >= 1.1.14)
|
|
87
|
+
auth-sanitizer (0.2.3)
|
|
88
|
+
version_gem (~> 1.1, >= 1.1.14)
|
|
89
|
+
base64 (0.3.0)
|
|
90
|
+
bcrypt (3.1.22)
|
|
91
|
+
bigdecimal (4.1.2)
|
|
92
|
+
builder (3.3.0)
|
|
93
|
+
concurrent-ruby (1.3.8)
|
|
94
|
+
connection_pool (3.0.2)
|
|
95
|
+
crass (1.0.7)
|
|
96
|
+
date (3.5.1)
|
|
97
|
+
diff-lcs (1.6.2)
|
|
98
|
+
drb (2.2.3)
|
|
99
|
+
erb (6.0.7)
|
|
100
|
+
erubi (1.13.1)
|
|
101
|
+
faraday (2.14.3)
|
|
102
|
+
faraday-net_http (>= 2.0, < 3.5)
|
|
103
|
+
json
|
|
104
|
+
logger
|
|
105
|
+
faraday-net_http (3.4.4)
|
|
106
|
+
net-http (~> 0.5)
|
|
107
|
+
globalid (1.4.0)
|
|
108
|
+
activesupport (>= 6.1)
|
|
109
|
+
hashie (5.1.0)
|
|
110
|
+
logger
|
|
111
|
+
i18n (1.15.2)
|
|
112
|
+
concurrent-ruby (~> 1.0)
|
|
113
|
+
io-console (0.9.2)
|
|
114
|
+
irb (1.18.0)
|
|
115
|
+
pp (>= 0.6.0)
|
|
116
|
+
prism (>= 1.3.0)
|
|
117
|
+
rdoc (>= 4.0.0)
|
|
118
|
+
reline (>= 0.4.2)
|
|
119
|
+
json (2.21.2)
|
|
120
|
+
jwt (2.10.3)
|
|
121
|
+
base64
|
|
122
|
+
logger (1.7.0)
|
|
123
|
+
loofah (2.25.2)
|
|
124
|
+
crass (~> 1.0.2)
|
|
125
|
+
nokogiri (>= 1.12.0)
|
|
126
|
+
mail (2.9.1)
|
|
127
|
+
logger
|
|
128
|
+
mini_mime (>= 0.1.1)
|
|
129
|
+
net-imap
|
|
130
|
+
net-pop
|
|
131
|
+
net-smtp
|
|
132
|
+
marcel (1.2.1)
|
|
133
|
+
mini_mime (1.1.5)
|
|
134
|
+
minitest (6.0.6)
|
|
135
|
+
drb (~> 2.0)
|
|
136
|
+
prism (~> 1.5)
|
|
137
|
+
multi_xml (0.9.1)
|
|
138
|
+
bigdecimal (>= 3.1, < 5)
|
|
139
|
+
net-http (0.9.1)
|
|
140
|
+
uri (>= 0.11.1)
|
|
141
|
+
net-imap (0.6.6)
|
|
142
|
+
date
|
|
143
|
+
net-protocol
|
|
144
|
+
net-pop (0.1.2)
|
|
145
|
+
net-protocol
|
|
146
|
+
net-protocol (0.3.0)
|
|
147
|
+
timeout
|
|
148
|
+
net-smtp (0.5.1)
|
|
149
|
+
net-protocol
|
|
150
|
+
nio4r (2.7.5)
|
|
151
|
+
nokogiri (1.19.4-x86_64-linux-gnu)
|
|
152
|
+
racc (~> 1.4)
|
|
153
|
+
oauth (1.1.8)
|
|
154
|
+
anonymous_loader (~> 0.1, >= 0.1.3)
|
|
155
|
+
auth-sanitizer (~> 0.2, >= 0.2.3)
|
|
156
|
+
base64 (~> 0.1)
|
|
157
|
+
oauth-tty (~> 1.0, >= 1.0.13)
|
|
158
|
+
snaky_hash (~> 2.0, >= 2.0.7)
|
|
159
|
+
version_gem (~> 1.1, >= 1.1.14)
|
|
160
|
+
oauth-tty (1.0.13)
|
|
161
|
+
anonymous_loader (~> 0.1, >= 0.1.3)
|
|
162
|
+
auth-sanitizer (~> 0.2, >= 0.2.3)
|
|
163
|
+
version_gem (~> 1.1, >= 1.1.14)
|
|
164
|
+
oauth2 (2.0.25)
|
|
165
|
+
anonymous_loader (~> 0.1, >= 0.1.3)
|
|
166
|
+
auth-sanitizer (~> 0.2, >= 0.2.3)
|
|
167
|
+
faraday (>= 0.17.3, < 4.0)
|
|
168
|
+
jwt (>= 1.0, < 4.0)
|
|
169
|
+
logger (~> 1.2)
|
|
170
|
+
multi_xml (~> 0.5)
|
|
171
|
+
rack (>= 1.2, < 4)
|
|
172
|
+
snaky_hash (~> 2.0, >= 2.0.7)
|
|
173
|
+
version_gem (~> 1.1, >= 1.1.14)
|
|
174
|
+
pp (0.6.4)
|
|
175
|
+
prettyprint
|
|
176
|
+
prettyprint (0.2.0)
|
|
177
|
+
prism (1.9.0)
|
|
178
|
+
racc (1.8.1)
|
|
179
|
+
rack (3.2.7)
|
|
180
|
+
rack-session (2.1.2)
|
|
181
|
+
base64 (>= 0.1.0)
|
|
182
|
+
rack (>= 3.0.0)
|
|
183
|
+
rack-test (2.2.0)
|
|
184
|
+
rack (>= 1.3)
|
|
185
|
+
rackup (2.3.1)
|
|
186
|
+
rack (>= 3)
|
|
187
|
+
rails (8.1.3.1)
|
|
188
|
+
actioncable (= 8.1.3.1)
|
|
189
|
+
actionmailbox (= 8.1.3.1)
|
|
190
|
+
actionmailer (= 8.1.3.1)
|
|
191
|
+
actionpack (= 8.1.3.1)
|
|
192
|
+
actiontext (= 8.1.3.1)
|
|
193
|
+
actionview (= 8.1.3.1)
|
|
194
|
+
activejob (= 8.1.3.1)
|
|
195
|
+
activemodel (= 8.1.3.1)
|
|
196
|
+
activerecord (= 8.1.3.1)
|
|
197
|
+
activestorage (= 8.1.3.1)
|
|
198
|
+
activesupport (= 8.1.3.1)
|
|
199
|
+
bundler (>= 1.15.0)
|
|
200
|
+
railties (= 8.1.3.1)
|
|
201
|
+
rails-dom-testing (2.3.0)
|
|
202
|
+
activesupport (>= 5.0.0)
|
|
203
|
+
minitest
|
|
204
|
+
nokogiri (>= 1.6)
|
|
205
|
+
rails-html-sanitizer (1.7.1)
|
|
206
|
+
loofah (~> 2.25, >= 2.25.2)
|
|
207
|
+
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
|
|
208
|
+
railties (8.1.3.1)
|
|
209
|
+
actionpack (= 8.1.3.1)
|
|
210
|
+
activesupport (= 8.1.3.1)
|
|
211
|
+
irb (~> 1.13)
|
|
212
|
+
rackup (>= 1.0.0)
|
|
213
|
+
rake (>= 12.2)
|
|
214
|
+
thor (~> 1.0, >= 1.2.2)
|
|
215
|
+
tsort (>= 0.2)
|
|
216
|
+
zeitwerk (~> 2.6)
|
|
217
|
+
rake (13.4.2)
|
|
218
|
+
rbs (4.2.0)
|
|
219
|
+
logger
|
|
220
|
+
prism (>= 1.6.0)
|
|
221
|
+
tsort
|
|
222
|
+
rdoc (8.0.0)
|
|
223
|
+
erb
|
|
224
|
+
prism (>= 1.6.0)
|
|
225
|
+
rbs (>= 4.0.0)
|
|
226
|
+
tsort
|
|
227
|
+
reline (0.7.0)
|
|
228
|
+
io-console (~> 0.5)
|
|
229
|
+
rspec (3.13.2)
|
|
230
|
+
rspec-core (~> 3.13.0)
|
|
231
|
+
rspec-expectations (~> 3.13.0)
|
|
232
|
+
rspec-mocks (~> 3.13.0)
|
|
233
|
+
rspec-core (3.13.6)
|
|
234
|
+
rspec-support (~> 3.13.0)
|
|
235
|
+
rspec-expectations (3.13.5)
|
|
236
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
237
|
+
rspec-support (~> 3.13.0)
|
|
238
|
+
rspec-mocks (3.13.8)
|
|
239
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
240
|
+
rspec-support (~> 3.13.0)
|
|
241
|
+
rspec-support (3.13.7)
|
|
242
|
+
securerandom (0.4.1)
|
|
243
|
+
snaky_hash (2.0.7)
|
|
244
|
+
hashie (>= 0.1.0, < 6)
|
|
245
|
+
version_gem (~> 1.1, >= 1.1.14)
|
|
246
|
+
sorcery (0.16.5)
|
|
247
|
+
bcrypt (~> 3.1)
|
|
248
|
+
oauth (>= 0.6)
|
|
249
|
+
oauth2 (~> 2.0)
|
|
250
|
+
sqlite3 (2.9.6-x86_64-linux-gnu)
|
|
251
|
+
thor (1.5.0)
|
|
252
|
+
timeout (0.6.1)
|
|
253
|
+
tsort (0.2.0)
|
|
254
|
+
tzinfo (2.0.6)
|
|
255
|
+
concurrent-ruby (~> 1.0)
|
|
256
|
+
uri (1.1.1)
|
|
257
|
+
useragent (0.16.11)
|
|
258
|
+
version_gem (1.1.15)
|
|
259
|
+
websocket-driver (0.8.2)
|
|
260
|
+
base64
|
|
261
|
+
websocket-extensions (>= 0.1.0)
|
|
262
|
+
websocket-extensions (0.1.5)
|
|
263
|
+
zeitwerk (2.8.3)
|
|
264
|
+
|
|
265
|
+
PLATFORMS
|
|
266
|
+
x86_64-linux
|
|
267
|
+
|
|
268
|
+
DEPENDENCIES
|
|
269
|
+
activerecord (~> 8.0)
|
|
270
|
+
rails (~> 8.0)
|
|
271
|
+
rake (~> 13.0)
|
|
272
|
+
rspec (~> 3.0)
|
|
273
|
+
sorcery (= 0.16.5)
|
|
274
|
+
sorcery-jwt!
|
|
275
|
+
sqlite3 (~> 2.0)
|
|
276
|
+
|
|
277
|
+
BUNDLED WITH
|
|
278
|
+
2.6.9
|