chef-zero 4.2.3 → 4.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +201 -201
  3. data/README.md +155 -150
  4. data/Rakefile +31 -31
  5. data/bin/chef-zero +100 -100
  6. data/lib/chef_zero.rb +10 -7
  7. data/lib/chef_zero/chef_data/acl_path.rb +139 -139
  8. data/lib/chef_zero/chef_data/cookbook_data.rb +240 -240
  9. data/lib/chef_zero/chef_data/data_normalizer.rb +207 -207
  10. data/lib/chef_zero/chef_data/default_creator.rb +446 -446
  11. data/lib/chef_zero/data_store/data_already_exists_error.rb +29 -29
  12. data/lib/chef_zero/data_store/data_error.rb +31 -31
  13. data/lib/chef_zero/data_store/data_not_found_error.rb +28 -28
  14. data/lib/chef_zero/data_store/default_facade.rb +149 -149
  15. data/lib/chef_zero/data_store/interface_v1.rb +67 -67
  16. data/lib/chef_zero/data_store/interface_v2.rb +18 -18
  17. data/lib/chef_zero/data_store/memory_store.rb +33 -33
  18. data/lib/chef_zero/data_store/memory_store_v2.rb +155 -155
  19. data/lib/chef_zero/data_store/raw_file_store.rb +147 -147
  20. data/lib/chef_zero/data_store/v1_to_v2_adapter.rb +142 -142
  21. data/lib/chef_zero/data_store/v2_to_v1_adapter.rb +107 -107
  22. data/lib/chef_zero/endpoints/acl_endpoint.rb +38 -38
  23. data/lib/chef_zero/endpoints/acls_endpoint.rb +29 -29
  24. data/lib/chef_zero/endpoints/actor_endpoint.rb +94 -88
  25. data/lib/chef_zero/endpoints/actors_endpoint.rb +64 -64
  26. data/lib/chef_zero/endpoints/authenticate_user_endpoint.rb +31 -31
  27. data/lib/chef_zero/endpoints/container_endpoint.rb +22 -22
  28. data/lib/chef_zero/endpoints/containers_endpoint.rb +13 -13
  29. data/lib/chef_zero/endpoints/cookbook_endpoint.rb +39 -39
  30. data/lib/chef_zero/endpoints/cookbook_version_endpoint.rb +119 -119
  31. data/lib/chef_zero/endpoints/cookbooks_base.rb +65 -65
  32. data/lib/chef_zero/endpoints/cookbooks_endpoint.rb +19 -19
  33. data/lib/chef_zero/endpoints/data_bag_endpoint.rb +45 -45
  34. data/lib/chef_zero/endpoints/data_bag_item_endpoint.rb +25 -25
  35. data/lib/chef_zero/endpoints/data_bags_endpoint.rb +23 -23
  36. data/lib/chef_zero/endpoints/environment_cookbook_endpoint.rb +24 -24
  37. data/lib/chef_zero/endpoints/environment_cookbook_versions_endpoint.rb +123 -123
  38. data/lib/chef_zero/endpoints/environment_cookbooks_endpoint.rb +22 -22
  39. data/lib/chef_zero/endpoints/environment_endpoint.rb +33 -33
  40. data/lib/chef_zero/endpoints/environment_nodes_endpoint.rb +23 -23
  41. data/lib/chef_zero/endpoints/environment_recipes_endpoint.rb +22 -22
  42. data/lib/chef_zero/endpoints/environment_role_endpoint.rb +36 -36
  43. data/lib/chef_zero/endpoints/file_store_file_endpoint.rb +22 -22
  44. data/lib/chef_zero/endpoints/group_endpoint.rb +20 -20
  45. data/lib/chef_zero/endpoints/groups_endpoint.rb +13 -13
  46. data/lib/chef_zero/endpoints/license_endpoint.rb +25 -25
  47. data/lib/chef_zero/endpoints/node_endpoint.rb +17 -17
  48. data/lib/chef_zero/endpoints/node_identifiers_endpoint.rb +22 -0
  49. data/lib/chef_zero/endpoints/not_found_endpoint.rb +11 -11
  50. data/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +22 -22
  51. data/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +30 -29
  52. data/lib/chef_zero/endpoints/organization_authenticate_user_endpoint.rb +26 -26
  53. data/lib/chef_zero/endpoints/organization_endpoint.rb +46 -41
  54. data/lib/chef_zero/endpoints/organization_user_base.rb +15 -0
  55. data/lib/chef_zero/endpoints/organization_user_endpoint.rb +26 -48
  56. data/lib/chef_zero/endpoints/organization_users_endpoint.rb +43 -14
  57. data/lib/chef_zero/endpoints/organization_validator_key_endpoint.rb +20 -20
  58. data/lib/chef_zero/endpoints/organizations_endpoint.rb +62 -55
  59. data/lib/chef_zero/endpoints/policies_endpoint.rb +151 -154
  60. data/lib/chef_zero/endpoints/principal_endpoint.rb +42 -42
  61. data/lib/chef_zero/endpoints/rest_list_endpoint.rb +42 -42
  62. data/lib/chef_zero/endpoints/rest_object_endpoint.rb +63 -63
  63. data/lib/chef_zero/endpoints/role_endpoint.rb +16 -16
  64. data/lib/chef_zero/endpoints/role_environments_endpoint.rb +14 -14
  65. data/lib/chef_zero/endpoints/sandbox_endpoint.rb +27 -27
  66. data/lib/chef_zero/endpoints/sandboxes_endpoint.rb +50 -50
  67. data/lib/chef_zero/endpoints/search_endpoint.rb +194 -192
  68. data/lib/chef_zero/endpoints/searches_endpoint.rb +18 -18
  69. data/lib/chef_zero/endpoints/server_api_version_endpoint.rb +14 -0
  70. data/lib/chef_zero/endpoints/system_recovery_endpoint.rb +30 -30
  71. data/lib/chef_zero/endpoints/user_association_request_endpoint.rb +40 -40
  72. data/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb +19 -19
  73. data/lib/chef_zero/endpoints/user_association_requests_endpoint.rb +19 -19
  74. data/lib/chef_zero/endpoints/user_organizations_endpoint.rb +22 -22
  75. data/lib/chef_zero/endpoints/version_endpoint.rb +12 -12
  76. data/lib/chef_zero/log.rb +7 -7
  77. data/lib/chef_zero/rest_base.rb +242 -214
  78. data/lib/chef_zero/rest_error_response.rb +11 -11
  79. data/lib/chef_zero/rest_request.rb +69 -65
  80. data/lib/chef_zero/rest_router.rb +45 -45
  81. data/lib/chef_zero/rspec.rb +308 -308
  82. data/lib/chef_zero/server.rb +642 -637
  83. data/lib/chef_zero/socketless_server_map.rb +92 -92
  84. data/lib/chef_zero/solr/query/binary_operator.rb +52 -52
  85. data/lib/chef_zero/solr/query/phrase.rb +23 -23
  86. data/lib/chef_zero/solr/query/range_query.rb +46 -46
  87. data/lib/chef_zero/solr/query/regexpable_query.rb +29 -29
  88. data/lib/chef_zero/solr/query/subquery.rb +37 -37
  89. data/lib/chef_zero/solr/query/term.rb +45 -45
  90. data/lib/chef_zero/solr/query/unary_operator.rb +43 -43
  91. data/lib/chef_zero/solr/solr_doc.rb +53 -53
  92. data/lib/chef_zero/solr/solr_parser.rb +203 -203
  93. data/lib/chef_zero/version.rb +3 -3
  94. data/spec/run_oc_pedant.rb +63 -56
  95. data/spec/search_spec.rb +32 -32
  96. data/spec/server_spec.rb +92 -91
  97. data/spec/socketless_server_map_spec.rb +76 -76
  98. data/spec/support/oc_pedant.rb +132 -134
  99. data/spec/support/stickywicket.pem +27 -27
  100. metadata +10 -15
  101. data/spec/run_pedant.rb +0 -103
  102. data/spec/support/pedant.rb +0 -129
