auther 6.1.0 → 7.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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +65 -53
- data/app/models/auther/account.rb +10 -2
- data/lib/auther/authenticator.rb +1 -0
- data/lib/auther/engine.rb +3 -1
- data/lib/auther/gatekeeper.rb +7 -2
- data/lib/auther/identity.rb +1 -1
- data/lib/generators/auther/install/install_generator.rb +2 -1
- metadata +8 -8
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f18a67c138885193bca861c0f4e5da9e120b24a9
|
4
|
+
data.tar.gz: 6a9dd5ea153ad990342de7f8a76abd1722a6cfe0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 339180597982acb766251a3cdb0d5ea205e71146c0cc20784cec31de12b2df37150592c41df90823579f0a2afd151ee75aa525a6d98b560739dd3e72e64e89e1
|
7
|
+
data.tar.gz: cc8a275ee79ae2734b7d9e3fe61f7fffc240be4f4ebf9c95ee0800dd9e217b4ad364e174f1aa59cea73c1afef5568dff5f81bc68303b2486b3c6502edaf38f71
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -7,10 +7,11 @@
|
|
7
7
|
[](https://travis-ci.org/bkuhlmann/auther)
|
8
8
|
[](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
|
11
|
-
of HTTP Basic Authentication or something as heavyweight as
|
12
|
-
doesn't require a database and is compatible
|
13
|
-
making for a pleasent
|
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
|
[](https://github.com/bkuhlmann/auther)
|
52
53
|
[](https://github.com/bkuhlmann/auther)
|
53
54
|
|
54
|
-
- Uses [Bourbon](http://bourbon.io), [Neat](http://neat.bourbon.io), and
|
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.
|
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
|
75
|
-
allowing the installation of unsigned dependencies since they are beyond the scope of this
|
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
|
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=
|
94
|
-
AUTHER_ADMIN_LOGIN=
|
95
|
-
AUTHER_ADMIN_PASSWORD=
|
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:
|
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
|
125
|
-
before deploying to production! To encrypt/decrypt account credentials, launch
|
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
|
128
|
-
|
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 "
|
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:
|
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
|
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.
|
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:
|
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
|
171
|
-
in attribute validation. This model could potentially be replaced with a
|
172
|
-
controller customization)...but you should question if you
|
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
|
178
|
-
validations to aid in form validation. This presenter makes it easy to construct
|
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
|
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
|
188
|
-
mentioned above). The form can be stylized by attaching new styles to the
|
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
|
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
|
203
|
-
`Auther::BaseController` for additional details or the `Auther::SessionController` for default
|
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
|
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
|
-
-
|
224
|
-
|
225
|
-
|
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).
|
228
|
-
configuration `ActionView::Base.field_error_proc = proc { |html_tag, _|
|
229
|
-
markup is added to the DOM when errors are raised. If
|
230
|
-
|
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
|
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
|
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,
|
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: {
|
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
|
data/lib/auther/authenticator.rb
CHANGED
@@ -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
|
data/lib/auther/engine.rb
CHANGED
@@ -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
|
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|
|
data/lib/auther/gatekeeper.rb
CHANGED
@@ -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}".
|
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:
|
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
|
data/lib/auther/identity.rb
CHANGED
@@ -14,7 +14,8 @@ module Auther
|
|
14
14
|
private
|
15
15
|
|
16
16
|
def install_initializer
|
17
|
-
template 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:
|
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:
|
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: '
|
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: '
|
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.
|
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.
|
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.
|
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.
|
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
|