vault-rails 0.3.2 → 0.7.1
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.
- checksums.yaml +5 -5
- data/README.md +144 -11
- data/Rakefile +5 -2
- data/lib/vault/encrypted_model.rb +177 -59
- data/lib/vault/rails.rb +75 -27
- data/lib/vault/rails/configurable.rb +27 -7
- data/lib/vault/rails/errors.rb +8 -0
- data/lib/vault/rails/{serializer.rb → json_serializer.rb} +4 -5
- data/lib/vault/rails/version.rb +1 -1
- data/spec/dummy/app/models/lazy_person.rb +20 -0
- data/spec/dummy/app/models/lazy_single_person.rb +18 -0
- data/spec/dummy/app/models/person.rb +36 -1
- data/spec/dummy/config/environments/development.rb +5 -3
- data/spec/dummy/config/environments/test.rb +5 -3
- data/spec/dummy/db/migrate/20150428220101_create_people.rb +7 -1
- data/spec/dummy/db/schema.rb +21 -16
- data/spec/integration/rails_spec.rb +397 -17
- data/spec/lib/vault/rails/json_serializer_spec.rb +42 -0
- data/spec/spec_helper.rb +27 -0
- data/spec/unit/encrypted_model_spec.rb +9 -4
- data/spec/unit/rails/configurable_spec.rb +75 -0
- data/spec/unit/vault/rails_spec.rb +33 -0
- metadata +29 -24
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Vault::Rails::JSONSerializer do
|
4
|
+
[
|
5
|
+
nil,
|
6
|
+
false,
|
7
|
+
true,
|
8
|
+
"",
|
9
|
+
"foo",
|
10
|
+
{},
|
11
|
+
{ "foo" => "bar" },
|
12
|
+
[],
|
13
|
+
["foo", "bar"],
|
14
|
+
0,
|
15
|
+
123,
|
16
|
+
0.0,
|
17
|
+
0.123,
|
18
|
+
0xff,
|
19
|
+
123e123
|
20
|
+
].each do |object|
|
21
|
+
it "encodes and decodes #{object.inspect}" do
|
22
|
+
encoded = described_class.encode(object)
|
23
|
+
expect(encoded).to be_a(String)
|
24
|
+
decoded = described_class.decode(encoded)
|
25
|
+
expect(decoded).to eq(object)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe ".decode" do
|
30
|
+
subject(:decoded) { described_class.decode(raw) }
|
31
|
+
|
32
|
+
context "with nil" do
|
33
|
+
let(:raw) { nil }
|
34
|
+
it { is_expected.to eq(nil) }
|
35
|
+
end
|
36
|
+
|
37
|
+
context "with an empty string (only possible if column has a default)" do
|
38
|
+
let(:raw) { "" }
|
39
|
+
it { is_expected.to eq(nil) }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,12 +3,31 @@ require "vault/rails"
|
|
3
3
|
|
4
4
|
require "rspec"
|
5
5
|
|
6
|
+
def vault_version_string
|
7
|
+
@vault_version_string ||= `vault --version`
|
8
|
+
end
|
9
|
+
|
10
|
+
TEST_VAULT_VERSION = Gem::Version.new(vault_version_string.match(/(\d+\.\d+\.\d+)/)[1])
|
11
|
+
|
6
12
|
RSpec.configure do |config|
|
7
13
|
# Prohibit using the should syntax
|
8
14
|
config.expect_with :rspec do |spec|
|
9
15
|
spec.syntax = :expect
|
10
16
|
end
|
11
17
|
|
18
|
+
# Allow tests to isolate a specific test using +focus: true+. If nothing
|
19
|
+
# is focused, then all tests are executed.
|
20
|
+
config.filter_run_when_matching :focus
|
21
|
+
config.filter_run_excluding vault: lambda { |v|
|
22
|
+
!vault_meets_requirements?(v)
|
23
|
+
}
|
24
|
+
config.filter_run_excluding ent_vault: lambda { |v|
|
25
|
+
!vault_is_enterprise? || !vault_meets_requirements?(v)
|
26
|
+
}
|
27
|
+
config.filter_run_excluding non_ent_vault: lambda { |v|
|
28
|
+
vault_is_enterprise? || !vault_meets_requirements?(v)
|
29
|
+
}
|
30
|
+
|
12
31
|
# Allow tests to isolate a specific test using +focus: true+. If nothing
|
13
32
|
# is focused, then all tests are executed.
|
14
33
|
config.filter_run(focus: true)
|
@@ -21,4 +40,12 @@ RSpec.configure do |config|
|
|
21
40
|
config.order = 'random'
|
22
41
|
end
|
23
42
|
|
43
|
+
def vault_is_enterprise?
|
44
|
+
!!vault_version_string.match(/\+(?:ent|prem)/)
|
45
|
+
end
|
46
|
+
|
47
|
+
def vault_meets_requirements?(v)
|
48
|
+
Gem::Requirement.new(v).satisfied_by?(TEST_VAULT_VERSION)
|
49
|
+
end
|
50
|
+
|
24
51
|
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
@@ -20,6 +20,12 @@ describe Vault::EncryptedModel do
|
|
20
20
|
}.to raise_error(Vault::Rails::ValidationFailedError)
|
21
21
|
end
|
22
22
|
|
23
|
+
it "raises an exception if a proc is passed to :context without an arity of 1" do
|
24
|
+
expect {
|
25
|
+
klass.vault_attribute(:foo, context: ->() { })
|
26
|
+
}.to raise_error(Vault::Rails::ValidationFailedError, /1 argument/i)
|
27
|
+
end
|
28
|
+
|
23
29
|
it "defines a getter" do
|
24
30
|
klass.vault_attribute(:foo)
|
25
31
|
expect(klass.instance_methods).to include(:foo)
|
@@ -36,10 +42,9 @@ describe Vault::EncryptedModel do
|
|
36
42
|
end
|
37
43
|
|
38
44
|
it "defines dirty attribute methods" do
|
39
|
-
|
40
|
-
expect(
|
41
|
-
expect(
|
42
|
-
expect(klass.instance_methods).to include(:foo_was)
|
45
|
+
expect(Person.new).to respond_to(:ssn_change)
|
46
|
+
expect(Person.new).to respond_to(:ssn_changed?)
|
47
|
+
expect(Person.new).to respond_to(:ssn_was)
|
43
48
|
end
|
44
49
|
end
|
45
50
|
end
|
@@ -9,6 +9,81 @@ describe Vault::Rails::Configurable do
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
describe '.application' do
|
13
|
+
context 'when unconfigured' do
|
14
|
+
it 'raises exception' do
|
15
|
+
expect {
|
16
|
+
subject.application
|
17
|
+
}.to raise_error(RuntimeError)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when configured' do
|
22
|
+
before do
|
23
|
+
subject.configure do |vault|
|
24
|
+
vault.application = "dummy"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'returns the application' do
|
29
|
+
expect(subject.application).to eq "dummy"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'falls back to ENV' do
|
34
|
+
before do
|
35
|
+
ENV["VAULT_RAILS_APPLICATION"] = "envdummy"
|
36
|
+
end
|
37
|
+
after do
|
38
|
+
ENV.delete("VAULT_RAILS_APPLICATION")
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'returns the application defined in ENV' do
|
42
|
+
expect(subject.application).to eq "envdummy"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '.enabled' do
|
48
|
+
context 'when unconfigured' do
|
49
|
+
it 'returns false' do
|
50
|
+
expect(subject.enabled?).to eq false
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when configured' do
|
55
|
+
it 'returns true' do
|
56
|
+
subject.configure do |vault|
|
57
|
+
vault.enabled = true
|
58
|
+
end
|
59
|
+
expect(subject.enabled?).to eq true
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'returns false' do
|
63
|
+
subject.configure do |vault|
|
64
|
+
vault.enabled = false
|
65
|
+
end
|
66
|
+
expect(subject.enabled?).to eq false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'falls back to ENV' do
|
71
|
+
after do
|
72
|
+
ENV.delete("VAULT_RAILS_ENABLED")
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'returns false' do
|
76
|
+
ENV["VAULT_RAILS_ENABLED"] = "false"
|
77
|
+
expect(subject.enabled?).to eq false
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'returns true' do
|
81
|
+
ENV["VAULT_RAILS_ENABLED"] = "true"
|
82
|
+
expect(subject.enabled?).to eq true
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
12
87
|
describe '.in_memory_warnings_enabled?' do
|
13
88
|
context 'when unconfigured' do
|
14
89
|
it 'returns true' do
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Vault::Rails do
|
4
|
+
describe "#memory_key_for" do
|
5
|
+
input_examples = [
|
6
|
+
["path", "key"],
|
7
|
+
["path", "key", "context"],
|
8
|
+
["a_really_long_path", "a_really_long_key"],
|
9
|
+
["a_really_long_path", "a_really_long_key", "a_really_long_context"],
|
10
|
+
]
|
11
|
+
|
12
|
+
input_examples.each do |path, key, encryption_context|
|
13
|
+
context "with path=#{path}, key=#{key}, context=#{encryption_context}" do
|
14
|
+
it "returns exactly 16 bytes as required by OpenSSL AES 128" do
|
15
|
+
memory_key = Vault::Rails.send(
|
16
|
+
:memory_key_for, path, key, context: encryption_context
|
17
|
+
)
|
18
|
+
expect(memory_key.bytesize).to eq(16)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns unique keys for different paths, keys, and contexts" do
|
24
|
+
memory_keys = input_examples.map { |path, key, encryption_context|
|
25
|
+
Vault::Rails.send(
|
26
|
+
:memory_key_for, path, key, context: encryption_context
|
27
|
+
)
|
28
|
+
}
|
29
|
+
|
30
|
+
expect(memory_keys).to match_array(memory_keys.uniq)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
metadata
CHANGED
@@ -1,59 +1,59 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vault-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seth Vargo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '5.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '5.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: vault
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
33
|
+
version: '0.14'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
40
|
+
version: '0.14'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: pry
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name: pry
|
70
|
+
name: pry-byebug
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 12.3.3
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 12.3.3
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rspec
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,16 +112,16 @@ dependencies:
|
|
112
112
|
name: sqlite3
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - "
|
115
|
+
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
117
|
+
version: 1.3.6
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- - "
|
122
|
+
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
124
|
+
version: 1.3.6
|
125
125
|
description: Official Vault plugin for Rails
|
126
126
|
email:
|
127
127
|
- sethvargo@gmail.com
|
@@ -136,10 +136,11 @@ files:
|
|
136
136
|
- lib/vault/rails.rb
|
137
137
|
- lib/vault/rails/configurable.rb
|
138
138
|
- lib/vault/rails/errors.rb
|
139
|
-
- lib/vault/rails/
|
139
|
+
- lib/vault/rails/json_serializer.rb
|
140
140
|
- lib/vault/rails/version.rb
|
141
141
|
- spec/dummy/Rakefile
|
142
142
|
- spec/dummy/app/models/lazy_person.rb
|
143
|
+
- spec/dummy/app/models/lazy_single_person.rb
|
143
144
|
- spec/dummy/app/models/person.rb
|
144
145
|
- spec/dummy/bin/bundle
|
145
146
|
- spec/dummy/bin/rails
|
@@ -171,11 +172,13 @@ files:
|
|
171
172
|
- spec/dummy/public/500.html
|
172
173
|
- spec/dummy/public/favicon.ico
|
173
174
|
- spec/integration/rails_spec.rb
|
175
|
+
- spec/lib/vault/rails/json_serializer_spec.rb
|
174
176
|
- spec/spec_helper.rb
|
175
177
|
- spec/support/vault_server.rb
|
176
178
|
- spec/unit/encrypted_model_spec.rb
|
177
179
|
- spec/unit/rails/configurable_spec.rb
|
178
180
|
- spec/unit/rails_spec.rb
|
181
|
+
- spec/unit/vault/rails_spec.rb
|
179
182
|
homepage: https://github.com/hashicorp/vault-rails
|
180
183
|
licenses:
|
181
184
|
- MPL-2.0
|
@@ -195,13 +198,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
195
198
|
- !ruby/object:Gem::Version
|
196
199
|
version: '0'
|
197
200
|
requirements: []
|
198
|
-
|
199
|
-
rubygems_version: 2.6.10
|
201
|
+
rubygems_version: 3.2.3
|
200
202
|
signing_key:
|
201
203
|
specification_version: 4
|
202
204
|
summary: Official Vault plugin for Rails
|
203
205
|
test_files:
|
206
|
+
- spec/dummy/Rakefile
|
204
207
|
- spec/dummy/app/models/lazy_person.rb
|
208
|
+
- spec/dummy/app/models/lazy_single_person.rb
|
205
209
|
- spec/dummy/app/models/person.rb
|
206
210
|
- spec/dummy/bin/bundle
|
207
211
|
- spec/dummy/bin/rails
|
@@ -232,10 +236,11 @@ test_files:
|
|
232
236
|
- spec/dummy/public/422.html
|
233
237
|
- spec/dummy/public/500.html
|
234
238
|
- spec/dummy/public/favicon.ico
|
235
|
-
- spec/dummy/Rakefile
|
236
239
|
- spec/integration/rails_spec.rb
|
240
|
+
- spec/lib/vault/rails/json_serializer_spec.rb
|
237
241
|
- spec/spec_helper.rb
|
238
242
|
- spec/support/vault_server.rb
|
239
243
|
- spec/unit/encrypted_model_spec.rb
|
240
244
|
- spec/unit/rails/configurable_spec.rb
|
241
245
|
- spec/unit/rails_spec.rb
|
246
|
+
- spec/unit/vault/rails_spec.rb
|