passwd 0.1.1 → 0.1.2

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
2
  SHA1:
3
- metadata.gz: a92e0fc9b057332f70b4adde83c0d52d39c837ad
4
- data.tar.gz: fd0514c01725a3312fcc8b64591aa881a2584371
3
+ metadata.gz: 5f91e14eb692efe0d90d138bcc541788aec69c12
4
+ data.tar.gz: 67a298fe7246b5470272e55b11427262f44a245d
5
5
  SHA512:
6
- metadata.gz: 040c613b3fe930cd550cacc68a47977ab7e6a56a02870135e897a4dacc76699aadf1ae8479b2efac63401c742e56719b560b0f2d613b6b3ce39aee1484e29a61
7
- data.tar.gz: 3e475498013103b4d9bf6f5a0c35b9395ed92eb7d32df93ebbe151c4f605220dd336fc2098eb1574114723217d55444cc5a2756dedd71d3e1eeffe7ad1cb5da1
6
+ metadata.gz: 24d8d2da30dcd3cb480d114e0f637f594319095d21c7383071bb745217c374d14f0a7625f95c829d0389a1f62f20206f0028914a6f96d39e153636e24825cf9d
7
+ data.tar.gz: d11e78fc3350d5003e0fe96cde72fe13694ad4149997f41e6c73b0bd4105a9393114df219838e6977c32b91cfe98d6d7eb3ecff7fc70b30576146744b005da4d
data/README.md CHANGED
@@ -49,8 +49,8 @@ Default config is stored in the class instance variable.
49
49
  Changing the default configs are as follows:
50
50
 
51
51
  ```ruby
52
- Passwd.config => Get config object.
53
- Passwd.config(length: 10) => Change to the default length.
52
+ Passwd.config # => Get config object.
53
+ Passwd.config(length: 10) # => Change to the default length.
54
54
 
55
55
  Passwd.configure do |c|
56
56
  c.length = 10
@@ -67,6 +67,29 @@ Options that can be specified:
67
67
  * :letters_upper => Define an array of upper case. default is ("A".."Z").to_a
68
68
  * :letters_number => Define an array of numbers. default is ("0".."9").to_a
69
69
 
70
+ ### Policy check
71
+
72
+ Default policy is 8 more characters and require lower case and require number.
73
+
74
+ ```ruby
75
+ Passwd.policy_check("secret") # => true or false
76
+ ```
77
+
78
+ ### Policy settings
79
+
80
+ ```ruby
81
+ Passwd.policy_configure do |c|
82
+ c.min_length = 10
83
+ end
84
+ ```
85
+
86
+ Options that can be specified:
87
+
88
+ * :min_length => Number of minimum characters. default is 8.
89
+ * :require_lower => Require lower case if set true. default is true.
90
+ * :require_upper => Require upper case if set true. default is false.
91
+ * :require_number => Require number if set true. default is true.
92
+
70
93
  ### Password object
71
94
 
72
95
  Default password is randomly generated.
@@ -96,9 +119,12 @@ password == password.text # => true
96
119
  password == "invalid!!" # => false
97
120
  ```
98
121
 
99
- ## For ActiveRecord User model
122
+ ## For ActiveRecord
123
+
124
+ ### User model
100
125
 
101
- model:
126
+ Include `Passwd::ActiveRecord` module and define id/salt/password column from `define_column` method.
127
+ `id` column is required uniqueness.
102
128
 
103
129
  ```ruby
104
130
  class User < ActiveRecord::Base
@@ -110,7 +136,13 @@ class User < ActiveRecord::Base
110
136
  end
111
137
  ```
112
138
 
113
- Authentication:
139
+ Available following method by defining id/salt/password column.
140
+
141
+ ### Authentication
142
+
143
+ `authenticate` method is available in both instance and class.
144
+ Return the user object if the authentication successful.
145
+ Return the nil if authentication fails or doesn't exists user.
114
146
 
