mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-07-29 12:00:32 +00:00
58 lines
1.6 KiB
Ruby
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
|