devise-security 0.11.1 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.circleci/config.yml +41 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +22 -2
- data/.ruby-version +1 -1
- data/.travis.yml +15 -3
- data/Appraisals +19 -0
- data/Gemfile +1 -0
- data/README.md +15 -10
- data/Rakefile +3 -1
- data/app/controllers/devise/paranoid_verification_code_controller.rb +1 -1
- data/app/controllers/devise/password_expired_controller.rb +1 -1
- data/app/views/devise/paranoid_verification_code/show.html.erb +2 -2
- data/app/views/devise/password_expired/show.html.erb +5 -5
- data/config/locales/de.yml +7 -7
- data/config/locales/en.yml +8 -8
- data/config/locales/es.yml +8 -8
- data/devise-security.gemspec +12 -6
- data/gemfiles/rails_4.1_stable.gemfile +8 -0
- data/gemfiles/rails_4.2_stable.gemfile +8 -0
- data/gemfiles/rails_5.0_stable.gemfile +8 -0
- data/gemfiles/rails_5.1_stable.gemfile +8 -0
- data/gemfiles/rails_5.2_rc1.gemfile +8 -0
- data/lib/devise-security/controllers/helpers.rb +2 -2
- data/lib/devise-security/hooks/session_limitable.rb +3 -3
- data/lib/devise-security/models/compatibility.rb +22 -0
- data/lib/devise-security/models/expirable.rb +13 -13
- data/lib/devise-security/models/old_password.rb +1 -1
- data/lib/devise-security/models/paranoid_verification.rb +5 -2
- data/lib/devise-security/models/password_archivable.rb +34 -38
- data/lib/devise-security/models/password_expirable.rb +1 -1
- data/lib/devise-security/models/secure_validatable.rb +16 -14
- data/lib/devise-security/models/security_questionable.rb +1 -2
- data/lib/devise-security/models/session_limitable.rb +3 -3
- data/lib/devise-security/orm/active_record.rb +1 -3
- data/lib/devise-security/patches/confirmations_controller_captcha.rb +2 -2
- data/lib/devise-security/patches/confirmations_controller_security_question.rb +2 -2
- data/lib/devise-security/patches/passwords_controller_captcha.rb +2 -2
- data/lib/devise-security/patches/passwords_controller_security_question.rb +2 -2
- data/lib/devise-security/patches/registrations_controller_captcha.rb +2 -2
- data/lib/devise-security/patches/sessions_controller_captcha.rb +3 -3
- data/lib/devise-security/patches/unlocks_controller_captcha.rb +2 -2
- data/lib/devise-security/patches/unlocks_controller_security_question.rb +2 -2
- data/lib/devise-security/rails.rb +2 -2
- data/lib/devise-security/routes.rb +2 -3
- data/lib/devise-security/schema.rb +11 -6
- data/lib/devise-security/version.rb +1 -1
- data/test/dummy/app/models/application_record.rb +3 -0
- data/test/dummy/app/models/captcha_user.rb +1 -1
- data/test/dummy/app/models/security_question_user.rb +2 -3
- data/test/dummy/app/models/user.rb +21 -4
- data/test/dummy/app/models/widget.rb +4 -0
- data/test/dummy/config/environments/test.rb +10 -2
- data/test/dummy/config/initializers/devise.rb +1 -0
- data/test/dummy/config/secrets.yml +1 -2
- data/test/dummy/db/migrate/20120508165529_create_tables.rb +9 -3
- data/test/dummy/db/migrate/20180318103603_add_expireable_columns.rb +6 -0
- data/test/dummy/db/migrate/20180318105329_add_confirmable_columns.rb +8 -0
- data/test/dummy/db/migrate/20180318105732_add_rememberable_columns.rb +5 -0
- data/test/dummy/db/migrate/20180318111336_add_recoverable_columns.rb +6 -0
- data/test/dummy/db/migrate/20180319114023_add_widget.rb +8 -0
- data/test/test_captcha_controller.rb +13 -13
- data/test/test_helper.rb +7 -0
- data/test/test_paranoid_verification.rb +2 -2
- data/test/test_password_archivable.rb +27 -13
- data/test/test_password_expirable.rb +2 -2
- data/test/test_password_expired_controller.rb +25 -10
- data/test/test_security_question_controller.rb +45 -21
- metadata +90 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4ccd3b9a01ec2f531013bbed8d14cbf3131f2630d2c2d1a56d119268f1aa696c
|
4
|
+
data.tar.gz: f9305b860b267fd4f49dc724864d1d822c1e4d0f952be56f78d02d1c6b1a1b3c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f176d4afaee6b712cc7fa83c234cca6f286729f8a03660c33d10cf5cd363f49f70e56440f3e9e960f275ef4f7b2a846f60984af73e46e55f73266b431314cee1
|
7
|
+
data.tar.gz: 00e810e6e1c6c1845cc67d534206378c111499f09bb849a8d4129b20bc4c52a89b9261cfaf07ec7bb243995cc016f50f26c99eba29a9c1c148b3d9ec8b6632c5
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Ruby CircleCI 2.0 configuration file
|
2
|
+
#
|
3
|
+
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
|
4
|
+
#
|
5
|
+
version: 2
|
6
|
+
jobs:
|
7
|
+
build:
|
8
|
+
docker:
|
9
|
+
# specify the version you desire here
|
10
|
+
- image: circleci/ruby:2.4.1-node-browsers
|
11
|
+
|
12
|
+
# Specify service dependencies here if necessary
|
13
|
+
# CircleCI maintains a library of pre-built images
|
14
|
+
# documented at https://circleci.com/docs/2.0/circleci-images/
|
15
|
+
# - image: circleci/postgres:9.4
|
16
|
+
|
17
|
+
working_directory: ~/repo
|
18
|
+
|
19
|
+
steps:
|
20
|
+
- checkout
|
21
|
+
|
22
|
+
# Download and cache dependencies
|
23
|
+
- restore_cache:
|
24
|
+
keys:
|
25
|
+
# fallback to using the latest cache if no exact match is found
|
26
|
+
- v1-dependencies-
|
27
|
+
|
28
|
+
- run:
|
29
|
+
name: install dependencies
|
30
|
+
command: |
|
31
|
+
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
32
|
+
|
33
|
+
- save_cache:
|
34
|
+
paths:
|
35
|
+
- ./vendor/bundle
|
36
|
+
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
37
|
+
|
38
|
+
# run tests!
|
39
|
+
- run:
|
40
|
+
name: run tests
|
41
|
+
command: bundle exec rake
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
AllCops:
|
2
|
-
TargetRubyVersion: 2.
|
2
|
+
TargetRubyVersion: 2.3
|
3
3
|
Include:
|
4
4
|
- '**/Rakefile'
|
5
5
|
- '**/config.ru'
|
@@ -20,9 +20,29 @@ Rails:
|
|
20
20
|
Metrics/MethodLength:
|
21
21
|
Enabled: false
|
22
22
|
|
23
|
+
Metrics/LineLength:
|
24
|
+
Max: 100
|
25
|
+
|
26
|
+
Naming/FileName:
|
27
|
+
Exclude: ["devise-security.gemspec"]
|
28
|
+
|
29
|
+
Style/ClassAndModuleChildren:
|
30
|
+
EnforcedStyle: compact
|
31
|
+
SupportedStyles:
|
32
|
+
- nested
|
33
|
+
- compact
|
34
|
+
|
35
|
+
Style/HashSyntax:
|
36
|
+
EnforcedStyle: ruby19
|
37
|
+
|
38
|
+
Style/SymbolArray:
|
39
|
+
EnforcedStyle: brackets
|
40
|
+
|
23
41
|
# Trailing commas make for clearer diffs because the last line won't appear
|
24
42
|
# to have been changed, as it would if it lacked a comma and had one added.
|
25
|
-
Style/
|
43
|
+
Style/TrailingCommaInArrayLiteral:
|
44
|
+
EnforcedStyleForMultiline: comma
|
45
|
+
Style/TrailingCommaInHashLiteral:
|
26
46
|
EnforcedStyleForMultiline: comma
|
27
47
|
Style/TrailingCommaInArguments:
|
28
48
|
EnforcedStyleForMultiline: comma
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.2.
|
1
|
+
2.2.9
|
data/.travis.yml
CHANGED
@@ -4,10 +4,22 @@ install: bundle install --jobs=3 --retry=3
|
|
4
4
|
before_script: bundle install
|
5
5
|
script: bundle exec rake
|
6
6
|
rvm:
|
7
|
-
- 2.2.
|
8
|
-
- 2.3.
|
9
|
-
- 2.4.
|
7
|
+
- 2.2.9
|
8
|
+
- 2.3.6
|
9
|
+
- 2.4.3
|
10
|
+
- 2.5.0
|
10
11
|
- ruby-head
|
11
12
|
matrix:
|
12
13
|
allow_failures:
|
13
14
|
- rvm: ruby-head
|
15
|
+
- gemfile: gemfiles/rails_5.2_rc1.gemfile
|
16
|
+
- rvm: 2.4.3
|
17
|
+
gemfile: gemfiles/rails_4.1_stable.gemfile
|
18
|
+
- rvm: 2.5.0
|
19
|
+
gemfile: gemfiles/rails_4.1_stable.gemfile
|
20
|
+
gemfile:
|
21
|
+
- gemfiles/rails_4.1_stable.gemfile
|
22
|
+
- gemfiles/rails_4.2_stable.gemfile
|
23
|
+
- gemfiles/rails_5.0_stable.gemfile
|
24
|
+
- gemfiles/rails_5.1_stable.gemfile
|
25
|
+
- gemfiles/rails_5.2_rc1.gemfile
|
data/Appraisals
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
appraise 'rails-4.1-stable' do
|
2
|
+
gem 'rails', '~> 4.1.0'
|
3
|
+
end
|
4
|
+
|
5
|
+
appraise 'rails-4.2-stable' do
|
6
|
+
gem 'rails', '~> 4.2.0'
|
7
|
+
end
|
8
|
+
|
9
|
+
appraise 'rails-5.0-stable' do
|
10
|
+
gem 'rails', '~> 5.0.0'
|
11
|
+
end
|
12
|
+
|
13
|
+
appraise 'rails-5.1-stable' do
|
14
|
+
gem 'rails', '~> 5.1.0'
|
15
|
+
end
|
16
|
+
|
17
|
+
appraise 'rails-5.2-rc1' do
|
18
|
+
gem 'rails', '~> 5.2.0.rc1'
|
19
|
+
end
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
# Devise Security
|
2
2
|
|
3
3
|
[![Build Status](https://travis-ci.org/devise-security/devise-security.svg?branch=master)](https://travis-ci.org/devise-security/devise-security)
|
4
|
+
[![Coverage Status](https://coveralls.io/repos/github/devise-security/devise-security/badge.svg?branch=master)](https://coveralls.io/github/devise-security/devise-security?branch=master)
|
5
|
+
[![Maintainability](https://api.codeclimate.com/v1/badges/ace7cd003a0db8bffa5a/maintainability)](https://codeclimate.com/github/devise-security/devise-security/maintainability)
|
4
6
|
|
5
7
|
A [Devise](https://github.com/plataformatec/devise) extension to add additional security features required by modern web applications. Forked from [Devise Security Extension](https://github.com/phatworx/devise_security_extension)
|
6
8
|
|
7
9
|
It is composed of 7 additional Devise modules:
|
8
10
|
|
9
|
-
* `:password_expirable` - passwords will expire after a configured time (and will need an update). You will most likely want to use `:password_expirable` together with the `:password_archivable` module to [prevent the current expired password being reused](https://github.com/phatworx/
|
11
|
+
* `:password_expirable` - passwords will expire after a configured time (and will need an update). You will most likely want to use `:password_expirable` together with the `:password_archivable` module to [prevent the current expired password being reused](https://github.com/phatworx/devise_security_extension/issues/175) immediately as the new password.
|
10
12
|
* `:secure_validatable` - better way to validate a model (email, stronger password validation). Don't use with Devise `:validatable` module!
|
11
13
|
* `:password_archivable` - save used passwords in an `old_passwords` table for history checks (don't be able to use a formerly used password)
|
12
14
|
* `:session_limitable` - ensures, that there is only one session usable per account at once
|
@@ -22,7 +24,7 @@ Configuration and database schema for each module below.
|
|
22
24
|
|
23
25
|
## Getting started
|
24
26
|
|
25
|
-
Devise Security works with Devise on Rails
|
27
|
+
Devise Security works with Devise on Rails 4.1 onwards. You can add it to your Gemfile after you successfully set up Devise (see [Devise documentation](https://github.com/plataformatec/devise)) with:
|
26
28
|
|
27
29
|
```ruby
|
28
30
|
gem 'devise-security'
|
@@ -120,6 +122,8 @@ rails generate easy_captcha:install
|
|
120
122
|
|
121
123
|
## Schema
|
122
124
|
|
125
|
+
Note: Unlike Devise, devise-security does not currently support mongoid. Pull requests are welcome!
|
126
|
+
|
123
127
|
### Password expirable
|
124
128
|
```ruby
|
125
129
|
create_table :the_resources do |t|
|
@@ -133,12 +137,13 @@ add_index :the_resources, :password_changed_at
|
|
133
137
|
### Password archivable
|
134
138
|
```ruby
|
135
139
|
create_table :old_passwords do |t|
|
136
|
-
t.string :encrypted_password, :
|
137
|
-
t.string :password_archivable_type, :
|
138
|
-
t.integer :password_archivable_id, :
|
140
|
+
t.string :encrypted_password, null: false
|
141
|
+
t.string :password_archivable_type, null: false
|
142
|
+
t.integer :password_archivable_id, null: false
|
143
|
+
t.string :password_salt # Optional. bcrypt stores the salt in the encrypted password field so this column may not be necessary.
|
139
144
|
t.datetime :created_at
|
140
145
|
end
|
141
|
-
add_index :old_passwords, [:password_archivable_type, :password_archivable_id], :
|
146
|
+
add_index :old_passwords, [:password_archivable_type, :password_archivable_id], name: :index_password_archivable
|
142
147
|
```
|
143
148
|
|
144
149
|
### Session limitable
|
@@ -146,7 +151,7 @@ add_index :old_passwords, [:password_archivable_type, :password_archivable_id],
|
|
146
151
|
create_table :the_resources do |t|
|
147
152
|
# other devise fields
|
148
153
|
|
149
|
-
t.string :unique_session_id, :
|
154
|
+
t.string :unique_session_id, limit: 20
|
150
155
|
end
|
151
156
|
```
|
152
157
|
|
@@ -189,8 +194,8 @@ end
|
|
189
194
|
|
190
195
|
```ruby
|
191
196
|
create_table :security_questions do |t|
|
192
|
-
t.string :locale, :
|
193
|
-
t.string :name, :
|
197
|
+
t.string :locale, null: false
|
198
|
+
t.string :name, null: false
|
194
199
|
end
|
195
200
|
|
196
201
|
SecurityQuestion.create! locale: :de, name: 'Wie lautet der Geburstname Ihrer Mutter?'
|
@@ -222,7 +227,7 @@ end
|
|
222
227
|
## Requirements
|
223
228
|
|
224
229
|
* Devise (https://github.com/plataformatec/devise)
|
225
|
-
* Rails
|
230
|
+
* Rails 4.1 onwards (http://github.com/rails/rails)
|
226
231
|
* recommendations:
|
227
232
|
* `autocomplete-off` (http://github.com/phatworx/autocomplete-off)
|
228
233
|
* `easy_captcha` (http://github.com/phatworx/easy_captcha)
|
data/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class Devise::ParanoidVerificationCodeController < DeviseController
|
2
2
|
skip_before_action :handle_paranoid_verification
|
3
|
-
prepend_before_action :authenticate_scope!, :
|
3
|
+
prepend_before_action :authenticate_scope!, only: [:show, :update]
|
4
4
|
|
5
5
|
def show
|
6
6
|
if !resource.nil? && resource.need_paranoid_verification?
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Devise::PasswordExpiredController < DeviseController
|
2
2
|
skip_before_action :handle_password_change
|
3
3
|
before_action :skip_password_change, only: [:show, :update]
|
4
|
-
prepend_before_action :authenticate_scope!, :
|
4
|
+
prepend_before_action :authenticate_scope!, only: [:show, :update]
|
5
5
|
|
6
6
|
def show
|
7
7
|
respond_with(resource)
|
@@ -1,10 +1,10 @@
|
|
1
1
|
<h2>Submit verification code</h2>
|
2
2
|
|
3
|
-
<%= form_for(resource, :
|
3
|
+
<%= form_for(resource, as: resource_name, url: [resource_name, :paranoid_verification_code], html: { method: :put }) do |f| %>
|
4
4
|
<%= devise_error_messages! %>
|
5
5
|
|
6
6
|
<p><%= f.label :paranoid_verification_code, 'Verification code' %><br />
|
7
7
|
<%= f.text_field :paranoid_verification_code, value: '' %></p>
|
8
8
|
|
9
|
-
<p><%= f.submit
|
9
|
+
<p><%= f.submit 'Submit' %></p>
|
10
10
|
<% end %>
|
@@ -1,16 +1,16 @@
|
|
1
1
|
<h2>Renew your password</h2>
|
2
2
|
|
3
|
-
<%= form_for(resource, :
|
3
|
+
<%= form_for(resource, as: resource_name, url: [resource_name, :password_expired], html: { method: :put }) do |f| %>
|
4
4
|
<%= devise_error_messages! %>
|
5
5
|
|
6
|
-
<p><%= f.label :current_password,
|
6
|
+
<p><%= f.label :current_password, 'Current password' %><br />
|
7
7
|
<%= f.password_field :current_password %></p>
|
8
8
|
|
9
|
-
<p><%= f.label :password,
|
9
|
+
<p><%= f.label :password, 'New password' %><br />
|
10
10
|
<%= f.password_field :password %></p>
|
11
11
|
|
12
|
-
<p><%= f.label :password_confirmation,
|
12
|
+
<p><%= f.label :password_confirmation, 'Confirm new password' %><br />
|
13
13
|
<%= f.password_field :password_confirmation %></p>
|
14
14
|
|
15
|
-
<p><%= f.submit
|
15
|
+
<p><%= f.submit 'Change my password' %></p>
|
16
16
|
<% end %>
|
data/config/locales/de.yml
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
de:
|
2
2
|
errors:
|
3
3
|
messages:
|
4
|
-
taken_in_past:
|
5
|
-
equal_to_current_password:
|
6
|
-
password_format:
|
4
|
+
taken_in_past: 'wurde bereits in der Vergangenheit verwendet!'
|
5
|
+
equal_to_current_password: 'darf nicht dem aktuellen Passwort entsprechen!'
|
6
|
+
password_format: 'müssen große, kleine Buchstaben und Ziffern enthalten'
|
7
7
|
devise:
|
8
|
-
invalid_captcha:
|
8
|
+
invalid_captcha: 'Die Captchaeingabe ist nicht gültig!'
|
9
9
|
paranoid_verify:
|
10
|
-
code_required:
|
10
|
+
code_required: 'Bitte geben Sie den Code unser Support-Team zur Verfügung gestellt'
|
11
11
|
password_expired:
|
12
|
-
updated:
|
13
|
-
change_required:
|
12
|
+
updated: 'Das neue Passwort wurde übernommen.'
|
13
|
+
change_required: 'Ihr Passwort ist abgelaufen. Bitte vergeben sie ein neues Passwort!'
|
14
14
|
failure:
|
15
15
|
session_limited: 'Ihre Anmeldedaten wurden in einem anderen Browser genutzt. Bitte melden Sie sich erneut an, um in diesem Browser fortzufahren.'
|
16
16
|
expired: 'Ihr Account ist aufgrund zu langer Inaktiviät abgelaufen. Bitte kontaktieren Sie den Administrator.'
|
data/config/locales/en.yml
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
en:
|
2
2
|
errors:
|
3
3
|
messages:
|
4
|
-
taken_in_past:
|
5
|
-
equal_to_current_password:
|
6
|
-
password_format:
|
4
|
+
taken_in_past: 'was used previously.'
|
5
|
+
equal_to_current_password: 'must be different than the current password.'
|
6
|
+
password_format: 'must contain big, small letters and digits'
|
7
7
|
devise:
|
8
|
-
invalid_captcha:
|
9
|
-
invalid_security_question:
|
8
|
+
invalid_captcha: 'The captcha input was invalid.'
|
9
|
+
invalid_security_question: 'The security question answer was invalid.'
|
10
10
|
paranoid_verify:
|
11
|
-
code_required:
|
11
|
+
code_required: 'Please enter the code our support team provided'
|
12
12
|
password_expired:
|
13
|
-
updated:
|
14
|
-
change_required:
|
13
|
+
updated: 'Your new password is saved.'
|
14
|
+
change_required: 'Your password is expired. Please renew your password.'
|
15
15
|
failure:
|
16
16
|
session_limited: 'Your login credentials were used in another browser. Please sign in again to continue in this browser.'
|
17
17
|
expired: 'Your account has expired due to inactivity. Please contact the site administrator.'
|
data/config/locales/es.yml
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
es:
|
2
2
|
errors:
|
3
3
|
messages:
|
4
|
-
taken_in_past:
|
5
|
-
equal_to_current_password:
|
6
|
-
password_format:
|
4
|
+
taken_in_past: 'la contraseña fue usada previamente, favor elegir otra.'
|
5
|
+
equal_to_current_password: 'tiene que ser diferente a la contraseña actual.'
|
6
|
+
password_format: 'tiene que contener mayúsculas, minúsculas y digitos '
|
7
7
|
devise:
|
8
|
-
invalid_captcha:
|
9
|
-
invalid_security_question:
|
8
|
+
invalid_captcha: 'El captcha ingresado es inválido.'
|
9
|
+
invalid_security_question: 'La respuesta a la pregunta de suguridad fue incorrecta.'
|
10
10
|
paranoid_verify:
|
11
|
-
code_required:
|
11
|
+
code_required: 'Por favor ingrese el código provisto por nuestro equipo de soporte'
|
12
12
|
password_expired:
|
13
|
-
updated:
|
14
|
-
change_required:
|
13
|
+
updated: 'Su nueva contraña ha sido guardada.'
|
14
|
+
change_required: 'Su contraña ha expirado. Por favor renueve su contraseña.'
|
15
15
|
failure:
|
16
16
|
session_limited: 'Sus credenciales de inicio de sesión fueron usadas en otro navegador. Por favor inicie sesión nuevamente para continuar en éste navegador.'
|
17
17
|
expired: 'Su cuenta ha expirado debido a inactividad. Por favor contacte al administrador de la aplicación.'
|
data/devise-security.gemspec
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
3
5
|
require 'devise-security/version'
|
4
6
|
|
5
7
|
Gem::Specification.new do |s|
|
@@ -10,7 +12,7 @@ Gem::Specification.new do |s|
|
|
10
12
|
s.summary = 'Security extension for devise'
|
11
13
|
s.email = 'natebird@gmail.com'
|
12
14
|
s.homepage = 'https://github.com/devise-security/devise-security'
|
13
|
-
s.description = 'An enterprise security extension for devise
|
15
|
+
s.description = 'An enterprise security extension for devise.'
|
14
16
|
s.authors = [
|
15
17
|
'Marco Scholl', 'Alexander Dreher', 'Nate Bird', 'Dillon Welch'
|
16
18
|
]
|
@@ -18,20 +20,24 @@ Gem::Specification.new do |s|
|
|
18
20
|
s.files = `git ls-files`.split("\n")
|
19
21
|
s.test_files = `git ls-files -- test/*`.split("\n")
|
20
22
|
s.require_paths = ['lib']
|
21
|
-
s.required_ruby_version = '>= 2.2.
|
23
|
+
s.required_ruby_version = '>= 2.2.9'
|
22
24
|
|
23
25
|
if RUBY_VERSION >= '2.4'
|
24
|
-
s.add_runtime_dependency 'rails', '>= 4.
|
26
|
+
s.add_runtime_dependency 'rails', '>= 4.1.0', '< 6.0'
|
25
27
|
else
|
26
|
-
s.add_runtime_dependency 'railties', '>=
|
28
|
+
s.add_runtime_dependency 'railties', '>= 4.1.0', '< 6.0'
|
27
29
|
end
|
28
30
|
s.add_runtime_dependency 'devise', '>= 4.2.0', '< 5.0'
|
29
31
|
|
32
|
+
s.add_development_dependency 'appraisal'
|
30
33
|
s.add_development_dependency 'bundler', '>= 1.3.0', '< 2.0'
|
31
34
|
s.add_development_dependency 'coveralls', '~> 0.8'
|
32
35
|
s.add_development_dependency 'easy_captcha', '~> 0'
|
33
36
|
s.add_development_dependency 'm'
|
34
|
-
s.add_development_dependency 'minitest', '
|
37
|
+
s.add_development_dependency 'minitest', '5.10.3' # see https://github.com/seattlerb/minitest/issues/730
|
38
|
+
s.add_development_dependency 'pry-byebug'
|
39
|
+
s.add_development_dependency 'pry-rescue'
|
40
|
+
s.add_development_dependency 'pry'
|
35
41
|
s.add_development_dependency 'rails_email_validator', '~> 0'
|
36
42
|
s.add_development_dependency 'rubocop', '~> 0'
|
37
43
|
s.add_development_dependency 'sqlite3', '~> 1.3', '>= 1.3.10'
|