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 +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
|
[![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
|
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
|
[![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
|
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
|