chef-zero 2.2.1 → 3.0.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/Rakefile +5 -1
- data/bin/chef-zero +17 -0
- data/lib/chef_zero/chef_data/acl_path.rb +139 -0
- data/lib/chef_zero/chef_data/cookbook_data.rb +240 -0
- data/lib/chef_zero/chef_data/data_normalizer.rb +207 -0
- data/lib/chef_zero/chef_data/default_creator.rb +446 -0
- data/lib/chef_zero/data_store/default_facade.rb +149 -0
- data/lib/chef_zero/data_store/interface_v1.rb +18 -0
- data/lib/chef_zero/data_store/memory_store.rb +2 -1
- data/lib/chef_zero/data_store/memory_store_v2.rb +3 -36
- data/lib/chef_zero/data_store/raw_file_store.rb +147 -0
- data/lib/chef_zero/data_store/v1_to_v2_adapter.rb +39 -103
- data/lib/chef_zero/data_store/v2_to_v1_adapter.rb +1 -1
- data/lib/chef_zero/endpoints/acl_endpoint.rb +38 -0
- data/lib/chef_zero/endpoints/acls_endpoint.rb +29 -0
- data/lib/chef_zero/endpoints/actor_endpoint.rb +36 -10
- data/lib/chef_zero/endpoints/actors_endpoint.rb +38 -6
- data/lib/chef_zero/endpoints/authenticate_user_endpoint.rb +15 -9
- data/lib/chef_zero/endpoints/container_endpoint.rb +22 -0
- data/lib/chef_zero/endpoints/containers_endpoint.rb +13 -0
- data/lib/chef_zero/endpoints/cookbook_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/cookbook_version_endpoint.rb +15 -14
- data/lib/chef_zero/endpoints/cookbooks_base.rb +2 -2
- data/lib/chef_zero/endpoints/data_bag_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/data_bag_item_endpoint.rb +5 -5
- data/lib/chef_zero/endpoints/data_bags_endpoint.rb +5 -4
- data/lib/chef_zero/endpoints/environment_cookbook_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/environment_cookbook_versions_endpoint.rb +6 -6
- data/lib/chef_zero/endpoints/environment_cookbooks_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/environment_endpoint.rb +5 -5
- data/lib/chef_zero/endpoints/environment_nodes_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/environment_recipes_endpoint.rb +3 -3
- data/lib/chef_zero/endpoints/environment_role_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/file_store_file_endpoint.rb +1 -1
- data/lib/chef_zero/endpoints/group_endpoint.rb +20 -0
- data/lib/chef_zero/endpoints/groups_endpoint.rb +13 -0
- data/lib/chef_zero/endpoints/license_endpoint.rb +25 -0
- data/lib/chef_zero/endpoints/node_endpoint.rb +5 -5
- data/lib/chef_zero/endpoints/not_found_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +22 -0
- data/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +29 -0
- data/lib/chef_zero/endpoints/organization_authenticate_user_endpoint.rb +26 -0
- data/lib/chef_zero/endpoints/organization_endpoint.rb +41 -0
- data/lib/chef_zero/endpoints/organization_user_endpoint.rb +48 -0
- data/lib/chef_zero/endpoints/organization_users_endpoint.rb +14 -0
- data/lib/chef_zero/endpoints/organization_validator_key_endpoint.rb +20 -0
- data/lib/chef_zero/endpoints/organizations_endpoint.rb +55 -0
- data/lib/chef_zero/endpoints/principal_endpoint.rb +15 -3
- data/lib/chef_zero/endpoints/rest_list_endpoint.rb +8 -6
- data/lib/chef_zero/endpoints/rest_object_endpoint.rb +12 -10
- data/lib/chef_zero/endpoints/role_endpoint.rb +5 -5
- data/lib/chef_zero/endpoints/role_environments_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/sandbox_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/sandboxes_endpoint.rb +4 -4
- data/lib/chef_zero/endpoints/search_endpoint.rb +10 -10
- data/lib/chef_zero/endpoints/system_recovery_endpoint.rb +30 -0
- data/lib/chef_zero/endpoints/user_association_request_endpoint.rb +40 -0
- data/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb +19 -0
- data/lib/chef_zero/endpoints/user_association_requests_endpoint.rb +19 -0
- data/lib/chef_zero/endpoints/user_organizations_endpoint.rb +22 -0
- data/lib/chef_zero/rest_base.rb +79 -13
- data/lib/chef_zero/rest_error_response.rb +1 -1
- data/lib/chef_zero/rest_request.rb +4 -0
- data/lib/chef_zero/rest_router.rb +1 -0
- data/lib/chef_zero/rspec.rb +55 -8
- data/lib/chef_zero/server.rb +87 -21
- data/lib/chef_zero/version.rb +1 -1
- data/spec/run_oc_pedant.rb +53 -0
- data/spec/{run.rb → run_pedant.rb} +13 -4
- data/spec/server_spec.rb +54 -0
- data/spec/support/oc_pedant.rb +134 -0
- data/spec/support/pedant.rb +1 -1
- metadata +54 -13
- data/lib/chef_zero/cookbook_data.rb +0 -236
- data/lib/chef_zero/data_normalizer.rb +0 -146
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'chef_zero/rest_base'
|
3
|
+
|
4
|
+
module ChefZero
|
5
|
+
module Endpoints
|
6
|
+
# /organizations/ORG/users
|
7
|
+
class OrganizationUsersEndpoint < RestBase
|
8
|
+
def get(request)
|
9
|
+
result = list_data(request).map { |username| { "user" => { "username" => username } } }
|
10
|
+
json_response(200, result)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'chef_zero/rest_base'
|
3
|
+
require 'uuidtools'
|
4
|
+
|
5
|
+
module ChefZero
|
6
|
+
module Endpoints
|
7
|
+
# /organizations/NAME/_validator_key
|
8
|
+
class OrganizationValidatorKeyEndpoint < RestBase
|
9
|
+
def post(request)
|
10
|
+
org_name = request.rest_path[-2]
|
11
|
+
validator_path = [ 'organizations', org_name, 'clients', "#{org_name}-validator"]
|
12
|
+
validator = JSON.parse(get_data(request, validator_path), :create_additions => false)
|
13
|
+
private_key, public_key = server.gen_key_pair
|
14
|
+
validator['public_key'] = public_key
|
15
|
+
set_data(request, validator_path, JSON.pretty_generate(validator))
|
16
|
+
json_response(200, { 'private_key' => private_key })
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'chef_zero/rest_base'
|
3
|
+
require 'uuidtools'
|
4
|
+
|
5
|
+
module ChefZero
|
6
|
+
module Endpoints
|
7
|
+
# /organizations
|
8
|
+
class OrganizationsEndpoint < RestBase
|
9
|
+
def get(request)
|
10
|
+
result = {}
|
11
|
+
data_store.list(request.rest_path).each do |name|
|
12
|
+
result[name] = build_uri(request.base_uri, request.rest_path + [name])
|
13
|
+
end
|
14
|
+
json_response(200, result)
|
15
|
+
end
|
16
|
+
|
17
|
+
def post(request)
|
18
|
+
contents = request.body
|
19
|
+
name = JSON.parse(contents, :create_additions => false)['name']
|
20
|
+
if name.nil?
|
21
|
+
error(400, "Must specify 'name' in JSON")
|
22
|
+
elsif exists_data_dir?(request, request.rest_path + [ name ])
|
23
|
+
error(409, "Organization already exists")
|
24
|
+
else
|
25
|
+
create_data_dir(request, request.rest_path, name, :requestor => request.requestor)
|
26
|
+
|
27
|
+
org = {
|
28
|
+
"guid" => UUIDTools::UUID.random_create.to_s.gsub('-', ''),
|
29
|
+
"assigned_at" => Time.now.to_s
|
30
|
+
}
|
31
|
+
org_path = request.rest_path + [ name ]
|
32
|
+
set_data(request, org_path + [ 'org' ], JSON.pretty_generate(org))
|
33
|
+
|
34
|
+
if server.generate_real_keys?
|
35
|
+
# Create the validator client
|
36
|
+
validator_name = "#{name}-validator"
|
37
|
+
validator_path = org_path + [ 'clients', validator_name ]
|
38
|
+
private_key, public_key = server.gen_key_pair
|
39
|
+
validator = JSON.pretty_generate({
|
40
|
+
'validator' => true,
|
41
|
+
'public_key' => public_key
|
42
|
+
})
|
43
|
+
set_data(request, validator_path, validator)
|
44
|
+
end
|
45
|
+
|
46
|
+
json_response(201, {
|
47
|
+
"uri" => "#{build_uri(request.base_uri, org_path)}",
|
48
|
+
"clientname" => validator_name,
|
49
|
+
"private_key" => private_key
|
50
|
+
})
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'json'
|
2
2
|
require 'chef_zero'
|
3
3
|
require 'chef_zero/rest_base'
|
4
4
|
|
@@ -11,15 +11,27 @@ module ChefZero
|
|
11
11
|
json = get_data(request, request.rest_path[0..1] + [ 'users', name ], :nil)
|
12
12
|
if json
|
13
13
|
type = 'user'
|
14
|
+
org_member = true
|
14
15
|
else
|
15
16
|
json = get_data(request, request.rest_path[0..1] + [ 'clients', name ], :nil)
|
16
|
-
|
17
|
+
if json
|
18
|
+
type = 'client'
|
19
|
+
org_member = true
|
20
|
+
else
|
21
|
+
json = get_data(request, [ 'users', name ], :nil)
|
22
|
+
if json
|
23
|
+
type = 'user'
|
24
|
+
org_member = false
|
25
|
+
end
|
26
|
+
end
|
17
27
|
end
|
18
28
|
if json
|
19
29
|
json_response(200, {
|
20
30
|
'name' => name,
|
21
31
|
'type' => type,
|
22
|
-
'public_key' =>
|
32
|
+
'public_key' => JSON.parse(json)['public_key'] || PUBLIC_KEY,
|
33
|
+
'authz_id' => '0'*32,
|
34
|
+
'org_member' => org_member
|
23
35
|
})
|
24
36
|
else
|
25
37
|
error(404, 'Principal not found')
|
@@ -1,16 +1,17 @@
|
|
1
|
-
require '
|
1
|
+
require 'json'
|
2
2
|
require 'chef_zero/rest_base'
|
3
3
|
|
4
4
|
module ChefZero
|
5
5
|
module Endpoints
|
6
6
|
# Typical REST list endpoint (/roles or /data/BAG)
|
7
7
|
class RestListEndpoint < RestBase
|
8
|
-
def initialize(server,
|
8
|
+
def initialize(server, identity_keys = [ 'name' ])
|
9
9
|
super(server)
|
10
|
-
|
10
|
+
identity_keys = [ identity_keys ] if identity_keys.is_a?(String)
|
11
|
+
@identity_keys = identity_keys
|
11
12
|
end
|
12
13
|
|
13
|
-
attr_reader :
|
14
|
+
attr_reader :identity_keys
|
14
15
|
|
15
16
|
def get(request)
|
16
17
|
# Get the result
|
@@ -25,7 +26,7 @@ module ChefZero
|
|
25
26
|
contents = request.body
|
26
27
|
key = get_key(contents)
|
27
28
|
if key.nil?
|
28
|
-
error(400, "Must specify
|
29
|
+
error(400, "Must specify #{identity_keys.map { |k| k.inspect }.join(' or ')} in JSON")
|
29
30
|
else
|
30
31
|
create_data(request, request.rest_path, key, contents)
|
31
32
|
json_response(201, {'uri' => "#{build_uri(request.base_uri, request.rest_path + [key])}"})
|
@@ -33,7 +34,8 @@ module ChefZero
|
|
33
34
|
end
|
34
35
|
|
35
36
|
def get_key(contents)
|
36
|
-
|
37
|
+
json = JSON.parse(contents, :create_additions => false)
|
38
|
+
identity_keys.map { |k| json[k] }.select { |v| v }.first
|
37
39
|
end
|
38
40
|
end
|
39
41
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'json'
|
2
2
|
require 'chef_zero/rest_base'
|
3
3
|
require 'chef_zero/rest_error_response'
|
4
4
|
|
@@ -6,12 +6,13 @@ module ChefZero
|
|
6
6
|
module Endpoints
|
7
7
|
# Typical REST leaf endpoint (/roles/NAME or /data/BAG/NAME)
|
8
8
|
class RestObjectEndpoint < RestBase
|
9
|
-
def initialize(server,
|
9
|
+
def initialize(server, identity_keys = [ 'name' ])
|
10
10
|
super(server)
|
11
|
-
|
11
|
+
identity_keys = [ identity_keys ] if identity_keys.is_a?(String)
|
12
|
+
@identity_keys = identity_keys
|
12
13
|
end
|
13
14
|
|
14
|
-
attr_reader :
|
15
|
+
attr_reader :identity_keys
|
15
16
|
|
16
17
|
def get(request)
|
17
18
|
already_json_response(200, populate_defaults(request, get_data(request)))
|
@@ -20,13 +21,14 @@ module ChefZero
|
|
20
21
|
def put(request)
|
21
22
|
# We grab the old body to trigger a 404 if it doesn't exist
|
22
23
|
old_body = get_data(request)
|
23
|
-
request_json =
|
24
|
-
key = request_json[
|
24
|
+
request_json = JSON.parse(request.body, :create_additions => false)
|
25
|
+
key = identity_keys.map { |k| request_json[k] }.select { |v| v }.first
|
26
|
+
key ||= request.rest_path[-1]
|
25
27
|
# If it's a rename, check for conflict and delete the old value
|
26
28
|
rename = key != request.rest_path[-1]
|
27
29
|
if rename
|
28
30
|
begin
|
29
|
-
|
31
|
+
create_data(request, request.rest_path[0..-2], key, request.body, :data_store_exceptions)
|
30
32
|
rescue DataStore::DataAlreadyExistsError
|
31
33
|
return error(409, "Cannot rename '#{request.rest_path[-1]}' to '#{key}': '#{key}' already exists")
|
32
34
|
end
|
@@ -47,11 +49,11 @@ module ChefZero
|
|
47
49
|
def patch_request_body(request)
|
48
50
|
existing_value = get_data(request, nil, :nil)
|
49
51
|
if existing_value
|
50
|
-
request_json =
|
51
|
-
existing_json =
|
52
|
+
request_json = JSON.parse(request.body, :create_additions => false)
|
53
|
+
existing_json = JSON.parse(existing_value, :create_additions => false)
|
52
54
|
merged_json = existing_json.merge(request_json)
|
53
55
|
if merged_json.size > request_json.size
|
54
|
-
return
|
56
|
+
return JSON.pretty_generate(merged_json)
|
55
57
|
end
|
56
58
|
end
|
57
59
|
request.body
|
@@ -1,15 +1,15 @@
|
|
1
|
-
require '
|
1
|
+
require 'json'
|
2
2
|
require 'chef_zero/endpoints/rest_object_endpoint'
|
3
|
-
require 'chef_zero/data_normalizer'
|
3
|
+
require 'chef_zero/chef_data/data_normalizer'
|
4
4
|
|
5
5
|
module ChefZero
|
6
6
|
module Endpoints
|
7
7
|
# /roles/NAME
|
8
8
|
class RoleEndpoint < RestObjectEndpoint
|
9
9
|
def populate_defaults(request, response_json)
|
10
|
-
role =
|
11
|
-
role = DataNormalizer.normalize_role(role, request.rest_path[3])
|
12
|
-
|
10
|
+
role = JSON.parse(response_json, :create_additions => false)
|
11
|
+
role = ChefData::DataNormalizer.normalize_role(role, request.rest_path[3])
|
12
|
+
JSON.pretty_generate(role)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'json'
|
2
2
|
require 'chef_zero/rest_base'
|
3
3
|
|
4
4
|
module ChefZero
|
@@ -6,7 +6,7 @@ module ChefZero
|
|
6
6
|
# /roles/NAME/environments
|
7
7
|
class RoleEnvironmentsEndpoint < RestBase
|
8
8
|
def get(request)
|
9
|
-
role =
|
9
|
+
role = JSON.parse(get_data(request, request.rest_path[0..3]), :create_additions => false)
|
10
10
|
json_response(200, [ '_default' ] + (role['env_run_lists'].keys || []))
|
11
11
|
end
|
12
12
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'chef_zero/rest_base'
|
2
2
|
require 'chef_zero/rest_error_response'
|
3
|
-
require '
|
3
|
+
require 'json'
|
4
4
|
|
5
5
|
module ChefZero
|
6
6
|
module Endpoints
|
7
7
|
# /sandboxes/ID
|
8
8
|
class SandboxEndpoint < RestBase
|
9
9
|
def put(request)
|
10
|
-
existing_sandbox =
|
10
|
+
existing_sandbox = JSON.parse(get_data(request), :create_additions => false)
|
11
11
|
existing_sandbox['checksums'].each do |checksum|
|
12
12
|
if !exists_data?(request, request.rest_path[0..1] + ['file_store', 'checksums', checksum])
|
13
13
|
raise RestErrorResponse.new(503, "Checksum not uploaded: #{checksum}")
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'json'
|
2
2
|
require 'chef_zero/rest_base'
|
3
3
|
|
4
4
|
module ChefZero
|
@@ -13,7 +13,7 @@ module ChefZero
|
|
13
13
|
def post(request)
|
14
14
|
sandbox_checksums = []
|
15
15
|
|
16
|
-
needed_checksums =
|
16
|
+
needed_checksums = JSON.parse(request.body, :create_additions => false)['checksums']
|
17
17
|
result_checksums = {}
|
18
18
|
needed_checksums.keys.each do |needed_checksum|
|
19
19
|
if list_data(request, request.rest_path[0..1] + ['file_store', 'checksums']).include?(needed_checksum)
|
@@ -34,10 +34,10 @@ module ChefZero
|
|
34
34
|
time_str = Time.now.utc.strftime('%Y-%m-%dT%H:%M:%S%z')
|
35
35
|
time_str = "#{time_str[0..21]}:#{time_str[22..23]}"
|
36
36
|
|
37
|
-
create_data(request, request.rest_path, id,
|
37
|
+
create_data(request, request.rest_path, id, JSON.pretty_generate({
|
38
38
|
:create_time => time_str,
|
39
39
|
:checksums => sandbox_checksums
|
40
|
-
}
|
40
|
+
}))
|
41
41
|
|
42
42
|
json_response(201, {
|
43
43
|
:uri => build_uri(request.base_uri, request.rest_path + [id]),
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require '
|
1
|
+
require 'json'
|
2
2
|
require 'chef_zero/endpoints/rest_object_endpoint'
|
3
|
-
require 'chef_zero/data_normalizer'
|
3
|
+
require 'chef_zero/chef_data/data_normalizer'
|
4
4
|
require 'chef_zero/rest_error_response'
|
5
5
|
require 'chef_zero/solr/solr_parser'
|
6
6
|
require 'chef_zero/solr/solr_doc'
|
@@ -17,7 +17,7 @@ module ChefZero
|
|
17
17
|
|
18
18
|
def post(request)
|
19
19
|
full_results = search(request)
|
20
|
-
keys =
|
20
|
+
keys = JSON.parse(request.body, :create_additions => false)
|
21
21
|
partial_results = full_results['rows'].map do |name, uri, doc, search_value|
|
22
22
|
data = {}
|
23
23
|
keys.each_pair do |key, path|
|
@@ -48,15 +48,15 @@ module ChefZero
|
|
48
48
|
def search_container(request, index)
|
49
49
|
relative_parts, normalize_proc = case index
|
50
50
|
when 'client'
|
51
|
-
[ ['clients'], Proc.new { |client, name| DataNormalizer.normalize_client(client, name) } ]
|
51
|
+
[ ['clients'], Proc.new { |client, name| ChefData::DataNormalizer.normalize_client(client, name) } ]
|
52
52
|
when 'node'
|
53
|
-
[ ['nodes'], Proc.new { |node, name| DataNormalizer.normalize_node(node, name) } ]
|
53
|
+
[ ['nodes'], Proc.new { |node, name| ChefData::DataNormalizer.normalize_node(node, name) } ]
|
54
54
|
when 'environment'
|
55
|
-
[ ['environments'], Proc.new { |environment, name| DataNormalizer.normalize_environment(environment, name) } ]
|
55
|
+
[ ['environments'], Proc.new { |environment, name| ChefData::DataNormalizer.normalize_environment(environment, name) } ]
|
56
56
|
when 'role'
|
57
|
-
[ ['roles'], Proc.new { |role, name| DataNormalizer.normalize_role(role, name) } ]
|
57
|
+
[ ['roles'], Proc.new { |role, name| ChefData::DataNormalizer.normalize_role(role, name) } ]
|
58
58
|
else
|
59
|
-
[ ['data', index], Proc.new { |data_bag_item, id| DataNormalizer.normalize_data_bag_item(data_bag_item, index, id, 'DELETE') } ]
|
59
|
+
[ ['data', index], Proc.new { |data_bag_item, id| ChefData::DataNormalizer.normalize_data_bag_item(data_bag_item, index, id, 'DELETE') } ]
|
60
60
|
end
|
61
61
|
[
|
62
62
|
request.rest_path[0..1] + relative_parts,
|
@@ -86,7 +86,7 @@ module ChefZero
|
|
86
86
|
result
|
87
87
|
|
88
88
|
elsif !%w(client environment role).include?(index)
|
89
|
-
DataNormalizer.normalize_data_bag_item(value, index, id, 'GET')
|
89
|
+
ChefData::DataNormalizer.normalize_data_bag_item(value, index, id, 'GET')
|
90
90
|
else
|
91
91
|
value
|
92
92
|
end
|
@@ -110,7 +110,7 @@ module ChefZero
|
|
110
110
|
result = []
|
111
111
|
list_data(request, container).each do |name|
|
112
112
|
value = get_data(request, container + [name])
|
113
|
-
expanded = expander.call(
|
113
|
+
expanded = expander.call(JSON.parse(value, :create_additions => false), name)
|
114
114
|
result << [ name, build_uri(request.base_uri, container + [name]), expanded, expand_for_indexing(expanded, index, name) ]
|
115
115
|
end
|
116
116
|
result = result.select do |name, uri, value, search_value|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'chef_zero/rest_base'
|
3
|
+
|
4
|
+
module ChefZero
|
5
|
+
module Endpoints
|
6
|
+
# /system_recovery
|
7
|
+
class SystemRecoveryEndpoint < RestBase
|
8
|
+
def post(request)
|
9
|
+
request_json = JSON.parse(request.body, :create_additions => false)
|
10
|
+
name = request_json['username']
|
11
|
+
password = request_json['password']
|
12
|
+
user = get_data(request, request.rest_path[0..-2] + ['users', name], :nil)
|
13
|
+
if !user
|
14
|
+
raise RestErrorResponse.new(403, "Nonexistent user")
|
15
|
+
end
|
16
|
+
|
17
|
+
user = JSON.parse(user, :create_additions => false)
|
18
|
+
user = ChefData::DataNormalizer.normalize_user(user, name, [ 'username' ], server.options[:osc_compat])
|
19
|
+
if !user['recovery_authentication_enabled']
|
20
|
+
raise RestErrorResponse.new(403, "Only users with recovery_authentication_enabled=true may use /system_recovery to log in")
|
21
|
+
end
|
22
|
+
if user['password'] != password
|
23
|
+
raise RestErrorResponse.new(401, "Incorrect password")
|
24
|
+
end
|
25
|
+
|
26
|
+
json_response(200, user)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'chef_zero/rest_base'
|
3
|
+
|
4
|
+
module ChefZero
|
5
|
+
module Endpoints
|
6
|
+
# /users/USER/association_requests/ID
|
7
|
+
class UserAssociationRequestEndpoint < RestBase
|
8
|
+
def put(request)
|
9
|
+
username = request.rest_path[1]
|
10
|
+
id = request.rest_path[3]
|
11
|
+
if id !~ /^#{username}-(.+)/
|
12
|
+
raise RestErrorResponse.new(400, "Association request #{id} is invalid. Must be #{username}-orgname.")
|
13
|
+
end
|
14
|
+
orgname = $1
|
15
|
+
|
16
|
+
json = JSON.parse(request.body, :create_additions => false)
|
17
|
+
association_request_path = [ 'organizations', orgname, 'association_requests', username ]
|
18
|
+
if json['response'] == 'accept'
|
19
|
+
users = get_data(request, [ 'organizations', orgname, 'groups', 'users' ])
|
20
|
+
users = JSON.parse(users, :create_additions => false)
|
21
|
+
|
22
|
+
delete_data(request, association_request_path)
|
23
|
+
create_data(request, [ 'organizations', orgname, 'users' ], username, '{}')
|
24
|
+
|
25
|
+
# Add the user to the users group if it isn't already there
|
26
|
+
if !users['users'] || !users['users'].include?(username)
|
27
|
+
users['users'] ||= []
|
28
|
+
users['users'] |= [ username ]
|
29
|
+
set_data(request, [ 'organizations', orgname, 'groups', 'users' ], JSON.pretty_generate(users))
|
30
|
+
end
|
31
|
+
elsif json['response'] == 'reject'
|
32
|
+
delete_data(request, association_request_path)
|
33
|
+
else
|
34
|
+
raise RestErrorResponse.new(400, "response parameter was missing or set to the wrong value (must be accept or reject)")
|
35
|
+
end
|
36
|
+
json_response(200, { 'organization' => { 'name' => orgname } })
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'chef_zero/rest_base'
|
3
|
+
|
4
|
+
module ChefZero
|
5
|
+
module Endpoints
|
6
|
+
# /users/NAME/association_requests/count
|
7
|
+
class UserAssociationRequestsCountEndpoint < RestBase
|
8
|
+
def get(request)
|
9
|
+
get_data(request, request.rest_path[0..-3])
|
10
|
+
|
11
|
+
username = request.rest_path[1]
|
12
|
+
result = list_data(request, [ 'organizations' ]).select do |org|
|
13
|
+
exists_data?(request, [ 'organizations', org, 'association_requests', username ])
|
14
|
+
end
|
15
|
+
json_response(200, { "value" => result.size })
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|