chef-vault 3.3.0 → 4.1.11

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.
Files changed (71) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +32 -6
  3. data/bin/chef-vault +5 -5
  4. data/chef-vault.gemspec +7 -26
  5. data/lib/chef/knife/mixin/helper.rb +29 -1
  6. data/lib/chef/knife/vault_admins.rb +5 -1
  7. data/lib/chef/knife/vault_base.rb +23 -13
  8. data/lib/chef/knife/vault_create.rb +26 -23
  9. data/lib/chef/knife/vault_delete.rb +4 -2
  10. data/lib/chef/knife/vault_download.rb +2 -2
  11. data/lib/chef/knife/vault_edit.rb +4 -4
  12. data/lib/chef/knife/vault_isvault.rb +4 -4
  13. data/lib/chef/knife/vault_itemtype.rb +4 -4
  14. data/lib/chef/knife/vault_list.rb +5 -5
  15. data/lib/chef/knife/vault_refresh.rb +7 -7
  16. data/lib/chef/knife/vault_remove.rb +19 -16
  17. data/lib/chef/knife/vault_rotate_all_keys.rb +5 -4
  18. data/lib/chef/knife/vault_rotate_keys.rb +3 -3
  19. data/lib/chef/knife/vault_show.rb +8 -10
  20. data/lib/chef/knife/vault_update.rb +38 -24
  21. data/lib/chef-vault/actor.rb +9 -7
  22. data/lib/chef-vault/chef_api.rb +4 -4
  23. data/lib/chef-vault/exceptions.rb +3 -0
  24. data/lib/chef-vault/item.rb +57 -21
  25. data/lib/chef-vault/item_keys.rb +35 -9
  26. data/lib/chef-vault/mixins.rb +2 -2
  27. data/lib/chef-vault/version.rb +1 -1
  28. data/lib/chef-vault.rb +8 -8
  29. metadata +8 -135
  30. data/.github/CODEOWNERS +0 -2
  31. data/.gitignore +0 -33
  32. data/.rspec +0 -2
  33. data/.rubocop.yml +0 -6
  34. data/.simplecov +0 -6
  35. data/.travis.yml +0 -19
  36. data/Changelog.md +0 -134
  37. data/DEMO.md +0 -60
  38. data/KNIFE_EXAMPLES.md +0 -256
  39. data/README.md +0 -333
  40. data/Rakefile +0 -50
  41. data/THEORY.md +0 -363
  42. data/UPGRADE.md +0 -55
  43. data/appveyor.yml +0 -32
  44. data/features/clean.feature +0 -23
  45. data/features/clean_on_refresh.feature +0 -27
  46. data/features/clean_unknown_clients.feature +0 -45
  47. data/features/detect_and_warn_v1_vault.feature +0 -14
  48. data/features/isvault.feature +0 -29
  49. data/features/itemtype.feature +0 -24
  50. data/features/step_definitions/chef-databag.rb +0 -9
  51. data/features/step_definitions/chef-repo.rb +0 -72
  52. data/features/step_definitions/chef-vault.rb +0 -151
  53. data/features/step_definitions/chef_databagitem.rb +0 -9
  54. data/features/support/env.rb +0 -14
  55. data/features/vault_create.feature +0 -63
  56. data/features/vault_list.feature +0 -31
  57. data/features/vault_show.feature +0 -45
  58. data/features/vault_show_vaultname.feature +0 -21
  59. data/features/vault_update.feature +0 -18
  60. data/features/verify_id_matches.feature +0 -10
  61. data/features/wrong_private_key.feature +0 -13
  62. data/hooks/pre-commit +0 -43
  63. data/spec/chef-vault/actor_spec.rb +0 -247
  64. data/spec/chef-vault/certificate_spec.rb +0 -37
  65. data/spec/chef-vault/chef_api_spec.rb +0 -39
  66. data/spec/chef-vault/item_keys_spec.rb +0 -263
  67. data/spec/chef-vault/item_spec.rb +0 -360
  68. data/spec/chef-vault/user_spec.rb +0 -36
  69. data/spec/chef-vault_spec.rb +0 -65
  70. data/spec/spec_helper.rb +0 -91
  71. data/tasks/github_changelog_generator.rb +0 -30
