vault-tree 0.1.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.
Files changed (164) hide show
  1. data/.gitignore +26 -0
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +43 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +118 -0
  6. data/Rakefile +17 -0
  7. data/VagrantFile +30 -0
  8. data/features/core.feature +44 -0
  9. data/features/exceptions.feature +41 -0
  10. data/features/steps/core.steps.rb +168 -0
  11. data/features/steps/exceptions.steps.rb +103 -0
  12. data/features/support/env.rb +1 -0
  13. data/features/world.rb +3 -0
  14. data/lib/vault-tree.rb +7 -0
  15. data/lib/vault-tree/config/dependencies.rb +4 -0
  16. data/lib/vault-tree/config/lib.rb +2 -0
  17. data/lib/vault-tree/config/path_helpers.rb +49 -0
  18. data/lib/vault-tree/config/string.rb +25 -0
  19. data/lib/vault-tree/contract/close_validator.rb +35 -0
  20. data/lib/vault-tree/contract/contract.rb +85 -0
  21. data/lib/vault-tree/contract/contract_presenter.rb +27 -0
  22. data/lib/vault-tree/contract/doorman.rb +112 -0
  23. data/lib/vault-tree/contract/null_vault.rb +16 -0
  24. data/lib/vault-tree/contract/open_validator.rb +20 -0
  25. data/lib/vault-tree/contract/vault.rb +96 -0
  26. data/lib/vault-tree/exceptions/empty_vault.rb +8 -0
  27. data/lib/vault-tree/exceptions/fill_attempt_master_password.rb +6 -0
  28. data/lib/vault-tree/exceptions/invalid_signature.rb +0 -0
  29. data/lib/vault-tree/exceptions/malformed_json.rb +0 -0
  30. data/lib/vault-tree/exceptions/missing_external_data.rb +6 -0
  31. data/lib/vault-tree/exceptions/missing_partner_decryption_key.rb +6 -0
  32. data/lib/vault-tree/exceptions/missing_passphrase.rb +6 -0
  33. data/lib/vault-tree/exceptions/non_unique_vault_id.rb +0 -0
  34. data/lib/vault-tree/exceptions/unsupported_keyword.rb +6 -0
  35. data/lib/vault-tree/exceptions/vault_does_not_exist.rb +6 -0
  36. data/lib/vault-tree/exceptions/vault_tree_exception.rb +6 -0
  37. data/lib/vault-tree/keywords/decryption_key.rb +14 -0
  38. data/lib/vault-tree/keywords/external_data.rb +13 -0
  39. data/lib/vault-tree/keywords/keyword.rb +19 -0
  40. data/lib/vault-tree/keywords/keyword_interpreter.rb +45 -0
  41. data/lib/vault-tree/keywords/master_passphrase.rb +9 -0
  42. data/lib/vault-tree/keywords/public_encryption_key.rb +27 -0
  43. data/lib/vault-tree/keywords/random_number.rb +9 -0
  44. data/lib/vault-tree/keywords/shared_key.rb +24 -0
  45. data/lib/vault-tree/keywords/unlocked.rb +9 -0
  46. data/lib/vault-tree/keywords/vault_contents.rb +13 -0
  47. data/lib/vault-tree/lock_smith/asymmetric_cipher.rb +31 -0
  48. data/lib/vault-tree/lock_smith/crypto_hash.rb +11 -0
  49. data/lib/vault-tree/lock_smith/digital_signature.rb +32 -0
  50. data/lib/vault-tree/lock_smith/encryption_key_pair.rb +25 -0
  51. data/lib/vault-tree/lock_smith/null_vault.rb +4 -0
  52. data/lib/vault-tree/lock_smith/random_number.rb +11 -0
  53. data/lib/vault-tree/lock_smith/shared_key_pair.rb +12 -0
  54. data/lib/vault-tree/lock_smith/signing_key_pair.rb +25 -0
  55. data/lib/vault-tree/lock_smith/symmetric_cipher.rb +25 -0
  56. data/lib/vault-tree/util/json.rb +16 -0
  57. data/lib/vault-tree/version.rb +3 -0
  58. data/spec/app/locksmith/asymmetric_cipher_spec.rb +25 -0
  59. data/spec/app/locksmith/signing_key_pair_spec.rb +22 -0
  60. data/spec/spec_helper.rb +5 -0
  61. data/spec/support/fixtures/blank_simple_test_contract.json +14 -0
  62. data/spec/support/fixtures/broken_contract.json +55 -0
  63. data/spec/support/fixtures/one_two_three-0.5.0.EXP.json +105 -0
  64. data/spec/support/fixtures/reference_contract.1.0.0.json +227 -0
  65. data/spec/support/fixtures/simple_test_contract.json +14 -0
  66. data/support/cookbooks/ark/.gitignore +12 -0
  67. data/support/cookbooks/ark/.kitchen.yml +34 -0
  68. data/support/cookbooks/ark/.travis.yml +6 -0
  69. data/support/cookbooks/ark/Berksfile +9 -0
  70. data/support/cookbooks/ark/CHANGELOG.md +87 -0
  71. data/support/cookbooks/ark/CONTRIBUTING.md +257 -0
  72. data/support/cookbooks/ark/README.md +301 -0
  73. data/support/cookbooks/ark/Rakefile +36 -0
  74. data/support/cookbooks/ark/TESTING.md +25 -0
  75. data/support/cookbooks/ark/Toftfile +15 -0
  76. data/support/cookbooks/ark/attributes/default.rb +6 -0
  77. data/support/cookbooks/ark/chefignore +96 -0
  78. data/support/cookbooks/ark/files/default/foo.tar.gz +0 -0
  79. data/support/cookbooks/ark/files/default/foo.tbz +0 -0
  80. data/support/cookbooks/ark/files/default/foo.tgz +0 -0
  81. data/support/cookbooks/ark/files/default/foo.zip +0 -0
  82. data/support/cookbooks/ark/files/default/tests/minitest/default_test.rb +0 -0
  83. data/support/cookbooks/ark/files/default/tests/minitest/support/helpers.rb +0 -0
  84. data/support/cookbooks/ark/files/default/tests/minitest/test_test.rb +94 -0
  85. data/support/cookbooks/ark/libraries/default.rb +167 -0
  86. data/support/cookbooks/ark/metadata.rb +13 -0
  87. data/support/cookbooks/ark/providers/default.rb +370 -0
  88. data/support/cookbooks/ark/recipes/default.rb +31 -0
  89. data/support/cookbooks/ark/recipes/test.rb +138 -0
  90. data/support/cookbooks/ark/resources/default.rb +54 -0
  91. data/support/cookbooks/ark/templates/default/add_to_path.sh.erb +1 -0
  92. data/support/cookbooks/ark/test/support/Gemfile +4 -0
  93. data/support/cookbooks/build-essential/README.md +24 -0
  94. data/support/cookbooks/build-essential/metadata.rb +10 -0
  95. data/support/cookbooks/build-essential/recipes/default.rb +45 -0
  96. data/support/cookbooks/chruby/.gitignore +15 -0
  97. data/support/cookbooks/chruby/.kitchen.yml +26 -0
  98. data/support/cookbooks/chruby/.ruby_version +1 -0
  99. data/support/cookbooks/chruby/Berksfile +3 -0
  100. data/support/cookbooks/chruby/Gemfile +7 -0
  101. data/support/cookbooks/chruby/LICENSE +14 -0
  102. data/support/cookbooks/chruby/README.md +92 -0
  103. data/support/cookbooks/chruby/Rakefile +7 -0
  104. data/support/cookbooks/chruby/Thorfile +6 -0
  105. data/support/cookbooks/chruby/Vagrantfile +86 -0
  106. data/support/cookbooks/chruby/attributes/default.rb +10 -0
  107. data/support/cookbooks/chruby/chefignore +96 -0
  108. data/support/cookbooks/chruby/metadata.rb +11 -0
  109. data/support/cookbooks/chruby/recipes/default.rb +43 -0
  110. data/support/cookbooks/chruby/recipes/system.rb +25 -0
  111. data/support/cookbooks/chruby/templates/default/chruby.sh.erb +22 -0
  112. data/support/cookbooks/chruby/test/integration/default/bash/embedded_test.sh +1 -0
  113. data/support/cookbooks/git/.gitignore +14 -0
  114. data/support/cookbooks/git/.kitchen.yml +46 -0
  115. data/support/cookbooks/git/Berksfile +8 -0
  116. data/support/cookbooks/git/CHANGELOG.md +87 -0
  117. data/support/cookbooks/git/CONTRIBUTING +29 -0
  118. data/support/cookbooks/git/Gemfile +3 -0
  119. data/support/cookbooks/git/LICENSE +201 -0
  120. data/support/cookbooks/git/README.md +115 -0
  121. data/support/cookbooks/git/TESTING.md +25 -0
  122. data/support/cookbooks/git/attributes/default.rb +40 -0
  123. data/support/cookbooks/git/metadata.rb +35 -0
  124. data/support/cookbooks/git/recipes/default.rb +53 -0
  125. data/support/cookbooks/git/recipes/server.rb +58 -0
  126. data/support/cookbooks/git/recipes/source.rb +49 -0
  127. data/support/cookbooks/git/recipes/windows.rb +37 -0
  128. data/support/cookbooks/git/templates/default/git-xinetd.d.erb +10 -0
  129. data/support/cookbooks/git/templates/default/sv-git-daemon-log-run.erb +2 -0
  130. data/support/cookbooks/git/templates/default/sv-git-daemon-run.erb +3 -0
  131. data/support/cookbooks/install_ruby/README.md +3 -0
  132. data/support/cookbooks/install_ruby/metadata.rb +10 -0
  133. data/support/cookbooks/install_ruby/recipes/default.rb +14 -0
  134. data/support/cookbooks/ruby_build/.gitignore +6 -0
  135. data/support/cookbooks/ruby_build/.kitchen.yml +31 -0
  136. data/support/cookbooks/ruby_build/.travis.yml +4 -0
  137. data/support/cookbooks/ruby_build/Berksfile +10 -0
  138. data/support/cookbooks/ruby_build/CHANGELOG.md +72 -0
  139. data/support/cookbooks/ruby_build/Gemfile +14 -0
  140. data/support/cookbooks/ruby_build/README.md +338 -0
  141. data/support/cookbooks/ruby_build/Rakefile +21 -0
  142. data/support/cookbooks/ruby_build/attributes/default.rb +67 -0
  143. data/support/cookbooks/ruby_build/chefignore +53 -0
  144. data/support/cookbooks/ruby_build/libraries/ruby_build_recipe_helpers.rb +40 -0
  145. data/support/cookbooks/ruby_build/metadata.rb +18 -0
  146. data/support/cookbooks/ruby_build/providers/ruby.rb +88 -0
  147. data/support/cookbooks/ruby_build/recipes/default.rb +69 -0
  148. data/support/cookbooks/ruby_build/resources/ruby.rb +33 -0
  149. data/support/cookbooks/ruby_build/test/cookbooks/alltherubies/metadata.rb +10 -0
  150. data/support/cookbooks/ruby_build/test/cookbooks/alltherubies/recipes/default.rb +59 -0
  151. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/_verify_tests.bash +33 -0
  152. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_1.8.7.bats +29 -0
  153. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_1.9.2.bats +18 -0
  154. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_1.9.3.bats +18 -0
  155. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_2.0.0.bats +18 -0
  156. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_jruby.bats +20 -0
  157. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_rbx.bats +18 -0
  158. data/support/cookbooks/ruby_build/test/integration/alltherubies/bats/verify_ree.bats +19 -0
  159. data/support/cookbooks/ruby_build/test/integration/installation/bats/installation.bats +6 -0
  160. data/support/scripts/libsodium_ubuntu.sh +80 -0
  161. data/support/tasks/.gitkeep +0 -0
  162. data/support/tasks/libsodium_install.rb +57 -0
  163. data/vault-tree.gemspec +26 -0
  164. metadata +305 -0
