Welcome to mirror list, hosted at ThFree Co, Russian Federation.

mail_room.rb « internal « api « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 6e24cf6e7c5228aa6fc3890595a830253bebf877 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 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

      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 = 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