passwd 0.3.0 → 0.4.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
- SHA1:
3
- metadata.gz: 4315761117ee941709bb71c7eb31757f2a5b7ec2
4
- data.tar.gz: ad9db1a83f918d12d53a6ac15f4d3cb39e8f3c9b
2
+ SHA256:
3
+ metadata.gz: f9a0399d0e6b478da6e96ad38e2806fb32199bae624d5bddf4abd5093d652cf8
4
+ data.tar.gz: 6b7a805295dcd19b924156838b24463cbdd9bf233280027cf3ce49d4abeeb9df
5
5
  SHA512:
6
- metadata.gz: d8025a6e85f67eacdf856281b17ceef650fb354e48fbafe1a4c06c979a7d2e1bf98ed1e4d812d3429b141945f1f7cbb0bcd7652b1ca65a288ba0583ba7ad971c
7
- data.tar.gz: 780295751daffe7ebda019356f62aac1f56fe5a388b09281d8a8889654feb5d97d2f527c0de3c85f8344e1e41351887068202493d1cb5994022bfda4ebe83a71
6
+ metadata.gz: 99d186d8eb981e43d3ece62f8d96c74ec84cb328d5d5fc56338d322cd9e0cef8f626ef405647eaad01e5cb0fda7e1af3f077beed16ec2fe9adc2798bc3ad9fa7
7
+ data.tar.gz: 7498777e9c67f19b18be0e4c1119fa810551bc4a2fc01411ac1ada816879fce1c2b16d9f31635e1f0426aa2c1486af985dc5b47894529a3b31e657457b5ec748
@@ -0,0 +1,28 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: CI
9
+ on:
10
+ push:
11
+ branches: [ master ]
12
+ pull_request:
13
+ branches: [ master ]
14
+ jobs:
15
+ test:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v2
19
+ - name: Set up Ruby
20
+ uses: ruby/setup-ruby@v1
21
+ with:
22
+ ruby-version: 2.7.2
23
+ - name: Install dependencies
24
+ run: bundle install
25
+ - name: Run tests
26
+ run: bundle exec rake spec
27
+ - name: Run rubocop
28
+ run: bundle exec rake rubocop
data/.gitignore CHANGED
@@ -8,3 +8,4 @@
8
8
  /tmp/
9
9
 
10
10
  /Gemfile.lock
