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.
@@ -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