@@ -0,0 +1,16 @@
1
+ module VaultTree
2
+ class NullVault
3
+
4
+ def properties
5
+ {}
6
+ end
7
+
8
+ def id
9
+ nil
10
+ end
11
+
12
+ def close
13
+ self
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ module VaultTree
2
+ class OpenValidator
3
+ attr_reader :vault
4
+
5
+ def initialize(vault)
6
+ @vault = vault
7
+ end
8
+
9
+ def validate!
10
+ confirm_vault_not_empty
11
+ true
12
+ end
13
+
14
+ private
15
+
16
+ def confirm_vault_not_empty
17
+ raise Exceptions::EmptyVault if vault.empty?
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,96 @@
1
+ module VaultTree
2
+ class Vault
3
+ attr_reader :id, :properties, :contract
4
+
5
+ def initialize(id, properties, contract)
6
+ @id = id
7
+ @properties = properties
8
+ @contract = contract
9
+ end
10
+
11
+ def close
12
+ close_ancestors
13
+ close_self
14
+ end
15
+
16
+ def retrieve_contents
17
+ unlocked_contents
18
+ end
19
+
20
+ def fill_with
21
+ properties['fill_with']
22
+ end
23
+
24
+ def lock_with
25
+ properties['lock_with']
26
+ end
27
+
28
+ def unlock_with
29
+ properties['unlock_with']
30
+ end
31
+
32
+ def contents
33
+ properties['contents']
34
+ end
35
+
36
+ def empty?
37
+ contents.empty?
38
+ end
39
+
40
+ def filler
41
+ KeywordInterpreter.new(fill_with, self).evaluate
42
+ end
43
+
44
+ def locking_key
45
+ KeywordInterpreter.new(lock_with, self).evaluate
46
+ end
47
+
48
+ def unlocking_key
49
+ KeywordInterpreter.new(unlock_with, self).evaluate
50
+ end
51
+
52
+ private
53
+
54
+ def close_ancestors
55
+ close_lock_ancestor
56
+ close_fill_ancestor
57
+ end
58
+
59
+ def close_self
60
+ @properties['contents'] = locked_contents
61
+ self
62
+ end
63
+
64
+ def unlocked_contents
65
+ Doorman.new(self).unlocked_contents
66
+ end
67
+
68
+ def locked_contents
69
+ Doorman.new(self).locked_contents
70
+ end
71
+
72
+ def close_lock_ancestor
73
+ contract.close_vault(lock_ancestor_id)
74
+ end
75
+
76
+ def close_fill_ancestor
77
+ contract.close_vault(fill_ancestor_id)
78
+ end
79
+
80
+ def has_lock_ancestor?
81
+ lock_with.include? 'CONTENTS'
82
+ end
83
+
84
+ def has_fill_ancestor?
85
+ fill_with.include? 'CONTENTS'
86
+ end
87
+
88
+ def lock_ancestor_id
89
+ lock_with.extract_ancestor_id if has_lock_ancestor?
90
+ end
91
+
92
+ def fill_ancestor_id
93
+ fill_with.extract_ancestor_id if has_fill_ancestor?
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,8 @@
1
+ module VaultTree
2
+ module Exceptions
3
+ class EmptyVault < VaultTreeException
4
+ # Cant open emtpy vaults
5
+ # Attempted to open an empty vault
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ module VaultTree
2
+ module Exceptions
3
+ class FillAttemptMasterPassword < VaultTreeException
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module VaultTree
2
+ module Exceptions
3
+ class MissingExternalData < VaultTreeException
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module VaultTree
2
+ module Exceptions
3
+ class MissingPartnerDecryptionKey < VaultTreeException
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module VaultTree
2
+ module Exceptions
3
+ class MissingPassphrase < VaultTreeException
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module VaultTree
2
+ module Exceptions
3
+ class UnsupportedKeyword < VaultTreeException
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module VaultTree
2
+ module Exceptions
3
+ class VaultDoesNotExist < VaultTreeException
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module VaultTree
2
+ module Exceptions
3
+ class VaultTreeException < StandardError
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ module VaultTree
2
+ class DecryptionKey < Keyword
3
+
4
+ def evaluate
5
+ key_pair.generate_private_key
6
+ end
7
+
8
+ private
9
+
10
+ def key_pair
11
+ LockSmith::EncryptionKeyPair.new
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module VaultTree
2
+ class ExternalData < Keyword
3
+
4
+ def evaluate
5
+ contract.external_data(id)
6
+ end
7
+
8
+ def id
9
+ vault.id
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ module VaultTree
2
+ class Keyword
3
+ attr_reader :vault, :arg_array
4
+
5
+ def initialize(vault, arg_array)
6
+ @vault = vault
7
+ @arg_array = arg_array
8
+ post_initialize(arg_array)
9
+ end
10
+
11
+ def contract
12
+ vault.contract
13
+ end
14
+
15
+ def post_initialize(arg_array = [])
16
+ nil
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,45 @@
1
+ module VaultTree
2
+ class KeywordInterpreter
3
+ attr_reader :word, :vault
4
+
5
+ def initialize(word,vault)
6
+ @word = word
7
+ @vault = vault
8
+ end
9
+
10
+ def evaluate # start here
11
+ begin
12
+ keyword_class_name.new(vault, arg_array).evaluate
13
+ rescue NameError
14
+ raise Exceptions::UnsupportedKeyword
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def keyword_class_name
21
+ instance_eval "VaultTree::#{word_base.downcase.camelize}"
22
+ end
23
+
24
+ def word_base
25
+ word.gsub(/(\[.*\])/,'').strip
26
+ end
27
+
28
+ def arg_array
29
+ if has_args?
30
+ instance_eval arg_array_string
31
+ else
32
+ []
33
+ end
34
+ end
35
+
36
+ def arg_array_string
37
+ word.gsub(word_base,'').strip
38
+ end
39
+
40
+ def has_args?
41
+ word.match(/\[/)
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,9 @@
1
+ module VaultTree
2
+ class MasterPassphrase < Keyword
3
+
4
+ def evaluate
5
+ contract.master_passphrase
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ module VaultTree
2
+ class PublicEncryptionKey < Keyword
3
+ attr_reader :vault_id
4
+
5
+ def post_initialize(arg_array)
6
+ @vault_id = arg_array[0]
7
+ end
8
+
9
+ def evaluate
10
+ key_pair.public_key(decryption_key)
11
+ end
12
+
13
+ private
14
+
15
+ def key_pair
16
+ LockSmith::EncryptionKeyPair.new
17
+ end
18
+
19
+ def decryption_key
20
+ begin
21
+ contract.retrieve_contents(vault_id)
22
+ rescue Exceptions::EmptyVault
23
+ raise Exceptions::MissingPartnerDecryptionKey
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,9 @@
1
+ module VaultTree
2
+ class RandomNumber < Keyword
3
+
4
+ def evaluate
5
+ LockSmith::RandomNumber.compute
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ module VaultTree
2
+ class SharedKey < Keyword
3
+ attr_reader :public_key_vault_id, :secret_key_vault_id
4
+
5
+ def post_initialize(arg_array)
6
+ @public_key_vault_id = arg_array[0]
7
+ @secret_key_vault_id = arg_array[1]
8
+ end
9
+
10
+ def evaluate
11
+ LockSmith::SharedKeyPair.new(public_key: public_key_vault_contents, secret_key: secret_key_vault_contents)
12
+ end
13
+
14
+ private
15
+
16
+ def public_key_vault_contents
17
+ contract.retrieve_contents(public_key_vault_id)
18
+ end
19
+
20
+ def secret_key_vault_contents
21
+ contract.retrieve_contents(secret_key_vault_id)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ module VaultTree
2
+ class Unlocked < Keyword
3
+
4
+ def evaluate
5
+ LockSmith::CryptoHash.compute('UNLOCKED')
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module VaultTree
2
+ class Contents < Keyword
3
+ attr_reader :vault_id
4
+
5
+ def post_initialize(arg_array)
6
+ @vault_id = arg_array[0]
7
+ end
8
+
9
+ def evaluate
10
+ contract.retrieve_contents(vault_id)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,31 @@
1
+ module VaultTree
2
+ module LockSmith
3
+ class AsymmetricCipher
4
+
5
+ def encrypt(opts)
6
+ crypto_box(opts[:public_key],opts[:secret_key]).box(opts[:plain_text], :base64)
7
+ end
8
+
9
+ def decrypt(opts)
10
+ crypto_box(opts[:public_key],opts[:secret_key]).open(opts[:cipher_text], :base64)
11
+ end
12
+
13
+ private
14
+
15
+ def crypto_box(public_key,private_key)
16
+ pub = public_key_object(public_key)
17
+ pri = private_key_object(private_key)
18
+ box = Crypto::Box.new(pub,pri, :base64)
19
+ Crypto::RandomNonceBox.new(box)
20
+ end
21
+
22
+ def private_key_object(pri_key)
23
+ Crypto::PrivateKey.new(pri_key,:base64)
24
+ end
25
+
26
+ def public_key_object(pub_key)
27
+ Crypto::PublicKey.new(pub_key,:base64)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,11 @@
1
+ module VaultTree
2
+ module LockSmith
3
+ class CryptoHash
4
+
5
+ def self.compute(data)
6
+ Crypto::Hash.sha256("#{data}", :base64)
7
+ end
8
+
9
+ end
10
+ end
11
+ end