dionysus 1.0.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|