auther 6.1.0 → 7.0.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
  SHA1:
3
- metadata.gz: ae23c670e1240c68aa73f18205a4b9edbbbeb57a
4
- data.tar.gz: 198026f67de190a9fa075483ef954f7d7076d1e4
3
+ metadata.gz: f18a67c138885193bca861c0f4e5da9e120b24a9
4
+ data.tar.gz: 6a9dd5ea153ad990342de7f8a76abd1722a6cfe0
5
5
  SHA512:
6
- metadata.gz: 32962315d8a930ad0c5df710098f14e5f47c5931b739d3a6dfd141797000bc9acd1b8bd81c2db713452dd5bbc4b4c0a53e668788de904c35f00e382af594a603
7
- data.tar.gz: 0f9a269fce1f1afd0e747c2c26a339159d14920eaaf807003b529a08537506e62b83c7549fcef18d939122b0ad7fa7067c4ff6786bb5e2569dd91a36f87df4ef
6
+ metadata.gz: 339180597982acb766251a3cdb0d5ea205e71146c0cc20784cec31de12b2df37150592c41df90823579f0a2afd151ee75aa525a6d98b560739dd3e72e64e89e1
7
+ data.tar.gz: cc8a275ee79ae2734b7d9e3fe61f7fffc240be4f4ebf9c95ee0800dd9e217b4ad364e174f1aa59cea73c1afef5568dff5f81bc68303b2486b3c6502edaf38f71
Binary file
data.tar.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -7,10 +7,11 @@
7
7
  [![Travis CI Status](https://secure.travis-ci.org/bkuhlmann/auther.svg)](https://travis-ci.org/bkuhlmann/auther)
8
8
  [![Patreon](https://img.shields.io/badge/patreon-donate-brightgreen.svg)](https://www.patreon.com/bkuhlmann)
9
9
 
10
- Provides simple, form-based authentication for apps that need security but don't want to deal with the clunky UI
11
- of HTTP Basic Authentication or something as heavyweight as [Devise](https://github.com/plataformatec/devise). It
12
- doesn't require a database and is compatible with password managers like [1Password](https://agilebits.com/onepassword)
13
- making for a pleasent user experience.
10
+ Provides simple, form-based authentication for apps that need security but don't want to deal with
11
+ the clunky UI of HTTP Basic Authentication or something as heavyweight as
12
+ [Devise](https://github.com/plataformatec/devise). It doesn't require a database and is compatible
13
+ with password managers like [1Password](https://agilebits.com/onepassword) making for a pleasent
14
+ user experience.
14
15
 
15
16
  <!-- Tocer[start]: Auto-generated, don't remove. -->
16
17
 
@@ -51,8 +52,8 @@ making for a pleasent user experience.
51
52
  [![Screenshot - Mobile Valid](doc/screenshots/mobile-valid.png)](https://github.com/bkuhlmann/auther)
52
53
  [![Screenshot - Mobile Invalid](doc/screenshots/mobile-invalid.png)](https://github.com/bkuhlmann/auther)
53
54
 
54
- - Uses [Bourbon](http://bourbon.io), [Neat](http://neat.bourbon.io), and [Bitters](http://bitters.bourbon.io) for
55
- lightweight styling.
55
+ - Uses [Bourbon](http://bourbon.io), [Neat](http://neat.bourbon.io), and
56
+ [Bitters](http://bitters.bourbon.io) for lightweight styling.
56
57
  - Uses encrypted account credentials to keep sensitive information secure.
57
58
  - Supports multiple accounts with account specific blacklists.
58
59
  - Supports customizable routes, models, presenters, views, controllers, and loggers.
@@ -61,7 +62,7 @@ making for a pleasent user experience.
61
62
 
62
63
  # Requirements
63
64
 
64
- 0. [Ruby 2.x.x](https://www.ruby-lang.org).
65
+ 0. [Ruby 2.4.x](https://www.ruby-lang.org).
65
66
  0. [Ruby on Rails 5.x.x](http://rubyonrails.org).
66
67
 
67
68
  # Setup
@@ -71,8 +72,9 @@ For a secure install, type the following from the command line (recommended):
71
72
  gem cert --add <(curl --location --silent https://www.alchemists.io/gem-public.pem)
72
73
  gem install auther --trust-policy MediumSecurity
73
74
 
74
- NOTE: A HighSecurity trust policy would be best but MediumSecurity enables signed gem verification while
75
- allowing the installation of unsigned dependencies since they are beyond the scope of this gem.
75
+ NOTE: A HighSecurity trust policy would be best but MediumSecurity enables signed gem verification
76
+ while allowing the installation of unsigned dependencies since they are beyond the scope of this
77
+ gem.
76
78
 
77
79
  For an insecure install, type the following (not recommended):
78
80
 
@@ -88,11 +90,12 @@ Run the generator to configure and initialize your application:
88
90
 
89
91
  # Usage
90
92
 
91
- Assuming you are using the [dotenv](https://github.com/bkeepers/dotenv) gem, add the following to your `.env` settings:
93
+ Assuming you are using the [dotenv](https://github.com/bkeepers/dotenv) gem, add the following to
94
+ your `.env` settings:
92
95
 
93
- AUTHER_SECRET=66is2tB4EbekG74DPGRmyQkdtZkQyNWZY6yeeNsmQ4Rpu42esdnP9X6puxpKfs64Gy2ghPu6QGTKsvQ73wXuDyWzDr
94
- AUTHER_ADMIN_LOGIN=aHdMWUhiVGRyVHBPMmhTRWNRR082MFhNdVFkL2ZaSGpvY2VoVS90dGRpRT0tLXFBWWZDRkJ4aDR3Qy9aamNOeU1JekE9PQ==--bf077a68a8e654ed9e480851c9597dae57ec34b8
95
- AUTHER_ADMIN_PASSWORD=VTloc285SVNrbnlHN0xhOTlMVEx6WnZ0VnFOMjFNWWdkZlRKdGVjZ1FtUT0tLTkrSDdweU1meVdFV1FIRnhpenZiK1E9PQ==--85c415da879ffab2491d37d767d108254d1ed57e
96
+ AUTHER_SECRET=\x14\xCE\xCB\xECc\xCFl$.\xCE\xA7J}\xEE\xD5\xEA}\x86\xE7\xF6\xE3\xF3DA\x8F\x90m\xED\xA5\xA4=Z
97
+ AUTHER_ADMIN_LOGIN=cEgyd2hHSit6NkpwN000aUNiU3BkNThxcjRRd1AyT1RmbFFqaGJRR0FjVT0tLWR6Mm1sUmxscHlxQU1leHF2d3ZoZ2c9PQ==--6d4b8bfadc54bfba6a41164675b14980caf01445
98
+ AUTHER_ADMIN_PASSWORD=LzlDekNYVW5UK05rRXZnekJuN1g5OXNhYUFRLy96TWI1NEMzbHFnVHpqND0tLUJUSGJTS1djQjlFR0ZkS0VCcE14VEE9PQ==--6331922bb9dace39e402818ce4ebf87ab9a73317
96
99
 
97
100
  Launch your Rails application and visit the following:
98
101
 
@@ -101,7 +104,7 @@ Launch your Rails application and visit the following:
101
104
  Use these credentials to login:
102
105
 
103
106
  - Login: test@test.com
104
- - Password: password
107
+ - Password: nevermore
105
108
 
106
109
  ## Initializer
107
110
 
@@ -121,21 +124,24 @@ The initializer comes installed with the following settings:
121
124
  ]
122
125
  }
123
126
 
124
- **IMPORTANT**: The encrypted secret, login, and password credentials used in the `.env` setup above must be re-encrypted
125
- before deploying to production! To encrypt/decrypt account credentials, launch a rails console and run the following:
127
+ **IMPORTANT**: The encrypted secret, login, and password credentials used in the `.env` setup above
128
+ must be re-encrypted before deploying to production! To encrypt/decrypt account credentials, launch
129
+ a rails console and run the following:
126
130
 
127
- # Best if more than 150 characters and gibberish to read. Must be equal to what is defined in the `auther_settings`.
128
- cipher = Auther::Cipher.new "vuKrwD9XWoYuv@s99?tR(9VqryiL,KV{W7wFnejUa4QcVBP+D{2rD4JfuD(mXgA=$tNK4Pfn#NeGs3o3TZ3CqNc^Qb"
131
+ # Best is generated via `SecureRandom.random_bytes 32`. `32` bytes is the minimum but using a
132
+ # number higher than `32` is recommend. Must be equal to what is defined in `auther_settings`.
133
+ cipher = Auther::Cipher.new "\x14\xCE\xCB\xECc\xCFl$.\xCE\xA7J}\xEE\xD5\xEA}\x86\xE7\xF6\xE3\xF3DA\x8F\x90m\xED\xA5\xA4=Z"
129
134
 
130
135
  # Do this to encrypt an unecrypted value.
131
136
  cipher.encrypt "test@test.com"
132
137
 
133
138
  # Do this to decrypt an encrypted value.
134
- cipher.decrypt "N3JzR213WlBISDZsMjJQNkRXbEVmYVczbVdnMHRYVHRud29lOWRCekp6ST0tLWpFMkROekUvWDBkOHZ4ZngxZHV6clE9PQ==--cd863c39991fa4bb9a35de918aa16da54514e331"
139
+ cipher.decrypt "cEgyd2hHSit6NkpwN000aUNiU3BkNThxcjRRd1AyT1RmbFFqaGJRR0FjVT0tLWR6Mm1sUmxscHlxQU1leHF2d3ZoZ2c9PQ==--6d4b8bfadc54bfba6a41164675b14980caf01445"
135
140
 
136
141
  The initializer can be customized as follows:
137
142
 
138
- - *title* - Optional. The HTML page title (as rendered within a browser tab). Default: "Authorization".
143
+ - *title* - Optional. The HTML page title (as rendered within a browser tab). Default:
144
+ "Authorization".
139
145
  - *label* - Optional. The page label (what would appear above the form). Default: "Authorization".
140
146
  - *secret* - Required. The secret passphrase used to encrypt/decrypt account credentials.
141
147
  - *accounts* - Required. The array of accounts with different or similar access to the application.
@@ -143,17 +149,18 @@ The initializer can be customized as follows:
143
149
  - *encrypted_login* - Required. The encrypted account login.
144
150
  - *encrypted_password* - Required. The encrypted account password.
145
151
  - *paths* - Required. The array of blacklisted paths for which only this account has access to.
146
- - *authorized_url* - Optional. The URL to redirect to upon successful authorization. Authorized redirection works
147
- in the order defined:
152
+ - *authorized_url* - Optional. The URL to redirect to upon successful authorization. Authorized
153
+ redirection works in the order defined:
148
154
  0. The blacklisted path (if requested prior to authorization but now authorized).
149
155
  0. The authorized URL (if defined and the blacklisted path wasn't requested).
150
156
  0. The root path (if none of the above).
151
- - *deauthorized_url* - Optional. The URL to redirect to upon successful deauthorization (i.e. logout). Deauthorized
152
- redirections works as follows (in the order defined):
157
+ - *deauthorized_url* - Optional. The URL to redirect to upon successful deauthorization (i.e.
158
+ logout). Deauthorized redirections works as follows (in the order defined):
153
159
  0. The deauthorized URL (if defined).
154
160
  0. The auth URL.
155
161
  - *auth_url* - Optional. The URL to redirect to when enforcing authentication. Default: “/login”.
156
- - *logger* - Optional. The logger used to log path/account authorization messages. Default: `Auther::NullLogger`.
162
+ - *logger* - Optional. The logger used to log path/account authorization messages. Default:
163
+ `Auther::NullLogger`.
157
164
 
158
165
  ## Routes
159
166
 
@@ -167,40 +174,42 @@ The routes can be customized as follows (installed, by default, via the install
167
174
 
168
175
  ## Model
169
176
 
170
- The [Auther::Account](app/models/auther/account.rb) is a plain old Ruby object that uses ActiveModel validations to aid
171
- in attribute validation. This model could potentially be replaced with a database-backed object (would require
172
- controller customization)...but you should question if you have outgrown the use of this gem and need a different
173
- solution altogether if it comes to that.
177
+ The [Auther::Account](app/models/auther/account.rb) is a plain old Ruby object that uses ActiveModel
178
+ validations to aid in attribute validation. This model could potentially be replaced with a
179
+ database-backed object (would require controller customization)...but you should question if you
180
+ have outgrown the use of this gem and need a different solution altogether if it comes to that.
174
181
 
175
182
  ## Presenter
176
183
 
177
- The [Auther::Presenter::Account](app/presenters/auther/account.rb) is a plain old Ruby object that uses ActiveModel
178
- validations to aid in form validation. This presenter makes it easy to construct form data for input and validation.
184
+ The [Auther::Presenter::Account](app/presenters/auther/account.rb) is a plain old Ruby object that
185
+ uses ActiveModel validations to aid in form validation. This presenter makes it easy to construct
186
+ form data for input and validation.
179
187
 
180
188
  ## View
181
189
 
182
- The view can be customized by creating the following file within your Rails application (assumes that the
183
- default Auther::SessionController implementation is sufficient):
190
+ The view can be customized by creating the following file within your Rails application (assumes
191
+ that the default Auther::SessionController implementation is sufficient):
184
192
 
185
193
  app/views/auther/session/new.html
186
194
 
187
- The form uses `@account` instance variable which is an instance of the Auther::Presenter::Account presenter (as
188
- mentioned above). The form can be stylized by attaching new styles to the .authorization class (see
189
- [auther.scss](app/assets/stylesheets/auther/auther.scss) for details).
195
+ The form uses `@account` instance variable which is an instance of the Auther::Presenter::Account
196
+ presenter (as mentioned above). The form can be stylized by attaching new styles to the
197
+ .authorization class (see [auther.scss](app/assets/stylesheets/auther/auther.scss) for details).
190
198
 
191
199
  ## Controller
192
200
 
193
201
  The [Auther::SessionController](app/controllers/auther/session_controller.rb) inherits from the
194
- [Auther::BaseController](app/controllers/auther/base_controller.rb). To customize, it is recommended that
195
- you add a controller to your app that inherits from the Auther::BaseController. Example:
202
+ [Auther::BaseController](app/controllers/auther/base_controller.rb). To customize, it is recommended
203
+ that you add a controller to your app that inherits from the Auther::BaseController. Example:
196
204
 
197
205
  # Example Path: app/controllers/session_controller.rb
198
206
  class SessionController < Auther::BaseController
199
207
  layout "example"
200
208
  end
201
209
 
202
- This allows customization of session controller behavior to serve any special business needs. See the
203
- `Auther::BaseController` for additional details or the `Auther::SessionController` for default implementation.
210
+ This allows customization of session controller behavior to serve any special business needs. See
211
+ the `Auther::BaseController` for additional details or the `Auther::SessionController` for default
212
+ implementation.
204
213
 
205
214
  ## Logging
206
215
 
@@ -210,8 +219,8 @@ As mentioned in the setup above, the logger can be customized as follows:
210
219
  ActiveSupport::Logger.new("log/#{Rails.env}.log") # Can be used to log to the environment log.
211
220
  Logger.new(STDOUT) # Can be used to log to standard output.
212
221
 
213
- When logging is enabled, you'll be able to see the following information in the server logs to help debug custom
214
- Auther settings:
222
+ When logging is enabled, you'll be able to see the following information in the server logs to help
223
+ debug custom Auther settings:
215
224
 
216
225
  - Requested path and blacklist path detection.
217
226
  - Finding (or not finding) of account.
@@ -220,15 +229,17 @@ Auther settings:
220
229
 
221
230
  ## Troubleshooting
222
231
 
223
- - If upgrading Rails, changing the cookie/session settings, generating a new secret base key, etc. this might
224
- cause Auther authentication to fail. Make sure to clear your browser cookies in this situation or use Google
225
- Chrome (incognito mode) to verify.
232
+ - With Ruby 2.4.0, it's imporant that the secret is generated via `SecureRandom.random_bytes`. Use
233
+ `32` bytes or higher for a secure secret.
234
+ - If upgrading Rails, changing the cookie/session settings, generating a new secret base key, etc.
235
+ this might cause Auther authentication to fail. Make sure to clear your browser cookies in this
236
+ situation or use Google Chrome (incognito mode) to verify.
226
237
  - If the authentication view/form looks broken (stylewise) this could be due to custom
227
- `ActionView::Base.field_error_proc` settings defined by your app (usually via an initializer). Auther uses this
228
- configuration `ActionView::Base.field_error_proc = proc { |html_tag, _| html_tag.html_safe }` so that no additional
229
- markup is added to the DOM when errors are raised. If you have customized this to something else, you might want to
230
- read the usage documentation (mentioned above) to rebuild the authentication view/form for your specific business
231
- needs.
238
+ `ActionView::Base.field_error_proc` settings defined by your app (usually via an initializer).
239
+ Auther uses this configuration `ActionView::Base.field_error_proc = proc { |html_tag, _|
240
+ html_tag.html_safe }` so that no additional markup is added to the DOM when errors are raised. If
241
+ you have customized this to something else, you might want to read the usage documentation
242
+ (mentioned above) to rebuild the authentication view/form for your specific business needs.
232
243
 
233
244
  # Tests
234
245
 
@@ -246,8 +257,8 @@ Read [Semantic Versioning](http://semver.org) for details. Briefly, it means:
246
257
 
247
258
  # Code of Conduct
248
259
 
249
- Please note that this project is released with a [CODE OF CONDUCT](CODE_OF_CONDUCT.md). By participating in this project
250
- you agree to abide by its terms.
260
+ Please note that this project is released with a [CODE OF CONDUCT](CODE_OF_CONDUCT.md). By
261
+ participating in this project you agree to abide by its terms.
251
262
 
252
263
  # Contributions
253
264
 
@@ -265,4 +276,5 @@ Built with [Gemsmith](https://github.com/bkuhlmann/gemsmith).
265
276
 
266
277
  # Credits
267
278
 
268
- Developed by [Brooke Kuhlmann](https://www.alchemists.io) at [Alchemists](https://www.alchemists.io).
279
+ Developed by [Brooke Kuhlmann](https://www.alchemists.io) at
280
+ [Alchemists](https://www.alchemists.io).
@@ -7,10 +7,18 @@ module Auther
7
7
  class Account
8
8
  include ActiveModel::Validations
9
9
 
10
- attr_accessor :name, :encrypted_login, :encrypted_password, :paths, :authorized_url, :deauthorized_url
10
+ attr_accessor :name,
11
+ :encrypted_login,
12
+ :encrypted_password,
13
+ :paths,
14
+ :authorized_url,
15
+ :deauthorized_url
11
16
 
12
17
  validates :name, :encrypted_login, :encrypted_password, presence: true
13
- validates :paths, presence: {unless: ->(account) { account.paths.is_a? Array }, message: "must be an array"}
18
+ validates :paths, presence: {
19
+ unless: ->(account) { account.paths.is_a? Array },
20
+ message: "must be an array"
21
+ }
14
22
 
15
23
  def initialize options = {}
16
24
  @name = options.fetch :name, nil
@@ -3,6 +3,7 @@
3
3
  module Auther
4
4
  # Manages account authentication.
5
5
  class Authenticator
6
+ # rubocop:disable Metrics/ParameterLists
6
7
  def initialize secret, account_model, account_presenter, logger: Auther::NullLogger.new(STDOUT)
7
8
  @cipher = Auther::Cipher.new secret
8
9
  @account_model = account_model
@@ -12,7 +12,9 @@ module Auther
12
12
  config.action_view.field_error_proc = proc { |html_tag, _| html_tag.html_safe }
13
13
 
14
14
  config.to_prepare do
15
- Dir.glob(Engine.root + "app/presenters/**/*.rb").each { |presenter| require_dependency presenter }
15
+ Dir.glob(Engine.root + "app/presenters/**/*.rb").each do |presenter|
16
+ require_dependency presenter
17
+ end
16
18
  end
17
19
 
18
20
  initializer "auther.initialize" do |app|
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Auther
4
4
  # Rack middleware that guards access to sensitive routes.
5
+ # rubocop:disable Metrics/ClassLength
5
6
  class Gatekeeper
6
7
  attr_reader :application, :environment, :settings
7
8
 
@@ -53,8 +54,11 @@ module Auther
53
54
  end
54
55
  end
55
56
 
57
+ # rubocop:disable Metrics/ParameterLists
56
58
  def log_authorization authorized, account_name, blacklist, request_path
57
- details = %(Account: "#{account_name}". Blacklist: #{blacklist}. Request Path: "#{request_path}".)
59
+ details = %(Account: "#{account_name}". ) +
60
+ %(Blacklist: #{blacklist}. ) +
61
+ %(Request Path: "#{request_path}".)
58
62
 
59
63
  if authorized
60
64
  log_info %(Authorization passed. #{details})
@@ -118,7 +122,8 @@ module Auther
118
122
 
119
123
  def authorized? path
120
124
  if blacklisted_matched_paths(path).any?
121
- log_info %(Requested path "#{request.path}" found in blacklisted paths: #{blacklisted_paths}.)
125
+ log_info %(Requested path "#{request.path}" found in blacklisted paths: ) +
126
+ %(#{blacklisted_paths}.)
122
127
  account = find_account
123
128
  account && authenticated?(account) && account_authorized?(account, path)
124
129
  else
@@ -12,7 +12,7 @@ module Auther
12
12
  end
13
13
 
14
14
  def self.version
15
- "6.1.0"
15
+ "7.0.0"
16
16
  end
17
17
 
18
18
  def self.version_label
@@ -14,7 +14,8 @@ module Auther
14
14
  private
15
15
 
16
16
  def install_initializer
17
- template File.join("config", "initializers", "auther.rb"), File.join("config", "initializers", "auther.rb")
17
+ template File.join("config", "initializers", "auther.rb"),
18
+ File.join("config", "initializers", "auther.rb")
18
19
  end
19
20
 
20
21
  def add_routes
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: auther
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.0
4
+ version: 7.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
@@ -30,7 +30,7 @@ cert_chain:
30
30
  n/LUZ1dKhIHzfKx1B4+TEIefArObGfkLIDM8+Dq1RX7TF1k81Men7iu4MgE9bYBn
31
31
  3dE+xI3FdB5gWcdWxdtgRCmWjtXeYYyb4z6NQQ==
32
32
  -----END CERTIFICATE-----
33
- date: 2016-12-18 00:00:00.000000000 Z
33
+ date: 2017-01-22 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: rails
@@ -122,14 +122,14 @@ dependencies:
122
122
  requirements:
123
123
  - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: '8.2'
125
+ version: '9.0'
126
126
  type: :development
127
127
  prerelease: false
128
128
  version_requirements: !ruby/object:Gem::Requirement
129
129
  requirements:
130
130
  - - "~>"
131
131
  - !ruby/object:Gem::Version
132
- version: '8.2'
132
+ version: '9.0'
133
133
  - !ruby/object:Gem::Dependency
134
134
  name: pg
135
135
  requirement: !ruby/object:Gem::Requirement
@@ -304,14 +304,14 @@ dependencies:
304
304
  requirements:
305
305
  - - "~>"
306
306
  - !ruby/object:Gem::Version
307
- version: '0.46'
307
+ version: '0.47'
308
308
  type: :development
309
309
  prerelease: false
310
310
  version_requirements: !ruby/object:Gem::Requirement
311
311
  requirements:
312
312
  - - "~>"
313
313
  - !ruby/object:Gem::Version
314
- version: '0.46'
314
+ version: '0.47'
315
315
  - !ruby/object:Gem::Dependency
316
316
  name: codeclimate-test-reporter
317
317
  requirement: !ruby/object:Gem::Requirement
@@ -376,7 +376,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
376
376
  requirements:
377
377
  - - "~>"
378
378
  - !ruby/object:Gem::Version
379
- version: '2.3'
379
+ version: '2.4'
380
380
  required_rubygems_version: !ruby/object:Gem::Requirement
381
381
  requirements:
382
382
  - - ">="
@@ -384,7 +384,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
384
384
  version: '0'
385
385
  requirements: []
386
386
  rubyforge_project:
387
- rubygems_version: 2.6.8
387
+ rubygems_version: 2.6.9
388
388
  signing_key:
389
389
  specification_version: 4
390
390
  summary: Enhances Rails with multi-account, form-based, database-less, application-wide
metadata.gz.sig CHANGED
Binary file