summaryrefslogtreecommitdiff
path: root/lib/chef_zero/endpoints/actor_key_endpoint.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chef_zero/endpoints/actor_key_endpoint.rb')
-rw-r--r--lib/chef_zero/endpoints/actor_key_endpoint.rb69
1 files changed, 17 insertions, 52 deletions
diff --git a/lib/chef_zero/endpoints/actor_key_endpoint.rb b/lib/chef_zero/endpoints/actor_key_endpoint.rb
index d45570d..f2b65ed 100644
--- a/lib/chef_zero/endpoints/actor_key_endpoint.rb
+++ b/lib/chef_zero/endpoints/actor_key_endpoint.rb
@@ -1,39 +1,27 @@
-require 'ffi_yajl'
require 'chef_zero/rest_base'
module ChefZero
module Endpoints
+ # ActorKeyEndpoint
+ #
+ # This class handles DELETE/GET/PUT requests for all client/user keys
+ # **except** default public keys, i.e. requests with identity key
+ # "default". Those are handled by ActorDefaultKeyEndpoint. See that class
+ # for more information.
+ #
# /users/USER/keys/NAME
# /organizations/ORG/clients/CLIENT/keys/NAME
class ActorKeyEndpoint < RestBase
- DEFAULT_PUBLIC_KEY_NAME = "default".freeze
-
def get(request)
- # Try to get the actor so a 404 is returned if it doesn't exist
- actor_json = get_actor_json(request)
-
- if request.rest_path[-1] == DEFAULT_PUBLIC_KEY_NAME
- actor_data = FFI_Yajl::Parser.parse(actor_json, create_additions: false)
- default_public_key = default_public_key_from_actor(actor_data)
- return json_response(200, default_public_key)
- end
-
+ validate_actor!(request)
key_path = data_path(request)
already_json_response(200, get_data(request, key_path))
end
def delete(request)
- # Try to get the actor so a 404 is returned if it doesn't exist
- actor_json = get_actor_json(request)
-
- if request.rest_path[-1] == DEFAULT_PUBLIC_KEY_NAME
- actor_data = FFI_Yajl::Parser.parse(actor_json, create_additions: false)
- default_public_key = delete_actor_default_public_key!(request, actor_data)
- return json_response(200, default_public_key)
- end
+ validate_actor!(request) # 404 if actor doesn't exist
key_path = data_path(request)
-
data = get_data(request, key_path)
delete_data(request, key_path)
@@ -41,17 +29,15 @@ module ChefZero
end
def put(request)
- # We grab the old data to trigger a 404 if it doesn't exist
- get_data(request, data_path(request))
-
- set_data(request, path, request.body)
+ validate_actor!(request) # 404 if actor doesn't exist
+ set_data(request, data_path(request), request.body)
end
private
# Returns the keys data store path, which is the same as
- # `request.rest_path` except with "user_keys" instead of "users" or
- # "client_keys" instead of "clients."
+ # `request.rest_path` except with "client_keys" instead of "clients" or
+ # "user_keys" instead of "users."
def data_path(request)
request.rest_path.dup.tap do |path|
if client?(request)
@@ -62,36 +48,15 @@ module ChefZero
end
end
- def default_public_key_from_actor(actor_data)
- { "name" => DEFAULT_PUBLIC_KEY_NAME,
- "public_key" => actor_data["public_key"],
- "expiration_date" => "infinity" }
- end
-
- def delete_actor_default_public_key!(request, actor_data)
- new_actor_data = actor_data.merge("public_key" => nil)
-
- set_data(
- request,
- actor_path(request),
- FFI_Yajl::Encoder.encode(new_actor_data, pretty: true)
- )
-
- default_public_key_from_actor(actor_data)
- end
-
- def get_actor_json(request)
- get_data(request, actor_path(request))
+ # Raises RestErrorResponse (404) if actor doesn't exist
+ def validate_actor!(request)
+ actor_path = request.rest_path[ client?(request) ? 0..3 : 0..1 ]
+ get_data(request, actor_path)
end
def client?(request)
request.rest_path[2] == "clients"
end
-
- def actor_path(request)
- return request.rest_path[0..3] if client?(request)
- request.rest_path[0..1]
- end
end
end
end