115
147
  ```ruby
116
148
  user = User.authenticate("foo@example.com", "secret") # => return user object or nil.
@@ -122,6 +154,8 @@ else
122
154
  end
123
155
  ```
124
156
 
157
+ instance method is not required `id`.
158
+
125
159
  ```ruby
126
160
  user = User.find(params[:id])
127
161
  if user.authenticate("secret") # => return true or false
@@ -131,20 +165,24 @@ else
131
165
  end
132
166
  ```
133
167
 
134
- Change passowrd:
168
+ ### Change passowrd
169
+
170
+ `set_password` method will be set random password.
171
+ Return value is plain text password.
172
+ To specify the password as an argument if you want to specify a password.
173
+ `salt` also set if salt is nil.
135
174
 
136
175
  ```ruby
137
176
  user = User.find(params[:id])
138
- # set random password. (salt also set if salt is nil)
139
- # return set password text.
140
- # set specified password if specified argument.
141
- # user.set_password("secret")
142
177
  password_text = user.set_password
143
178
 
144
179
  if user.save
145
180
  NoticeMailer.change_mail(user, password_text).deliver
146
181
  end
147
182
  ```
183
+ `update_password` method will be set new password if the authentication successful.
184
+ Return the nil if authentication fails.
185
+ But `update_password` method doesn't call `save` method.
148
186
 
