dionysus 1.0.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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
@@ -1,8 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- require 'dionysus'
4
- describe Dionysus do
5
- it "should have a version number" do
6
- Dionysus::VERSION.should match(/\A\d+(\.\d+)+(\.\w+)??\Z/)
7
- end
8
- end
@@ -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