passwd 0.0.6 → 0.0.7

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/README.md CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/passwd.png)](http://badge.fury.io/rb/passwd)
4
4
  [![Build Status](https://travis-ci.org/i2bskn/passwd.png?branch=master)](https://travis-ci.org/i2bskn/passwd)
5
- [![Code Climate](https://codeclimate.com/github/i2bskn/passwd.png)](https://codeclimate.com/github/i2bskn/passwd)
6
5
  [![Coverage Status](https://coveralls.io/repos/i2bskn/passwd/badge.png?branch=master)](https://coveralls.io/r/i2bskn/passwd?branch=master)
6
+ [![Code Climate](https://codeclimate.com/github/i2bskn/passwd.png)](https://codeclimate.com/github/i2bskn/passwd)
7
7
 
8
8
  Password utilities.
9
9
 
data/lib/passwd.rb CHANGED
@@ -19,33 +19,36 @@ module Passwd
19
19
 
20
20
  class << self
21
21
  def create(options={})
22
- config = @@config.merge(options)
22
+ config = @@config.merge(config_validator(options))
23
23
  letters = get_retters(config)
24
-
25
- # Create random password
26
24
  Array.new(config[:length]){letters[rand(letters.size)]}.join
27
25
  end
28
26
 
29
- def get_retters(config)
30
- # Create letters
31
- letters = Array.new
32
- letters += config[:letters_lower] if config[:lower]
33
- letters += config[:letters_upper] if config[:upper]
34
- letters += config[:letters_number] if config[:number]
35
- letters
36
- end
37
-
38
27
  def auth(password_text, salt_hash, password_hash)
39
28
  enc_pass = Passwd.hashing("#{salt_hash}#{password_text}")
40
29
  password_hash == enc_pass
41
30
  end
42
31
 
43
- def hashing(passwd)
44
- Digest::SHA1.hexdigest passwd
32
+ def hashing(password)
33
+ Digest::SHA1.hexdigest password
45
34
  end
46
35
 
47
36
  def config(options={})
48
- @@config.merge!(options)
37
+ @@config.merge!(config_validator(options))
38
+ end
39
+
40
+ private
41
+ def get_retters(config)
42
+ ["lower", "upper", "number"].inject([]) do |letters, type|
43
+ letters.concat(config["letters_#{type}".to_sym]) if config[type.to_sym]
44
+ letters
45
+ end
46
+ end
47
+
48
+ def config_validator(config_hash)
49
+ parameters = [:length, :lower, :upper, :number, :letters_lower, :letters_upper, :letters_number]
50
+ config = config_hash.inject({}){|r, (k, v)| r.store(k.to_sym, v); r}
51
+ config.select{|k, v| parameters.include? k}
49
52
  end
50
53
  end
51
54
  end
@@ -4,30 +4,44 @@ module Passwd
4
4
  module ActiveRecord
5
5
  module ClassMethods
6
6
  def define_column(options={})
7
- idc = options[:id] || :email
8
- saltc = options[:salt] || :salt
9
- passwordc = options[:password] || :password
7
+ id_name = options[:id] || :email
8
+ salt_name = options[:salt] || :salt
9
+ password_name = options[:password] || :password
10
10
 
11
+ define_singleton_auth(id_name, salt_name, password_name)
12
+ define_instance_auth(id_name, salt_name, password_name)
13
+ define_set_password(id_name, salt_name, password_name)
14
+ define_update_password(salt_name, password_name)
15
+ end
16
+
17
+ private
18
+ def define_singleton_auth(id_name, salt_name, password_name)
11
19
  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))
20
+ user = self.where(id_name => id).first
21
+ user if user && Passwd.auth(pass, user.send(salt_name), user.send(password_name))
14
22
  end
23
+ end
15
24
 
25
+ def define_instance_auth(id_name, salt_name, password_name)
16
26
  define_method :authenticate do |pass|
17
- Passwd.auth(pass, self.send(saltc), self.send(passwordc))
27
+ Passwd.auth(pass, self.send(salt_name), self.send(password_name))
18
28
  end
29
+ end
19
30
 
31
+ def define_set_password(id_name, salt_name, password_name)
20
32
  define_method :set_password do |pass=nil|
21
33
  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}"))
34
+ salt = self.send(salt_name) || Passwd.hashing("#{self.send(id_name)}#{Time.now.to_s}")
35
+ self.send("#{salt_name.to_s}=", salt)
36
+ self.send("#{password_name.to_s}=", Passwd.hashing("#{salt}#{password}"))
25
37
  password
26
38
  end
39
+ end
27
40
 
28
- define_method :update_password do |old, new|
29
- if Passwd.auth(old, self.send(saltc), self.send(passwordc))
30
- set_password(new)
41
+ def define_update_password(salt_name, password_name)
42
+ define_method :update_password do |old_pass, new_pass|
43
+ if Passwd.auth(old_pass, self.send(salt_name), self.send(password_name))
44
+ set_password(new_pass)
31
45
  else
32
46
  false
33
47
  end
@@ -36,8 +50,8 @@ module Passwd
36
50
  end
37
51
 
38
52
  class << self
39
- def included(klass)
40
- klass.extend ClassMethods
53
+ def included(base)
54
+ base.extend ClassMethods
41
55
  end
42
56
  end
43
57
  end
@@ -1,3 +1,3 @@
1
1
  module Passwd
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -3,136 +3,149 @@
3
3
  require "spec_helper"
4
4
 
5
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)
6
+ let(:default) {@default}
7
+ let(:password) {Passwd::Password.new}
8
+
9
+ describe "#initialize" do
10
+ context "with default params" do
11
+ let!(:password_text) {
12
+ password_text = Passwd.create
13
+ Passwd.should_receive(:create).and_return(password_text)
14
+ password_text
15
+ }
16
+
17
+ let!(:time_now) {
18
+ time_now = Time.now
19
+ Time.should_receive(:now).and_return(time_now)
20
+ time_now
21
+ }
22
+
23
+ it "@text should be a random password" do
24
+ expect(password.text.size).to eq(default[:length])
25
+ expect(password.text).to eq(password_text)
26
+ end
27
+
28
+ it "@salt_text should be a auto created" do
29
+ expect(password.salt_text).to eq(time_now.to_s)
30
+ end
31
+
32
+ it "@salt_hash should be a hashed salt" do
33
+ expect(password.salt_hash).to eq(Passwd.hashing(time_now.to_s))
34
+ end
35
+
36
+ it "@password_hash should be a hashed password with salt" do
37
+ password_hash = Passwd.hashing("#{Passwd.hashing(time_now.to_s)}#{password_text}")
38
+ expect(password.hash).to eq(password_hash)
39
+ end
40
+ end
41
+
42
+ context "with custom params" do
43
+ let(:password_text) {Passwd.create}
44
+ let(:salt_text) {"salt"}
45
+ let!(:time_now) {
46
+ time_now = Time.now
47
+ Time.stub(:create).and_return(time_now)
48
+ time_now
49
+ }
50
+
51
+ it "@text is specified password" do
52
+ password = Passwd::Password.new(password: password_text)
53
+ expect(password.text).to eq(password_text)
54
+ end
55
+
56
+ it "@hash is hash of specified password" do
57
+ password = Passwd::Password.new(password: password_text)
58
+ password_hash = Passwd.hashing("#{Passwd.hashing(time_now.to_s)}#{password_text}")
59
+ expect(password.hash).to eq(password_hash)
60
+ end
61
+
62
+ it "@salt_text is specified salt" do
63
+ password = Passwd::Password.new(salt_text: salt_text)
64
+ expect(password.salt_text).to eq(salt_text)
65
+ end
66
+
67
+ it "@salt_hash is hash of specified salt" do
68
+ salt_hash = Passwd.hashing(salt_text)
69
+ password = Passwd::Password.new(salt_text: salt_text)
70
+ expect(password.salt_hash).to eq(salt_hash)
71
+ end
40
72
  end
41
73
  end
42
74
 
43
- context "#text=" do
44
- before(:each) do
45
- @password = Passwd::Password.new(password: "Secret!!")
46
- end
47
-
75
+ describe "#text=" do
48
76
  it "@text is changed" do
49
- old_password = @password.text
50
- @password.text = Passwd.create
51
- expect(@password.text).not_to eq(old_password)
77
+ old_password = password.text
78
+ password.text = password.text.reverse
79
+ expect(password.text).not_to eq(old_password)
52
80
  end
53
81
 
54
82
  it "@hash is changed" do
55
- old_hash = @password.hash
56
- @password.text = Passwd.create
57
- expect(@password.hash).not_to eq(old_hash)
83
+ old_hash = password.hash
84
+ new_password = password.text = password.text.reverse
85
+ expect(password.hash).not_to eq(old_hash)
86
+ expect(password.hash).to eq(Passwd.hashing("#{password.salt_hash}#{new_password}"))
58
87
  end
59
88
  end
60
89
 
61
- context "#hash=" do
62
- before(:each) do
63
- @password = Passwd::Password.new
64
- end
65
-
90
+ describe "#hash=" do
66
91
  it "@text is nil" do
67
- @password.hash = Passwd.hashing("Secret!!")
68
- expect(@password.text).to eq(nil)
92
+ password.hash = Passwd.hashing("secret")
93
+ expect(password.text).to be_nil
69
94
  end
70
95
 
71
96
  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)
97
+ old_hash = password.hash
98
+ password.hash = Passwd.hashing("secret")
99
+ expect(password.hash).not_to eq(old_hash)
75
100
  end
76
101
  end
77
102
 
78
- context "#salt_text=" do
79
- before(:each) do
80
- @password = Passwd::Password.new
81
- end
82
-
103
+ describe "#salt_text=" do
83
104
  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)
105
+ old_salt = password.salt_text
106
+ password.salt_text = "salt"
107
+ expect(password.salt_text).not_to eq(old_salt)
87
108
  end
88
109
 
89
110
  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)
111
+ old_salt = password.salt_hash
112
+ password.salt_text = "salt"
113
+ expect(password.salt_hash).not_to eq(old_salt)
93
114
  end
94
115
 
95
116
  it "@hash is changed" do
96
- old_hash = @password.hash
97
- @password.salt_text = "salt"
98
- expect(@password.hash).not_to eq(old_hash)
117
+ old_hash = password.hash
118
+ password.salt_text = "salt"
119
+ expect(password.hash).not_to eq(old_hash)
99
120
  end
100
121
  end
101
122
 
102
- context "#salt_hash=" do
103
- before(:each) do
104
- @password = Passwd::Password.new
105
- end
106
-
123
+ describe "#salt_hash=" do
107
124
  it "@salt_text is nil" do
108
- @password.salt_hash = Passwd.hashing("salt")
109
- expect(@password.salt_text).to eq(nil)
125
+ password.salt_hash = Passwd.hashing("salt")
126
+ expect(password.salt_text).to eq(nil)
110
127
  end
111
128
 
112
129
  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)
130
+ old_salt_hash = password.salt_hash
131
+ password.salt_hash = Passwd.hashing("salt")
132
+ expect(password.salt_hash).not_to eq(old_salt_hash)
116
133
  end
117
134
 
118
135
  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)
