diff options
Diffstat (limited to 'lib/chef_zero/endpoints/actor_key_endpoint.rb')
-rw-r--r-- | lib/chef_zero/endpoints/actor_key_endpoint.rb | 69 |
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 |