11
+ /.rspec_status
data/.rubocop.yml ADDED
@@ -0,0 +1,168 @@
1
+ AllCops:
2
+ NewCops: enable
3
+ TargetRubyVersion: 2.7
4
+ Exclude:
5
+ - "node_modules/**/*"
6
+ - "vendor/**/*"
7
+
8
+ # Private methods indent.
9
+ Layout/IndentationConsistency:
10
+ EnforcedStyle: indented_internal_methods
11
+
12
+ # Warning: 120 characters
13
+ # Error: 160 characters
14
+ # Make the library more restrictive.
15
+ Layout/LineLength:
16
+ Max: 120
17
+
18
+ # Multi-line indentation with receiver.
19
+ Layout/MultilineMethodCallIndentation:
20
+ EnforcedStyle: indented_relative_to_receiver
21
+
22
+ Layout/SpaceInsideBlockBraces:
23
+ SpaceBeforeBlockParameters: false
24
+
25
+ Lint/AmbiguousBlockAssociation:
26
+ Exclude:
27
+ - "spec/**/*_spec.rb"
28
+
29
+ # May define constants within the block in spec.
30
+ Lint/ConstantDefinitionInBlock:
31
+ Exclude:
32
+ - "spec/**/*_spec.rb"
33
+
34
+ Lint/InheritException:
35
+ EnforcedStyle: standard_error
36
+
37
+ Lint/UnderscorePrefixedVariableName:
38
+ Enabled: false
39
+
40
+ Lint/UnusedMethodArgument:
41
+ Enabled: false
42
+
43
+ Metrics/AbcSize:
44
+ Max: 24
45
+
46
+ Metrics/BlockLength:
47
+ Exclude:
48
+ - "spec/**/*.rb"
49
+ - "Gemfile"
50
+ - "*.gemspec"
51
+
52
+ Metrics/CyclomaticComplexity:
53
+ Max: 10
54
+
55
+ Metrics/MethodLength:
56
+ Max: 20
57
+
58
+ Security/YAMLLoad:
59
+ Enabled: false
60
+
61
+ Style/Alias:
62
+ EnforcedStyle: prefer_alias_method
63
+
64
+ Style/AndOr:
65
+ EnforcedStyle: conditionals
66
+
67
+ Style/AsciiComments:
68
+ Enabled: false
69
+
70
+ Style/BlockDelimiters:
71
+ Enabled: false
72
+
73
+ Style/ClassAndModuleChildren:
74
+ Enabled: false
75
+
76
+ Style/CollectionMethods:
77
+ PreferredMethods:
78
+ detect: "detect"
79
+ find: "detect"
80
+ inject: "inject"
81
+ reduce: "inject"
82
+
83
+ Style/Documentation:
84
+ Enabled: false
85
+
86
+ Style/DoubleNegation:
87
+ Enabled: false
88
+
89
+ Style/EmptyCaseCondition:
90
+ Enabled: false
91
+
92
+ Style/EmptyElse:
93
+ EnforcedStyle: empty
94
+
95
+ Style/EmptyMethod:
96
+ EnforcedStyle: expanded
97
+
98
+ Style/FormatString:
99
+ EnforcedStyle: percent
100
+
101
+ # Do not use frozen_string_literal comment.
102
+ Style/FrozenStringLiteralComment:
103
+ Enabled: false
104
+
105
+ Style/HashSyntax:
106
+ Exclude:
107
+ - "Rakefile"
108
+
109
+ Style/MultilineBlockChain:
110
+ Enabled: false
111
+
112
+ Style/MixinUsage:
113
+ Exclude:
114
+ - "bin/setup"
115
+
116
+ # Use _ when 7 digits or more.
117
+ Style/NumericLiterals:
118
+ MinDigits: 7
119
+ Strict: true
120
+
121
+ Style/NumericPredicate:
122
+ Enabled: false
123
+
124
+ Style/OrAssignment:
125
+ Enabled: false
126
+
127
+ Style/PercentLiteralDelimiters:
128
+ Enabled: false
129
+
130
+ # `has_xxx?` is more readable.
131
+ Style/PreferredHashMethods:
132
+ EnforcedStyle: verbose
133
+
134
+ # Do not use unnecessary returns. (Allow to return multiple values.)
135
+ Style/RedundantReturn:
136
+ AllowMultipleReturnValues: true
137
+
138
+ # Do not specify error class when rescuing StandardError.
139
+ Style/RescueStandardError:
140
+ EnforcedStyle: implicit
141
+
142
+ # String literals use double quotes.
143
+ Style/StringLiterals:
144
+ EnforcedStyle: double_quotes
145
+
146
+ # String literal inside the string interpolation use double quotes too.
147
+ Style/StringLiteralsInInterpolation:
148
+ EnforcedStyle: double_quotes
149
+
150
+ # Percent(`%i(a b)`) and brackets(`[:a, :b]`) are acceptable.
151
+ Style/SymbolArray:
152
+ Enabled: false
153
+
154
+ # Put a trailing comma in argument list.
155
+ Style/TrailingCommaInArguments:
156
+ EnforcedStyleForMultiline: comma
157
+
158
+ # Put a trailing comma in Array literal.
159
+ Style/TrailingCommaInArrayLiteral:
160
+ EnforcedStyleForMultiline: comma
161
+
162
+ # Put a trailing comma in Hash literal.
163
+ Style/TrailingCommaInHashLiteral:
164
+ EnforcedStyleForMultiline: comma
165
+
166
+ # Percent(`%w(a b)`) and brackets(`["a", "b"]`) are acceptable.
167
+ Style/WordArray:
168
+ Enabled: false
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.7.2
data/README.md CHANGED
@@ -36,7 +36,10 @@ See [config](https://github.com/i2bskn/passwd/blob/master/lib/generators/passwd/
36
36
  ```ruby
37
37
  passwd = Passwd.current
38
38
  passwd.random(10) # Create random password of 10 characters.
39
- passwd.hashed_password("secret", "salt") # Create hashed password with stretching.
39
+ password = passwd.password_hashing("secret") # Create hashed password from plain text.
40
+ password == "secret" # => true
41
+ load_password = passwd.load_password("hashed_password") # Load hashed password.
42
+ load_password == "secret"
40
43
  ```
41
44
 
42
45
  ### ActiveRecord with Rails
@@ -56,7 +59,6 @@ User model The following column are required.
56
59
  Column name can be changed with the specified options.
57
60
 
58
61
  - `:id => :email` Unique value to be used for authentication.
59
- - `:salt => :salt` Column of String to save the salt.
60
62
  - `:password => :password` Column of String to save the hashed password.
61
63
 
62
64
  Use the `name` column as id.
data/Rakefile CHANGED
@@ -1,10 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
- require "rake/testtask"
2
+ require "rspec/core/rake_task"
3
+ require "rubocop/rake_task"
3
4
 
4
- Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
7
- t.test_files = FileList["test/**/*_test.rb"]
8
- end
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ RuboCop::RakeTask.new
9
7
 
10
- task :default => :test
8
+ task :default => %i(spec rubocop)
@@ -1,11 +1,8 @@
1
1
  Passwd.current.config.tap do |config|
2
- # Hashing algorithm
3
- # Supported algorithm is :md5, :rmd160, :sha1, :sha256, :sha384 and :sha512
4
- # config.algorithm = :sha512
5
-
6
2
  # Number of hashed by stretching
7
- # Not stretching if specified nil or 0.
8
- # config.stretching = 100
3
+ # Minimum is 4, maximum is 31, default is 12.
4
+ # See also BCrypt::Engine
5
+ # config.stretching = 12
9
6
 
10
7
  # Random generate password length
11
8
  # config.length = 10
@@ -22,6 +19,3 @@ end
22
19
 
23
20
  # Redirect path when not signin
24
21
  # Rails.application.config.passwd.signin_path = :signin_path
25
-
26
- # Salt generation logic
27
- # Rails.application.config.passwd.random_salt = proc { SecureRandom.uuid }
data/lib/passwd.rb CHANGED
@@ -1,6 +1,4 @@
1
- require "digest"
2
- require "securerandom"
3
-
1
+ require "bcrypt"
4
2
  require "passwd/version"
5
3
  require "passwd/errors"
6
4
  require "passwd/config"
@@ -12,32 +10,26 @@ class Passwd
12
10
  @current ||= new
13
11
  end
14
12
 
15
- def current=(passwd)
16
- @current = passwd
17
- end
13
+ attr_writer :current
18
14
  end
19
15
 
20
16
  def initialize(conf = nil)
21
17
  @config = conf
22
18
  end
23
19
 
24
- def hashed_password(plain, salt)
25
- config.stretching.to_i.times.with_object([digest_class.hexdigest([plain, salt].join)]) { |_, pass|
26
- pass[0] = digest_class.hexdigest(pass[0])
27
- }.first
20
+ def password_hashing(plain)
21
+ BCrypt::Password.create(plain, cost: config.stretching.clamp(BCrypt::Engine::MIN_COST, BCrypt::Engine::MAX_COST))
22
+ end
23
+
24
+ def load_password(hashed_password)
25
+ BCrypt::Password.new(hashed_password)
28
26
  end
29
27
 
30
- def random(n = nil)
31
- Array.new(n || config.length) { config.characters[rand(config.characters.size)] }.join
28
+ def random(long = nil)
29
+ Array.new(long || config.length) { config.characters[rand(config.characters.size)] }.join
32
30
  end
33
31
 
34
32
  def config
35
33
  @config ||= Config.new
36
34
  end
37
-
38
- private
39
-
40
- def digest_class
41
- Digest.const_get(config.algorithm.upcase)
42
- end
43
35
  end
data/lib/passwd/config.rb CHANGED
@@ -1,13 +1,12 @@
1
1
  class Passwd
2
2
  class Config
3
3
  VALID_OPTIONS = [
4
- :algorithm,
5
4
  :stretching,
6
5
  :length,
7
6
  :characters,
8
7
  ].freeze
9
8
 
10
- attr_accessor *VALID_OPTIONS
9
+ attr_accessor(*VALID_OPTIONS)
11
10
 
12
11
  def initialize(options = {})
13
12
  reset
@@ -15,13 +14,12 @@ class Passwd
15
14
  end
16
15
 
17
16
  def merge(options)
18
- options.keys.each { |key| send("#{key}=", options[key]) }
17
+ options.each_key {|key| send("#{key}=", options[key]) }
19
18
  self
20
19
  end
21
20
 
22
21
  def reset
23
- @algorithm = :sha512
24
- @stretching = 100
22
+ @stretching = 12
25
23
  @length = 10
26
24
  @characters = [("a".."z"), ("A".."Z"), ("0".."9")].map(&:to_a).flatten
27
25
  end
data/lib/passwd/errors.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  class Passwd
2
2
  class UnauthorizedAccess < StandardError; end
3
+ class ContainsBinaryCharacter < StandardError; end
3
4
  end
@@ -33,16 +33,17 @@ module Passwd::Rails
33
33
  end
34
34
 
35
35
  def redirect_to_referer_or(path, options = {})
36
- redirect_to session[:referer].presence || path, **options
36
+ redirect_to session[:signin_referer].presence || path, **options
37
37
  end
38
38
 
39
39
  def require_signin
40
- unless signin?
41
- path = _signin_path
42
- raise UnauthorizedAccess unless path
43
- session[:referer] = request.fullpath
44
- redirect_to path
45
- end
40
+ return if signin?
41
+
42
+ path = _signin_path
43
+ raise UnauthorizedAccess unless path
44
+
45
+ session[:signin_referer] = request.fullpath
46
+ redirect_to path
46
47
  end
47
48
 
48
49
  def passwd_auth_class
@@ -1,10 +1,10 @@
1
1
  module Passwd::Rails
2
2
  module ActiveRecordExt
3
- def with_authenticate(passwd: nil, user_id: :email, salt: :salt, password: :password)
3
+ def with_authenticate(passwd: nil, user_id: :email, password: :password)
4
4
  passwd ||= Passwd.current
5
5
  define_singleton_auth_with_passwd(user_id)
6
- define_instance_auth_with_passwd(passwd, salt, password)
7
- define_instance_set_password(passwd, salt, password)
6
+ define_instance_auth_with_passwd(passwd, password)
7
+ define_instance_set_password(passwd, password)
8
8
  end
9
9
 
10
10
  private
@@ -18,18 +18,16 @@ module Passwd::Rails
18
18
  end
19
19
  end
20
20
 
21
- def define_instance_auth_with_passwd(passwd, salt_col, password_col)
21
+ def define_instance_auth_with_passwd(passwd, password_col)
22
22
  define_method :authenticate do |plain|
23
- passwd.hashed_password(plain, send(salt_col)) == send(password_col)
23
+ BCrypt::Password.new(send(password_col)) == plain
24
24
  end
25
25
  end
26
26
 
27
- def define_instance_set_password(passwd, salt_col, password_col)
27
+ def define_instance_set_password(passwd, password_col)
28
28
  define_method :set_password do |plain = nil|
29
29
  plain ||= passwd.random
30
- random_salt = Rails.application.config.passwd.random_salt || proc { SecureRandom.uuid }
31
- send("#{salt_col}=", random_salt.call(self)) unless send(salt_col)
32
- send("#{password_col}=", passwd.hashed_password(plain, send(salt_col)))
30
+ send("#{password_col}=", passwd.password_hashing(plain))
33
31
  plain
34
32
  end
35
33
  end
@@ -7,11 +7,11 @@ class Passwd
7
7
  require "passwd/rails/active_record_ext"
8
8
 
9
9
  ActiveSupport.on_load(:action_controller) do
10
- ::ActionController::Base.send(:include, ::Passwd::Rails::ActionControllerExt)
10
+ ::ActionController::Base.include ::Passwd::Rails::ActionControllerExt
11
11
  end
12
12
 
13
13
  ActiveSupport.on_load(:active_record) do
14
- ::ActiveRecord::Base.send(:extend, Passwd::Rails::ActiveRecordExt)
14
+ ::ActiveRecord::Base.extend Passwd::Rails::ActiveRecordExt
15
15
  end
16
16
  end
17
17
  end
@@ -1,4 +1,3 @@
1
1
  class Passwd
2
- VERSION = "0.3.0".freeze
2
+ VERSION = "0.4.0".freeze
3
3
  end
4
-
data/passwd.gemspec CHANGED
@@ -1,4 +1,4 @@
1
- lib = File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path("lib", __dir__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require "passwd/version"
4
4
 
@@ -6,10 +6,10 @@ Gem::Specification.new do |spec|
6
6
  spec.name = "passwd"
7
7
  spec.version = Passwd::VERSION
8
8
  spec.authors = ["i2bskn"]
9
- spec.email = ["i2bskn@gmail.com"]
9
+ spec.email = ["iiboshi@craftake.co.jp"]
10
10
 
11
- spec.description = %q{Passwd is provide hashed password creation and authentication.}
12
- spec.summary = %q{Passwd is provide hashed password creation and authentication.}
11
+ spec.description = "Passwd is provide hashed password creation and authentication."
12
+ spec.summary = "Passwd is provide hashed password creation and authentication."
13
13
  spec.homepage = "https://github.com/i2bskn/passwd"
14
14
  spec.license = "MIT"
15
15
 
@@ -18,11 +18,15 @@ Gem::Specification.new do |spec|
18
18
  end
19
19
 
20
20
  spec.bindir = "exe"
21
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.add_development_dependency "bundler"
25
- spec.add_development_dependency "rake"
26
- spec.add_development_dependency "minitest", "~> 5.0"
27
- spec.add_development_dependency "pry"
24
+ spec.required_ruby_version = ">= 2.7.0"
25
+
26
+ spec.add_dependency "bcrypt", "~> 3.1.0"
27
+ spec.add_development_dependency "bundler", ">= 2.1.0"
28
+ spec.add_development_dependency "pry", "~> 0.14.0"
29
+ spec.add_development_dependency "rake", "~> 13.0.0"
30
+ spec.add_development_dependency "rspec", "~> 3.10.0"
31
+ spec.add_development_dependency "rubocop", "1.11.0"
28
32
  end
metadata CHANGED
@@ -1,80 +1,110 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: passwd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - i2bskn
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-07-23 00:00:00.000000000 Z
11
+ date: 2021-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bcrypt
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 3.1.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - ">="
18
32
  - !ruby/object:Gem::Version
19
- version: '0'
33
+ version: 2.1.0
20
34
  type: :development
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - ">="
25
39
  - !ruby/object:Gem::Version
26
- version: '0'
40
+ version: 2.1.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.14.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.14.0
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rake
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
- - - ">="
59
+ - - "~>"
32
60
  - !ruby/object:Gem::Version
33
- version: '0'
61
+ version: 13.0.0
34
62
  type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
- - - ">="
66
+ - - "~>"
39
67
  - !ruby/object:Gem::Version
40
- version: '0'
68
+ version: 13.0.0
41
69
  - !ruby/object:Gem::Dependency
42
- name: minitest
70
+ name: rspec
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
73
  - - "~>"
46
74
  - !ruby/object:Gem::Version
47
- version: '5.0'
75
+ version: 3.10.0
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
80
  - - "~>"
53
81
  - !ruby/object:Gem::Version
54
- version: '5.0'
82
+ version: 3.10.0
55
83
  - !ruby/object:Gem::Dependency
56
- name: pry
84
+ name: rubocop
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
- - - ">="
87
+ - - '='
60
88
  - !ruby/object:Gem::Version
61
- version: '0'
89
+ version: 1.11.0
62
90
  type: :development
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
- - - ">="
94
+ - - '='
67
95
  - !ruby/object:Gem::Version
68
- version: '0'
96
+ version: 1.11.0
69
97
  description: Passwd is provide hashed password creation and authentication.
70
98
  email:
71
- - i2bskn@gmail.com
99
+ - iiboshi@craftake.co.jp
72
100
  executables: []
73
101
  extensions: []
74
102
  extra_rdoc_files: []
75
103
  files:
104
+ - ".github/workflows/ci.yml"
76
105
  - ".gitignore"
77
- - ".travis.yml"
106
+ - ".rubocop.yml"
107
+ - ".ruby-version"
78
108
  - Gemfile
79
109
  - LICENSE
80
110
  - README.md
@@ -96,7 +126,7 @@ homepage: https://github.com/i2bskn/passwd
96
126
  licenses:
97
127
  - MIT
98
128
  metadata: {}
99
- post_install_message:
129
+ post_install_message:
100
130
  rdoc_options: []
101
131
  require_paths:
102
132
  - lib
@@ -104,16 +134,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
104
134
  requirements:
105
135
  - - ">="
106
136
  - !ruby/object:Gem::Version
107
- version: '0'
137
+ version: 2.7.0
108
138
  required_rubygems_version: !ruby/object:Gem::Requirement
109
139
  requirements:
110
140
  - - ">="
111
141
  - !ruby/object:Gem::Version
112
142
  version: '0'
113
143
  requirements: []
114
- rubyforge_project:
115
- rubygems_version: 2.6.11
116
- signing_key:
144
+ rubygems_version: 3.1.4
145
+ signing_key:
117
146
  specification_version: 4
118
147
  summary: Passwd is provide hashed password creation and authentication.
119
148
  test_files: []
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.5.1
5
- before_install: gem install bundler -v 1.16.2