passwd 0.0.4 → 0.0.5
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.
- data/.travis.yml +15 -0
- data/README.md +118 -33
- data/Rakefile +1 -1
- data/lib/passwd/active_record.rb +44 -0
- data/lib/passwd/password.rb +45 -0
- data/lib/passwd/version.rb +1 -1
- data/lib/passwd.rb +4 -43
- data/passwd.gemspec +0 -1
- data/spec/passwd/active_record_spec.rb +142 -0
- data/spec/passwd/password_spec.rb +147 -0
- data/spec/passwd_spec.rb +1 -148
- data/spec/spec_helper.rb +1 -0
- metadata +14 -5
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -2,13 +2,15 @@
|
|
2
2
|
|
3
3
|
[](https://travis-ci.org/i2bskn/passwd)
|
4
4
|
|
5
|
-
Password
|
5
|
+
Password utilities.
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
9
9
|
Add this line to your application's Gemfile:
|
10
10
|
|
11
|
-
|
11
|
+
```ruby
|
12
|
+
gem 'passwd'
|
13
|
+
```
|
12
14
|
|
13
15
|
And then execute:
|
14
16
|
|
@@ -20,11 +22,33 @@ Or install it yourself as:
|
|
20
22
|
|
21
23
|
## Usage
|
22
24
|
|
23
|
-
|
25
|
+
```ruby
|
26
|
+
require 'passwd'
|
27
|
+
```
|
24
28
|
|
25
|
-
Create random password
|
29
|
+
### Create random password
|
26
30
|
|
27
|
-
|
31
|
+
```ruby
|
32
|
+
password = Passwd.create
|
33
|
+
```
|
34
|
+
|
35
|
+
### Hashing password
|
36
|
+
|
37
|
+
Hashing with SHA1.
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
password_hash = Passwd.hashing(password)
|
41
|
+
```
|
42
|
+
|
43
|
+
### Password settings
|
44
|
+
|
45
|
+
Default config is stored in the class variable. (@@config)
|
46
|
+
Changing the default configs are as follows:
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
Passwd.config => Get config hash.
|
50
|
+
Passwd.config(length: 10) => Change to the default length.
|
51
|
+
```
|
28
52
|
|
29
53
|
Options that can be specified:
|
30
54
|
|
@@ -36,19 +60,21 @@ Options that can be specified:
|
|
36
60
|
* :letters_upper => Define an array of upper case. default is ("A".."Z").to_a
|
37
61
|
* :letters_number => Define an array of numbers. default is ("0".."9").to_a
|
38
62
|
|
39
|
-
|
40
|
-
Changing the default configs are as follows:
|
41
|
-
|
42
|
-
Passwd.config => Get config hash.
|
43
|
-
Passwd.config(length: 10) => Change to the default length.
|
63
|
+
### Password policy check
|
44
64
|
|
45
|
-
|
65
|
+
```ruby
|
66
|
+
Passwd.policy_check(password)
|
67
|
+
```
|
46
68
|
|
47
|
-
|
69
|
+
### Policy settings
|
48
70
|
|
49
|
-
|
71
|
+
Default policy is stored in the class variable. (@@policy)
|
72
|
+
Changing the default policy are as follows:
|
50
73
|
|
51
|
-
|
74
|
+
```ruby
|
75
|
+
Passwd.policy => Get policy hash.
|
76
|
+
Passwd.policy(min_length: 10) => Change to the default min_length.
|
77
|
+
```
|
52
78
|
|
53
79
|
Options that can be specified:
|
54
80
|
|
@@ -59,22 +85,18 @@ Options that can be specified:
|
|
59
85
|
* :require_upper => Require upper case if set true. specify_type enabled when true.
|
60
86
|
* :require_number => Require number case if set true. specify_type enabled when true.
|
61
87
|
|
62
|
-
|
63
|
-
Changing the default policy are as follows:
|
64
|
-
|
65
|
-
Passwd.policy => Get policy hash.
|
66
|
-
Passwd.policy(min_length: 10) => Change to the default min_length.
|
67
|
-
|
68
|
-
Passwd object:
|
88
|
+
### Password object
|
69
89
|
|
70
90
|
Default password is randomly generated.
|
71
91
|
Default salt is "#{Time.now.to_s}".
|
72
92
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
93
|
+
```ruby
|
94
|
+
password = Passwd::Password.new
|
95
|
+
password.text # return text password.
|
96
|
+
password.salt_text # return text salt.
|
97
|
+
password.salt_hash # return hash salt.
|
98
|
+
password.hash # return hash password.
|
99
|
+
```
|
78
100
|
|
79
101
|
Options that can be specified:
|
80
102
|
|
@@ -83,12 +105,75 @@ Options that can be specified:
|
|
83
105
|
|
84
106
|
Password authenticate:
|
85
107
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
108
|
+
```ruby
|
109
|
+
password = Passwd::Password.new
|
110
|
+
Passwd.auth(password.text, password.salt_hash, password.hash) # => true
|
111
|
+
Passwd.auth("invalid!!", password.salt_hash, password.hash) # => false
|
112
|
+
|
113
|
+
password == password.text # => true
|
114
|
+
password == "invalid!!" # => false
|
115
|
+
```
|
116
|
+
|
117
|
+
## For ActiveRecord User model
|
118
|
+
|
119
|
+
model:
|
120
|
+
|
121
|
+
```ruby
|
122
|
+
class User < ActiveRecord::Base
|
123
|
+
include Passwd::ActiveRecord
|
124
|
+
# if not specified arguments for define_column => {id: :email, salt: :salt, password: :password}
|
125
|
+
define_column id: :id_colname, salt: :salt_colname, password: :password_colname
|
126
|
+
|
127
|
+
...
|
128
|
+
end
|
129
|
+
```
|
130
|
+
|
131
|
+
Authentication:
|
132
|
+
|
133
|
+
```ruby
|
134
|
+
user = User.authenticate("foo@example.com", "secret") # => return user object or nil.
|
135
|
+
|
136
|
+
if user
|
137
|
+
puts "Hello #{user.name}!"
|
138
|
+
else
|
139
|
+
puts "Authentication failed"
|
140
|
+
end
|
141
|
+
```
|
142
|
+
|
143
|
+
```ruby
|
144
|
+
user = User.find(params[:id])
|
145
|
+
if user.authenticate("secret") # => return true or false
|
146
|
+
puts "Authentication is successful!"
|
147
|
+
else
|
148
|
+
puts "Authentication failed!"
|
149
|
+
end
|
150
|
+
```
|
151
|
+
|
152
|
+
Change passowrd:
|
153
|
+
|
154
|
+
```ruby
|
155
|
+
user = User.find(params[:id])
|
156
|
+
# set random password. (salt also set if salt is nil)
|
157
|
+
# return set password text.
|
158
|
+
# set specified password if specified argument.
|
159
|
+
# user.set_password("secret")
|
160
|
+
password_text = user.set_password
|
161
|
+
|
162
|
+
if user.save
|
163
|
+
NoticeMailer.change_mail(user, password_text).deliver
|
164
|
+
end
|
165
|
+
```
|
166
|
+
|
167
|
+
```ruby
|
168
|
+
user.find(params[:id])
|
169
|
+
if user.update_password(old_pass, new_pass) # => return new password(text) or false
|
170
|
+
if user.save
|
171
|
+
NoticeMailer.change_mail(user, password_text).deliver
|
172
|
+
end
|
173
|
+
else
|
174
|
+
puts "Authentication failed!"
|
175
|
+
end
|
176
|
+
```
|
92
177
|
|
93
178
|
## Contributing
|
94
179
|
|
@@ -96,4 +181,4 @@ Password authenticate:
|
|
96
181
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
97
182
|
3. Commit your changes (`git commit -am 'Added some feature'`)
|
98
183
|
4. Push to the branch (`git push origin my-new-feature`)
|
99
|
-
5. Create new Pull Request
|
184
|
+
5. Create new Pull Request
|
data/Rakefile
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Passwd
|
4
|
+
module ActiveRecord
|
5
|
+
module ClassMethods
|
6
|
+
def define_column(options={})
|
7
|
+
idc = options[:id] || :email
|
8
|
+
saltc = options[:salt] || :salt
|
9
|
+
passwordc = options[:password] || :password
|
10
|
+
|
11
|
+
define_singleton_method :authenticate do |id, pass|
|
12
|
+
user = self.where(idc => id).first
|
13
|
+
user if user && Passwd.auth(pass, user.send(saltc), user.send(passwordc))
|
14
|
+
end
|
15
|
+
|
16
|
+
define_method :authenticate do |pass|
|
17
|
+
Passwd.auth(pass, self.send(saltc), self.send(passwordc))
|
18
|
+
end
|
19
|
+
|
20
|
+
define_method :set_password do |pass=nil|
|
21
|
+
password = pass || Passwd.create
|
22
|
+
salt = self.send(saltc) || Passwd.hashing("#{self.send(idc)}#{Time.now.to_s}")
|
23
|
+
self.send("#{saltc.to_s}=", salt)
|
24
|
+
self.send("#{passwordc.to_s}=", Passwd.hashing("#{salt}#{password}"))
|
25
|
+
password
|
26
|
+
end
|
27
|
+
|
28
|
+
define_method :update_password do |old, new|
|
29
|
+
if Passwd.auth(old, self.send(saltc), self.send(passwordc))
|
30
|
+
set_password(new)
|
31
|
+
else
|
32
|
+
false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class << self
|
39
|
+
def included(klass)
|
40
|
+
klass.extend ClassMethods
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Passwd
|
4
|
+
class Password
|
5
|
+
attr_reader :text, :hash, :salt_text, :salt_hash
|
6
|
+
|
7
|
+
def initialize(options={})
|
8
|
+
@text = options[:password] || Passwd.create
|
9
|
+
@salt_text = options[:salt_text] || Time.now.to_s
|
10
|
+
@salt_hash = Passwd.hashing(@salt_text)
|
11
|
+
@hash = Passwd.hashing("#{@salt_hash}#{@text}")
|
12
|
+
end
|
13
|
+
|
14
|
+
def text=(password)
|
15
|
+
@hash = Passwd.hashing("#{@salt_hash}#{password}")
|
16
|
+
@text = password
|
17
|
+
end
|
18
|
+
|
19
|
+
def hash=(password_hash)
|
20
|
+
@text = nil
|
21
|
+
@hash = password_hash
|
22
|
+
end
|
23
|
+
|
24
|
+
def salt_text=(salt_text)
|
25
|
+
@salt_hash = Passwd.hashing(salt_text)
|
26
|
+
@hash = Passwd.hashing("#{@salt_hash}#{@text}")
|
27
|
+
@salt_text = salt_text
|
28
|
+
end
|
29
|
+
|
30
|
+
def salt_hash=(salt_hash)
|
31
|
+
@salt_text = nil
|
32
|
+
@hash = Passwd.hashing("#{salt_hash}#{@text}")
|
33
|
+
@salt_hash = salt_hash
|
34
|
+
end
|
35
|
+
|
36
|
+
def policy_check
|
37
|
+
Passwd.policy_check @text
|
38
|
+
end
|
39
|
+
|
40
|
+
def ==(password)
|
41
|
+
enc_pass = Passwd.hashing("#{@salt_hash}#{password}")
|
42
|
+
@hash == enc_pass
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/passwd/version.rb
CHANGED
data/lib/passwd.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
require "passwd/version"
|
4
3
|
require "digest/sha1"
|
5
4
|
|
5
|
+
require "passwd/version"
|
6
|
+
require "passwd/password"
|
7
|
+
require "passwd/active_record"
|
8
|
+
|
6
9
|
module Passwd
|
7
10
|
@@config = {
|
8
11
|
length: 8,
|
@@ -23,48 +26,6 @@ module Passwd
|
|
23
26
|
require_number: true
|
24
27
|
}
|
25
28
|
|
26
|
-
class Password
|
27
|
-
attr_reader :text, :hash, :salt_text, :salt_hash
|
28
|
-
|
29
|
-
def initialize(options={password: nil, salt_text: Time.now.to_s})
|
30
|
-
@text = options[:password].nil? ? Passwd.create : options[:password]
|
31
|
-
@salt_text = options[:salt_text] || Time.now.to_s
|
32
|
-
@salt_hash = Passwd.hashing(@salt_text)
|
33
|
-
@hash = Passwd.hashing("#{@salt_hash}#{@text}")
|
34
|
-
end
|
35
|
-
|
36
|
-
def text=(password)
|
37
|
-
@hash = Passwd.hashing("#{@salt_hash}#{password}")
|
38
|
-
@text = password
|
39
|
-
end
|
40
|
-
|
41
|
-
def hash=(password_hash)
|
42
|
-
@text = nil
|
43
|
-
@hash = password_hash
|
44
|
-
end
|
45
|
-
|
46
|
-
def salt_text=(salt_text)
|
47
|
-
@salt_hash = Passwd.hashing(salt_text)
|
48
|
-
@hash = Passwd.hashing("#{@salt_hash}#{@text}")
|
49
|
-
@salt_text = salt_text
|
50
|
-
end
|
51
|
-
|
52
|
-
def salt_hash=(salt_hash)
|
53
|
-
@salt_text = nil
|
54
|
-
@hash = Passwd.hashing("#{salt_hash}#{@text}")
|
55
|
-
@salt_hash = salt_hash
|
56
|
-
end
|
57
|
-
|
58
|
-
def policy_check
|
59
|
-
Passwd.policy_check @text
|
60
|
-
end
|
61
|
-
|
62
|
-
def ==(password)
|
63
|
-
enc_pass = Passwd.hashing("#{@salt_hash}#{password}")
|
64
|
-
@hash == enc_pass
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
29
|
class << self
|
69
30
|
def create(options={})
|
70
31
|
config = @@config.merge(options)
|
data/passwd.gemspec
CHANGED
@@ -0,0 +1,142 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe Passwd::ActiveRecord do
|
6
|
+
class User
|
7
|
+
include Passwd::ActiveRecord
|
8
|
+
define_column
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:salt) {Digest::SHA1.hexdigest("salt")}
|
12
|
+
let(:password_text) {"secret"}
|
13
|
+
let(:password_hash) {Digest::SHA1.hexdigest("#{salt}#{password_text}")}
|
14
|
+
|
15
|
+
describe ".included" do
|
16
|
+
it "define singleton methods" do
|
17
|
+
expect(User.respond_to? :define_column).to be_true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "extend methods" do
|
22
|
+
describe ".define_column" do
|
23
|
+
let(:user) {User.new}
|
24
|
+
|
25
|
+
it "define singleton methods" do
|
26
|
+
expect(User.respond_to? :authenticate).to be_true
|
27
|
+
end
|
28
|
+
|
29
|
+
it "define authenticate method" do
|
30
|
+
expect(user.respond_to? :authenticate).to be_true
|
31
|
+
end
|
32
|
+
|
33
|
+
it "define set_password method" do
|
34
|
+
expect(user.respond_to? :set_password).to be_true
|
35
|
+
end
|
36
|
+
|
37
|
+
it "define update_password" do
|
38
|
+
expect(user.respond_to? :update_password).to be_true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "defined methods from define_column" do
|
44
|
+
describe ".authenticate" do
|
45
|
+
let!(:record) {
|
46
|
+
record = double("record mock")
|
47
|
+
record.stub(:salt).and_return(salt)
|
48
|
+
record.stub(:password).and_return(password_hash)
|
49
|
+
response = [record]
|
50
|
+
User.stub(:where).and_return(response)
|
51
|
+
record
|
52
|
+
}
|
53
|
+
|
54
|
+
it "user should be returned if authentication is successful" do
|
55
|
+
User.should_receive(:where)
|
56
|
+
expect(User.authenticate("valid_id", password_text)).to eq(record)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should return nil if authentication failed" do
|
60
|
+
User.should_receive(:where)
|
61
|
+
expect(User.authenticate("valid_id", "invalid_secret")).to be_nil
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should return nil if user not found" do
|
65
|
+
User.should_receive(:where).with(:email => "invalid_id").and_return([])
|
66
|
+
expect(User.authenticate("invalid_id", password_text)).to be_nil
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#authenticate" do
|
71
|
+
let!(:user) {
|
72
|
+
user = User.new
|
73
|
+
user.stub(:salt).and_return(salt)
|
74
|
+
user.stub(:password).and_return(password_hash)
|
75
|
+
user
|
76
|
+
}
|
77
|
+
|
78
|
+
it "should return true if authentication is successful" do
|
79
|
+
expect(user.authenticate(password_text)).to be_true
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should return false if authentication failed" do
|
83
|
+
expect(user.authenticate("invalid_pass")).to be_false
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "#set_password" do
|
88
|
+
let!(:user) {
|
89
|
+
user = User.new
|
90
|
+
user.stub(:salt).and_return(salt)
|
91
|
+
user
|
92
|
+
}
|
93
|
+
|
94
|
+
it "should return set password" do
|
95
|
+
user.should_receive(:salt=).with(salt)
|
96
|
+
user.should_receive(:password=).with(Passwd.hashing("#{salt}#{password_text}"))
|
97
|
+
expect(user.set_password(password_text)).to eq(password_text)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should set random password if not specified" do
|
101
|
+
user.should_receive(:salt=).with(salt)
|
102
|
+
random_password = Passwd.create
|
103
|
+
Passwd.should_receive(:create).and_return(random_password)
|
104
|
+
user.should_receive(:password=).with(Passwd.hashing("#{salt}#{random_password}"))
|
105
|
+
user.set_password
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should set salt if salt is nil" do
|
109
|
+
mail_addr = "foo@example.com"
|
110
|
+
time_now = Time.now
|
111
|
+
salt2 = Passwd.hashing("#{mail_addr}#{time_now.to_s}")
|
112
|
+
Time.stub(:now).and_return(time_now)
|
113
|
+
user.stub(:email).and_return(mail_addr)
|
114
|
+
user.should_receive(:salt).and_return(nil)
|
115
|
+
user.should_receive(:salt=).with(salt2)
|
116
|
+
user.should_receive(:password=).with(Passwd.hashing("#{salt2}#{password_text}"))
|
117
|
+
user.set_password(password_text)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe "#update_password" do
|
122
|
+
let!(:user) {
|
123
|
+
user = User.new
|
124
|
+
user.stub(:salt).and_return(salt)
|
125
|
+
user.stub(:password).and_return(password_hash)
|
126
|
+
user
|
127
|
+
}
|
128
|
+
|
129
|
+
it "should return update password" do
|
130
|
+
pass = "new_password"
|
131
|
+
user.should_receive(:set_password).with(pass).and_return(pass)
|
132
|
+
expect(user.update_password(password_text, pass)).to eq(pass)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should return false if authentication failed" do
|
136
|
+
Passwd.should_receive(:auth).and_return(false)
|
137
|
+
user.should_not_receive(:set_password)
|
138
|
+
user.update_password("invalid_password", "new_password")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe Passwd::Password do
|
6
|
+
context "#initialize" do
|
7
|
+
it "set instance valiables" do
|
8
|
+
password = Passwd::Password.new
|
9
|
+
expect(password.text.size).to eq(8)
|
10
|
+
expect(password.text.class).to eq(String)
|
11
|
+
expect(password.hash.class).to eq(String)
|
12
|
+
expect(password.salt_text.class).to eq(String)
|
13
|
+
expect(password.salt_hash.class).to eq(String)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "@text is specified password" do
|
17
|
+
pass_text = Passwd.create
|
18
|
+
password = Passwd::Password.new(password: pass_text)
|
19
|
+
expect(password.text).to eq(pass_text)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "@hash is hash of specified password" do
|
23
|
+
pass_text = Passwd.create
|
24
|
+
password = Passwd::Password.new(password: pass_text)
|
25
|
+
pass_hash = Passwd.hashing("#{password.salt_hash}#{pass_text}")
|
26
|
+
expect(password.hash).to eq(pass_hash)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "@salt_text is specified salt" do
|
30
|
+
salt_text = "salt"
|
31
|
+
password = Passwd::Password.new(salt_text: salt_text)
|
32
|
+
expect(password.salt_text).to eq(salt_text)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "@salt_hash is hash of specified salt" do
|
36
|
+
salt_text = "salt"
|
37
|
+
salt_hash = Passwd.hashing(salt_text)
|
38
|
+
password = Passwd::Password.new(salt_text: salt_text)
|
39
|
+
expect(password.salt_hash).to eq(salt_hash)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "#text=" do
|
44
|
+
before(:each) do
|
45
|
+
@password = Passwd::Password.new(password: "Secret!!")
|
46
|
+
end
|
47
|
+
|
48
|
+
it "@text is changed" do
|
49
|
+
old_password = @password.text
|
50
|
+
@password.text = Passwd.create
|
51
|
+
expect(@password.text).not_to eq(old_password)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "@hash is changed" do
|
55
|
+
old_hash = @password.hash
|
56
|
+
@password.text = Passwd.create
|
57
|
+
expect(@password.hash).not_to eq(old_hash)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "#hash=" do
|
62
|
+
before(:each) do
|
63
|
+
@password = Passwd::Password.new
|
64
|
+
end
|
65
|
+
|
66
|
+
it "@text is nil" do
|
67
|
+
@password.hash = Passwd.hashing("Secret!!")
|
68
|
+
expect(@password.text).to eq(nil)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "@hash is changed" do
|
72
|
+
old_hash = @password.hash
|
73
|
+
@password.hash = Passwd.hashing("Secret!!")
|
74
|
+
expect(@password.hash).not_to eq(old_hash)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "#salt_text=" do
|
79
|
+
before(:each) do
|
80
|
+
@password = Passwd::Password.new
|
81
|
+
end
|
82
|
+
|
83
|
+
it "@salt_text is changed" do
|
84
|
+
old_salt_text = @password.salt_text
|
85
|
+
@password.salt_text = "salt"
|
86
|
+
expect(@password.salt_text).not_to eq(old_salt_text)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "@salt_hash is changed" do
|
90
|
+
old_salt_hash = @password.salt_hash
|
91
|
+
@password.salt_text = "salt"
|
92
|
+
expect(@password.salt_hash).not_to eq(old_salt_hash)
|
93
|
+
end
|
94
|
+
|
95
|
+
it "@hash is changed" do
|
96
|
+
old_hash = @password.hash
|
97
|
+
@password.salt_text = "salt"
|
98
|
+
expect(@password.hash).not_to eq(old_hash)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context "#salt_hash=" do
|
103
|
+
before(:each) do
|
104
|
+
@password = Passwd::Password.new
|
105
|
+
end
|
106
|
+
|
107
|
+
it "@salt_text is nil" do
|
108
|
+
@password.salt_hash = Passwd.hashing("salt")
|
109
|
+
expect(@password.salt_text).to eq(nil)
|
110
|
+
end
|
111
|
+
|
112
|
+
it "@salt_hash is changed" do
|
113
|
+
old_salt_hash = @password.salt_hash
|
114
|
+
@password.salt_hash = Passwd.hashing("salt")
|
115
|
+
expect(@password.salt_hash).not_to eq(old_salt_hash)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "@hash is changed" do
|
119
|
+
old_hash = @password.hash
|
120
|
+
@password.salt_hash = Passwd.hashing("salt")
|
121
|
+
expect(@password.hash).not_to eq(old_hash)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
context "#policy_check" do
|
126
|
+
it "Passwd.policy_check is called with pass_text" do
|
127
|
+
pass_text = Passwd.create
|
128
|
+
Passwd.should_receive(:policy_check).with(pass_text)
|
129
|
+
password = Passwd::Password.new(password: pass_text)
|
130
|
+
password.policy_check
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context "#==" do
|
135
|
+
before(:each) do
|
136
|
+
@password = Passwd::Password.new
|
137
|
+
end
|
138
|
+
|
139
|
+
it "return true with valid password" do
|
140
|
+
expect(@password == @password.text).to eq(true)
|
141
|
+
end
|
142
|
+
|
143
|
+
it "return false with invalid password" do
|
144
|
+
expect(@password == "Secret!!").to eq(false)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
data/spec/passwd_spec.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
require "passwd"
|
6
|
-
require "digest/sha1"
|
3
|
+
require "spec_helper"
|
7
4
|
|
8
5
|
describe Passwd do
|
9
6
|
describe "singleton methods" do
|
@@ -139,148 +136,4 @@ describe Passwd do
|
|
139
136
|
end
|
140
137
|
end
|
141
138
|
end
|
142
|
-
|
143
|
-
describe 'Password' do
|
144
|
-
context "#initialize" do
|
145
|
-
it "set instance valiables" do
|
146
|
-
password = Passwd::Password.new
|
147
|
-
expect(password.text.size).to eq(8)
|
148
|
-
expect(password.text.class).to eq(String)
|
149
|
-
expect(password.hash.class).to eq(String)
|
150
|
-
expect(password.salt_text.class).to eq(String)
|
151
|
-
expect(password.salt_hash.class).to eq(String)
|
152
|
-
end
|
153
|
-
|
154
|
-
it "@text is specified password" do
|
155
|
-
pass_text = Passwd.create
|
156
|
-
password = Passwd::Password.new(password: pass_text)
|
157
|
-
expect(password.text).to eq(pass_text)
|
158
|
-
end
|
159
|
-
|
160
|
-
it "@hash is hash of specified password" do
|
161
|
-
pass_text = Passwd.create
|
162
|
-
password = Passwd::Password.new(password: pass_text)
|
163
|
-
pass_hash = Passwd.hashing("#{password.salt_hash}#{pass_text}")
|
164
|
-
expect(password.hash).to eq(pass_hash)
|
165
|
-
end
|
166
|
-
|
167
|
-
it "@salt_text is specified salt" do
|
168
|
-
salt_text = "salt"
|
169
|
-
password = Passwd::Password.new(salt_text: salt_text)
|
170
|
-
expect(password.salt_text).to eq(salt_text)
|
171
|
-
end
|
172
|
-
|
173
|
-
it "@salt_hash is hash of specified salt" do
|
174
|
-
salt_text = "salt"
|
175
|
-
salt_hash = Passwd.hashing(salt_text)
|
176
|
-
password = Passwd::Password.new(salt_text: salt_text)
|
177
|
-
expect(password.salt_hash).to eq(salt_hash)
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
context "#text=" do
|
182
|
-
before(:each) do
|
183
|
-
@password = Passwd::Password.new(password: "Secret!!")
|
184
|
-
end
|
185
|
-
|
186
|
-
it "@text is changed" do
|
187
|
-
old_password = @password.text
|
188
|
-
@password.text = Passwd.create
|
189
|
-
expect(@password.text).not_to eq(old_password)
|
190
|
-
end
|
191
|
-
|
192
|
-
it "@hash is changed" do
|
193
|
-
old_hash = @password.hash
|
194
|
-
@password.text = Passwd.create
|
195
|
-
expect(@password.hash).not_to eq(old_hash)
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
context "#hash=" do
|
200
|
-
before(:each) do
|
201
|
-
@password = Passwd::Password.new
|
202
|
-
end
|
203
|
-
|
204
|
-
it "@text is nil" do
|
205
|
-
@password.hash = Passwd.hashing("Secret!!")
|
206
|
-
expect(@password.text).to eq(nil)
|
207
|
-
end
|
208
|
-
|
209
|
-
it "@hash is changed" do
|
210
|
-
old_hash = @password.hash
|
211
|
-
@password.hash = Passwd.hashing("Secret!!")
|
212
|
-
expect(@password.hash).not_to eq(old_hash)
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
context "#salt_text=" do
|
217
|
-
before(:each) do
|
218
|
-
@password = Passwd::Password.new
|
219
|
-
end
|
220
|
-
|
221
|
-
it "@salt_text is changed" do
|
222
|
-
old_salt_text = @password.salt_text
|
223
|
-
@password.salt_text = "salt"
|
224
|
-
expect(@password.salt_text).not_to eq(old_salt_text)
|
225
|
-
end
|
226
|
-
|
227
|
-
it "@salt_hash is changed" do
|
228
|
-
old_salt_hash = @password.salt_hash
|
229
|
-
@password.salt_text = "salt"
|
230
|
-
expect(@password.salt_hash).not_to eq(old_salt_hash)
|
231
|
-
end
|
232
|
-
|
233
|
-
it "@hash is changed" do
|
234
|
-
old_hash = @password.hash
|
235
|
-
@password.salt_text = "salt"
|
236
|
-
expect(@password.hash).not_to eq(old_hash)
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
context "#salt_hash=" do
|
241
|
-
before(:each) do
|
242
|
-
@password = Passwd::Password.new
|
243
|
-
end
|
244
|
-
|
245
|
-
it "@salt_text is nil" do
|
246
|
-
@password.salt_hash = Passwd.hashing("salt")
|
247
|
-
expect(@password.salt_text).to eq(nil)
|
248
|
-
end
|
249
|
-
|
250
|
-
it "@salt_hash is changed" do
|
251
|
-
old_salt_hash = @password.salt_hash
|
252
|
-
@password.salt_hash = Passwd.hashing("salt")
|
253
|
-
expect(@password.salt_hash).not_to eq(old_salt_hash)
|
254
|
-
end
|
255
|
-
|
256
|
-
it "@hash is changed" do
|
257
|
-
old_hash = @password.hash
|
258
|
-
@password.salt_hash = Passwd.hashing("salt")
|
259
|
-
expect(@password.hash).not_to eq(old_hash)
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
context "#policy_check" do
|
264
|
-
it "Passwd.policy_check is called with pass_text" do
|
265
|
-
pass_text = Passwd.create
|
266
|
-
Passwd.should_receive(:policy_check).with(pass_text)
|
267
|
-
password = Passwd::Password.new(password: pass_text)
|
268
|
-
password.policy_check
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
context "#==" do
|
273
|
-
before(:each) do
|
274
|
-
@password = Passwd::Password.new
|
275
|
-
end
|
276
|
-
|
277
|
-
it "return true with valid password" do
|
278
|
-
expect(@password == @password.text).to eq(true)
|
279
|
-
end
|
280
|
-
|
281
|
-
it "return false with invalid password" do
|
282
|
-
expect(@password == "Secret!!").to eq(false)
|
283
|
-
end
|
284
|
-
end
|
285
|
-
end
|
286
139
|
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "passwd"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: passwd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -67,14 +67,20 @@ extensions: []
|
|
67
67
|
extra_rdoc_files: []
|
68
68
|
files:
|
69
69
|
- .gitignore
|
70
|
+
- .travis.yml
|
70
71
|
- Gemfile
|
71
72
|
- LICENSE.txt
|
72
73
|
- README.md
|
73
74
|
- Rakefile
|
74
75
|
- lib/passwd.rb
|
76
|
+
- lib/passwd/active_record.rb
|
77
|
+
- lib/passwd/password.rb
|
75
78
|
- lib/passwd/version.rb
|
76
79
|
- passwd.gemspec
|
80
|
+
- spec/passwd/active_record_spec.rb
|
81
|
+
- spec/passwd/password_spec.rb
|
77
82
|
- spec/passwd_spec.rb
|
83
|
+
- spec/spec_helper.rb
|
78
84
|
homepage: https://github.com/i2bskn/passwd
|
79
85
|
licenses:
|
80
86
|
- MIT
|
@@ -90,7 +96,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
90
96
|
version: '0'
|
91
97
|
segments:
|
92
98
|
- 0
|
93
|
-
hash:
|
99
|
+
hash: 109903666620076134
|
94
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
101
|
none: false
|
96
102
|
requirements:
|
@@ -99,12 +105,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
105
|
version: '0'
|
100
106
|
segments:
|
101
107
|
- 0
|
102
|
-
hash:
|
108
|
+
hash: 109903666620076134
|
103
109
|
requirements: []
|
104
110
|
rubyforge_project:
|
105
|
-
rubygems_version: 1.8.
|
111
|
+
rubygems_version: 1.8.25
|
106
112
|
signing_key:
|
107
113
|
specification_version: 3
|
108
114
|
summary: Password utility
|
109
115
|
test_files:
|
116
|
+
- spec/passwd/active_record_spec.rb
|
117
|
+
- spec/passwd/password_spec.rb
|
110
118
|
- spec/passwd_spec.rb
|
119
|
+
- spec/spec_helper.rb
|