55 lines
1.9 KiB
Ruby
55 lines
1.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module API
|
|
# This internal endpoint receives webhooks sent from the MailRoom component.
|
|
# This component constantly listens to configured email accounts. When it
|
|
# finds any incoming email or service desk email, it makes a POST request to
|
|
# this endpoint. The target mailbox type is indicated in the request path.
|
|
# The email raw content is attached to the request body.
|
|
#
|
|
# For more information, please visit https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/644
|
|
module Internal
|
|
class MailRoom < ::API::Base
|
|
feature_category :service_desk
|
|
|
|
format :json
|
|
content_type :txt, 'text/plain'
|
|
default_format :txt
|
|
|
|
before do
|
|
authenticate_gitlab_mailroom_request!
|
|
end
|
|
|
|
helpers do
|
|
def authenticate_gitlab_mailroom_request!
|
|
unauthorized! unless Gitlab::MailRoom::Authenticator.verify_api_request(headers, params[:mailbox_type])
|
|
end
|
|
end
|
|
|
|
namespace 'internal' do
|
|
namespace 'mail_room' do
|
|
params do
|
|
requires :mailbox_type, type: String,
|
|
desc: 'The destination mailbox type configuration. Must either be incoming_email or service_desk_email'
|
|
end
|
|
post "/*mailbox_type" do
|
|
worker = Gitlab::MailRoom.worker_for(params[:mailbox_type])
|
|
raw = Gitlab::EncodingHelper.encode_utf8(request.body.read)
|
|
begin
|
|
worker.perform_async(raw)
|
|
rescue Gitlab::SidekiqMiddleware::SizeLimiter::ExceedLimitError
|
|
receiver = Gitlab::Email::Receiver.new(raw)
|
|
reason = Gitlab::Email::FailureHandler.handle(receiver, Gitlab::Email::EmailTooLarge.new)
|
|
|
|
status 400
|
|
break { success: false, message: reason }
|
|
end
|
|
|
|
status 200
|
|
{ success: true }
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|