149
187
  ```ruby
150
188
  user.find(params[:id])
data/lib/passwd/base.rb CHANGED
@@ -1,10 +1,13 @@
1
1
  # coding: utf-8
2
2
 
3
+ require "singleton"
3
4
  require "passwd/configuration/config"
4
5
  require "passwd/configuration/tmp_config"
6
+ require "passwd/configuration/policy"
5
7
 
6
8
  module Passwd
7
9
  @config = Config.instance
10
+ @policy = Policy.instance
8
11
 
9
12
  module Base
10
13
  def create(options={})
@@ -38,9 +41,25 @@ module Passwd
38
41
  end
39
42
  alias :config :configure
40
43
 
44
+ def policy_configure(&block)
45
+ if block_given?
46
+ @policy.configure &block
47
+ else
48
+ @policy
49
+ end
50
+ end
51
+
52
+ def policy_check(password)
53
+ @policy.valid?(password, @config)
54
+ end
55
+
41
56
  def reset_config
42
57
  @config.reset
43
58
  end
59
+
60
+ def reset_policy
61
+ @policy.reset
62
+ end
44
63
  end
45
64
 
46
65
  extend Base
@@ -1,7 +1,5 @@
1
1
  # coding: utf-8
2
2
 
3
- require "singleton"
4
-
5
3
  require "passwd/configuration/abstract_config"
6
4
 
7
5
  module Passwd
@@ -0,0 +1,46 @@
1
+ # coding: utf-8
2
+
3
+ module Passwd
4
+ class Policy
5
+ include Singleton
6
+
7
+ VALID_OPTIONS_KEYS = [
8
+ :min_length,
9
+ :require_lower,
10
+ :require_upper,
11
+ :require_number
12
+ ].freeze
13
+
14
+ attr_accessor *VALID_OPTIONS_KEYS
15
+
16
+ def initialize
17
+ reset
18
+ end
19
+
20
+ def configure
21
+ yield self
22
+ end
23
+
24
+ def valid?(password, config)
25
+ return false if self.min_length > password.size
26
+ return false if self.require_lower && !include_char?(config.letters_lower, password)
27
+ return false if self.require_upper && !include_char?(config.letters_upper, password)
28
+ return false if self.require_number && !include_char?(config.letters_number, password)
29
+ true
30
+ end
31
+
32
+ def include_char?(letters, strings)
33
+ strings.each_char do |c|
34
+ return true if letters.include? c
35
+ end
36
+ false
37
+ end
38
+
39
+ def reset
40
+ self.min_length = 8
41
+ self.require_lower = true
42
+ self.require_upper = false
43
+ self.require_number = true
44
+ end
45
+ end
46
+ end
@@ -1,5 +1,5 @@
1
1
  # coding: utf-8
2
2
 
3
3
  module Passwd
4
- VERSION = "0.1.1"
4
+ VERSION = "0.1.2"
5
5
  end
@@ -103,6 +103,57 @@ describe Passwd do
103
103
  end
104
104
  end
105
105
 
106
+ describe "#policy_configure" do
107
+ it "return policy object" do
108
+ expect(Passwd.policy_configure.is_a? Passwd::Policy).to be_true
109
+ end
110
+
111
+ it "set policy value from block" do
112
+ Passwd.policy_configure do |c|
113
+ c.min_length = 10
114
+ end
115
+ expect(Passwd.policy_configure.min_length).not_to eq(8)
116
+ expect(Passwd.policy_configure.min_length).to eq(10)
117
+ end
118
+ end
119
+
120
+ describe "#policy_check" do
121
+ it "Policy#valid? should be called" do
122
+ Passwd::Policy.instance.should_receive(:valid?).with("secret1234" ,Passwd::Config.instance)
123
+ expect(Passwd.policy_check("secret1234")).not_to raise_error
124
+ end
125
+ end
126
+
127
+ describe "#reset_policy" do
128
+ let(:policy) {Passwd::Policy.instance}
129
+
130
+ before {
131
+ policy.configure do |c|
132
+ c.min_length = 20
133
+ c.require_lower = false
134
+ c.require_upper = true
135
+ c.require_number = false
136
+ end
137
+ Passwd.reset_policy
138
+ }
139
+
140
+ it "min_length should be a default" do
141
+ expect(policy.min_length).to eq(8)
142
+ end
143
+
144
+ it "require_lower should be a default" do
145
+ expect(policy.require_lower).to be_true
146
+ end
147
+
148
+ it "upper should be a default" do
149
+ expect(policy.require_upper).to be_false
150
+ end
151
+
152
+ it "number should be a default" do
153
+ expect(policy.require_number).to be_true
154
+ end
155
+ end
156
+
106
157
  describe "#reset_config" do
107
158
  let(:config) {Passwd::Config.instance}
108
159
 
@@ -0,0 +1,133 @@
1
+ # coding: utf-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Passwd::Policy do
6
+ let(:policy) {Passwd::Policy.instance}
7
+
8
+ describe "defined accessors" do
9
+ it "defined min_length" do
10
+ expect(policy.respond_to? :min_length).to be_true
11
+ end
12
+
13
+ it "defined require_lower" do
14
+ expect(policy.respond_to? :require_lower).to be_true
15
+ end
16
+
17
+ it "defined require_upper" do
18
+ expect(policy.respond_to? :require_upper).to be_true
19
+ end
20
+
21
+ it "defined require_number" do
22
+ expect(policy.respond_to? :require_number).to be_true
23
+ end
24
+ end
25
+
26
+ describe "#initialize" do
27
+ it "min_length should be a default" do
28
+ expect(policy.min_length).to eq(8)
29
+ end
30
+
31
+ it "require_lower should be a default" do
32
+ expect(policy.require_lower).to be_true
33
+ end
34
+
35
+ it "require_upper should be a default" do
36
+ expect(policy.require_upper).to be_false
37
+ end
38
+
39
+ it "require_number should be a default" do
40
+ expect(policy.require_number).to be_true
41
+ end
42
+ end
43
+
44
+ describe "#configure" do
45
+ before {
46
+ policy.configure do |c|
47
+ c.min_length = 20
48
+ c.require_lower = false
49
+ c.require_upper = true
50
+ c.require_number = false
51
+ end
52
+ }
53
+
54
+ it "set min_length from block" do
55
+ expect(policy.min_length).to eq(20)
56
+ end
57
+
58
+ it "set require_lower from block" do
59
+ expect(policy.require_lower).to be_false
60
+ end
61
+
62
+ it "set require_upper from block" do
63
+ expect(policy.require_upper).to be_true
64
+ end
65
+
66
+ it "set require_number from block" do
67
+ expect(policy.require_number).to be_false
68
+ end
69
+ end
70
+
71
+ describe "#valid?" do
72
+ let(:config) {Passwd::Config.instance}
73
+
74
+ it "valid password should be valid" do
75
+ expect(policy.valid?("secret1234", config)).to be_true
76
+ end
77
+
78
+ it "short password should not valid" do
79
+ expect(policy.valid?("short1", config)).to be_false
80
+ end
81
+
82
+ it "password should not valid if not contain lower case" do
83
+ expect(policy.valid?("NOTLOWER12", config)).to be_false
84
+ end
85
+
86
+ it "password should not valid if not contain upper case" do
87
+ policy.configure {|c| c.require_upper = true}
88
+ expect(policy.valid?("notupper12", config)).to be_false
89
+ end
90
+
91
+ it "password should not valid if not contain number" do
92
+ expect(policy.valid?("notnumber", config)).to be_false
93
+ end
94
+ end
95
+
96
+ describe "#include_char?" do
97
+ it "should be return true if contains" do
98
+ expect(policy.include_char?(("a".."z").to_a, "contains")).to be_true
99
+ end
100
+
101
+ it "should be return false if not contains" do
102
+ expect(policy.include_char?(("a".."z").to_a, "NOTCONTAINS")).to be_false
103
+ end
104
+ end
105
+
106
+ describe "#reset" do
107
+ before {
108
+ policy.configure do |c|
109
+ c.min_length = 20
110
+ c.require_lower = false
111
+ c.require_upper = true
112
+ c.require_number = false
113
+ end
114
+ policy.reset
115
+ }
116
+
117
+ it "min_length should be a default" do
118
+ expect(policy.min_length).to eq(8)
119
+ end
120
+
121
+ it "require_lower should be a default" do
122
+ expect(policy.require_lower).to be_true
123
+ end
124
+
125
+ it "require_upper should be a default" do
126
+ expect(policy.require_upper).to be_false
127
+ end
128
+
129
+ it "require_number should be a default" do
130
+ expect(policy.require_number).to be_true
131
+ end
132
+ end
133
+ end
data/spec/spec_helper.rb CHANGED
@@ -14,5 +14,6 @@ RSpec.configure do |config|
14
14
  config.order = "random"
15
15
  config.after do
16
16
  Passwd::Config.instance.reset
17
+ Passwd::Policy.instance.reset
17
18
  end
18
19
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: passwd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - i2bskn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-10 00:00:00.000000000 Z
11
+ date: 2013-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -71,6 +71,7 @@ files:
71
71
  - lib/passwd/base.rb
72
72
  - lib/passwd/configuration/abstract_config.rb
73
73
  - lib/passwd/configuration/config.rb
74
+ - lib/passwd/configuration/policy.rb
74
75
  - lib/passwd/configuration/tmp_config.rb
75
76
  - lib/passwd/password.rb
76
77
  - lib/passwd/version.rb
@@ -78,6 +79,7 @@ files:
78
79
  - spec/passwd/active_record_spec.rb
79
80
  - spec/passwd/base_spec.rb
80
81
  - spec/passwd/configuration/config_spec.rb
82
+ - spec/passwd/configuration/policy_spec.rb
81
83
  - spec/passwd/configuration/tmp_config_spec.rb
82
84
  - spec/passwd/password_spec.rb
83
85
  - spec/spec_helper.rb
@@ -109,6 +111,7 @@ test_files:
109
111
  - spec/passwd/active_record_spec.rb
110
112
  - spec/passwd/base_spec.rb
111
113
  - spec/passwd/configuration/config_spec.rb
114
+ - spec/passwd/configuration/policy_spec.rb
112
115
  - spec/passwd/configuration/tmp_config_spec.rb
113
116
  - spec/passwd/password_spec.rb
114
117
  - spec/spec_helper.rb