Files
gitlab-foss/lib/api/web_commits.rb
2024-09-03 15:10:58 +00:00

58 lines
1.6 KiB
Ruby

# frozen_string_literal: true
module API
class WebCommits < ::API::Base
GITALY_PUBLIC_KEY_CACHE_KEY = 'gitaly_public_key'
GITALY_UNAVAILABLE = 'The git server, Gitaly, is not available at this time. Please contact your administrator.'
PUBLIC_KEY_NOT_FOUND = 'Public key not found.'
feature_category :source_code_management
before { authenticate_non_get! }
helpers do
def gitaly_server
@gitaly_server ||= Gitaly::Server.new(::Gitlab::GitalyClient.random_storage)
end
def server_signature_public_key
gitaly_server.server_signature_public_key
end
def server_signature_error?
gitaly_server.server_signature_error?
end
def handle_gitaly_unavailable
render_api_error!(GITALY_UNAVAILABLE, :service_unavailable)
end
def handle_public_key_not_found
render_api_error!(PUBLIC_KEY_NOT_FOUND, :not_found)
end
def cache_public_key
Rails.cache.fetch(GITALY_PUBLIC_KEY_CACHE_KEY, expires_in: 1.hour.to_i, skip_nil: true) do
{ public_key: server_signature_public_key }
end
end
end
desc 'Get the public key for web commits' do
detail 'This feature was introduced in GitLab 17.4.'
success code: 200
failure [
{ code: 503, message: GITALY_UNAVAILABLE },
{ code: 404, message: PUBLIC_KEY_NOT_FOUND }
]
end
get 'web_commits/public_key' do
handle_gitaly_unavailable if server_signature_error?
handle_public_key_not_found if server_signature_public_key.empty?
cache_public_key
end
end
end