data/Rakefile CHANGED
@@ -1,31 +1,31 @@
1
- require 'bundler'
2
- require 'bundler/gem_tasks'
3
-
4
- require 'chef_zero/version'
5
-
6
- task :default => :pedant
7
-
8
- desc "run specs"
9
- task :spec do
10
- system('rspec spec/*_spec.rb')
11
- end
12
-
13
- desc "run pedant"
14
- task :pedant do
15
- require File.expand_path('spec/run_pedant')
16
- end
17
-
18
- desc "run oc pedant"
19
- task :oc_pedant do
20
- require File.expand_path('spec/run_oc_pedant')
21
- end
22
-
23
- task :chef_spec do
24
- gem_path = Bundler.environment.specs['chef'].first.full_gem_path
25
- system("cd #{gem_path} && rspec spec/integration")
26
- end
27
-
28
- task :berkshelf_spec do
29
- gem_path = Bundler.environment.specs['berkshelf'].first.full_gem_path
30
- system("cd #{gem_path} && thor spec:ci")
31
- end
1
+ require 'bundler'
2
+ require 'bundler/gem_tasks'
3
+
4
+ require 'chef_zero/version'
5
+
6
+ task :default => :pedant
7
+
8
+ desc "run specs"
9
+ task :spec do
10
+ system('rspec spec/*_spec.rb')
11
+ end
12
+
13
+ desc "run oc pedant"
14
+ task :pedant do
15
+ require File.expand_path('spec/run_oc_pedant')
16
+ end
17
+
18
+ desc "run oc pedant"
19
+ task :oc_pedant do
20
+ require File.expand_path('spec/run_oc_pedant')
21
+ end
22
+
23
+ task :chef_spec do
24
+ gem_path = Bundler.environment.specs['chef'].first.full_gem_path
25
+ system("cd #{gem_path} && rspec spec/integration")
26
+ end
27
+
28
+ task :berkshelf_spec do
29
+ gem_path = Bundler.environment.specs['berkshelf'].first.full_gem_path
30
+ system("cd #{gem_path} && thor spec:ci")
31
+ end
data/bin/chef-zero CHANGED
@@ -1,100 +1,100 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Trap interrupts to quit cleanly.
4
- Signal.trap('INT') { exit 1 }
5
-
6
- require 'rubygems'
7
- $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", "lib")))
8
-
9
- require 'chef_zero/log'
10
- require 'chef_zero/version'
11
- require 'chef_zero/server'
12
- require 'chef_zero/data_store/raw_file_store'
13
- require 'optparse'
14
-
15
- def parse_port(port)
16
- array = []
17
- port.split(',').each do |part|
18
- a,b = part.split('-',2)
19
- if b
20
- array = array.concat(a.to_i.upto(b.to_i).to_a)
21
- else
22
- array = array.concat([a.to_i])
23
- end
24
- end
25
- array
26
- end
27
-
28
- options = {}
29
-
30
- OptionParser.new do |opts|
31
- opts.banner = "Usage: chef-zero [ARGS]"
32
-
33
- opts.on("-H", "--host HOST", "Host to bind to (default: 127.0.0.1)") do |value|
34
- options[:host] = value
35
- end
36
-
37
- opts.on("-p", "--port PORT", "Port to listen on (e.g. 8889, or 8500-8600 or 8885,8888)") do |value|
38
- options[:port] ||= []
39
- options[:port] += parse_port(value)
40
- end
41
-
42
- opts.on("--[no-]generate-keys", "Whether to generate actual keys or fake it (faster). Default: false.") do |value|
43
- options[:generate_real_keys] = value
44
- end
45
-
46
- opts.on("-d", "--daemon", "Run as a daemon process") do |value|
47
- options[:daemon] = value
48
- end
49
-
50
- opts.on("-l", "--log-level LEVEL", "Set the output log level") do |value|
51
- options[:log_level] = value
52
- end
53
-
54
- opts.on("--log-file FILE", "Log to a file") do |value|
55
- options[:log_file] = value
56
- end
57
-
58
- opts.on("--multi-org", "Whether to run in multi-org mode") do |value|
59
- options[:single_org] = nil
60
- end
61
-
62
- opts.on("--file-store PATH", "Persist data to files at the given path") do |value|
63
- options[:data_store] = ChefZero::DataStore::RawFileStore.new(value)
64
- end
65
-
66
- opts.on("--[no-]ssl", "Use SSL with self-signed certificate(Auto generate before every run). Default: false.") do |value|
67
- options[:ssl] = value
68
- end
69
-
70
- opts.on_tail("-h", "--help", "Show this message") do
71
- puts opts
72
- exit
73
- end
74
-
75
- opts.on_tail("--version", "Show version") do
76
- puts ChefZero::VERSION
77
- exit
78
- end
79
- end.parse!
80
-
81
- if options[:data_store]
82
- options[:data_store] = ChefZero::DataStore::DefaultFacade.new(options[:data_store], options[:single_org], false)
83
- end
84
-
85
- if options[:log_file]
86
- ChefZero::Log.init(options[:log_file])
87
- end
88
-
89
- server = ChefZero::Server.new(options)
90
-
91
- if options[:daemon]
92
- if Process.respond_to?(:daemon)
93
- Process.daemon(true)
94
- server.start(true)
95
- else
96
- abort 'Process.daemon requires Ruby >= 1.9'
97
- end
98
- else
99
- server.start(true)
100
- end
1
+ #!/usr/bin/env ruby
2
+
3
+ # Trap interrupts to quit cleanly.
4
+ Signal.trap('INT') { exit 1 }
5
+
6
+ require 'rubygems'
7
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", "lib")))
8
+
9
+ require 'chef_zero/log'
10
+ require 'chef_zero/version'
11
+ require 'chef_zero/server'
12
+ require 'chef_zero/data_store/raw_file_store'
13
+ require 'optparse'
14
+
15
+ def parse_port(port)
16
+ array = []
17
+ port.split(',').each do |part|
18
+ a,b = part.split('-',2)
19
+ if b
20
+ array = array.concat(a.to_i.upto(b.to_i).to_a)
21
+ else
22
+ array = array.concat([a.to_i])
23
+ end
24
+ end
25
+ array
26
+ end
27
+
28
+ options = {}
29
+
30
+ OptionParser.new do |opts|
31
+ opts.banner = "Usage: chef-zero [ARGS]"
32
+
33
+ opts.on("-H", "--host HOST", "Host to bind to (default: 127.0.0.1)") do |value|
34
+ options[:host] = value
35
+ end
36
+
37
+ opts.on("-p", "--port PORT", "Port to listen on (e.g. 8889, or 8500-8600 or 8885,8888)") do |value|
38
+ options[:port] ||= []
39
+ options[:port] += parse_port(value)
40
+ end
41
+
42
+ opts.on("--[no-]generate-keys", "Whether to generate actual keys or fake it (faster). Default: false.") do |value|
43
+ options[:generate_real_keys] = value
44
+ end
45
+
46
+ opts.on("-d", "--daemon", "Run as a daemon process") do |value|
47
+ options[:daemon] = value
48
+ end
49
+
50
+ opts.on("-l", "--log-level LEVEL", "Set the output log level") do |value|
51
+ options[:log_level] = value
52
+ end
53
+
54
+ opts.on("--log-file FILE", "Log to a file") do |value|
55
+ options[:log_file] = value
56
+ end
57
+
58
+ opts.on("--multi-org", "Whether to run in multi-org mode") do |value|
59
+ options[:single_org] = nil
60
+ end
61
+
62
+ opts.on("--file-store PATH", "Persist data to files at the given path") do |value|
63
+ options[:data_store] = ChefZero::DataStore::RawFileStore.new(value)
64
+ end
65
+
66
+ opts.on("--[no-]ssl", "Use SSL with self-signed certificate(Auto generate before every run). Default: false.") do |value|
67
+ options[:ssl] = value
68
+ end
69
+
70
+ opts.on_tail("-h", "--help", "Show this message") do
71
+ puts opts
72
+ exit
73
+ end
74
+
75
+ opts.on_tail("--version", "Show version") do
76
+ puts ChefZero::VERSION
77
+ exit
78
+ end
79
+ end.parse!
80
+
81
+ if options[:data_store]
82
+ options[:data_store] = ChefZero::DataStore::DefaultFacade.new(options[:data_store], options[:single_org], false)
83
+ end
84
+
85
+ if options[:log_file]
86
+ ChefZero::Log.init(options[:log_file])
87
+ end
88
+
89
+ server = ChefZero::Server.new(options)
90
+
91
+ if options[:daemon]
92
+ if Process.respond_to?(:daemon)
93
+ Process.daemon(true)
94
+ server.start(true)
95
+ else
96
+ abort 'Process.daemon requires Ruby >= 1.9'
97
+ end
98
+ else
99
+ server.start(true)
100
+ end
data/lib/chef_zero.rb CHANGED
@@ -1,7 +1,10 @@
1
- module ChefZero
2
- require 'chef_zero/log'
3
-
4
- CERTIFICATE = "-----BEGIN CERTIFICATE-----\nMIIDMzCCApygAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMCVVMx\nEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFjAUBgNVBAoM\nDU9wc2NvZGUsIEluYy4xHDAaBgNVBAsME0NlcnRpZmljYXRlIFNlcnZpY2UxMjAw\nBgNVBAMMKW9wc2NvZGUuY29tL2VtYWlsQWRkcmVzcz1hdXRoQG9wc2NvZGUuY29t\nMB4XDTEyMTEyMTAwMzQyMVoXDTIyMTExOTAwMzQyMVowgZsxEDAOBgNVBAcTB1Nl\nYXR0bGUxEzARBgNVBAgTCldhc2hpbmd0b24xCzAJBgNVBAYTAlVTMRwwGgYDVQQL\nExNDZXJ0aWZpY2F0ZSBTZXJ2aWNlMRYwFAYDVQQKEw1PcHNjb2RlLCBJbmMuMS8w\nLQYDVQQDFCZVUkk6aHR0cDovL29wc2NvZGUuY29tL0dVSURTL3VzZXJfZ3VpZDCC\nASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANLDmPbR71bS2esZlZh/HfC6\n0azXFjl2677wq2ovk9xrUb0Ui4ZLC66TqQ9C/RBzOjXU4TRf3hgPTqvlCgHusl0d\nIcLCrsSl6kPEhJpYWWfRoroIAwf82A9yLQekhqXZEXu5EKkwoUMqyF6m0ZCasaE1\ny8niQxdLAsk3ady/CGQlFqHTPKFfU5UASR2LRtYC1MCIvJHDFRKAp9kPJbQo9P37\nZ8IU7cDudkZFgNLmDixlWsh7C0ghX8fgAlj1P6FgsFufygam973k79GhIP54dELB\nc0S6E8ekkRSOXU9jX/IoiXuFglBvFihAdhvED58bMXzj2AwXUyeAlxItnvs+NVUC\nAwEAATANBgkqhkiG9w0BAQUFAAOBgQBkFZRbMoywK3hb0/X7MXmPYa7nlfnd5UXq\nr2n32ettzZNmEPaI2d1j+//nL5qqhOlrWPS88eKEPnBOX/jZpUWOuAAddnrvFzgw\nrp/C2H7oMT+29F+5ezeViLKbzoFYb4yECHBoi66IFXNae13yj7taMboBeUmE664G\nTB/MZpRr8g==\n-----END CERTIFICATE-----\n"
5
- PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0sOY9tHvVtLZ6xmVmH8d\n8LrRrNcWOXbrvvCrai+T3GtRvRSLhksLrpOpD0L9EHM6NdThNF/eGA9Oq+UKAe6y\nXR0hwsKuxKXqQ8SEmlhZZ9GiuggDB/zYD3ItB6SGpdkRe7kQqTChQyrIXqbRkJqx\noTXLyeJDF0sCyTdp3L8IZCUWodM8oV9TlQBJHYtG1gLUwIi8kcMVEoCn2Q8ltCj0\n/ftnwhTtwO52RkWA0uYOLGVayHsLSCFfx+ACWPU/oWCwW5/KBqb3veTv0aEg/nh0\nQsFzRLoTx6SRFI5dT2Nf8iiJe4WCUG8WKEB2G8QPnxsxfOPYDBdTJ4CXEi2e+z41\nVQIDAQAB\n-----END PUBLIC KEY-----\n"
6
- PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0sOY9tHvVtLZ6xmVmH8d8LrRrNcWOXbrvvCrai+T3GtRvRSL\nhksLrpOpD0L9EHM6NdThNF/eGA9Oq+UKAe6yXR0hwsKuxKXqQ8SEmlhZZ9GiuggD\nB/zYD3ItB6SGpdkRe7kQqTChQyrIXqbRkJqxoTXLyeJDF0sCyTdp3L8IZCUWodM8\noV9TlQBJHYtG1gLUwIi8kcMVEoCn2Q8ltCj0/ftnwhTtwO52RkWA0uYOLGVayHsL\nSCFfx+ACWPU/oWCwW5/KBqb3veTv0aEg/nh0QsFzRLoTx6SRFI5dT2Nf8iiJe4WC\nUG8WKEB2G8QPnxsxfOPYDBdTJ4CXEi2e+z41VQIDAQABAoIBAALhqbW2KQ+G0nPk\nZacwFbi01SkHx8YBWjfCEpXhEKRy0ytCnKW5YO+CFU2gHNWcva7+uhV9OgwaKXkw\nKHLeUJH1VADVqI4Htqw2g5mYm6BPvWnNsjzpuAp+BR+VoEGkNhj67r9hatMAQr0I\nitTvSH5rvd2EumYXIHKfz1K1SegUk1u1EL1RcMzRmZe4gDb6eNBs9Sg4im4ybTG6\npPIytA8vBQVWhjuAR2Tm+wZHiy0Az6Vu7c2mS07FSX6FO4E8SxWf8idaK9ijMGSq\nFvIS04mrY6XCPUPUC4qm1qNnhDPpOr7CpI2OO98SqGanStS5NFlSFXeXPpM280/u\nfZUA0AECgYEA+x7QUnffDrt7LK2cX6wbvn4mRnFxet7bJjrfWIHf+Rm0URikaNma\nh0/wNKpKBwIH+eHK/LslgzcplrqPytGGHLOG97Gyo5tGAzyLHUWBmsNkRksY2sPL\nuHq6pYWJNkqhnWGnIbmqCr0EWih82x/y4qxbJYpYqXMrit0wVf7yAgkCgYEA1twI\ngFaXqesetTPoEHSQSgC8S4D5/NkdriUXCYb06REcvo9IpFMuiOkVUYNN5d3MDNTP\nIdBicfmvfNELvBtXDomEUD8ls1UuoTIXRNGZ0VsZXu7OErXCK0JKNNyqRmOwcvYL\nJRqLfnlei5Ndo1lu286yL74c5rdTLs/nI2p4e+0CgYB079ZmcLeILrmfBoFI8+Y/\ngJLmPrFvXBOE6+lRV7kqUFPtZ6I3yQzyccETZTDvrnx0WjaiFavUPH27WMjY01S2\nTMtO0Iq1MPsbSrglO1as8MvjB9ldFcvp7gy4Q0Sv6XT0yqJ/S+vo8Df0m+H4UBpU\nf5o6EwBSd/UQxwtZIE0lsQKBgQCswfjX8Eg8KL/lJNpIOOE3j4XXE9ptksmJl2sB\njxDnQYoiMqVO808saHVquC/vTrpd6tKtNpehWwjeTFuqITWLi8jmmQ+gNTKsC9Gn\n1Pxf2Gb67PqnEpwQGln+TRtgQ5HBrdHiQIi+5am+gnw89pDrjjO5rZwhanAo6KPJ\n1zcPNQKBgQDxFu8v4frDmRNCVaZS4f1B6wTrcMrnibIDlnzrK9GG6Hz1U7dDv8s8\nNf4UmeMzDXjlPWZVOvS5+9HKJPdPj7/onv8B2m18+lcgTTDJBkza7R1mjL1Cje/Z\nKcVGsryKN6cjE7yCDasnA7R2rVBV/7NWeJV77bmzT5O//rW4yIfUIg==\n-----END RSA PRIVATE KEY-----\n"
7
- end
1
+ module ChefZero
2
+ require 'chef_zero/log'
3
+
4
+ MIN_API_VERSION = 0
5
+ MAX_API_VERSION = 1
6
+
7
+ CERTIFICATE = "-----BEGIN CERTIFICATE-----\nMIIDMzCCApygAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMCVVMx\nEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFjAUBgNVBAoM\nDU9wc2NvZGUsIEluYy4xHDAaBgNVBAsME0NlcnRpZmljYXRlIFNlcnZpY2UxMjAw\nBgNVBAMMKW9wc2NvZGUuY29tL2VtYWlsQWRkcmVzcz1hdXRoQG9wc2NvZGUuY29t\nMB4XDTEyMTEyMTAwMzQyMVoXDTIyMTExOTAwMzQyMVowgZsxEDAOBgNVBAcTB1Nl\nYXR0bGUxEzARBgNVBAgTCldhc2hpbmd0b24xCzAJBgNVBAYTAlVTMRwwGgYDVQQL\nExNDZXJ0aWZpY2F0ZSBTZXJ2aWNlMRYwFAYDVQQKEw1PcHNjb2RlLCBJbmMuMS8w\nLQYDVQQDFCZVUkk6aHR0cDovL29wc2NvZGUuY29tL0dVSURTL3VzZXJfZ3VpZDCC\nASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANLDmPbR71bS2esZlZh/HfC6\n0azXFjl2677wq2ovk9xrUb0Ui4ZLC66TqQ9C/RBzOjXU4TRf3hgPTqvlCgHusl0d\nIcLCrsSl6kPEhJpYWWfRoroIAwf82A9yLQekhqXZEXu5EKkwoUMqyF6m0ZCasaE1\ny8niQxdLAsk3ady/CGQlFqHTPKFfU5UASR2LRtYC1MCIvJHDFRKAp9kPJbQo9P37\nZ8IU7cDudkZFgNLmDixlWsh7C0ghX8fgAlj1P6FgsFufygam973k79GhIP54dELB\nc0S6E8ekkRSOXU9jX/IoiXuFglBvFihAdhvED58bMXzj2AwXUyeAlxItnvs+NVUC\nAwEAATANBgkqhkiG9w0BAQUFAAOBgQBkFZRbMoywK3hb0/X7MXmPYa7nlfnd5UXq\nr2n32ettzZNmEPaI2d1j+//nL5qqhOlrWPS88eKEPnBOX/jZpUWOuAAddnrvFzgw\nrp/C2H7oMT+29F+5ezeViLKbzoFYb4yECHBoi66IFXNae13yj7taMboBeUmE664G\nTB/MZpRr8g==\n-----END CERTIFICATE-----\n"
8
+ PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0sOY9tHvVtLZ6xmVmH8d\n8LrRrNcWOXbrvvCrai+T3GtRvRSLhksLrpOpD0L9EHM6NdThNF/eGA9Oq+UKAe6y\nXR0hwsKuxKXqQ8SEmlhZZ9GiuggDB/zYD3ItB6SGpdkRe7kQqTChQyrIXqbRkJqx\noTXLyeJDF0sCyTdp3L8IZCUWodM8oV9TlQBJHYtG1gLUwIi8kcMVEoCn2Q8ltCj0\n/ftnwhTtwO52RkWA0uYOLGVayHsLSCFfx+ACWPU/oWCwW5/KBqb3veTv0aEg/nh0\nQsFzRLoTx6SRFI5dT2Nf8iiJe4WCUG8WKEB2G8QPnxsxfOPYDBdTJ4CXEi2e+z41\nVQIDAQAB\n-----END PUBLIC KEY-----\n"
9
+ PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0sOY9tHvVtLZ6xmVmH8d8LrRrNcWOXbrvvCrai+T3GtRvRSL\nhksLrpOpD0L9EHM6NdThNF/eGA9Oq+UKAe6yXR0hwsKuxKXqQ8SEmlhZZ9GiuggD\nB/zYD3ItB6SGpdkRe7kQqTChQyrIXqbRkJqxoTXLyeJDF0sCyTdp3L8IZCUWodM8\noV9TlQBJHYtG1gLUwIi8kcMVEoCn2Q8ltCj0/ftnwhTtwO52RkWA0uYOLGVayHsL\nSCFfx+ACWPU/oWCwW5/KBqb3veTv0aEg/nh0QsFzRLoTx6SRFI5dT2Nf8iiJe4WC\nUG8WKEB2G8QPnxsxfOPYDBdTJ4CXEi2e+z41VQIDAQABAoIBAALhqbW2KQ+G0nPk\nZacwFbi01SkHx8YBWjfCEpXhEKRy0ytCnKW5YO+CFU2gHNWcva7+uhV9OgwaKXkw\nKHLeUJH1VADVqI4Htqw2g5mYm6BPvWnNsjzpuAp+BR+VoEGkNhj67r9hatMAQr0I\nitTvSH5rvd2EumYXIHKfz1K1SegUk1u1EL1RcMzRmZe4gDb6eNBs9Sg4im4ybTG6\npPIytA8vBQVWhjuAR2Tm+wZHiy0Az6Vu7c2mS07FSX6FO4E8SxWf8idaK9ijMGSq\nFvIS04mrY6XCPUPUC4qm1qNnhDPpOr7CpI2OO98SqGanStS5NFlSFXeXPpM280/u\nfZUA0AECgYEA+x7QUnffDrt7LK2cX6wbvn4mRnFxet7bJjrfWIHf+Rm0URikaNma\nh0/wNKpKBwIH+eHK/LslgzcplrqPytGGHLOG97Gyo5tGAzyLHUWBmsNkRksY2sPL\nuHq6pYWJNkqhnWGnIbmqCr0EWih82x/y4qxbJYpYqXMrit0wVf7yAgkCgYEA1twI\ngFaXqesetTPoEHSQSgC8S4D5/NkdriUXCYb06REcvo9IpFMuiOkVUYNN5d3MDNTP\nIdBicfmvfNELvBtXDomEUD8ls1UuoTIXRNGZ0VsZXu7OErXCK0JKNNyqRmOwcvYL\nJRqLfnlei5Ndo1lu286yL74c5rdTLs/nI2p4e+0CgYB079ZmcLeILrmfBoFI8+Y/\ngJLmPrFvXBOE6+lRV7kqUFPtZ6I3yQzyccETZTDvrnx0WjaiFavUPH27WMjY01S2\nTMtO0Iq1MPsbSrglO1as8MvjB9ldFcvp7gy4Q0Sv6XT0yqJ/S+vo8Df0m+H4UBpU\nf5o6EwBSd/UQxwtZIE0lsQKBgQCswfjX8Eg8KL/lJNpIOOE3j4XXE9ptksmJl2sB\njxDnQYoiMqVO808saHVquC/vTrpd6tKtNpehWwjeTFuqITWLi8jmmQ+gNTKsC9Gn\n1Pxf2Gb67PqnEpwQGln+TRtgQ5HBrdHiQIi+5am+gnw89pDrjjO5rZwhanAo6KPJ\n1zcPNQKBgQDxFu8v4frDmRNCVaZS4f1B6wTrcMrnibIDlnzrK9GG6Hz1U7dDv8s8\nNf4UmeMzDXjlPWZVOvS5+9HKJPdPj7/onv8B2m18+lcgTTDJBkza7R1mjL1Cje/Z\nKcVGsryKN6cjE7yCDasnA7R2rVBV/7NWeJV77bmzT5O//rW4yIfUIg==\n-----END RSA PRIVATE KEY-----\n"
10
+ end
@@ -1,139 +1,139 @@
1
- module ChefZero
2
- module ChefData
3
- # Manages translations between REST and ACL data paths
4
- # and parent paths.
5
- #
6
- # Suggestions
7
- # - make /organizations/ORG/_acl and deprecate organization/_acl and organizations/_acl
8
- # - add endpoints for /containers/(users|organizations|containers)(/_acl)
9
- # - add PUT for */_acl
10
- # - add endpoints for /organizations/ORG/data/containers and /organizations/ORG/cookbooks/containers
11
- # - sane, fully documented ACL model
12
- # - sane inheritance / override model: if actors or groups are explicitly
13
- # specified on X, they are not inherited from X's parent
14
- # - stop adding pivotal to acls (he already has access to what he needs)
15
- module AclPath
16
- ORG_DATA_TYPES = %w(clients cookbooks containers data environments groups nodes roles sandboxes)
17
- TOP_DATA_TYPES = %w(containers organizations users)
18
-
19
- # ACL data paths for a partition are:
20
- # / -> /acls/root
21
- # /TYPE -> /acls/containers/TYPE
22
- # /TYPE/NAME -> /acls/TYPE/NAME
23
- #
24
- # The root partition "/" has its own acls, so it looks like this:
25
- #
26
- # / -> /acls/root
27
- # /users -> /acls/containers/users
28
- # /organizations -> /acls/containers/organizations
29
- # /users/schlansky -> /acls/users/schlansky
30
- #
31
- # Each organization is its own partition, so it looks like this:
32
- #
33
- # /organizations/blah -> /organizations/blah/acls/root
34
- # /organizations/blah/roles -> /organizations/blah/acls/containers/roles
35
- # /organizations/blah/roles/web -> /organizations/blah/acls/roles/web
36
- # /organizations/ORG is its own partition. ACLs for anything under it follow
37
-
38
- # This method takes a Chef REST path and returns the chef-zero path
39
- # used to look up the ACL. If an object does not have an ACL directly,
40
- # it will return nil. Paths like /organizations/ORG/data/bag/item will
41
- # return nil, because it is the parent path (data/bag) that has an ACL.
42
- def self.get_acl_data_path(path)
43
- # Things under organizations have their own acls hierarchy
44
- if path[0] == 'organizations' && path.size >= 2
45
- under_org = partition_acl_data_path(path[2..-1], ORG_DATA_TYPES)
46
- if under_org
47
- path[0..1] + under_org
48
- end
49
- else
50
- partition_acl_data_path(path, TOP_DATA_TYPES)
51
- end
52
- end
53
-
54
- #
55
- # Reverse transform from acl_data_path to path.
56
- # /acls/root -> /
57
- # /acls/** -> /**
58
- # /organizations/ORG/acls/root -> /organizations/ORG
59
- # /organizations/ORG/acls/** -> /organizations/ORG/**
60
- #
61
- # This means that /acls/containers/nodes maps to
62
- # /containers/nodes, not /nodes.
63
- #
64
- def self.get_object_path(acl_data_path)
65
- if acl_data_path[0] == 'acls'
66
- if acl_data_path[1] == 'root'
67
- []
68
- else
69
- acl_data_path[1..-1]
70
- end
71
- elsif acl_data_path[0] == 'organizations' && acl_data_path[2] == 'acls'
72
- if acl_data_path[3] == 'root'
73
- acl_data_path[0..1]
74
- else
75
- acl_data_path[0..1] + acl_data_path[3..-1]
76
- end
77
- end
78
- end
79
-
80
- # Method *assumes* acl_data_path is valid.
81
- # /organizations/BLAH's parent is /organizations
82
- #
83
- # An example traversal up the whole tree:
84
- # /organizations/foo/acls/nodes/mario ->
85
- # /organizations/foo/acls/containers/nodes ->
86
- # /organizations/foo/acls/containers/containers ->
87
- # /organizations/foo/acls/root ->
88
- # /acls/containers/organizations ->
89
- # /acls/containers/containers ->
90
- # /acls/root ->
91
- # nil
92
- def self.parent_acl_data_path(acl_data_path)
93
- if acl_data_path[0] == 'organizations'
94
- under_org = partition_parent_acl_data_path(acl_data_path[2..-1])
95
- if under_org
96
- acl_data_path[0..1] + under_org
97
- else
98
- # ACL data path is /organizations/X/acls/root; therefore parent is "/organizations"
99
- [ 'acls', 'containers', 'organizations' ]
100
- end
101
- else
102
- partition_parent_acl_data_path(acl_data_path)
103
- end
104
- end
105
-
106
- private
107
-
108
- # /acls/root -> nil
109
- # /acls/containers/containers -> /acls/root
110
- # /acls/TYPE/X -> /acls/containers/TYPE
111
- #
112
- # Method *assumes* acl_data_path is valid.
113
- # Returns nil if the path is /acls/root
114
- def self.partition_parent_acl_data_path(acl_data_path)
115
- if acl_data_path.size == 3
116
- if acl_data_path == %w(acls containers containers)
117
- [ 'acls', 'root' ]
118
- else
119
- [ 'acls', 'containers', acl_data_path[1]]
120
- end
121
- else
122
- nil
123
- end
124
- end
125
-
126
- def self.partition_acl_data_path(path, data_types)
127
- if path.size == 0
128
- [ 'acls', 'root']
129
- elsif data_types.include?(path[0])
130
- if path.size == 0
131
- [ 'acls', 'containers', path[0] ]
132
- elsif path.size == 2
133
- [ 'acls', path[0], path[1] ]
134
- end
135
- end
136
- end
137
- end
138
- end
139
- end
1
+ module ChefZero
2
+ module ChefData
3
+ # Manages translations between REST and ACL data paths
4
+ # and parent paths.
5
+ #
6
+ # Suggestions
7
+ # - make /organizations/ORG/_acl and deprecate organization/_acl and organizations/_acl
8
+ # - add endpoints for /containers/(users|organizations|containers)(/_acl)
9
+ # - add PUT for */_acl
10
+ # - add endpoints for /organizations/ORG/data/containers and /organizations/ORG/cookbooks/containers
11
+ # - sane, fully documented ACL model
12
+ # - sane inheritance / override model: if actors or groups are explicitly
13
+ # specified on X, they are not inherited from X's parent
14
+ # - stop adding pivotal to acls (he already has access to what he needs)
15
+ module AclPath
16
+ ORG_DATA_TYPES = %w(clients cookbooks containers data environments groups nodes roles sandboxes)
17
+ TOP_DATA_TYPES = %w(containers organizations users)
18
+
19
+ # ACL data paths for a partition are:
20
+ # / -> /acls/root
21
+ # /TYPE -> /acls/containers/TYPE
22
+ # /TYPE/NAME -> /acls/TYPE/NAME
23
+ #
24
+ # The root partition "/" has its own acls, so it looks like this:
25
+ #
26
+ # / -> /acls/root
27
+ # /users -> /acls/containers/users
28
+ # /organizations -> /acls/containers/organizations
29
+ # /users/schlansky -> /acls/users/schlansky
30
+ #
31
+ # Each organization is its own partition, so it looks like this:
32
+ #
33
+ # /organizations/blah -> /organizations/blah/acls/root
34
+ # /organizations/blah/roles -> /organizations/blah/acls/containers/roles
35
+ # /organizations/blah/roles/web -> /organizations/blah/acls/roles/web
36
+ # /organizations/ORG is its own partition. ACLs for anything under it follow
37
+
38
+ # This method takes a Chef REST path and returns the chef-zero path
39
+ # used to look up the ACL. If an object does not have an ACL directly,
40
+ # it will return nil. Paths like /organizations/ORG/data/bag/item will
41
+ # return nil, because it is the parent path (data/bag) that has an ACL.
42
+ def self.get_acl_data_path(path)
43
+ # Things under organizations have their own acls hierarchy
44
+ if path[0] == 'organizations' && path.size >= 2
45
+ under_org = partition_acl_data_path(path[2..-1], ORG_DATA_TYPES)
46
+ if under_org
47
+ path[0..1] + under_org
48
+ end
49
+ else
50
+ partition_acl_data_path(path, TOP_DATA_TYPES)
51
+ end
52
+ end
53
+
54
+ #
55
+ # Reverse transform from acl_data_path to path.
56
+ # /acls/root -> /
57
+ # /acls/** -> /**
58
+ # /organizations/ORG/acls/root -> /organizations/ORG
59
+ # /organizations/ORG/acls/** -> /organizations/ORG/**
60
+ #
61
+ # This means that /acls/containers/nodes maps to
62
+ # /containers/nodes, not /nodes.
63
+ #
64
+ def self.get_object_path(acl_data_path)
65
+ if acl_data_path[0] == 'acls'
66
+ if acl_data_path[1] == 'root'
67
+ []
68
+ else
69
+ acl_data_path[1..-1]
70
+ end
71
+ elsif acl_data_path[0] == 'organizations' && acl_data_path[2] == 'acls'
72
+ if acl_data_path[3] == 'root'
73
+ acl_data_path[0..1]
74
+ else
75
+ acl_data_path[0..1] + acl_data_path[3..-1]
76
+ end
77
+ end
78
+ end
79
+
80
+ # Method *assumes* acl_data_path is valid.
81
+ # /organizations/BLAH's parent is /organizations
82
+ #
83
+ # An example traversal up the whole tree:
84
+ # /organizations/foo/acls/nodes/mario ->
85
+ # /organizations/foo/acls/containers/nodes ->
86
+ # /organizations/foo/acls/containers/containers ->
87
+ # /organizations/foo/acls/root ->
88
+ # /acls/containers/organizations ->
89
+ # /acls/containers/containers ->
90
+ # /acls/root ->
91
+ # nil
92
+ def self.parent_acl_data_path(acl_data_path)
93
+ if acl_data_path[0] == 'organizations'
94
+ under_org = partition_parent_acl_data_path(acl_data_path[2..-1])
95
+ if under_org
96
+ acl_data_path[0..1] + under_org
97
+ else
98
+ # ACL data path is /organizations/X/acls/root; therefore parent is "/organizations"
99
+ [ 'acls', 'containers', 'organizations' ]
100
+ end
101
+ else
102
+ partition_parent_acl_data_path(acl_data_path)
103
+ end
104
+ end
105
+
106
+ private
107
+
108
+ # /acls/root -> nil
109
+ # /acls/containers/containers -> /acls/root
110
+ # /acls/TYPE/X -> /acls/containers/TYPE
111
+ #
112
+ # Method *assumes* acl_data_path is valid.
113
+ # Returns nil if the path is /acls/root
114
+ def self.partition_parent_acl_data_path(acl_data_path)
115
+ if acl_data_path.size == 3
116
+ if acl_data_path == %w(acls containers containers)
117
+ [ 'acls', 'root' ]
118
+ else
119
+ [ 'acls', 'containers', acl_data_path[1]]
120
+ end
121
+ else
122
+ nil
123
+ end
124
+ end
125
+
126
+ def self.partition_acl_data_path(path, data_types)
127
+ if path.size == 0
128
+ [ 'acls', 'root']
129
+ elsif data_types.include?(path[0])
130
+ if path.size == 0
131
+ [ 'acls', 'containers', path[0] ]
132
+ elsif path.size == 2
133
+ [ 'acls', path[0], path[1] ]
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end