devise-two-factor 6.0.0 → 6.2.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 +10 -3
- data/.github/workflows/push.yml +28 -0
- data/Appraisals +15 -30
- data/CHANGELOG.md +14 -0
- data/README.md +4 -7
- data/Rakefile +2 -0
- data/UPGRADING.md +1 -1
- data/devise-two-factor.gemspec +3 -7
- data/gemfiles/rails_7.2.gemfile +8 -0
- data/gemfiles/rails_8.0.gemfile +8 -0
- data/gemfiles/rails_8.1.gemfile +8 -0
- data/lib/devise-two-factor.rb +1 -0
- data/lib/devise_two_factor/models/two_factor_authenticatable.rb +9 -12
- data/lib/devise_two_factor/strategies/two_factor_backupable.rb +6 -1
- data/lib/devise_two_factor/version.rb +1 -1
- metadata +38 -92
- checksums.yaml.gz.sig +0 -0
- data/certs/tinfoil-cacert.pem +0 -41
- data/certs/tinfoilsecurity-gems-cert.pem +0 -35
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b6893a24ebfb4eae935305d8b0657383c1630eb7619e23dfcd9ad0190bf1cd64
|
|
4
|
+
data.tar.gz: 24bab113bff7ae25afd03f9230caf372f8bdb0c319eeb18ab469353ca5136de1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0b78eedcbafc38b967fb8a6717b9f70f87751b234ce905f5b4d99a176224e4927bc7039a69bb454daba16c8b07b368dc1d9a89e19016910733fd5f744f857a7c
|
|
7
|
+
data.tar.gz: '0199a55f34cc5b67375620c1acabbca8b7256ead8b5401a6917dc2589b64158080851c9d5a061bc7fba1b95d36034f4e24aa13f1efb802a9cf44d1e202f407a0'
|
data/.github/workflows/ci.yml
CHANGED
|
@@ -12,14 +12,21 @@ jobs:
|
|
|
12
12
|
fail-fast: false
|
|
13
13
|
matrix:
|
|
14
14
|
# Due to https://github.com/actions/runner/issues/849, we should quote versions
|
|
15
|
-
ruby: ['3.1', '3.2', '3.3', 'truffleruby-head']
|
|
16
|
-
rails: ['7.0', '7.1']
|
|
15
|
+
ruby: ['3.1', '3.2', '3.3', '3.4', 'truffleruby-head']
|
|
16
|
+
rails: ['7.0', '7.1', '7.2', '8.0', '8.1']
|
|
17
|
+
exclude:
|
|
18
|
+
- ruby: '3.1'
|
|
19
|
+
rails: '8.0'
|
|
20
|
+
- ruby: '3.1'
|
|
21
|
+
rails: '8.1'
|
|
22
|
+
- ruby: '3.4'
|
|
23
|
+
rails: '7.0'
|
|
17
24
|
|
|
18
25
|
name: Ruby ${{ matrix.ruby }}, Rails ${{ matrix.rails }}
|
|
19
26
|
env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
|
|
20
27
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/rails_${{ matrix.rails }}.gemfile
|
|
21
28
|
steps:
|
|
22
|
-
- uses: actions/checkout@
|
|
29
|
+
- uses: actions/checkout@v5
|
|
23
30
|
- name: Set up Ruby
|
|
24
31
|
uses: ruby/setup-ruby@v1
|
|
25
32
|
with:
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: Push Gem
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- v*
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
deployment:
|
|
10
|
+
name: Push gem to RubyGems.org
|
|
11
|
+
environment: RubyGems
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
|
|
16
|
+
contents: write # IMPORTANT: this permission is required for `rake release` to push the release tag
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
# Set up
|
|
20
|
+
- uses: actions/checkout@v5
|
|
21
|
+
- name: Set up Ruby
|
|
22
|
+
uses: ruby/setup-ruby@v1
|
|
23
|
+
with:
|
|
24
|
+
bundler-cache: true
|
|
25
|
+
ruby-version: ruby
|
|
26
|
+
|
|
27
|
+
# Release
|
|
28
|
+
- uses: rubygems/release-gem@v1
|
data/Appraisals
CHANGED
|
@@ -1,39 +1,24 @@
|
|
|
1
|
-
appraise "rails-
|
|
2
|
-
gem 'railties', '~>
|
|
3
|
-
gem 'activesupport', '~>
|
|
4
|
-
end
|
|
5
|
-
|
|
6
|
-
appraise "rails-4.2" do
|
|
7
|
-
gem 'railties', '~> 4.2'
|
|
8
|
-
gem 'activesupport', '~> 4.2'
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
appraise "rails-5.0" do
|
|
12
|
-
gem 'railties', '~> 5.0'
|
|
13
|
-
gem 'activesupport', '~> 5.0'
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
appraise "rails-5.1" do
|
|
17
|
-
gem 'railties', '~> 5.1'
|
|
18
|
-
gem 'activesupport', '~> 5.1'
|
|
1
|
+
appraise "rails-7.0" do
|
|
2
|
+
gem 'railties', '~> 7.0.0'
|
|
3
|
+
gem 'activesupport', '~> 7.0.0'
|
|
19
4
|
end
|
|
20
5
|
|
|
21
|
-
appraise "rails-
|
|
22
|
-
gem 'railties', '~>
|
|
23
|
-
gem 'activesupport', '~>
|
|
6
|
+
appraise "rails-7.1" do
|
|
7
|
+
gem 'railties', '~> 7.1.0'
|
|
8
|
+
gem 'activesupport', '~> 7.1.0'
|
|
24
9
|
end
|
|
25
10
|
|
|
26
|
-
appraise "rails-
|
|
27
|
-
gem 'railties', '~>
|
|
28
|
-
gem 'activesupport', '~>
|
|
11
|
+
appraise "rails-7.2" do
|
|
12
|
+
gem 'railties', '~> 7.2.0'
|
|
13
|
+
gem 'activesupport', '~> 7.2.0'
|
|
29
14
|
end
|
|
30
15
|
|
|
31
|
-
appraise "rails-
|
|
32
|
-
gem 'railties', '~>
|
|
33
|
-
gem 'activesupport', '~>
|
|
16
|
+
appraise "rails-8.0" do
|
|
17
|
+
gem 'railties', '~> 8.0.0'
|
|
18
|
+
gem 'activesupport', '~> 8.0.0'
|
|
34
19
|
end
|
|
35
20
|
|
|
36
|
-
appraise "rails-
|
|
37
|
-
gem 'railties', '
|
|
38
|
-
gem 'activesupport', '
|
|
21
|
+
appraise "rails-8.1" do
|
|
22
|
+
gem 'railties', '8.1.0'
|
|
23
|
+
gem 'activesupport', '8.1.0'
|
|
39
24
|
end
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 6.2.0
|
|
6
|
+
|
|
7
|
+
- Rails 8.1 support
|
|
8
|
+
|
|
9
|
+
## 6.1.0
|
|
10
|
+
|
|
11
|
+
- Rails 8 support
|
|
12
|
+
|
|
13
|
+
## 6.0.0
|
|
14
|
+
|
|
15
|
+
**Breaking Changes**
|
|
16
|
+
- `otp_secret_length` and `otp_backup_code_length` options have changed to be the number of random bytes that are generated. See [UPGRADING.md](UPGRADING.md).
|
|
17
|
+
- `consume_otp!` and `invalidate_otp_backup_code!` now call `save!` instead of `save`. See [UPGRADING.md](UPGRADING.md).
|
|
18
|
+
|
|
5
19
|
## 5.1.0
|
|
6
20
|
|
|
7
21
|
- Remove faker dev dependency
|
data/README.md
CHANGED
|
@@ -82,7 +82,7 @@ This generator will:
|
|
|
82
82
|
|
|
83
83
|
1. Edit `app/models/MODEL.rb` (where MODEL is your model name):
|
|
84
84
|
* add the `:two_factor_authenticatable` devise module
|
|
85
|
-
* remove the `:database_authenticatable` if present
|
|
85
|
+
* remove the `:database_authenticatable` devise module, if present; having both modules enabled will lead to issues described below.
|
|
86
86
|
1. Add a Warden config block to your Devise initializer, which enables the strategies required for two-factor authentication.
|
|
87
87
|
|
|
88
88
|
Remember to apply the new migration after you run the generator:
|
|
@@ -107,9 +107,9 @@ Next you need to whitelist `:otp_attempt` as a permitted parameter in Devise `:s
|
|
|
107
107
|
end
|
|
108
108
|
```
|
|
109
109
|
|
|
110
|
-
Finally you should verify that `:database_authenticatable` is **not** being loaded by your model. The generator will try to remove it, but if you have a non-standard Devise setup, this step may fail.
|
|
110
|
+
Finally you should verify that `:database_authenticatable` is **not** being loaded by your model. The generator will try to remove it, but if you have a non-standard Devise setup, this step may fail. `:two_factor_authenticatable` includes all of `:database_authenticatable`'s functionality; it will still allow login without two-factor authentication until you enable it on your model's records with `otp_required_for_login`.
|
|
111
111
|
|
|
112
|
-
**Loading both `:database_authenticatable` and `:two_factor_authenticatable` in a model is a security issue
|
|
112
|
+
**Loading both `:database_authenticatable` and `:two_factor_authenticatable` in a model is a security issue.** It will allow users to bypass two-factor authentication regardless of how `otp_required_for_login` is set due to the way Warden handles cascading strategies!
|
|
113
113
|
|
|
114
114
|
## Designing Your Workflow
|
|
115
115
|
|
|
@@ -155,10 +155,7 @@ At Tinfoil Security, we opted to use the excellent [rqrcode-rails3](https://gith
|
|
|
155
155
|
If you decide to do this you'll need to generate a URI to act as the source for the QR code. This can be done using the `User#otp_provisioning_uri` method.
|
|
156
156
|
|
|
157
157
|
```ruby
|
|
158
|
-
issuer
|
|
159
|
-
label = "#{issuer}:#{current_user.email}"
|
|
160
|
-
|
|
161
|
-
current_user.otp_provisioning_uri(label, issuer: issuer)
|
|
158
|
+
current_user.otp_provisioning_uri(current_user.email, issuer: 'Your App')
|
|
162
159
|
|
|
163
160
|
# > "otpauth://totp/Your%20App:user@example.com?secret=[otp_secret]&issuer=Your+App"
|
|
164
161
|
```
|
data/Rakefile
CHANGED
data/UPGRADING.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
### save!
|
|
6
6
|
|
|
7
|
-
`consume_otp!` and `invalidate_otp_backup_code!` now call `save!` instead of `save` (or nothing at all in the case of `
|
|
7
|
+
`consume_otp!` and `invalidate_otp_backup_code!` now call `save!` instead of `save` (or nothing at all in the case of `invalidate_otp_backup_code!`). If you manually called `save`/`save!` after calling `invalidate_otp_backup_code!` you may be able to remove it.
|
|
8
8
|
|
|
9
9
|
### Secret Lengths
|
|
10
10
|
|
data/devise-two-factor.gemspec
CHANGED
|
@@ -11,17 +11,12 @@ Gem::Specification.new do |s|
|
|
|
11
11
|
s.description = 'Devise-Two-Factor is a minimalist extension to Devise which offers support for two-factor authentication through the TOTP scheme.'
|
|
12
12
|
s.authors = ['Quinn Wilton']
|
|
13
13
|
|
|
14
|
-
s.cert_chain = [
|
|
15
|
-
'certs/tinfoil-cacert.pem',
|
|
16
|
-
'certs/tinfoilsecurity-gems-cert.pem'
|
|
17
|
-
]
|
|
18
|
-
s.signing_key = File.expand_path("~/.ssh/tinfoilsecurity-gems-key.pem") if $0 =~ /gem\z/
|
|
19
14
|
s.files = `git ls-files`.split("\n").delete_if { |x| x.match('demo/*') }
|
|
20
15
|
s.test_files = `git ls-files -- spec/*`.split("\n")
|
|
21
16
|
s.require_paths = ['lib']
|
|
22
17
|
|
|
23
|
-
s.add_runtime_dependency 'railties', '
|
|
24
|
-
s.add_runtime_dependency 'activesupport', '
|
|
18
|
+
s.add_runtime_dependency 'railties', '>= 7.0', '< 8.2'
|
|
19
|
+
s.add_runtime_dependency 'activesupport', '>= 7.0', '< 8.2'
|
|
25
20
|
s.add_runtime_dependency 'devise', '~> 4.0'
|
|
26
21
|
s.add_runtime_dependency 'rotp', '~> 6.0'
|
|
27
22
|
|
|
@@ -30,4 +25,5 @@ Gem::Specification.new do |s|
|
|
|
30
25
|
s.add_development_dependency 'bundler', '> 1.0'
|
|
31
26
|
s.add_development_dependency 'rspec', '> 3'
|
|
32
27
|
s.add_development_dependency 'simplecov'
|
|
28
|
+
s.add_development_dependency 'rake', '~> 13'
|
|
33
29
|
end
|
data/lib/devise-two-factor.rb
CHANGED
|
@@ -41,12 +41,11 @@ module Devise
|
|
|
41
41
|
|
|
42
42
|
if self.consumed_timestep
|
|
43
43
|
# reconstruct the timestamp of the last consumed timestep
|
|
44
|
-
after_timestamp = self.consumed_timestep *
|
|
44
|
+
after_timestamp = self.consumed_timestep * totp.interval
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
end
|
|
47
|
+
timestamp = totp.verify(code.gsub(/\s+/, ""), drift_behind: self.class.otp_allowed_drift, drift_ahead: self.class.otp_allowed_drift, after: after_timestamp)
|
|
48
|
+
return consume_otp!(totp, timestamp) if timestamp
|
|
50
49
|
|
|
51
50
|
false
|
|
52
51
|
end
|
|
@@ -59,11 +58,6 @@ module Devise
|
|
|
59
58
|
otp.at(Time.now)
|
|
60
59
|
end
|
|
61
60
|
|
|
62
|
-
# ROTP's TOTP#timecode is private, so we duplicate it here
|
|
63
|
-
def current_otp_timestep
|
|
64
|
-
Time.now.utc.to_i / otp.interval
|
|
65
|
-
end
|
|
66
|
-
|
|
67
61
|
def otp_provisioning_uri(account, options = {})
|
|
68
62
|
otp_secret = options[:otp_secret] || self.otp_secret
|
|
69
63
|
ROTP::TOTP.new(otp_secret, options).provisioning_uri(account)
|
|
@@ -78,10 +72,13 @@ module Devise
|
|
|
78
72
|
|
|
79
73
|
# An OTP cannot be used more than once in a given timestep
|
|
80
74
|
# Storing timestep of last valid OTP is sufficient to satisfy this requirement
|
|
81
|
-
def consume_otp!
|
|
82
|
-
|
|
83
|
-
|
|
75
|
+
def consume_otp!(otp, timestamp)
|
|
76
|
+
timestep = timestamp / otp.interval
|
|
77
|
+
|
|
78
|
+
if self.consumed_timestep != timestep
|
|
79
|
+
self.consumed_timestep = timestep
|
|
84
80
|
save!(validate: false)
|
|
81
|
+
|
|
85
82
|
return true
|
|
86
83
|
end
|
|
87
84
|
|
|
@@ -5,7 +5,7 @@ module Devise
|
|
|
5
5
|
def authenticate!
|
|
6
6
|
resource = mapping.to.find_for_database_authentication(authentication_hash)
|
|
7
7
|
|
|
8
|
-
if validate(resource) { resource
|
|
8
|
+
if validate(resource) { validate_backup_code(resource) }
|
|
9
9
|
super
|
|
10
10
|
end
|
|
11
11
|
|
|
@@ -15,6 +15,11 @@ module Devise
|
|
|
15
15
|
# but database authenticatable automatically halts on a bad password
|
|
16
16
|
@halted = false if @result == :failure
|
|
17
17
|
end
|
|
18
|
+
|
|
19
|
+
def validate_backup_code(resource)
|
|
20
|
+
return if params[scope].nil? || params[scope]['otp_attempt'].nil?
|
|
21
|
+
resource.invalidate_otp_backup_code!(params[scope]['otp_attempt'])
|
|
22
|
+
end
|
|
18
23
|
end
|
|
19
24
|
end
|
|
20
25
|
end
|
metadata
CHANGED
|
@@ -1,121 +1,54 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: devise-two-factor
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 6.
|
|
4
|
+
version: 6.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Quinn Wilton
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
|
-
cert_chain:
|
|
11
|
-
-
|
|
12
|
-
-----BEGIN CERTIFICATE-----
|
|
13
|
-
MIIHSjCCBTKgAwIBAgIJAK2u0LojMCNgMA0GCSqGSIb3DQEBBQUAMIGcMQswCQYD
|
|
14
|
-
VQQGEwJVUzELMAkGA1UECBMCQ0ExEjAQBgNVBAcTCVBhbG8gQWx0bzEfMB0GA1UE
|
|
15
|
-
ChMWVGluZm9pbCBTZWN1cml0eSwgSW5jLjEfMB0GA1UEAxMWVGluZm9pbCBTZWN1
|
|
16
|
-
cml0eSwgSW5jLjEqMCgGCSqGSIb3DQEJARYbc3VwcG9ydEB0aW5mb2lsc2VjdXJp
|
|
17
|
-
dHkuY29tMB4XDTIxMDkwOTE4MjIwMFoXDTI1MDkwOTE4MjIwMFowgZwxCzAJBgNV
|
|
18
|
-
BAYTAlVTMQswCQYDVQQIEwJDQTESMBAGA1UEBxMJUGFsbyBBbHRvMR8wHQYDVQQK
|
|
19
|
-
ExZUaW5mb2lsIFNlY3VyaXR5LCBJbmMuMR8wHQYDVQQDExZUaW5mb2lsIFNlY3Vy
|
|
20
|
-
aXR5LCBJbmMuMSowKAYJKoZIhvcNAQkBFhtzdXBwb3J0QHRpbmZvaWxzZWN1cml0
|
|
21
|
-
eS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqbHvsSj0H0FB1
|
|
22
|
-
0gLYoDK1BKugkSB2DZeZZHP6B1UdWRahJXJP9oT1lhfQxx8iX4cgEi7JU3NqA6NR
|
|
23
|
-
cIRFQ50eH/qlmgs7909gaf8pDaeC0vR3wd0GeRg6qr1eDEnkzIyr/D1AMiX6H1eP
|
|
24
|
-
Y7J3SfrdaL3gft2iPRKGkgqsXR7oBNLA3n/ShiNgPXqRDl1CCj6aMY0cn5ROFScz
|
|
25
|
-
vT2FUB4DEwPD2l18m1p99OnXqsOLL2J65qA2+cI8FtgFmlwIi5oSf+URvIdNx+cH
|
|
26
|
-
lInlAtVHCvAKYLY0dlQ7czMQBcRpYjp2rwPt9f2ksq9b/voMTBABYHFV+IVn8svv
|
|
27
|
-
GZ5e1+icjtr/R7dCGmCdEdFLXVxafmZhukymG9USv9DKuv1qh7r4q8KaPIE8n7nQ
|
|
28
|
-
m97jENFfsgnwv+nUmIJ3tzuW5ZxO7A0tIIYdwzt0UjrO3ya4R5bTFXr4bnzZ/g/s
|
|
29
|
-
CLknWqg1BCRlPd6LnpVGPT0gNDV1pEO25wE3A3Yy0Ujxudcgay/CgUhnlU11qOAc
|
|
30
|
-
xmar2fhNZsviUhndd/220Ad5QMV2XzcAiopJIeu0juIVGRQM7x2h19Hsp0m6sOEF
|
|
31
|
-
jfhvbdUa4nvmIFeYFY+hr/YkTmG9ZjyBa8YaZXhwjhSmKCQ374J7mn5e0Cryuvi5
|
|
32
|
-
tYhwJn8rdwYZF/h2qqfEu8vaLoD09QIDAQABo4IBizCCAYcwHQYDVR0OBBYEFMmT
|
|
33
|
-
/x412UH+5OHqgleeTjLOv6iHMIHRBgNVHSMEgckwgcaAFMmT/x412UH+5OHqglee
|
|
34
|
-
TjLOv6iHoYGipIGfMIGcMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEjAQBgNV
|
|
35
|
-
BAcTCVBhbG8gQWx0bzEfMB0GA1UEChMWVGluZm9pbCBTZWN1cml0eSwgSW5jLjEf
|
|
36
|
-
MB0GA1UEAxMWVGluZm9pbCBTZWN1cml0eSwgSW5jLjEqMCgGCSqGSIb3DQEJARYb
|
|
37
|
-
c3VwcG9ydEB0aW5mb2lsc2VjdXJpdHkuY29tggkAra7QuiMwI2AwDwYDVR0TAQH/
|
|
38
|
-
BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAQYwCQYDVR0SBAIwADArBglghkgBhvhC
|
|
39
|
-
AQ0EHhYcVGlueUNBIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAmBgNVHREEHzAdgRtz
|
|
40
|
-
dXBwb3J0QHRpbmZvaWxzZWN1cml0eS5jb20wDgYDVR0PAQH/BAQDAgEGMA0GCSqG
|
|
41
|
-
SIb3DQEBBQUAA4ICAQBZy4JJSmwLuO0nZbdr4tJeVS2P8bcGi6PzAcdzVfwzjp6n
|
|
42
|
-
5qf8m4O8my4lnJieom0GrWSHQoPY1Yur4hEoZbugKO9DWZL3dTiGcrgw0TbQ6Gtq
|
|
43
|
-
TTPatW3LA21qFJwvohSvLqPdmZuM+H9g49sdl2kNTDVI6iUyMYuNpL14aPKPGBFo
|
|
44
|
-
o7UjciT1h7JtJl9b/fXrbPeRHBwpZXWeipiPGv/OZW5KnOsNlUkTquS7Zj4ETkIC
|
|
45
|
-
6mVtmsLvq+YwFthFyMU37pXwYxcmqRmH6lX+XC6AVW5oO4GBmG+Zr/Z+h5Cih5ca
|
|
46
|
-
/mX88RkO+dGTjw1IdxKmxOqKL62OBATKrTDJ/scsmRptynA4TunYW+7ikOpDbPfL
|
|
47
|
-
l18aleLISlcgWJg/Czf2nmBqAClPLnhV8qxWsvt58MQQ/Jpoggvpl8EG1PylWiBS
|
|
48
|
-
Kc/4Ad/FKQFpTzXUgDg2kV07npVjYbBzA5p4ZSWSlflFu93jb9gg2+qtnRSImVCZ
|
|
49
|
-
nQjZdsv8hebElPAIbtJjSnoH1Kz2ucYLakdF1UMKnpp1PVREtuKPz/foU9KUHs0z
|
|
50
|
-
dWRALx8cWG4uKK9AIEUlVdGKfX0Wj0qFK0KGxl3f3jObud5Agwue2EPKWwUzEGUh
|
|
51
|
-
Iqp60gNw3vBdKHw4dh1bfcbXWnRDL+OQPuOFZeMWgu1QmeHeuggYtYtRg7V5Kg==
|
|
52
|
-
-----END CERTIFICATE-----
|
|
53
|
-
- |
|
|
54
|
-
-----BEGIN CERTIFICATE-----
|
|
55
|
-
MIIGADCCA+igAwIBAgIIHIF9ta6cW3YwDQYJKoZIhvcNAQENBQAwgZwxCzAJBgNV
|
|
56
|
-
BAYTAlVTMQswCQYDVQQIEwJDQTESMBAGA1UEBxMJUGFsbyBBbHRvMR8wHQYDVQQK
|
|
57
|
-
ExZUaW5mb2lsIFNlY3VyaXR5LCBJbmMuMR8wHQYDVQQDExZUaW5mb2lsIFNlY3Vy
|
|
58
|
-
aXR5LCBJbmMuMSowKAYJKoZIhvcNAQkBFhtzdXBwb3J0QHRpbmZvaWxzZWN1cml0
|
|
59
|
-
eS5jb20wHhcNMjIwMzIyMjI1MzAwWhcNMjUwOTA5MTgyMjAwWjCBiDELMAkGA1UE
|
|
60
|
-
BhMCVVMxCzAJBgNVBAgTAkNBMR8wHQYDVQQKExZUaW5mb2lsIFNlY3VyaXR5LCBJ
|
|
61
|
-
bmMuMR0wGwYDVQQDExR0aW5mb2lsc2VjdXJpdHktZ2VtczEsMCoGCSqGSIb3DQEJ
|
|
62
|
-
ARYdZW5naW5lZXJzQHRpbmZvaWxzZWN1cml0eS5jb20wggIiMA0GCSqGSIb3DQEB
|
|
63
|
-
AQUAA4ICDwAwggIKAoICAQDNJYNH8D+8lACLt3KzjEIPs3XVBCPaMm2eD/Xk9OOT
|
|
64
|
-
uDV/NqgMK0icD9MRxMUtS3SCrC9QcPocXT76f2LQ3yVJuK+rBUasymEES47PIx2c
|
|
65
|
-
zC4n4Hga0xPPuBpioO26oaRFsobyzh9RPOIbnYfpjyqtdrbm+YyM3sPR4XzFirv9
|
|
66
|
-
xomT4E9T4RCLgOQHTcLKL9K9m+EN7PeVdVUXV0Pa7cVs2vJUKedsd7vnr6Lzbn8T
|
|
67
|
-
oPk/7J/4W931PbaeI5yg9ZuaRa9K2IaY1TkPI67NW4qKitBVepRlXw6Sb7TYcUnc
|
|
68
|
-
WEQ/eC5CpnOmqUrG5tfGD8cc5aGZOkitW/VXZgVj81xgCv1hk4HjErrqq4FBNAaC
|
|
69
|
-
SNyBfwR0TUYqg1lN1nbNjOKwfb6YRn06R2ovcFJG0tmGhsQULCr6fW8u2TfSM+U9
|
|
70
|
-
WFSIJx2griureY7EZPwg/MgsUiWUWMFemz3GVYXWJR3dN2pW9Uqr3rkjKZbA0bst
|
|
71
|
-
GWahJO9HuFdDakQxoaTPYPtTQDC+kskkO6lKG1KLIoZ1iLZzB1Ks1vEeyE7lp1im
|
|
72
|
-
WgpUq+q23PFkt1gIBi/4tGvzsLZye25QU2Y+XLzldCNm+DyRFXZ+Q+bK33IveUeU
|
|
73
|
-
WEOv4T1qTXHAOypyzmgodVRG/PrlsSMOBfE515kG1mDMGjRcCpEtlskgxUbf7qM7
|
|
74
|
-
hQIDAQABo1gwVjAJBgNVHRMEAjAAMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHBzOi8v
|
|
75
|
-
d3d3LnRpbmZvaWxzZWN1cml0eS5jb20vc2VjdXJpdHkvcmV2b2NhdGlvbl9saXN0
|
|
76
|
-
MA0GCSqGSIb3DQEBDQUAA4ICAQAiYF/m2ny/mxFvBVxHfdYuzybhCvsEUd+TSnoe
|
|
77
|
-
mqOWntY3sxCOaY0aGOMB4vyg9G+oP/kT4m63sD4uQxeuU7WOjaG2smCSS5q+PSWS
|
|
78
|
-
v63gILqPamjSyP/Om864EA6YlvVQ7nPXhVDEaiBt3iliefJGmb0wWSbbDCmq3aMb
|
|
79
|
-
WTLuax/IeY6MjJi20LutIcuz+VX8OxlA1hSpgAToMz3xrhA8fPt5UkKhkDkPFYBF
|
|
80
|
-
5htKVipyijChWsXyt33YM2qGaavTEXzxza1I99PGNRKxUMvbSMas4YaLqkBpQSc+
|
|
81
|
-
mcrLWYPiXWsePGu+j08AypE2Ubp4AOSZJN9rBBGotC3gofipo+K/sBiOM9xXI76Q
|
|
82
|
-
0HYOxXPa7D7UQQG1R9i0rcxmf9qepIVYCldmqVkKKDizcDo5UI9lRiLFjDyQhn6l
|
|
83
|
-
YFY9bPQ4lKTK5Jr3M6+dV7fHxLhqXyMGs1905IUb7qvB7Bq/f0qJfC0JZuY/qdn2
|
|
84
|
-
lL0SeFKOVsjErtobh3u8p8j2USkc8uJgIANHpXEMEExdp899CV/eVjh3TpAR7E6T
|
|
85
|
-
mg7Q9Hi6Hh8z+Le9iR4I49vPEWDQEvj35IT6VfwU79UfIOlX+DkW8fFkPbaut3Se
|
|
86
|
-
vqIDv6JBG9I16h/HhchntKfM58MI1bNZFBSdZqYOJiL8JIjP8HNIk76Y366ppG29
|
|
87
|
-
EhBYYg==
|
|
88
|
-
-----END CERTIFICATE-----
|
|
89
|
-
date: 2024-09-17 00:00:00.000000000 Z
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 2025-10-22 00:00:00.000000000 Z
|
|
90
11
|
dependencies:
|
|
91
12
|
- !ruby/object:Gem::Dependency
|
|
92
13
|
name: railties
|
|
93
14
|
requirement: !ruby/object:Gem::Requirement
|
|
94
15
|
requirements:
|
|
95
|
-
- - "
|
|
16
|
+
- - ">="
|
|
96
17
|
- !ruby/object:Gem::Version
|
|
97
18
|
version: '7.0'
|
|
19
|
+
- - "<"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '8.2'
|
|
98
22
|
type: :runtime
|
|
99
23
|
prerelease: false
|
|
100
24
|
version_requirements: !ruby/object:Gem::Requirement
|
|
101
25
|
requirements:
|
|
102
|
-
- - "
|
|
26
|
+
- - ">="
|
|
103
27
|
- !ruby/object:Gem::Version
|
|
104
28
|
version: '7.0'
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '8.2'
|
|
105
32
|
- !ruby/object:Gem::Dependency
|
|
106
33
|
name: activesupport
|
|
107
34
|
requirement: !ruby/object:Gem::Requirement
|
|
108
35
|
requirements:
|
|
109
|
-
- - "
|
|
36
|
+
- - ">="
|
|
110
37
|
- !ruby/object:Gem::Version
|
|
111
38
|
version: '7.0'
|
|
39
|
+
- - "<"
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '8.2'
|
|
112
42
|
type: :runtime
|
|
113
43
|
prerelease: false
|
|
114
44
|
version_requirements: !ruby/object:Gem::Requirement
|
|
115
45
|
requirements:
|
|
116
|
-
- - "
|
|
46
|
+
- - ">="
|
|
117
47
|
- !ruby/object:Gem::Version
|
|
118
48
|
version: '7.0'
|
|
49
|
+
- - "<"
|
|
50
|
+
- !ruby/object:Gem::Version
|
|
51
|
+
version: '8.2'
|
|
119
52
|
- !ruby/object:Gem::Dependency
|
|
120
53
|
name: devise
|
|
121
54
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -214,15 +147,29 @@ dependencies:
|
|
|
214
147
|
- - ">="
|
|
215
148
|
- !ruby/object:Gem::Version
|
|
216
149
|
version: '0'
|
|
150
|
+
- !ruby/object:Gem::Dependency
|
|
151
|
+
name: rake
|
|
152
|
+
requirement: !ruby/object:Gem::Requirement
|
|
153
|
+
requirements:
|
|
154
|
+
- - "~>"
|
|
155
|
+
- !ruby/object:Gem::Version
|
|
156
|
+
version: '13'
|
|
157
|
+
type: :development
|
|
158
|
+
prerelease: false
|
|
159
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
160
|
+
requirements:
|
|
161
|
+
- - "~>"
|
|
162
|
+
- !ruby/object:Gem::Version
|
|
163
|
+
version: '13'
|
|
217
164
|
description: Devise-Two-Factor is a minimalist extension to Devise which offers support
|
|
218
165
|
for two-factor authentication through the TOTP scheme.
|
|
219
|
-
email:
|
|
220
166
|
executables: []
|
|
221
167
|
extensions: []
|
|
222
168
|
extra_rdoc_files: []
|
|
223
169
|
files:
|
|
224
170
|
- ".github/dependabot.yml"
|
|
225
171
|
- ".github/workflows/ci.yml"
|
|
172
|
+
- ".github/workflows/push.yml"
|
|
226
173
|
- ".gitignore"
|
|
227
174
|
- ".markdownlint.json"
|
|
228
175
|
- ".rspec"
|
|
@@ -235,11 +182,12 @@ files:
|
|
|
235
182
|
- Rakefile
|
|
236
183
|
- SECURITY.md
|
|
237
184
|
- UPGRADING.md
|
|
238
|
-
- certs/tinfoil-cacert.pem
|
|
239
|
-
- certs/tinfoilsecurity-gems-cert.pem
|
|
240
185
|
- devise-two-factor.gemspec
|
|
241
186
|
- gemfiles/rails_7.0.gemfile
|
|
242
187
|
- gemfiles/rails_7.1.gemfile
|
|
188
|
+
- gemfiles/rails_7.2.gemfile
|
|
189
|
+
- gemfiles/rails_8.0.gemfile
|
|
190
|
+
- gemfiles/rails_8.1.gemfile
|
|
243
191
|
- lib/devise-two-factor.rb
|
|
244
192
|
- lib/devise_two_factor/models.rb
|
|
245
193
|
- lib/devise_two_factor/models/two_factor_authenticatable.rb
|
|
@@ -259,7 +207,6 @@ homepage: https://github.com/devise-two-factor/devise-two-factor
|
|
|
259
207
|
licenses:
|
|
260
208
|
- MIT
|
|
261
209
|
metadata: {}
|
|
262
|
-
post_install_message:
|
|
263
210
|
rdoc_options: []
|
|
264
211
|
require_paths:
|
|
265
212
|
- lib
|
|
@@ -274,8 +221,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
274
221
|
- !ruby/object:Gem::Version
|
|
275
222
|
version: '0'
|
|
276
223
|
requirements: []
|
|
277
|
-
rubygems_version: 3.
|
|
278
|
-
signing_key:
|
|
224
|
+
rubygems_version: 3.6.2
|
|
279
225
|
specification_version: 4
|
|
280
226
|
summary: Barebones two-factor authentication with Devise
|
|
281
227
|
test_files:
|
checksums.yaml.gz.sig
DELETED
|
Binary file
|
data/certs/tinfoil-cacert.pem
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
|
2
|
-
MIIHSjCCBTKgAwIBAgIJAK2u0LojMCNgMA0GCSqGSIb3DQEBBQUAMIGcMQswCQYD
|
|
3
|
-
VQQGEwJVUzELMAkGA1UECBMCQ0ExEjAQBgNVBAcTCVBhbG8gQWx0bzEfMB0GA1UE
|
|
4
|
-
ChMWVGluZm9pbCBTZWN1cml0eSwgSW5jLjEfMB0GA1UEAxMWVGluZm9pbCBTZWN1
|
|
5
|
-
cml0eSwgSW5jLjEqMCgGCSqGSIb3DQEJARYbc3VwcG9ydEB0aW5mb2lsc2VjdXJp
|
|
6
|
-
dHkuY29tMB4XDTIxMDkwOTE4MjIwMFoXDTI1MDkwOTE4MjIwMFowgZwxCzAJBgNV
|
|
7
|
-
BAYTAlVTMQswCQYDVQQIEwJDQTESMBAGA1UEBxMJUGFsbyBBbHRvMR8wHQYDVQQK
|
|
8
|
-
ExZUaW5mb2lsIFNlY3VyaXR5LCBJbmMuMR8wHQYDVQQDExZUaW5mb2lsIFNlY3Vy
|
|
9
|
-
aXR5LCBJbmMuMSowKAYJKoZIhvcNAQkBFhtzdXBwb3J0QHRpbmZvaWxzZWN1cml0
|
|
10
|
-
eS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqbHvsSj0H0FB1
|
|
11
|
-
0gLYoDK1BKugkSB2DZeZZHP6B1UdWRahJXJP9oT1lhfQxx8iX4cgEi7JU3NqA6NR
|
|
12
|
-
cIRFQ50eH/qlmgs7909gaf8pDaeC0vR3wd0GeRg6qr1eDEnkzIyr/D1AMiX6H1eP
|
|
13
|
-
Y7J3SfrdaL3gft2iPRKGkgqsXR7oBNLA3n/ShiNgPXqRDl1CCj6aMY0cn5ROFScz
|
|
14
|
-
vT2FUB4DEwPD2l18m1p99OnXqsOLL2J65qA2+cI8FtgFmlwIi5oSf+URvIdNx+cH
|
|
15
|
-
lInlAtVHCvAKYLY0dlQ7czMQBcRpYjp2rwPt9f2ksq9b/voMTBABYHFV+IVn8svv
|
|
16
|
-
GZ5e1+icjtr/R7dCGmCdEdFLXVxafmZhukymG9USv9DKuv1qh7r4q8KaPIE8n7nQ
|
|
17
|
-
m97jENFfsgnwv+nUmIJ3tzuW5ZxO7A0tIIYdwzt0UjrO3ya4R5bTFXr4bnzZ/g/s
|
|
18
|
-
CLknWqg1BCRlPd6LnpVGPT0gNDV1pEO25wE3A3Yy0Ujxudcgay/CgUhnlU11qOAc
|
|
19
|
-
xmar2fhNZsviUhndd/220Ad5QMV2XzcAiopJIeu0juIVGRQM7x2h19Hsp0m6sOEF
|
|
20
|
-
jfhvbdUa4nvmIFeYFY+hr/YkTmG9ZjyBa8YaZXhwjhSmKCQ374J7mn5e0Cryuvi5
|
|
21
|
-
tYhwJn8rdwYZF/h2qqfEu8vaLoD09QIDAQABo4IBizCCAYcwHQYDVR0OBBYEFMmT
|
|
22
|
-
/x412UH+5OHqgleeTjLOv6iHMIHRBgNVHSMEgckwgcaAFMmT/x412UH+5OHqglee
|
|
23
|
-
TjLOv6iHoYGipIGfMIGcMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEjAQBgNV
|
|
24
|
-
BAcTCVBhbG8gQWx0bzEfMB0GA1UEChMWVGluZm9pbCBTZWN1cml0eSwgSW5jLjEf
|
|
25
|
-
MB0GA1UEAxMWVGluZm9pbCBTZWN1cml0eSwgSW5jLjEqMCgGCSqGSIb3DQEJARYb
|
|
26
|
-
c3VwcG9ydEB0aW5mb2lsc2VjdXJpdHkuY29tggkAra7QuiMwI2AwDwYDVR0TAQH/
|
|
27
|
-
BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAQYwCQYDVR0SBAIwADArBglghkgBhvhC
|
|
28
|
-
AQ0EHhYcVGlueUNBIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAmBgNVHREEHzAdgRtz
|
|
29
|
-
dXBwb3J0QHRpbmZvaWxzZWN1cml0eS5jb20wDgYDVR0PAQH/BAQDAgEGMA0GCSqG
|
|
30
|
-
SIb3DQEBBQUAA4ICAQBZy4JJSmwLuO0nZbdr4tJeVS2P8bcGi6PzAcdzVfwzjp6n
|
|
31
|
-
5qf8m4O8my4lnJieom0GrWSHQoPY1Yur4hEoZbugKO9DWZL3dTiGcrgw0TbQ6Gtq
|
|
32
|
-
TTPatW3LA21qFJwvohSvLqPdmZuM+H9g49sdl2kNTDVI6iUyMYuNpL14aPKPGBFo
|
|
33
|
-
o7UjciT1h7JtJl9b/fXrbPeRHBwpZXWeipiPGv/OZW5KnOsNlUkTquS7Zj4ETkIC
|
|
34
|
-
6mVtmsLvq+YwFthFyMU37pXwYxcmqRmH6lX+XC6AVW5oO4GBmG+Zr/Z+h5Cih5ca
|
|
35
|
-
/mX88RkO+dGTjw1IdxKmxOqKL62OBATKrTDJ/scsmRptynA4TunYW+7ikOpDbPfL
|
|
36
|
-
l18aleLISlcgWJg/Czf2nmBqAClPLnhV8qxWsvt58MQQ/Jpoggvpl8EG1PylWiBS
|
|
37
|
-
Kc/4Ad/FKQFpTzXUgDg2kV07npVjYbBzA5p4ZSWSlflFu93jb9gg2+qtnRSImVCZ
|
|
38
|
-
nQjZdsv8hebElPAIbtJjSnoH1Kz2ucYLakdF1UMKnpp1PVREtuKPz/foU9KUHs0z
|
|
39
|
-
dWRALx8cWG4uKK9AIEUlVdGKfX0Wj0qFK0KGxl3f3jObud5Agwue2EPKWwUzEGUh
|
|
40
|
-
Iqp60gNw3vBdKHw4dh1bfcbXWnRDL+OQPuOFZeMWgu1QmeHeuggYtYtRg7V5Kg==
|
|
41
|
-
-----END CERTIFICATE-----
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
|
2
|
-
MIIGADCCA+igAwIBAgIIHIF9ta6cW3YwDQYJKoZIhvcNAQENBQAwgZwxCzAJBgNV
|
|
3
|
-
BAYTAlVTMQswCQYDVQQIEwJDQTESMBAGA1UEBxMJUGFsbyBBbHRvMR8wHQYDVQQK
|
|
4
|
-
ExZUaW5mb2lsIFNlY3VyaXR5LCBJbmMuMR8wHQYDVQQDExZUaW5mb2lsIFNlY3Vy
|
|
5
|
-
aXR5LCBJbmMuMSowKAYJKoZIhvcNAQkBFhtzdXBwb3J0QHRpbmZvaWxzZWN1cml0
|
|
6
|
-
eS5jb20wHhcNMjIwMzIyMjI1MzAwWhcNMjUwOTA5MTgyMjAwWjCBiDELMAkGA1UE
|
|
7
|
-
BhMCVVMxCzAJBgNVBAgTAkNBMR8wHQYDVQQKExZUaW5mb2lsIFNlY3VyaXR5LCBJ
|
|
8
|
-
bmMuMR0wGwYDVQQDExR0aW5mb2lsc2VjdXJpdHktZ2VtczEsMCoGCSqGSIb3DQEJ
|
|
9
|
-
ARYdZW5naW5lZXJzQHRpbmZvaWxzZWN1cml0eS5jb20wggIiMA0GCSqGSIb3DQEB
|
|
10
|
-
AQUAA4ICDwAwggIKAoICAQDNJYNH8D+8lACLt3KzjEIPs3XVBCPaMm2eD/Xk9OOT
|
|
11
|
-
uDV/NqgMK0icD9MRxMUtS3SCrC9QcPocXT76f2LQ3yVJuK+rBUasymEES47PIx2c
|
|
12
|
-
zC4n4Hga0xPPuBpioO26oaRFsobyzh9RPOIbnYfpjyqtdrbm+YyM3sPR4XzFirv9
|
|
13
|
-
xomT4E9T4RCLgOQHTcLKL9K9m+EN7PeVdVUXV0Pa7cVs2vJUKedsd7vnr6Lzbn8T
|
|
14
|
-
oPk/7J/4W931PbaeI5yg9ZuaRa9K2IaY1TkPI67NW4qKitBVepRlXw6Sb7TYcUnc
|
|
15
|
-
WEQ/eC5CpnOmqUrG5tfGD8cc5aGZOkitW/VXZgVj81xgCv1hk4HjErrqq4FBNAaC
|
|
16
|
-
SNyBfwR0TUYqg1lN1nbNjOKwfb6YRn06R2ovcFJG0tmGhsQULCr6fW8u2TfSM+U9
|
|
17
|
-
WFSIJx2griureY7EZPwg/MgsUiWUWMFemz3GVYXWJR3dN2pW9Uqr3rkjKZbA0bst
|
|
18
|
-
GWahJO9HuFdDakQxoaTPYPtTQDC+kskkO6lKG1KLIoZ1iLZzB1Ks1vEeyE7lp1im
|
|
19
|
-
WgpUq+q23PFkt1gIBi/4tGvzsLZye25QU2Y+XLzldCNm+DyRFXZ+Q+bK33IveUeU
|
|
20
|
-
WEOv4T1qTXHAOypyzmgodVRG/PrlsSMOBfE515kG1mDMGjRcCpEtlskgxUbf7qM7
|
|
21
|
-
hQIDAQABo1gwVjAJBgNVHRMEAjAAMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHBzOi8v
|
|
22
|
-
d3d3LnRpbmZvaWxzZWN1cml0eS5jb20vc2VjdXJpdHkvcmV2b2NhdGlvbl9saXN0
|
|
23
|
-
MA0GCSqGSIb3DQEBDQUAA4ICAQAiYF/m2ny/mxFvBVxHfdYuzybhCvsEUd+TSnoe
|
|
24
|
-
mqOWntY3sxCOaY0aGOMB4vyg9G+oP/kT4m63sD4uQxeuU7WOjaG2smCSS5q+PSWS
|
|
25
|
-
v63gILqPamjSyP/Om864EA6YlvVQ7nPXhVDEaiBt3iliefJGmb0wWSbbDCmq3aMb
|
|
26
|
-
WTLuax/IeY6MjJi20LutIcuz+VX8OxlA1hSpgAToMz3xrhA8fPt5UkKhkDkPFYBF
|
|
27
|
-
5htKVipyijChWsXyt33YM2qGaavTEXzxza1I99PGNRKxUMvbSMas4YaLqkBpQSc+
|
|
28
|
-
mcrLWYPiXWsePGu+j08AypE2Ubp4AOSZJN9rBBGotC3gofipo+K/sBiOM9xXI76Q
|
|
29
|
-
0HYOxXPa7D7UQQG1R9i0rcxmf9qepIVYCldmqVkKKDizcDo5UI9lRiLFjDyQhn6l
|
|
30
|
-
YFY9bPQ4lKTK5Jr3M6+dV7fHxLhqXyMGs1905IUb7qvB7Bq/f0qJfC0JZuY/qdn2
|
|
31
|
-
lL0SeFKOVsjErtobh3u8p8j2USkc8uJgIANHpXEMEExdp899CV/eVjh3TpAR7E6T
|
|
32
|
-
mg7Q9Hi6Hh8z+Le9iR4I49vPEWDQEvj35IT6VfwU79UfIOlX+DkW8fFkPbaut3Se
|
|
33
|
-
vqIDv6JBG9I16h/HhchntKfM58MI1bNZFBSdZqYOJiL8JIjP8HNIk76Y366ppG29
|
|
34
|
-
EhBYYg==
|
|
35
|
-
-----END CERTIFICATE-----
|
data.tar.gz.sig
DELETED
|
Binary file
|
metadata.gz.sig
DELETED
|
Binary file
|