clearance-deprecated_password_strategies 1.10.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 67f81e06d47c454b68411d9c1483f8779bd09e8a
4
+ data.tar.gz: 1acef3e65cd0ccbef987844a57ed60ed93f5ebee
5
+ SHA512:
6
+ metadata.gz: 106c50b3b1db2ba45f64e00d17312623160d6bae524d22d62fbba6207f4f89e9ac2446b0a1faa09f8cca9cd52de220c0e8ffdbb676f594fe4be9fdbf070c957d
7
+ data.tar.gz: c41a4d20e74b5db4499f1f99b7976f28c4bc9b5eb211d3b08571772762669c7931002e48dbe7c4afa24a718ae58394e350750f42d621c172067c8b964e483fe6
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language:
2
+ - ruby
3
+
4
+ rvm:
5
+ - 1.9.3
6
+ - 2.0.0
7
+ - 2.1.6
8
+ - 2.2.2
9
+
10
+ branches:
11
+ only:
12
+ - master
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,30 @@
1
+ We love pull requests from everyone. By participating in this project, you
2
+ agree to abide by the thoughtbot [code of conduct].
3
+
4
+ [code of conduct]: https://thoughtbot.com/open-source-code-of-conduct
5
+
6
+ ## Dependencies
7
+
8
+ 1. Install with `bundle install`
9
+
10
+ ## Contributing
11
+
12
+ 1. Fork the repo.
13
+
14
+ 2. Run the tests. We only take pull requests with passing tests, and it's great
15
+ to know that you have a clean slate: `rake`
16
+
17
+ 3. Add a test for your change. Only refactoring and documentation changes
18
+ require no new tests. If you are adding functionality or fixing a bug, we need
19
+ a test!
20
+
21
+ 4. Make the test pass.
22
+
23
+ 5. Push to your fork and submit a pull request.
24
+
25
+
26
+ At this point you're waiting on us. We like to at least comment on, if not
27
+ accept, pull requests within three business days (and, typically, one business
28
+ day). We may suggest some changes or improvements or alternatives.
29
+
30
+ And in case we didn't emphasize it enough: we love tests!
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2015 thoughtbot, inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # clearance-deprecated_password_strategies
2
+
3
+ This gem contains the three password strategies deprecated in Clearance 1.10.0:
4
+
5
+ * Clearance::PasswordStrategies::Blowfish
6
+ * Clearance::PasswordStrategies::SHA1
7
+ * Clearance::PasswordStrategies::BCryptMigrationFromSHA1
8
+
9
+ These strategies were removed from Clearance because we no longer use or
10
+ maintain them.
11
+
12
+ ## Usage
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem 'clearance-deprecated_password_strategies'
18
+ ```
19
+
20
+ And then execute:
21
+
22
+ $ bundle
23
+
24
+ ## Contributing
25
+
26
+ See the [CONTRIBUTING] document.
27
+ Thank you, [contributors]!
28
+
29
+ [CONTRIBUTING]: CONTRIBUTING.md
30
+ [contributors]: https://github.com/thoughtbot/templates/graphs/contributors
31
+
32
+ ## Need Help?
33
+
34
+ We offer 1-on-1 coaching. [Get in touch] if you'd like to learn more about
35
+ starting, maintaining, and contributing to an open source project.
36
+
37
+ [Get in touch]: http://coaching.thoughtbot.com/rails/?utm_source=github
38
+
39
+ ## License
40
+
41
+ Open source templates are Copyright (c) 2015 thoughtbot, inc. It contains free
42
+ software that may be redistributed under the terms specified in the [LICENSE]
43
+ file.
44
+
45
+ [LICENSE]: /LICENSE
46
+
47
+ ## About
48
+
49
+ ![thoughtbot](https://thoughtbot.com/logo.png)
50
+
51
+ Templates are maintained and funded by thoughtbot, inc.
52
+ The names and logos for thoughtbot are trademarks of thoughtbot, inc.
53
+
54
+ We love open source software!
55
+ See [our other projects][community]
56
+ or [hire us][hire] to help build your product.
57
+
58
+ [community]: https://thoughtbot.com/community?utm_source=github
59
+ [hire]: https://thoughtbot.com/hire-us?utm_source=github
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ desc 'Default'
5
+ task :default => [:spec]
6
+
7
+ RSpec::Core::RakeTask.new(:spec) do |t|
8
+ t.verbose = false
9
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'clearance/password_strategies/deprecated/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "clearance-deprecated_password_strategies"
8
+ spec.version = Clearance::PasswordStrategies::Deprecated::VERSION
9
+ spec.authors = ["Derek Prior"]
10
+ spec.email = ["derekprior@gmail.com"]
11
+ spec.summary = "Deprecated password strategies extracted from Clearance"
12
+ spec.description = "SHA1, Blowfish, and SHA1 to BCrypt migration strategies"
13
+ spec.homepage = "https://github.com/thoughtbot/clearance-deprecated-password-strategies"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", ">= 1.7"
21
+ spec.add_development_dependency "rake", ">= 10.0"
22
+ spec.add_development_dependency "rspec", ">= 3.1"
23
+
24
+ spec.add_dependency "activesupport"
25
+ spec.add_dependency "clearance", ">= 1.10"
26
+ end
@@ -0,0 +1,4 @@
1
+ require "clearance/password_strategies/deprecated/version"
2
+ require "clearance/password_strategies/deprecated/blowfish"
3
+ require "clearance/password_strategies/deprecated/sha1"
4
+ require "clearance/password_strategies/deprecated/bcrypt_migration_from_sha1"
@@ -0,0 +1,58 @@
1
+ module Clearance
2
+ module PasswordStrategies
3
+ module BCryptMigrationFromSHA1
4
+ class BCryptUser
5
+ include Clearance::PasswordStrategies::BCrypt
6
+
7
+ def initialize(user)
8
+ @user = user
9
+ end
10
+
11
+ delegate :encrypted_password, :encrypted_password=, to: :@user
12
+ end
13
+
14
+ class SHA1User
15
+ include Clearance::PasswordStrategies::SHA1
16
+
17
+ def initialize(user)
18
+ @user = user
19
+ end
20
+
21
+ delegate :salt, :salt=, :encrypted_password, :encrypted_password=, to: :@user
22
+ end
23
+
24
+ def authenticated?(password)
25
+ authenticated_with_sha1?(password) || authenticated_with_bcrypt?(password)
26
+ end
27
+
28
+ def password=(new_password)
29
+ @password = new_password
30
+ BCryptUser.new(self).password = new_password
31
+ end
32
+
33
+ private
34
+
35
+ def authenticated_with_bcrypt?(password)
36
+ begin
37
+ BCryptUser.new(self).authenticated? password
38
+ rescue ::BCrypt::Errors::InvalidHash
39
+ false
40
+ end
41
+ end
42
+
43
+ def authenticated_with_sha1?(password)
44
+ if sha1_password?
45
+ if SHA1User.new(self).authenticated? password
46
+ self.password = password
47
+ self.save
48
+ true
49
+ end
50
+ end
51
+ end
52
+
53
+ def sha1_password?
54
+ self.encrypted_password =~ /^[a-f0-9]{40}$/
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,46 @@
1
+ require "active_support"
2
+ require "active_support/core_ext/object/blank"
3
+ require "base64"
4
+ require "openssl"
5
+
6
+ module Clearance
7
+ module PasswordStrategies
8
+ module Blowfish
9
+ def authenticated?(password)
10
+ encrypted_password == encrypt(password)
11
+ end
12
+
13
+ def password=(new_password)
14
+ @password = new_password
15
+ initialize_salt_if_necessary
16
+
17
+ if new_password.present?
18
+ self.encrypted_password = encrypt(new_password)
19
+ end
20
+ end
21
+
22
+ protected
23
+
24
+ def encrypt(string)
25
+ generate_hash("--#{salt}--#{string}--")
26
+ end
27
+
28
+ def generate_hash(string)
29
+ cipher = OpenSSL::Cipher::Cipher.new("bf-cbc").encrypt
30
+ cipher.key = Digest::SHA256.digest(salt)
31
+ hash = cipher.update(string) << cipher.final
32
+ Base64.encode64(hash).encode("utf-8")
33
+ end
34
+
35
+ def initialize_salt_if_necessary
36
+ if salt.blank?
37
+ self.salt = generate_salt
38
+ end
39
+ end
40
+
41
+ def generate_salt
42
+ Base64.encode64(SecureRandom.hex(20)).encode("utf-8")
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,41 @@
1
+ module Clearance
2
+ module PasswordStrategies
3
+ module SHA1
4
+ require 'digest/sha1'
5
+ extend ActiveSupport::Concern
6
+
7
+ def authenticated?(password)
8
+ encrypted_password == encrypt(password)
9
+ end
10
+
11
+ def password=(new_password)
12
+ @password = new_password
13
+ initialize_salt_if_necessary
14
+
15
+ if new_password.present?
16
+ self.encrypted_password = encrypt(new_password)
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def encrypt(string)
23
+ generate_hash "--#{salt}--#{string}--"
24
+ end
25
+
26
+ def generate_hash(string)
27
+ Digest::SHA1.hexdigest(string).encode "UTF-8"
28
+ end
29
+
30
+ def initialize_salt_if_necessary
31
+ if salt.blank?
32
+ self.salt = generate_salt
33
+ end
34
+ end
35
+
36
+ def generate_salt
37
+ SecureRandom.hex(20).encode("UTF-8")
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,7 @@
1
+ module Clearance
2
+ module PasswordStrategies
3
+ module Deprecated
4
+ VERSION = "1.10.1"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,115 @@
1
+ require "spec_helper"
2
+
3
+ describe Clearance::PasswordStrategies::BCryptMigrationFromSHA1 do
4
+ describe "#password=" do
5
+ it "encrypts the password into a BCrypt-encrypted encrypted_password" do
6
+ stub_bcrypt_password
7
+
8
+ expect(model_instance.encrypted_password).to eq encrypted_password
9
+ end
10
+
11
+ it "encrypts with BCrypt" do
12
+ stub_bcrypt_password
13
+
14
+ expect(BCrypt::Password).to have_received(:create).
15
+ with(password, anything)
16
+ end
17
+
18
+ it "sets the pasword on the subject" do
19
+ stub_bcrypt_password
20
+
21
+ expect(model_instance.password).to be_present
22
+ end
23
+
24
+ def stub_bcrypt_password
25
+ model_instance.salt = salt
26
+ digestable = "--#{salt}--#{password}--"
27
+ model_instance.encrypted_password = Digest::SHA1.hexdigest(digestable)
28
+ allow(BCrypt::Password).to receive(:create).and_return(encrypted_password)
29
+ model_instance.password = password
30
+ end
31
+
32
+ def encrypted_password
33
+ @encrypted_password ||= double("encrypted password")
34
+ end
35
+ end
36
+
37
+ describe "#authenticated?" do
38
+ context "with a SHA1-encrypted password" do
39
+ it "is authenticated" do
40
+ model_instance.salt = salt
41
+ model_instance.encrypted_password = sha1_hash
42
+ allow(model_instance).to receive(:save)
43
+
44
+ expect(model_instance).to be_authenticated(password)
45
+ end
46
+
47
+ it "changes the hash into a BCrypt-encrypted one" do
48
+ model_instance.salt = salt
49
+ model_instance.encrypted_password = sha1_hash
50
+ allow(model_instance).to receive(:save)
51
+
52
+ model_instance.authenticated? password
53
+
54
+ expect(model_instance.encrypted_password).not_to eq sha1_hash
55
+ end
56
+
57
+ it "does not raise a BCrypt error for invalid passwords" do
58
+ model_instance.salt = salt
59
+ model_instance.encrypted_password = sha1_hash
60
+
61
+ expect do
62
+ model_instance.authenticated? "bad" + password
63
+ end.not_to raise_error
64
+ end
65
+
66
+ it "saves the subject to database" do
67
+ model_instance.salt = salt
68
+ model_instance.encrypted_password = sha1_hash
69
+ allow(model_instance).to receive(:save)
70
+
71
+ model_instance.authenticated? password
72
+
73
+ expect(model_instance).to have_received(:save)
74
+ end
75
+
76
+ def sha1_hash
77
+ Digest::SHA1.hexdigest("--#{salt}--#{password}--")
78
+ end
79
+ end
80
+
81
+ context "with a BCrypt-encrypted password" do
82
+ it "is authenticated" do
83
+ model_instance.encrypted_password = bcrypt_hash
84
+
85
+ expect(model_instance).to be_authenticated(password)
86
+ end
87
+
88
+ it "does not change the hash" do
89
+ model_instance.encrypted_password = bcrypt_hash
90
+
91
+ model_instance.authenticated? password
92
+
93
+ expect(model_instance.encrypted_password.to_s).to eq bcrypt_hash.to_s
94
+ end
95
+
96
+ def bcrypt_hash
97
+ @bcrypt_hash ||= ::BCrypt::Password.create(password)
98
+ end
99
+ end
100
+ end
101
+
102
+ def model_instance
103
+ @model_instance ||= fake_model_with_password_strategy(
104
+ Clearance::PasswordStrategies::BCryptMigrationFromSHA1
105
+ )
106
+ end
107
+
108
+ def salt
109
+ "salt"
110
+ end
111
+
112
+ def password
113
+ "password"
114
+ end
115
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+
3
+ describe Clearance::PasswordStrategies::Blowfish do
4
+ subject do
5
+ fake_model_with_password_strategy(Clearance::PasswordStrategies::Blowfish)
6
+ end
7
+
8
+ describe "#password=" do
9
+ context "when the password is set" do
10
+ let(:salt) { "salt" }
11
+ let(:password) { "password" }
12
+
13
+ before do
14
+ subject.salt = salt
15
+ subject.password = password
16
+ end
17
+
18
+ it "does not initialize the salt" do
19
+ expect(subject.salt).to eq salt
20
+ end
21
+
22
+ it "encrypts the password using Blowfish and the existing salt" do
23
+ cipher = OpenSSL::Cipher::Cipher.new("bf-cbc").encrypt
24
+ cipher.key = Digest::SHA256.digest(salt)
25
+ expected = cipher.update("--#{salt}--#{password}--") << cipher.final
26
+ encrypted_password = Base64.decode64(subject.encrypted_password)
27
+ expect(encrypted_password).to eq expected
28
+ end
29
+ end
30
+
31
+ context "when the salt is not set" do
32
+ before do
33
+ subject.salt = nil
34
+ subject.password = "whatever"
35
+ end
36
+
37
+ it "should initialize the salt" do
38
+ expect(subject.salt).not_to be_nil
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,52 @@
1
+ require "spec_helper"
2
+
3
+ describe Clearance::PasswordStrategies::SHA1 do
4
+ describe "#password=" do
5
+ context "when the salt is set" do
6
+ it "does not initialize the salt when assigned" do
7
+ model_instance = fake_model_with_sha1_strategy
8
+
9
+ model_instance.salt = salt
10
+
11
+ expect(model_instance.salt).to eq salt
12
+ end
13
+
14
+ it "encrypts the password using SHA1 and the existing salt" do
15
+ model_instance = fake_model_with_sha1_strategy
16
+ model_instance.salt = salt
17
+ model_instance.password = password
18
+
19
+ expected = Digest::SHA1.hexdigest("--#{salt}--#{password}--")
20
+
21
+ expect(model_instance.encrypted_password).to eq expected
22
+ end
23
+ end
24
+
25
+ context "when the salt is set" do
26
+ it "generates the salt" do
27
+ model_instance = fake_model_with_sha1_strategy
28
+ model_instance.password = ""
29
+
30
+ expect(model_instance.salt).not_to be_nil
31
+ end
32
+
33
+ it "doesn't encrypt the password" do
34
+ model_instance = fake_model_with_sha1_strategy
35
+
36
+ expect(model_instance.encrypted_password).to be_nil
37
+ end
38
+ end
39
+ end
40
+
41
+ def fake_model_with_sha1_strategy
42
+ fake_model_with_password_strategy(Clearance::PasswordStrategies::SHA1)
43
+ end
44
+
45
+ def salt
46
+ "salt"
47
+ end
48
+
49
+ def password
50
+ "password"
51
+ end
52
+ end
@@ -0,0 +1,42 @@
1
+ require "active_support/concern"
2
+ require "active_support/core_ext/module/delegation"
3
+ require "clearance/password_strategies/bcrypt"
4
+ require "clearance-deprecated_password_strategies"
5
+
6
+ RSpec.configure do |config|
7
+ config.expect_with :rspec do |expectations|
8
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
9
+ end
10
+
11
+ config.mock_with :rspec do |mocks|
12
+ mocks.verify_partial_doubles = true
13
+ end
14
+
15
+ config.warnings = true
16
+
17
+ if config.files_to_run.one?
18
+ config.default_formatter = "doc"
19
+ end
20
+
21
+ config.order = :random
22
+
23
+ Kernel.srand config.seed
24
+ end
25
+
26
+ def fake_model_with_password_strategy(password_strategy)
27
+ Class.new do
28
+ attr_reader :password
29
+ attr_accessor :encrypted_password, :salt
30
+
31
+ include password_strategy
32
+
33
+ def save
34
+ end
35
+ end.new
36
+ end
37
+
38
+ module Rails
39
+ def self.env
40
+ ActiveSupport::StringInquirer.new("test")
41
+ end
42
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: clearance-deprecated_password_strategies
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.10.1
5
+ platform: ruby
6
+ authors:
7
+ - Derek Prior
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '3.1'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '3.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: clearance
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '1.10'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '1.10'
83
+ description: SHA1, Blowfish, and SHA1 to BCrypt migration strategies
84
+ email:
85
+ - derekprior@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
+ - CONTRIBUTING.md
94
+ - Gemfile
95
+ - LICENSE
96
+ - README.md
97
+ - Rakefile
98
+ - clearance-deprecated_password_strategies.gemspec
99
+ - lib/clearance-deprecated_password_strategies.rb
100
+ - lib/clearance/password_strategies/deprecated/bcrypt_migration_from_sha1.rb
101
+ - lib/clearance/password_strategies/deprecated/blowfish.rb
102
+ - lib/clearance/password_strategies/deprecated/sha1.rb
103
+ - lib/clearance/password_strategies/deprecated/version.rb
104
+ - spec/clearance/password_strategies/deprecated/bcrypt_migration_from_sha1_spec.rb
105
+ - spec/clearance/password_strategies/deprecated/blowfish_spec.rb
106
+ - spec/clearance/password_strategies/deprecated/sha1_spec.rb
107
+ - spec/spec_helper.rb
108
+ homepage: https://github.com/thoughtbot/clearance-deprecated-password-strategies
109
+ licenses:
110
+ - MIT
111
+ metadata: {}
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 2.4.5
129
+ signing_key:
130
+ specification_version: 4
131
+ summary: Deprecated password strategies extracted from Clearance
132
+ test_files:
133
+ - spec/clearance/password_strategies/deprecated/bcrypt_migration_from_sha1_spec.rb
134
+ - spec/clearance/password_strategies/deprecated/blowfish_spec.rb
135
+ - spec/clearance/password_strategies/deprecated/sha1_spec.rb
136
+ - spec/spec_helper.rb
137
+ has_rdoc: