dionysus 1.0.2 → 2.0.0
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/Gemfile +16 -9
- data/README.md +31 -34
- data/Rakefile +16 -79
- data/description.md +1 -0
- data/lib/dionysus.rb +3 -22
- data/lib/dionysus/configuration_callbacks.rb +93 -0
- data/lib/dionysus/redcarpet/includes.rb +41 -0
- data/lib/dionysus/string/version_match.rb +8 -0
- data/lib/dionysus/travisci/gemfile_generator.rb +67 -0
- data/lib/dionysus/version.rb +3 -0
- data/spec/lib/dionysus_spec.rb +18 -0
- data/spec/lib/string/version_match_spec.rb +17 -0
- data/spec/spec_helper.rb +17 -6
- metadata +54 -307
- data/.document +0 -5
- data/.gitignore +0 -22
- data/.rspec +0 -1
- data/Gemfile.lock +0 -41
- data/VERSION +0 -1
- data/dionysus.gemspec +0 -121
- data/lib/dionysus/configuration.rb +0 -200
- data/lib/dionysus/digest.rb +0 -135
- data/lib/dionysus/rdoc/markdown.rb +0 -64
- data/lib/dionysus/rdoc/no_markup.rb +0 -56
- data/lib/dionysus/security.rb +0 -3
- data/lib/dionysus/security/password_salt.rb +0 -138
- data/lib/dionysus/security/string.rb +0 -126
- data/lib/dionysus/string.rb +0 -48
- data/lib/dionysus/version_string.rb +0 -96
- data/spec/configuration_spec.rb +0 -176
- data/spec/digest_spec.rb +0 -183
- data/spec/dionysus_spec.rb +0 -8
- data/spec/password_salt_spec.rb +0 -169
- data/spec/string_security_spec.rb +0 -204
- data/spec/string_spec.rb +0 -46
- data/spec/version_string_spec.rb +0 -83
data/spec/configuration_spec.rb
DELETED
@@ -1,176 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
require 'dionysus/configuration'
|
3
|
-
|
4
|
-
describe Configuration do
|
5
|
-
describe "basics" do
|
6
|
-
before(:each) { @c = Configuration.new(false) }
|
7
|
-
|
8
|
-
it "should be empty when no defaults" do
|
9
|
-
@c.size.should == 0
|
10
|
-
@c.should be_empty
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should be accessible by hash brackets" do
|
14
|
-
@c[:something] = 'a value'
|
15
|
-
@c['something-else'] = 'b value'
|
16
|
-
@c.should_not be_empty
|
17
|
-
@c[:something].should == 'a value'
|
18
|
-
@c['something'].should == 'a value'
|
19
|
-
@c[:'something-else'].should == 'b value'
|
20
|
-
@c['something-else'].should == 'b value'
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should be accessible by method name" do
|
24
|
-
@c.something = 'a value'
|
25
|
-
@c.should_not be_empty
|
26
|
-
@c.something.should == 'a value'
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should be accessible by get/set methods" do
|
30
|
-
@c.set(:something, 'a value')
|
31
|
-
@c.set('something-else', 'b value')
|
32
|
-
@c.should_not be_empty
|
33
|
-
@c.get(:something).should == 'a value'
|
34
|
-
@c.get('something').should == 'a value'
|
35
|
-
@c.get(:'something-else').should == 'b value'
|
36
|
-
@c.get('something-else').should == 'b value'
|
37
|
-
end
|
38
|
-
|
39
|
-
it "should not allow keys with the same name as defined methods." do
|
40
|
-
lambda { @c.set(:set, 'wowsers') }.should raise_error(ArgumentError, "Invalid key: set")
|
41
|
-
@c.to_hash[:set].should be_nil
|
42
|
-
lambda { @c[:set] = 'wowsers' }.should raise_error(ArgumentError, "Invalid key: set")
|
43
|
-
@c.to_hash[:set].should be_nil
|
44
|
-
lambda { @c.set = 'wowsers' }.should raise_error(ArgumentError, "Invalid key: set")
|
45
|
-
@c.to_hash[:set].should be_nil
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should not allow keys that do not conform to the allowed regex." do
|
49
|
-
lambda { @c.set('^&^&*^&*', 'wowsers') }.should raise_error(ArgumentError, "Invalid key: ^&^&*^&*")
|
50
|
-
lambda { @c.set('', 'wowsers') }.should raise_error(ArgumentError, "Invalid key: ")
|
51
|
-
lambda { @c.set(nil, 'wowsers') }.should raise_error(ArgumentError, "Invalid key: ")
|
52
|
-
lambda { @c.set(Object.new, 'wowsers') }.should raise_error(ArgumentError, /^Invalid key: #<Object:0x[a-fA-F0-9]+>$/)
|
53
|
-
end
|
54
|
-
|
55
|
-
it "should revert to the normal method_missing with a block" do
|
56
|
-
lambda { @c.not_a_key { 1+1 } }.should raise_error(NoMethodError)
|
57
|
-
end
|
58
|
-
|
59
|
-
it "should revert to the normal method_missing with any arguments" do
|
60
|
-
lambda { @c.not_a_key('fooey') }.should raise_error(NoMethodError)
|
61
|
-
lambda { @c.not_a_key(nil) }.should raise_error(NoMethodError)
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should revert to normal method_missing with a setter and more than 1 argument" do
|
65
|
-
lambda { @c.send(:not_a_key=, 'fooey', nil) }.should raise_error(NoMethodError)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
describe "with soft keys" do
|
70
|
-
before(:each) { @c = Configuration.new(false) }
|
71
|
-
|
72
|
-
it 'should be soft keys' do
|
73
|
-
@c.should be_soft_keys
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'should initialize empty' do
|
77
|
-
@c.size.should == 0
|
78
|
-
@c.should be_empty
|
79
|
-
end
|
80
|
-
|
81
|
-
it "should take defaults" do
|
82
|
-
@c = Configuration.new(false, :a_val => 'some value')
|
83
|
-
@c.should be_soft_key
|
84
|
-
@c.a_val.should == 'some value'
|
85
|
-
@c.size.should == 1
|
86
|
-
@c.should_not be_empty
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should remove the key on delete" do
|
90
|
-
@c.foo = 'fooey'
|
91
|
-
@c.keys.should == [:foo]
|
92
|
-
|
93
|
-
@c.delete :foo
|
94
|
-
@c.foo.should be_nil
|
95
|
-
@c.keys.should be_empty
|
96
|
-
end
|
97
|
-
|
98
|
-
it "should not remove the key on set nil" do
|
99
|
-
@c.foo = 'fooey'
|
100
|
-
@c.keys.should == [:foo]
|
101
|
-
|
102
|
-
@c.foo = nil
|
103
|
-
@c.foo.should be_nil
|
104
|
-
@c.keys.should == [:foo]
|
105
|
-
end
|
106
|
-
|
107
|
-
it "should allow any key" do
|
108
|
-
@c.allowed_key?('fjdasfiodsaifo').should be_true
|
109
|
-
@c.allowed_key?('^&*%^*9789').should be_true
|
110
|
-
@c.allowed_key?(Object.new).should be_true
|
111
|
-
end
|
112
|
-
|
113
|
-
it "should not allow setting hard keys" do
|
114
|
-
lambda { @c = Configurat.new(false, :a_hard_key, :a_val => 'some_value') }.should
|
115
|
-
raise_error(ArgumentError, 'Cannot define hard keys in soft keys mode')
|
116
|
-
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
describe "with hard keys" do
|
121
|
-
before(:each) { @c = Configuration.new(:foo, :bar) }
|
122
|
-
|
123
|
-
it "should be hard keys" do
|
124
|
-
@c.should be_hard_keys
|
125
|
-
end
|
126
|
-
|
127
|
-
it "should initialize empty" do
|
128
|
-
@c.size.should == 0
|
129
|
-
@c.should be_empty
|
130
|
-
@c.keys.should == [:bar, :foo]
|
131
|
-
end
|
132
|
-
|
133
|
-
it "should take defaults" do
|
134
|
-
@c = Configuration.new(:foo, :bar, {'wowsers' => 'wow', :bar => 'fooey'})
|
135
|
-
@c.keys.should == [:bar, :foo, :wowsers]
|
136
|
-
@c.size.should == 2
|
137
|
-
@c.foo.should == nil
|
138
|
-
@c.bar.should == 'fooey'
|
139
|
-
@c[:wowsers].should == 'wow'
|
140
|
-
end
|
141
|
-
|
142
|
-
it "should not remove the key on delete" do
|
143
|
-
@c.foo = 'fooey'
|
144
|
-
@c.keys.should include(:foo)
|
145
|
-
@c.size.should == 1
|
146
|
-
|
147
|
-
@c.delete :foo
|
148
|
-
@c.foo.should be_nil
|
149
|
-
@c.keys.should include(:foo)
|
150
|
-
@c.size.should == 0
|
151
|
-
end
|
152
|
-
|
153
|
-
it "should not remove the key on set nil" do
|
154
|
-
@c.foo = 'fooey'
|
155
|
-
@c.keys.should include(:foo)
|
156
|
-
@c.size.should == 1
|
157
|
-
|
158
|
-
@c.foo = nil
|
159
|
-
@c.foo.should be_nil
|
160
|
-
@c.keys.should include(:foo)
|
161
|
-
@c.size.should == 1
|
162
|
-
end
|
163
|
-
|
164
|
-
it "should allow only the hard keys" do
|
165
|
-
@c.allowed_key?('fjdasfiodsaifo').should be_false
|
166
|
-
@c.allowed_key?('^&*%^*9789').should be_false
|
167
|
-
@c.allowed_key?(Object.new).should be_false
|
168
|
-
@c.allowed_key?(:foo).should be_true
|
169
|
-
@c.allowed_key?('foo').should be_true
|
170
|
-
end
|
171
|
-
|
172
|
-
it "should revert to the normal method_missing an unallowed key" do
|
173
|
-
lambda { @c.not_a_key }.should raise_error(NoMethodError)
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|
data/spec/digest_spec.rb
DELETED
@@ -1,183 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
require 'dionysus/digest'
|
4
|
-
|
5
|
-
describe Digest do
|
6
|
-
DIGESTS = { :md5 => 128, :sha1 => 160, :sha2 => 256,
|
7
|
-
:sha256 => 256, :sha384 => 384, :sha512 => 512 }
|
8
|
-
it 'should have the default available digests' do
|
9
|
-
Digest.available_digests.length.should == Digest::DEFAULT_DIGESTS.length
|
10
|
-
Digest::DEFAULT_DIGESTS.each do |dig|
|
11
|
-
Digest.available_digests.should include(dig)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
describe 'registration' do
|
16
|
-
before(:all) do
|
17
|
-
Digest.digests.clear
|
18
|
-
end
|
19
|
-
|
20
|
-
after(:each) do
|
21
|
-
Digest.digests.clear
|
22
|
-
end
|
23
|
-
|
24
|
-
after(:all) do
|
25
|
-
Digest::DEFAULT_DIGESTS.each do |sym|
|
26
|
-
Digest.register_digest!(sym)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'should register an available digest' do
|
31
|
-
Digest.register_digest(:md5).should be_a(Hash)
|
32
|
-
Digest.digests[:md5].should be_a(Hash)
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'should register an available digest with bang' do
|
36
|
-
Digest.register_digest!(:md5).should be_a(Hash)
|
37
|
-
Digest.digests[:md5].should be_a(Hash)
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'should automatically interpret the class' do
|
41
|
-
Digest.register_digest(:md5)
|
42
|
-
Digest.digests[:md5][:klass].should == Digest::MD5
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'should register a digest with a class' do
|
46
|
-
Digest.register_digest(:md5, :klass => Digest::SHA256)
|
47
|
-
Digest.digests[:md5][:klass].should == Digest::SHA256
|
48
|
-
Digest.digests[:md5][:bit_length].should == 256
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'should automatically interpret the bit length' do
|
52
|
-
Digest.register_digest(:md5)
|
53
|
-
Digest.digests[:md5][:bit_length].should == 128
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'should register a digest with a class and a bit length' do
|
57
|
-
Digest.register_digest(:md5, :klass => Digest::SHA256, :bit_length => 1)
|
58
|
-
Digest.digests[:md5][:klass].should == Digest::SHA256
|
59
|
-
Digest.digests[:md5][:bit_length].should == 1
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'should quietly reject a digest if it does not exist' do
|
63
|
-
Digest.register_digest(:foobar).should == nil
|
64
|
-
Digest.digests.should == {}
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'should raise an error if a digest does not exist' do
|
68
|
-
lambda { Digest.register_digest!(:foobar) }.should
|
69
|
-
raise_error(LoadError, 'library not found for class Digest::FOOBAR -- digest/foobar')
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'should take an arbitrary object that responds to digest' do
|
73
|
-
my_digest = mock('my_digest')
|
74
|
-
my_digest.should_receive(:digest).with('1').and_return('12345')
|
75
|
-
Digest.register_digest(:my_digest, :klass => my_digest)
|
76
|
-
Digest.digests[:my_digest][:bit_length].should == 5 * 8
|
77
|
-
Digest.digests[:my_digest][:klass].should === my_digest
|
78
|
-
Digest.digests[:my_digest][:method].should == :digest
|
79
|
-
end
|
80
|
-
|
81
|
-
it 'should take an arbitrary method' do
|
82
|
-
my_digest = mock('my_digest')
|
83
|
-
my_digest.should_receive(:do_digest).with('1').and_return('12345')
|
84
|
-
Digest.register_digest(:my_digest, :klass => my_digest, :method => :do_digest)
|
85
|
-
Digest.digests[:my_digest][:bit_length].should == 5 * 8
|
86
|
-
Digest.digests[:my_digest][:klass].should === my_digest
|
87
|
-
Digest.digests[:my_digest][:method].should == :do_digest
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
describe 'digest lengths' do
|
92
|
-
DIGESTS.each do |dig, bits|
|
93
|
-
it "should have binary length for #{dig}" do
|
94
|
-
Digest.digest_lengths[dig].should == bits / 8
|
95
|
-
Digest.digest_lengths(:binary)[dig].should == bits / 8
|
96
|
-
Digest.digest_lengths(8)[dig].should == bits / 8
|
97
|
-
end
|
98
|
-
|
99
|
-
it "should have hex length for #{dig}" do
|
100
|
-
Digest.digest_lengths(:hex)[dig].should == bits / 4
|
101
|
-
Digest.digest_lengths(:hexidecimal)[dig].should == bits / 4
|
102
|
-
Digest.digest_lengths(4)[dig].should == bits / 4
|
103
|
-
end
|
104
|
-
|
105
|
-
it "should have base64 length for #{dig}" do
|
106
|
-
len = bits / 6
|
107
|
-
expected = (len % 4 == 0 ? len : len + (4 - len % 4))
|
108
|
-
Digest.digest_lengths(:base64)[dig].should == expected
|
109
|
-
Digest.digest_lengths(6)[dig].should == expected
|
110
|
-
end
|
111
|
-
|
112
|
-
it "should have bit length for #{dig}" do
|
113
|
-
Digest.digest_lengths(:bit)[dig].should == bits
|
114
|
-
Digest.digest_lengths(1)[dig].should == bits
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should have arbitrary length for #{dig}" do
|
118
|
-
len = bits / 7
|
119
|
-
Digest.digest_lengths(7)[dig].should == len + (8 - len % 8)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
it 'should reject bit length requests for < 0' do
|
124
|
-
lambda { Digest.digest_lengths(0) }.should raise_error(ArgumentError, 'Invalid encoding')
|
125
|
-
lambda { Digest.digest_lengths(-1) }.should raise_error(ArgumentError, 'Invalid encoding')
|
126
|
-
lambda { Digest.digest_lengths(-100) }.should raise_error(ArgumentError, 'Invalid encoding')
|
127
|
-
end
|
128
|
-
|
129
|
-
it 'should reject bit length requests for unknown encodings' do
|
130
|
-
lambda { Digest.digest_lengths(:my_digest) }.should raise_error(ArgumentError, 'Invalid encoding')
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
describe "digest helper" do
|
135
|
-
DIGESTS.each do |dig, bits|
|
136
|
-
it "should run the digest for #{dig}" do
|
137
|
-
Digest.digest(dig, 'foobar').length.should == bits / 8
|
138
|
-
end
|
139
|
-
|
140
|
-
it "should still have working original digest methods" do
|
141
|
-
"Digest::#{dig.to_s.upcase}".constantize.digest('foobar').length.should == bits / 8
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
it "should fail invalid digest" do
|
146
|
-
lambda { Digest.digest(:my_digest, 'foobar') }.should raise_error(LoadError)
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
describe "detection" do
|
151
|
-
DIGESTS.each do |dig, bits|
|
152
|
-
it "should detect #{dig} in binary" do
|
153
|
-
str = Digest.digest(dig, 'foobar')
|
154
|
-
Digest.detect_digest(str).should == (dig == :sha2 ? :sha256 : dig)
|
155
|
-
Digest.detect_digest(str, :binary).should == (dig == :sha2 ? :sha256 : dig)
|
156
|
-
Digest.detect_digest!(str).should == (dig == :sha2 ? :sha256 : dig)
|
157
|
-
Digest.detect_digest!(str, :binary).should == (dig == :sha2 ? :sha256 : dig)
|
158
|
-
end
|
159
|
-
|
160
|
-
it "should detect #{dig} in base64" do
|
161
|
-
str = Digest.digest(dig, 'foobar').encode64s
|
162
|
-
Digest.detect_digest(str, :base64).should == (dig == :sha2 ? :sha256 : dig)
|
163
|
-
Digest.detect_digest!(str, :base64).should == (dig == :sha2 ? :sha256 : dig)
|
164
|
-
end
|
165
|
-
|
166
|
-
it "should detect #{dig} in hexidecimal" do
|
167
|
-
str = Digest.digest(dig, 'foobar').encode_hexidecimal
|
168
|
-
Digest.detect_digest(str, :hex).should == (dig == :sha2 ? :sha256 : dig)
|
169
|
-
Digest.detect_digest(str, :hexidecimal).should == (dig == :sha2 ? :sha256 : dig)
|
170
|
-
Digest.detect_digest!(str, :hex).should == (dig == :sha2 ? :sha256 : dig)
|
171
|
-
Digest.detect_digest!(str, :hexidecimal).should == (dig == :sha2 ? :sha256 : dig)
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
it "should return nil on unknown digest" do
|
176
|
-
Digest.detect_digest('blah').should be_nil
|
177
|
-
end
|
178
|
-
|
179
|
-
it "should fail on unknown digest with !" do
|
180
|
-
lambda { Digest.detect_digest!('blah') }.should raise_error(RuntimeError, "Unknown digest")
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
data/spec/dionysus_spec.rb
DELETED
data/spec/password_salt_spec.rb
DELETED
@@ -1,169 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
require 'dionysus/security/password_salt'
|
4
|
-
describe PasswordSalt do
|
5
|
-
it "should not allow placements other than before, after, and split" do
|
6
|
-
salt = PasswordSalt.new('ABCDEFG')
|
7
|
-
[:before, :after, :split].each do |p|
|
8
|
-
salt.placement = p
|
9
|
-
salt.placement.should == p
|
10
|
-
salt.placement = p.to_s
|
11
|
-
salt.placement.should == p
|
12
|
-
end
|
13
|
-
|
14
|
-
lambda { salt.placement = :wowsers }.should raise_error(ArgumentError, "Invalid salt placement: wowsers")
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should should return the salt string with to_s" do
|
18
|
-
salt = PasswordSalt.new('ABCDEFG')
|
19
|
-
salt.to_s.should == 'ABCDEFG'
|
20
|
-
salt = PasswordSalt.new('ABCDEFG', :after)
|
21
|
-
salt.to_s.should == 'ABCDEFG'
|
22
|
-
salt = PasswordSalt.new()
|
23
|
-
salt.to_s.should == salt.string
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should compare equivalance on both string and placement" do
|
27
|
-
salt1 = PasswordSalt.new('ABCDEFG')
|
28
|
-
salt2 = PasswordSalt.new('ABCDEFG')
|
29
|
-
salt1.eql?(salt2).should be_true
|
30
|
-
salt2.eql?(salt1).should be_true
|
31
|
-
|
32
|
-
salt1 = PasswordSalt.new('ABCDEFG', :before)
|
33
|
-
salt2 = PasswordSalt.new('ABCDEFG', :before)
|
34
|
-
salt1.eql?(salt2).should be_true
|
35
|
-
salt2.eql?(salt1).should be_true
|
36
|
-
|
37
|
-
salt1 = PasswordSalt.new('ABCDEFG', :before)
|
38
|
-
salt2 = PasswordSalt.new('ABCDEFG', :split)
|
39
|
-
salt1.eql?(salt2).should_not be_true
|
40
|
-
salt2.eql?(salt1).should_not be_true
|
41
|
-
end
|
42
|
-
|
43
|
-
describe "initializer" do
|
44
|
-
it "should take the first string arg as the literal salt" do
|
45
|
-
salt = PasswordSalt.new('ABCDEFG')
|
46
|
-
salt.string.should == 'ABCDEFG'
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should take the the second symbold arg as the placement" do
|
50
|
-
salt = PasswordSalt.new('ABCDEFG', :before)
|
51
|
-
salt.placement.should == :before
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should generate a new salt of 8 characters and :after placement with no arguments" do
|
55
|
-
s = PasswordSalt.new
|
56
|
-
s.placement.should == :after
|
57
|
-
s.string.length.should == 8
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should take a length option" do
|
61
|
-
s = PasswordSalt.new(:length => 20)
|
62
|
-
s.placement.should == :after
|
63
|
-
s.string.length.should == 20
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
describe "salt generation" do
|
68
|
-
it "should generate 8 characters by default" do
|
69
|
-
salt = PasswordSalt.generate
|
70
|
-
salt.length.should == 8
|
71
|
-
end
|
72
|
-
|
73
|
-
it "should generate n characters when told to" do
|
74
|
-
(0..20).each do |n|
|
75
|
-
PasswordSalt.generate(n).length.should == n
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
it "should raise an error with negative length" do
|
80
|
-
lambda { PasswordSalt.generate(-1) }.should raise_error(ArgumentError, "Invalid length: -1")
|
81
|
-
end
|
82
|
-
|
83
|
-
it "should generate ascii characters only by default" do
|
84
|
-
100.times do
|
85
|
-
salt = PasswordSalt.generate(100)
|
86
|
-
salt.should match(/\A[A-Za-z0-9\+\/]{100}\Z/)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
it "should generate binary characters" do
|
91
|
-
100.times do
|
92
|
-
salt = PasswordSalt.generate(100, :binary)
|
93
|
-
salt.should_not match(/\A[A-Za-z0-9\+\/]{100}\Z/)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
it "should raise an error with an invalid format" do
|
98
|
-
lambda { PasswordSalt.generate(10, :foobar) }.should raise_error(ArgumentError, "Invalid format: foobar")
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
describe "after placement" do
|
103
|
-
before(:each) do
|
104
|
-
@password = 'foobar'
|
105
|
-
@salt = "ABCDEFG"
|
106
|
-
end
|
107
|
-
|
108
|
-
it "should put the salt after the password by default" do
|
109
|
-
salt = PasswordSalt.new(@salt)
|
110
|
-
salt.salt_password(@password).should == @password+@salt
|
111
|
-
end
|
112
|
-
|
113
|
-
it "should put the salt after the password" do
|
114
|
-
salt = PasswordSalt.new(@salt, :after)
|
115
|
-
salt.salt_password(@password).should == @password+@salt
|
116
|
-
end
|
117
|
-
|
118
|
-
it "should raise an error with a bad placement" do
|
119
|
-
salt = PasswordSalt.new(@salt)
|
120
|
-
salt.instance_variable_set('@placement', :foobar)
|
121
|
-
lambda { salt.salt_password(@password) }.should raise_error(RuntimeError, "Invalid salt placement: foobar")
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
describe "before placement" do
|
126
|
-
before(:each) do
|
127
|
-
@password = 'foobar'
|
128
|
-
@salt = "ABCDEFG"
|
129
|
-
end
|
130
|
-
|
131
|
-
it "should put the salt before the password" do
|
132
|
-
salt = PasswordSalt.new(@salt, :before)
|
133
|
-
salt.salt_password(@password).should == @salt+@password
|
134
|
-
salt = PasswordSalt.new(@salt)
|
135
|
-
salt.placement = :before
|
136
|
-
salt.salt_password(@password).should == @salt+@password
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
describe "split placement with even number of characters" do
|
141
|
-
before(:each) do
|
142
|
-
@password = 'foobar'
|
143
|
-
@salt = "ABCDEFGH"
|
144
|
-
end
|
145
|
-
|
146
|
-
it "should put half the salt before and half the salt after the password" do
|
147
|
-
salt = PasswordSalt.new(@salt, :split)
|
148
|
-
salt.salt_password(@password).should == 'ABCD'+@password+'EFGH'
|
149
|
-
salt = PasswordSalt.new(@salt)
|
150
|
-
salt.placement = :split
|
151
|
-
salt.salt_password(@password).should == 'ABCD'+@password+'EFGH'
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
describe "split placement with odd number of characters" do
|
156
|
-
before(:each) do
|
157
|
-
@password = 'foobar'
|
158
|
-
@salt = "ABCDEFG"
|
159
|
-
end
|
160
|
-
|
161
|
-
it "should put half the salt before and half the salt after the password" do
|
162
|
-
salt = PasswordSalt.new(@salt, :split)
|
163
|
-
salt.salt_password(@password).should == 'ABC'+@password+'DEFG'
|
164
|
-
salt = PasswordSalt.new(@salt)
|
165
|
-
salt.placement = :split
|
166
|
-
salt.salt_password(@password).should == 'ABC'+@password+'DEFG'
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|