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: 1e5e8c4c4e2e6d27f0423bb130acad1b30d6b444 (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
52
53
54
55
# 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