mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-07-25 16:03:48 +00:00
95 lines
2.7 KiB
Ruby
95 lines
2.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module API
|
|
module Admin
|
|
class Token < ::API::Base
|
|
feature_category :system_access
|
|
AUDIT_SOURCE = :api_admin_token
|
|
|
|
helpers Gitlab::InternalEventsTracking
|
|
|
|
helpers do
|
|
def identify_token(plaintext)
|
|
token = ::Authn::AgnosticTokenIdentifier.token_for(plaintext, AUDIT_SOURCE)
|
|
raise ArgumentError, 'Token type not supported.' if token.blank?
|
|
|
|
token
|
|
end
|
|
|
|
def track_admin_api_usage_event
|
|
track_internal_event(
|
|
'use_admin_token_api',
|
|
user: current_user,
|
|
namespace: current_user.namespace
|
|
)
|
|
end
|
|
end
|
|
|
|
before do
|
|
authenticated_as_admin!
|
|
end
|
|
|
|
rescue_from ArgumentError do |e|
|
|
render_api_error!(e.message, :unprocessable_entity)
|
|
end
|
|
|
|
params do
|
|
requires :token, type: String, desc: 'The token that information is requested about.'
|
|
end
|
|
namespace 'admin/token' do
|
|
desc 'Get information about a token.' do
|
|
detail 'This feature was introduced in GitLab 17.5.'
|
|
failure [
|
|
{ code: 401, message: 'Unauthorized' },
|
|
{ code: 403, message: 'Forbidden' },
|
|
{ code: 404, message: 'Not Found' },
|
|
{ code: 422, message: 'Unprocessable' }
|
|
]
|
|
tags %w[admin]
|
|
hidden true
|
|
end
|
|
post do
|
|
identified_token = identify_token(params[:token])
|
|
render_api_error!({ error: 'Not found' }, :not_found) if identified_token.revocable.nil?
|
|
|
|
track_admin_api_usage_event
|
|
|
|
status :ok
|
|
|
|
present identified_token.revocable, with: identified_token.present_with, current_user: current_user
|
|
end
|
|
|
|
desc 'Revoke a token.' do
|
|
detail 'This feature was introduced in GitLab 17.7.'
|
|
failure [
|
|
{ code: 401, message: 'Unauthorized' },
|
|
{ code: 403, message: 'Forbidden' },
|
|
{ code: 404, message: 'Not Found' },
|
|
{ code: 422, message: 'Unprocessable' }
|
|
]
|
|
tags %w[admin]
|
|
hidden true
|
|
end
|
|
delete do
|
|
if Feature.disabled?(:api_admin_token_revoke, current_user)
|
|
render_api_error!("'api_admin_token_revoke' feature flag is disabled", :not_found)
|
|
end
|
|
|
|
identified_token = identify_token(params[:token])
|
|
|
|
render_api_error!({ error: 'Not found' }, :not_found) if identified_token.revocable.nil?
|
|
|
|
response = identified_token.revoke!(current_user)
|
|
|
|
if response.success?
|
|
track_admin_api_usage_event
|
|
no_content!
|
|
else
|
|
render_api_error!({ error: response.message }, :bad_request)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|