@@ -1,72 +0,0 @@
1
- Given(/^a local mode chef repo with nodes '(.+?)'(?: with admins '(.+?)')?$/) do |nodelist, adminlist|
2
- # create the repo directory hierarchy
3
- %w{cookbooks clients nodes data_bags}.each do |dir|
4
- create_directory dir
5
- end
6
- # create a basic knife.rb
7
- write_file "knife.rb", <<EOF
8
- local_mode true
9
- chef_repo_path '.'
10
- chef_zero.enabled true
11
- knife[:vault_mode] = 'client'
12
- EOF
13
- # create the admin users and capture their private key we
14
- # always create an admin called 'admin' because otherwise subsequent
15
- # steps become annoying to determine who the admin is
16
- admins = %w{admin}
17
- admins.push(adminlist.split(/,/)) if adminlist
18
- admins.flatten.each do |admin|
19
- create_admin(admin)
20
- end
21
- # add the admin key to the knife configuration
22
- append_to_file "knife.rb", <<EOF
23
- node_name 'admin'
24
- client_key 'admin.pem'
25
- EOF
26
- # create the requested nodes
27
- nodelist.split(/,/).each do |node|
28
- create_client(node)
29
- create_node(node)
30
- end
31
- end
32
-
33
- Given(/^I create an admin named '(.+)'$/) do |admin|
34
- create_admin(admin)
35
- end
36
-
37
- Given(/^I delete clients? '(.+)' from the Chef server$/) do |nodelist|
38
- nodelist.split(/,/).each do |node|
39
- delete_client(node)
40
- end
41
- end
42
-
43
- Given(/^I regenerate the client key for the node '(.+)'$/) do |node|
44
- delete_client(node)
45
- create_client(node)
46
- end
47
-
48
- Given(/^I delete nodes? '(.+)' from the Chef server$/) do |nodelist|
49
- nodelist.split(/,/).each { |node| delete_node(node) }
50
- end
51
-
52
- def create_node(name)
53
- run_simple "knife node create #{name} -z -d -c knife.rb"
54
- end
55
-
56
- def create_admin(admin)
57
- create_client(admin, "-a")
58
- end
59
-
60
- def create_client(name, args = nil)
61
- command = "knife client create #{name} -z -d -c knife.rb #{args} >#{name}.pem"
62
- run_simple command
63
- write_file("#{name}.pem", last_command_started.stdout)
64
- end
65
-
66
- def delete_client(name)
67
- run_simple "knife client delete #{name} -y -z -c knife.rb"
68
- end
69
-
70
- def delete_node(name)
71
- run_simple "knife node delete #{name} -y -z -c knife.rb"
72
- end
@@ -1,151 +0,0 @@
1
- require "json"
2
-
3
- Given(/^I create a vault item '(.+)\/(.+)'( with keys in sparse mode)? containing the JSON '(.+)' encrypted for '(.+)'(?: with '(.+)' as admins?)?$/) do |vault, item, sparse, json, nodelist, admins|
4
- write_file "item.json", json
5
- query = nodelist.split(/,/).map { |e| "name:#{e}" }.join(" OR ")
6
- adminarg = admins.nil? ? "-A admin" : "-A #{admins}"
7
- sparseopt = sparse.nil? ? "" : "-K sparse"
8
- run_simple "knife vault create #{vault} #{item} -z -c knife.rb #{adminarg} #{sparseopt} -S '#{query}' -J item.json", false
9
- end
10
-
11
- Given(/^I update the vault item '(.+)\/(.+)' to be encrypted for '(.+)'( with the clean option)?$/) do |vault, item, nodelist, cleanopt|
12
- query = nodelist.split(/,/).map { |e| "name:#{e}" }.join(" OR ")
13
- run_simple "knife vault update #{vault} #{item} -z -c knife.rb -S '#{query}' #{cleanopt ? '--clean' : ''}"
14
- end
15
-
16
- Given(/^I remove clients? '(.+)' from vault item '(.+)\/(.+)' with the '(.+)' options?$/) do |nodelist, vault, item, optionlist|
17
- query = nodelist.split(/,/).map { |e| "name:#{e}" }.join(" OR ")
18
- options = optionlist.split(/,/).map { |o| "--#{o}" }.join(" ")
19
- run_simple "knife vault remove #{vault} #{item} -z -c knife.rb -S '#{query}' #{options}"
20
- end
21
-
22
- Given(/^I rotate the keys for vault item '(.+)\/(.+)' with the '(.+)' options?$/) do |vault, item, optionlist|
23
- options = optionlist.split(/,/).map { |o| "--#{o}" }.join(" ")
24
- run_simple "knife vault rotate keys #{vault} #{item} -c knife.rb -z #{options}"
25
- end
26
-
27
- Given(/^I rotate all keys with the '(.+)' options?$/) do |optionlist|
28
- options = optionlist.split(/,/).map { |o| "--#{o}" }.join(" ")
29
- run_simple "knife vault rotate all keys -z -c knife.rb #{options}"
30
- end
31
-
32
- Given(/^I refresh the vault item '(.+)\/(.+)'$/) do |vault, item|
33
- run_simple "knife vault refresh #{vault} #{item} -c knife.rb -z"
34
- end
35
-
36
- Given(/^I refresh the vault item '(.+)\/(.+)' with the '(.+)' options?$/) do |vault, item, optionlist|
37
- options = optionlist.split(/,/).map { |o| "--#{o}" }.join(" ")
38
- run_simple "knife vault refresh #{vault} #{item} -c knife.rb -z #{options}"
39
- end
40
-
41
- Given(/^I try to decrypt the vault item '(.+)\/(.+)' as '(.+)'$/) do |vault, item, node|
42
- run_simple "knife vault show #{vault} #{item} -z -c knife.rb -u #{node} -k #{node}.pem", false
43
- end
44
-
45
- Then(/^the vault item '(.+)\/(.+)' should( not)? be encrypted for '(.+)'( with keys in sparse mode)?$/) do |vault, item, neg, nodelist, sparse|
46
- nodes = nodelist.split(/,/)
47
- command = "knife data bag show #{vault} #{item}_keys -z -c knife.rb -F json"
48
- run_simple(command)
49
- output = last_command_started.stdout
50
- data = JSON.parse(output)
51
- if sparse
52
- expect(data).to include("mode" => "sparse")
53
- nodes.each do |node|
54
- command = "knife data bag show #{vault} #{item}_key_#{node} -z -c knife.rb -F json"
55
- run_simple(command, fail_on_error: false)
56
- if neg
57
- error = last_command_started.stderr
58
- expect(error).to include("ERROR: The object you are looking for could not be found")
59
- else
60
- data = JSON.parse(last_command_started.stdout)
61
- expect(data).to include("id" => "#{item}_key_#{node}")
62
- end
63
- end
64
- else
65
- expect(data).to include("mode" => "default")
66
- nodes.each { |node| neg ? (expect(data).not_to include(node)) : (expect(data).to include(node)) }
67
- end
68
- end
69
-
70
- Given(/^'(.+)' should( not)? be a client for the vault item '(.+)\/(.+)'$/) do |nodelist, neg, vault, item|
71
- nodes = nodelist.split(/,/)
72
- command = "knife data bag show #{vault} #{item}_keys -z -c knife.rb -F json"
73
- run_simple(command)
74
- output = last_command_started.stdout
75
- data = JSON.parse(output)
76
- nodes.each do |node|
77
- if neg
78
- expect(data["clients"]).not_to include(node)
79
- else
80
- expect(data["clients"]).to include(node)
81
- end
82
- end
83
- end
84
-
85
- Given(/^'(.+)' should( not)? be an admin for the vault item '(.+)\/(.+)'$/) do |nodelist, neg, vault, item|
86
- nodes = nodelist.split(/,/)
87
- command = "knife data bag show #{vault} #{item}_keys -z -c knife.rb -F json"
88
- run_simple(command)
89
- output = last_command_started.stdout
90
- data = JSON.parse(output)
91
- nodes.each do |node|
92
- if neg
93
- expect(data["admins"]).not_to include(node)
94
- else
95
- expect(data["admins"]).to include(node)
96
- end
97
- end
98
- end
99
-
100
- Given(/^I list the vaults$/) do
101
- run_simple("knife vault list")
102
- end
103
-
104
- Given(/^I can('t)? decrypt the vault item '(.+)\/(.+)' as '(.+)'$/) do |neg, vault, item, client|
105
- run_simple "knife vault show #{vault} #{item} -c knife.rb -z -u #{client} -k #{client}.pem", false
106
- if neg
107
- expect(last_command_started).not_to have_exit_status(0)
108
- else
109
- expect(last_command_started).to have_exit_status(0)
110
- end
111
- end
112
-
113
- Given(/^I (try to )?add '(.+)' as an admin for the vault item '(.+)\/(.+)'$/) do |try, newadmin, vault, item|
114
- run_simple "knife vault update #{vault} #{item} -c knife.rb -z -A #{newadmin}", !try
115
- end
116
-
117
- Given(/^I show the keys of the vault '(.+)'$/) do |vault|
118
- run_simple "knife vault show #{vault} -c knife.rb -z"
119
- end
120
-
121
- Given(/^I check if the data bag item '(.+)\/(.+)' is a vault$/) do |vault, item|
122
- run_simple "knife vault isvault #{vault} #{item} -c knife.rb -z", false
123
- end
124
-
125
- Given(/^I check the type of the data bag item '(.+)\/(.+)'$/) do |vault, item|
126
- run_simple "knife vault itemtype #{vault} #{item} -c knife.rb -z"
127
- end
128
-
129
- Given(/^I downgrade the vault item '(.+)\/(.+)' to v1 syntax/) do |vault, item|
130
- # v1 syntax doesn't have the admins, clients and search_query keys
131
- keysfile = "tmp/aruba/data_bags/#{vault}/#{item}_keys.json"
132
- data = JSON.parse(IO.read(keysfile))
133
- %w{admins clients search_query}.each { |k| data.key?("raw_data") ? data["raw_data"].delete(k) : data.delete(k) }
134
- IO.write(keysfile, JSON.generate(data))
135
- end
136
-
137
- Given(/^I can save the JSON object of the encrypted data bag for the vault item '(.+)\/(.+)'$/) do |vault, item|
138
- command = "knife data bag show #{vault} #{item} -z -c knife.rb -F json"
139
- run_simple(command)
140
- output = last_command_started.stdout
141
- @saved_encrypted_vault_item = JSON.parse(output)
142
- end
143
-
144
- Given(/^the data bag of the vault item '(.+)\/(.+)' has not been re-encrypted$/) do |vault, item|
145
- command = "knife data bag show #{vault} #{item} -z -c knife.rb -F json"
146
- run_simple(command)
147
- output = last_command_started.stdout
148
- encrypted_vault_item = JSON.parse(output)
149
-
150
- expect(encrypted_vault_item).to eq(@saved_encrypted_vault_item)
151
- end
@@ -1,9 +0,0 @@
1
- Given(/^I create a data bag item '(.+)\/(.+)' containing the JSON '(.+)'$/) do |databag, _, json|
2
- write_file "item.json", json
3
- run_simple "knife data bag from file #{databag} item.json -z -c knife.rb", false
4
- end
5
-
6
- Given(/^I create an encrypted data bag item '(.+)\/(.+)' containing the JSON '(.+)' with the secret '(.+)'$/) do |databag, _, json, secret|
7
- write_file "item.json", json
8
- run_simple "knife data bag from file #{databag} item.json -s #{secret} -z -c knife.rb", false
9
- end
@@ -1,14 +0,0 @@
1
- if ENV["COVERAGE"]
2
- require "simplecov"
3
- end
4
-
5
- require "aruba/cucumber"
6
-
7
- # Travis runs tests in a limited environment which takes a long time to invoke
8
- # the knife command. Up the timeout when we're in a travis build based on the
9
- # environment variable set in .travis.yml
10
- #if ENV['TRAVIS_BUILD']
11
- Before do
12
- @aruba_timeout_seconds = 15
13
- end
14
- #end
@@ -1,63 +0,0 @@
1
- Feature: knife vault create
2
- 'knife vault create' creates two Chef data bag items: an
3
- encrypted data bag item encrypted with a randomized shared
4
- secret, and a side-along data bag item suffixed with _keys
5
- that contains an set of asymmetrically encrypted copies of
6
- the shared secret using the public keys of a set of admins
7
- and/or clients
8
-
9
- Scenario: create vault with all known clients
10
- Given a local mode chef repo with nodes 'one,two,three'
11
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three'
12
- Then the vault item 'test/item' should be encrypted for 'one,two,three'
13
- And 'one,two,three' should be a client for the vault item 'test/item'
14
-
15
- Scenario: create vault with all unknown clients
16
- Given a local mode chef repo with nodes 'two,three'
17
- And I delete clients 'two,three' from the Chef server
18
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'two,three'
19
- Then the vault item 'test/item' should not be encrypted for 'one,two,three'
20
- And the output should contain "node 'two' has no private key; skipping"
21
- And the output should contain "node 'three' has no private key; skipping"
22
- And 'two,three' should not be a client for the vault item 'test/item'
23
-
24
- Scenario: create vault with mix of known and unknown clients
25
- Given a local mode chef repo with nodes 'one,two,three'
26
- And I delete client 'three' from the Chef server
27
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three'
28
- Then the vault item 'test/item' should be encrypted for 'one,two'
29
- And the output should contain "node 'three' has no private key; skipping"
30
- And 'one,two' should be a client for the vault item 'test/item'
31
- And 'three' should not be a client for the vault item 'test/item'
32
-
33
- Scenario: create vault with mix of known and unknown nodes
34
- Given a local mode chef repo with nodes 'one,two'
35
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three'
36
- Then the vault item 'test/item' should be encrypted for 'one,two'
37
- And 'one,two' should be a client for the vault item 'test/item'
38
- And 'three' should not be a client for the vault item 'test/item'
39
-
40
- Scenario: create vault with several admins
41
- Given a local mode chef repo with nodes 'one,two' with admins 'alice,bob'
42
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three' with 'alice' as admin
43
- Then the vault item 'test/item' should be encrypted for 'one,two'
44
- And 'one,two' should be a client for the vault item 'test/item'
45
- And 'three' should not be a client for the vault item 'test/item'
46
- And 'alice' should be an admin for the vault item 'test/item'
47
- And 'bob' should not be an admin for the vault item 'test/item'
48
-
49
- Scenario: create vault with several admins in sparse mode
50
- Given a local mode chef repo with nodes 'one,two' with admins 'alice,bob'
51
- And I create a vault item 'test/item' with keys in sparse mode containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three' with 'alice' as admin
52
- Then the vault item 'test/item' should be encrypted for 'one,two' with keys in sparse mode
53
- And the vault item 'test/item' should not be encrypted for 'three' with keys in sparse mode
54
- And 'one,two' should be a client for the vault item 'test/item'
55
- And 'three' should not be a client for the vault item 'test/item'
56
- And 'alice' should be an admin for the vault item 'test/item'
57
- And 'bob' should not be an admin for the vault item 'test/item'
58
-
59
- Scenario: create vault with an unknown admin
60
- Given a local mode chef repo with nodes 'one,two'
61
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three' with 'alice' as admin
62
- Then the exit status should not be 0
63
- And the output should contain "FATAL: Could not find default key for alice in users or clients!"
@@ -1,31 +0,0 @@
1
- Feature: list data bags that are vaults
2
- knife vault list should list all data bags that appear to
3
- be vaults. This is not an exact science; we assume that
4
- any data bag containing an even number of items and for
5
- which all items are pairs of thing/thing_keys is a vault
6
-
7
- Scenario: List bags that are vaults
8
- Given a local mode chef repo with nodes 'one,two,three'
9
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three'
10
- And I list the vaults
11
- Then the output should match /(?m:^test$)/
12
-
13
- Scenario: List bags that are vaults with keys in sparse mode
14
- Given a local mode chef repo with nodes 'one,two,three'
15
- And I create a vault item 'test/item' with keys in sparse mode containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three'
16
- And I list the vaults
17
- Then the output should match /(?m:^test$)/
18
-
19
- Scenario: Skip data bags that are not vaults
20
- Given a local mode chef repo with nodes 'one,two,three'
21
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three'
22
- And I create a data bag 'lessthantwokeys' containing the JSON '{"id": "item", "foo": "bar"}'
23
- And I create a data bag 'oddnumberofkeys' containing the JSON '{"id": "item", "one": 1, "two": 2, "three":3}'
24
- And I create a data bag 'unbalanced' containing the JSON '{"id": "item", "one": 1, "one_keys": 1, "two_keys": 1, "three_keys": 1}'
25
- And I create a data bag 'mismatched' containing the JSON '{"id": "item", "one": 1, "one_keys": 1, "two_keys": 1, "three": 1}'
26
- And I list the vaults
27
- Then the output should match /(?m:^test$)/
28
- And the output should not match /(?m:^lessthantwokeys$)/
29
- And the output should not match /(?m:^oddnumberofkeys$)/
30
- And the output should not match /(?m:^unbalanced$)/
31
- And the output should not match /(?m:^mismatched$)/
@@ -1,45 +0,0 @@
1
- Feature: knife vault show
2
- 'knife vault show' displays the contents of a Chef encrypted
3
- data bag by fetching the asymmetrically encrypted shared
4
- secret and decrypting it using the private key of the user
5
- or node
6
-
7
- Scenario: successful decrypt as admin
8
- Given a local mode chef repo with nodes 'one,two,three' with admins 'alice,bob'
9
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three' with 'alice' as admin
10
- Then the vault item 'test/item' should be encrypted for 'one,two,three,alice'
11
- And 'one,two,three' should be a client for the vault item 'test/item'
12
- And 'alice' should be an admin for the vault item 'test/item'
13
- And 'bob' should not be an admin for the vault item 'test/item'
14
- And I can decrypt the vault item 'test/item' as 'alice'
15
- And the output should match /^foo: bar$/
16
-
17
- Scenario: successful decrypt as node
18
- Given a local mode chef repo with nodes 'one,two,three' with admins 'alice,bob'
19
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three' with 'alice' as admin
20
- Then the vault item 'test/item' should be encrypted for 'one,two,three,alice'
21
- And 'one,two,three' should be a client for the vault item 'test/item'
22
- And 'alice' should be an admin for the vault item 'test/item'
23
- And 'bob' should not be an admin for the vault item 'test/item'
24
- And I can decrypt the vault item 'test/item' as 'two'
25
- And the output should match /^foo: bar$/
26
-
27
- Scenario: failed decrypt as admin
28
- Given a local mode chef repo with nodes 'one,two,three' with admins 'alice,bob'
29
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three' with 'alice' as admin
30
- Then the vault item 'test/item' should be encrypted for 'one,two,three,alice'
31
- And 'one,two,three' should be a client for the vault item 'test/item'
32
- And 'alice' should be an admin for the vault item 'test/item'
33
- And 'bob' should not be an admin for the vault item 'test/item'
34
- And I can't decrypt the vault item 'test/item' as 'bob'
35
- And the output should contain "test/item is not encrypted with your public key"
36
-
37
- Scenario: failed decrypt as node
38
- Given a local mode chef repo with nodes 'one,two,three' with admins 'alice,bob'
39
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two' with 'alice' as admin
40
- Then the vault item 'test/item' should be encrypted for 'one,two,alice'
41
- And 'one,two' should be a client for the vault item 'test/item'
42
- And 'alice' should be an admin for the vault item 'test/item'
43
- And 'bob' should not be an admin for the vault item 'test/item'
44
- And I can't decrypt the vault item 'test/item' as 'three'
45
- And the output should contain "test/item is not encrypted with your public key"
@@ -1,21 +0,0 @@
1
- Feature: knife vault show [VAULTNAME]
2
- 'knife vault show [VAULTNAME]' displays the keys of a vault
3
- (i.e. the items that are not suffixed with _keys)
4
-
5
- Scenario: show keys of a vault
6
- Given a local mode chef repo with nodes 'one,two,three'
7
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three'
8
- And I create a vault item 'test/item2' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three'
9
- Then the vault item 'test/item' should be encrypted for 'one,two,three'
10
- And 'one,two,three' should be a client for the vault item 'test/item'
11
- And I show the keys of the vault 'test'
12
- Then the output should match /(?m:^item$)/
13
- And the output should match /(?m:^item2$)/
14
- And the output should not match /(?m:^item_keys$)/
15
- And the output should not match /(?m:^item2_keys$)/
16
-
17
- Scenario: show keys of a data bag that is not a vault
18
- Given a local mode chef repo with nodes 'one,two,three'
19
- And I create a data bag 'notavault' containing the JSON '{"id": "item", "foo": "bar"}'
20
- And I show the keys of the vault 'notavault'
21
- Then the output should match /data bag notavault is not a chef-vault/
@@ -1,18 +0,0 @@
1
- Feature: knife vault update
2
- 'knife vault update' is used to add clients, or administrators
3
- and to re-run the search query and update the vault's item values.
4
-
5
- Scenario: add admin to a vault
6
- Given a local mode chef repo with nodes 'one,two,three' with admins 'alice,bob'
7
- When I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two,three' with 'alice' as admin
8
- Then the vault item 'test/item' should be encrypted for 'one,two,three'
9
- And 'one,two,three' should be a client for the vault item 'test/item'
10
- And 'alice' should be an admin for the vault item 'test/item'
11
- And I can decrypt the vault item 'test/item' as 'alice'
12
- But I can't decrypt the vault item 'test/item' as 'bob'
13
- And I can save the JSON object of the encrypted data bag for the vault item 'test/item'
14
- When I add 'bob' as an admin for the vault item 'test/item'
15
- Then 'alice,bob' should be an admin for the vault item 'test/item'
16
- And I can decrypt the vault item 'test/item' as 'alice'
17
- And I can decrypt the vault item 'test/item' as 'bob'
18
- And the data bag of the vault item 'test/item' has not been re-encrypted
@@ -1,10 +0,0 @@
1
- Feature: knife vault create with mismatched ID
2
- 'knife vault create' creates a vault. A JSON file can be passed
3
- on the command line. If the vault ID specified on the command line
4
- does not match the value of the 'id' key in the JSON file, knife
5
- should throw an error
6
-
7
- Scenario: create vault from JSON file with mismatched ID
8
- Given a local mode chef repo with nodes 'one,two,three'
9
- And I create a vault item 'test/item' containing the JSON '{"id": "eyetem"}' encrypted for 'one,two,three'
10
- Then the output should match /id mismatch - input JSON has id 'eyetem' but vault item has id 'item'/
@@ -1,13 +0,0 @@
1
- Feature: Wrong private key during decrypt
2
- https://github.com/Nordstrom/chef-vault/issues/43
3
- If a vault is encrypted for a node and then the node's private
4
- key is regenerated, the error that comes back from chef-vault
5
- should be informative, not a lower-level error from OpenSSL
6
- like 'OpenSSL::PKey::RSAError: padding check failed'
7
-
8
- Scenario: Regenerate node key and attempt decrypt
9
- Given a local mode chef repo with nodes 'one,two'
10
- And I create a vault item 'test/item' containing the JSON '{"foo": "bar"}' encrypted for 'one,two'
11
- And I regenerate the client key for the node 'one'
12
- And I try to decrypt the vault item 'test/item' as 'one'
13
- Then the output should match /is encrypted for you, but your private key failed to decrypt the contents/
data/hooks/pre-commit DELETED
@@ -1,43 +0,0 @@
1
- #!/usr/bin/env ruby
2
- output = `bundle exec chefstyle -a`
3
- if !$?.success?
4
- puts "pre-commit hook: Tried to run `bundle exec chefstyle -a` to autocleanup errors, but it failed with output:"
5
- puts output
6
- end
7
-
8
- detected = /(\d+) offenses detected/.match(output)
9
- corrected = /(\d+) offenses corrected/.match(output)
10
-
11
- # no errors detected by chefstyle
12
- exit 0 if detected.nil?
13
-
14
- # chefstyle found errors
15
- if !detected.nil?
16
- # get the first result from the capture group that isn't the whole capture
17
- num_detected = detected.to_a[1].to_i
18
- num_corrected = if corrected.nil?
19
- 0
20
- else
21
- corrected.to_a[1].to_i
22
- end
23
- if num_detected == num_corrected
24
- puts <<EOF
25
- pre-commit hook: Ran `bundle exec chefstyle -a` to autocleanup errors if any existed and
26
- #{num_detected} were detected, but all were cleaned up. `git add` all files that were
27
- autoupdated and try commiting again. New git status:
28
-
29
- EOF
30
- puts `git status`
31
- else
32
- puts <<EOF
33
- pre-commit hook: Ran `bundle exec chefstyle -a` to autocleanup errors if any existed and
34
- #{num_detected} were detected, but #{num_detected - num_corrected} could not be cleaned up
35
- automatically. Run:
36
-
37
- bundle exec chefstyle -a
38
-
39
- to see remaining errors to clean up by hand, add all updated files, and try commiting again.
40
- EOF
41
- end
42
- exit 1
43
- end