136
+ old_hash = password.hash
137
+ password.salt_hash = Passwd.hashing("salt")
138
+ expect(password.hash).not_to eq(old_hash)
122
139
  end
123
140
  end
124
141
 
125
- context "#==" do
126
- before(:each) do
127
- @password = Passwd::Password.new
128
- end
129
-
142
+ describe "#==" do
130
143
  it "return true with valid password" do
131
- expect(@password == @password.text).to eq(true)
144
+ expect(password == password.text).to be_true
132
145
  end
133
146
 
134
147
  it "return false with invalid password" do
135
- expect(@password == "Secret!!").to eq(false)
148
+ expect(password == "secret").to be_false
136
149
  end
137
150
  end
138
151
  end
data/spec/passwd_spec.rb CHANGED
@@ -3,82 +3,135 @@
3
3
  require "spec_helper"
4
4
 
5
5
  describe Passwd do
6
- describe "singleton methods" do
7
- context "#create" do
8
- it "return string object" do
9
- expect(Passwd.create.class).to eq(String)
10
- end
11
-
12
- it "password was created 8 characters" do
13
- expect(Passwd.create.size).to eq(8)
14
- end
15
-
16
- it "password was created specified characters" do
17
- expect(Passwd.create(length: 10).size).to eq(10)
18
- end
19
-
20
- it "password create without lower case" do
21
- password = Passwd.create(lower: false)
22
- expect(("a".."z").to_a.include?(password)).to eq(false)
23
- end
24
-
25
- it "password create without upper case" do
26
- password = Passwd.create(upper: false)
27
- expect(("A".."Z").to_a.include?(password)).to eq(false)
28
- end
29
-
30
- it "password create without number" do
31
- password = Passwd.create(number: false)
32
- expect(("0".."9").to_a.include?(password)).to eq(false)
33
- end
34
- end
35
-
36
- context "#auth" do
37
- it "return true with valid password" do
38
- password = Passwd.create
39
- salt_hash = Passwd.hashing(Time.now.to_s)
40
- password_hash = Passwd.hashing("#{salt_hash}#{password}")
41
- expect(Passwd.auth(password, salt_hash, password_hash)).to eq(true)
42
- end
43
-
44
- it "return false with invalid password" do
45
- password = "Secret!!"
46
- salt_hash = Passwd.hashing(Time.now.to_s)
47
- password_hash = Passwd.hashing("#{salt_hash}#{password}")
48
- expect(Passwd.auth("Secret!", salt_hash, password_hash)).to eq(false)
49
- end
50
- end
51
-
52
- context "#hashing" do
53
- it "return string object" do
54
- expect(Passwd.hashing(Passwd.create).class).to eq(String)
55
- end
56
-
57
- it "return hashed password" do
58
- password = Passwd.create
59
- password_hash = Digest::SHA1.hexdigest(password)
60
- expect(Passwd.hashing(password)).to eq(password_hash)
61
- end
62
- end
63
-
64
- context "#config" do
65
- before(:all) do
66
- @default_value = Passwd.config.clone
67
- end
68
-
69
- after(:all) do
70
- Passwd.config(@default_value)
71
- end
72
-
73
- it "return config hash" do
74
- expect(Passwd.config.class).to eq(Hash)
75
- end
76
-
77
- it "set config value" do
78
- old_value = Passwd.config[:length]
79
- Passwd.config(length: 10)
80
- expect(Passwd.config[:length]).not_to eq(old_value)
81
- end
6
+ let(:default) {@default}
7
+
8
+ describe "default settings" do
9
+ let(:config) {Passwd.config}
10
+
11
+ it "length should be a default" do
12
+ expect(config[:length]).to eq(default[:length])
13
+ end
14
+
15
+ it "lower should be a default" do
16
+ expect(config[:lower]).to eq(default[:lower])
17
+ end
18
+
19
+ it "upper should be a default" do
20
+ expect(config[:upper]).to eq(default[:upper])
21
+ end
22
+
23
+ it "number should be a default" do
24
+ expect(config[:number]).to eq(default[:number])
25
+ end
26
+
27
+ it "letters_lower should be a default" do
28
+ expect(config[:letters_lower]).to eq(default[:letters_lower])
29
+ end
30
+
31
+ it "letters_upper should be a default" do
32
+ expect(config[:letters_upper]).to eq(default[:letters_upper])
33
+ end
34
+
35
+ it "letters_number should be a default" do
36
+ expect(config[:letters_number]).to eq(default[:letters_number])
37
+ end
38
+ end
39
+
40
+ describe ".create" do
41
+ it "create random password" do
42
+ password = Passwd.create
43
+ expect(password.is_a? String).to be_true
44
+ expect(password.size).to eq(default[:length])
45
+ end
46
+
47
+ it "password was created specified characters" do
48
+ expect(Passwd.create(length: 10).size).to eq(10)
49
+ end
50
+
51
+ it "password create without lower case" do
52
+ password = Passwd.create lower: false
53
+ expect(default[:letters_lower].include? password).to be_false
54
+ end
55
+
56
+ it "password create without upper case" do
57
+ password = Passwd.create upper: false
58
+ expect(default[:letters_upper].include? password).to be_false
59
+ end
60
+
61
+ it "password create without number" do
62
+ password = Passwd.create(number: false)
63
+ expect(default[:letters_number].include? password).to be_false
64
+ end
65
+ end
66
+
67
+ describe ".auth" do
68
+ let!(:password) do
69
+ password = Passwd.create
70
+ salt_hash = Passwd.hashing(Time.now.to_s)
71
+ password_hash = Passwd.hashing("#{salt_hash}#{password}")
72
+ {text: password, salt: salt_hash, hash: password_hash}
73
+ end
74
+
75
+ it "return true with valid password" do
76
+ expect(Passwd.auth(password[:text], password[:salt], password[:hash])).to be_true
77
+ end
78
+
79
+ it "return false with invalid password" do
80
+ expect(Passwd.auth("invalid", password[:salt], password[:hash])).to be_false
81
+ end
82
+
83
+ it "should create exception if not specified arguments" do
84
+ expect(proc{Passwd.auth}).to raise_error
85
+ end
86
+ end
87
+
88
+ describe ".hashing" do
89
+ it "return hashed password" do
90
+ Digest::SHA1.should_receive(:hexdigest).with("secret").and_return("hash")
91
+ expect(Passwd.hashing("secret")).to eq("hash")
92
+ end
93
+
94
+ it "should create exception if not specified argument" do
95
+ expect(proc{Passwd.hashing}).to raise_error
96
+ end
97
+ end
98
+
99
+ describe ".config" do
100
+ after {Passwd.config(default)}
101
+
102
+ it "return config hash" do
103
+ expect(Passwd.config.is_a? Hash).to be_true
104
+ end
105
+
106
+ it "set config value" do
107
+ Passwd.config(length: 10)
108
+ expect(Passwd.config[:length]).not_to eq(default[:length])
109
+ expect(Passwd.config[:lower]).to eq(default[:lower])
110
+ end
111
+ end
112
+
113
+ describe ".get_retters" do
114
+ it "return letters" do
115
+ letters = Passwd.send(:get_retters, default)
116
+ expect(letters.is_a? Array).to be_true
117
+ expect(letters.select{|s| s.is_a? String}).to eq(letters)
118
+ expect(letters).to eq(default[:letters_lower] + default[:letters_upper] + default[:letters_number])
119
+ end
120
+
121
+ it "should create exception if not specified argument" do
122
+ expect(proc{Passwd.send(:get_retters)}).to raise_error
123
+ end
124
+ end
125
+
126
+ describe ".config_validator" do
127
+ it "convert to symbol the key" do
128
+ config = default.inject({}){|r, (k, v)| r.store(k.to_s, v); r}
129
+ expect(Passwd.send(:config_validator, config)).to eq(default)
130
+ end
131
+
132
+ it "delete not defined parameters" do
133
+ config = default.merge(invalid_parameter: true)
134
+ expect(Passwd.send(:config_validator, config)).to eq(default)
82
135
  end
83
136
  end
84
137
  end
data/spec/spec_helper.rb CHANGED
@@ -2,3 +2,18 @@ require "passwd"
2
2
 
3
3
  require "coveralls"
4
4
  Coveralls.wear!
5
+
6
+ RSpec.configure do |config|
7
+ config.order = "random"
8
+ config.before do
9
+ @default = {
10
+ length: 8,
11
+ lower: true,
12
+ upper: true,
13
+ number: true,
14
+ letters_lower: ('a'..'z').to_a,
15
+ letters_upper: ('A'..'Z').to_a,
16
+ letters_number: ('0'..'9').to_a
17
+ }
18
+ end
19
+ end
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.6
4
+ version: 0.0.7
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-05-28 00:00:00.000000000 Z
12
+ date: 2013-05-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -97,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
97
  version: '0'
98
98
  segments:
99
99
  - 0
100
- hash: -540825171026277875
100
+ hash: 35413922955959980
101
101
  required_rubygems_version: !ruby/object:Gem::Requirement
102
102
  none: false
103
103
  requirements:
@@ -106,10 +106,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
106
  version: '0'
107
107
  segments:
108
108
  - 0
109
- hash: -540825171026277875
109
+ hash: 35413922955959980
110
110
  requirements: []
111
111
  rubyforge_project:
112
- rubygems_version: 1.8.23
112
+ rubygems_version: 1.8.25
113
113
  signing_key:
114
114
  specification_version: 3
115
115
  summary: Password utility