From b3919d01554d31c5486d17332f4a4dde89a23239 Mon Sep 17 00:00:00 2001 From: George Claghorn Date: Thu, 18 Oct 2018 10:23:17 -0400 Subject: Don't require Postfix to send form data --- lib/action_mailbox/test_helper.rb | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/action_mailbox/test_helper.rb b/lib/action_mailbox/test_helper.rb index b1d7af33f9..23b2bb02ca 100644 --- a/lib/action_mailbox/test_helper.rb +++ b/lib/action_mailbox/test_helper.rb @@ -5,18 +5,15 @@ module ActionMailbox # Create an InboundEmail record using an eml fixture in the format of message/rfc822 # referenced with +fixture_name+ located in +test/fixtures/files/fixture_name+. def create_inbound_email_from_fixture(fixture_name, status: :processing) - create_inbound_email file_fixture(fixture_name), filename: fixture_name, status: status + create_inbound_email file_fixture(fixture_name).read, status: status end def create_inbound_email_from_mail(status: :processing, **mail_options) - raw_email = Tempfile.new.tap { |raw_email| raw_email.write Mail.new(mail_options).to_s } - create_inbound_email(raw_email, status: status) + create_inbound_email Mail.new(mail_options).to_s, status: status end - def create_inbound_email(io, filename: 'mail.eml', status: :processing) - ActionMailbox::InboundEmail.create_and_extract_message_id! \ - ActionDispatch::Http::UploadedFile.new(tempfile: io, filename: filename, type: 'message/rfc822'), - status: status + def create_inbound_email(source, status: :processing) + ActionMailbox::InboundEmail.create_and_extract_message_id! source, status: status end def receive_inbound_email_from_fixture(*args) -- cgit v1.2.3 From ebe3d0aaab633de77db494e50f720a8723acbd41 Mon Sep 17 00:00:00 2001 From: George Claghorn Date: Fri, 19 Oct 2018 16:31:53 -0400 Subject: Add a Rake task for piping to the Postfix ingress --- lib/tasks/ingress.rake | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 lib/tasks/ingress.rake (limited to 'lib') diff --git a/lib/tasks/ingress.rake b/lib/tasks/ingress.rake new file mode 100644 index 0000000000..051d7a6c94 --- /dev/null +++ b/lib/tasks/ingress.rake @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +namespace :action_mailbox do + namespace :ingress do + desc "Pipe an inbound email from STDIN to the Postfix ingress at the given URL" + task :postfix do + require "active_support" + require "active_support/core_ext/object/blank" + require "http" + + url, username, password = ENV.values_at("URL", "INGRESS_USERNAME", "INGRESS_PASSWORD") + + if url.blank? || username.blank? || password.blank? + abort "URL, INGRESS_USERNAME, and INGRESS_PASSWORD are required" + end + + begin + response = HTTP.basic_auth(user: username, pass: password) + .timeout(connect: 1, write: 10, read: 10) + .post(url, headers: { "Content-Type" => "message/rfc822", "User-Agent" => "Postfix" }, body: STDIN) + + if response.status.success? + puts "2.0.0 HTTP #{response.status}" + exit 0 + else + puts "4.6.0 HTTP #{response.status}" + exit 1 + end + rescue HTTP::ConnectionError => error + puts "4.4.2 Error connecting to the Postfix ingress: #{error.message}" + exit 1 + rescue HTTP::TimeoutError + puts "4.4.7 Timed out piping to the Postfix ingress" + exit 1 + end + end + end +end -- cgit v1.2.3 From 7755f9b381c007ce98e0858473a9f29f1cd25311 Mon Sep 17 00:00:00 2001 From: George Claghorn Date: Mon, 5 Nov 2018 09:11:01 -0500 Subject: Read ingress passwords/API keys from encrypted credentials Fall back to ENV for people who prefer that approach. --- lib/action_mailbox.rb | 1 + lib/action_mailbox/engine.rb | 1 + 2 files changed, 2 insertions(+) (limited to 'lib') diff --git a/lib/action_mailbox.rb b/lib/action_mailbox.rb index ae37cb84ed..fbc8122d9d 100644 --- a/lib/action_mailbox.rb +++ b/lib/action_mailbox.rb @@ -6,6 +6,7 @@ module ActionMailbox autoload :Base autoload :Router + mattr_accessor :ingress mattr_accessor :logger mattr_accessor :incinerate_after, default: 30.days end diff --git a/lib/action_mailbox/engine.rb b/lib/action_mailbox/engine.rb index b4758aacb5..6a0312c65f 100644 --- a/lib/action_mailbox/engine.rb +++ b/lib/action_mailbox/engine.rb @@ -10,6 +10,7 @@ module ActionMailbox initializer "action_mailbox.config" do config.after_initialize do |app| + ActionMailbox.ingress = app.config.action_mailbox.ingress ActionMailbox.logger = app.config.action_mailbox.logger || Rails.logger ActionMailbox.incinerate_after = app.config.action_mailbox.incinerate_after || 30.days end -- cgit v1.2.3 From b859eebff8545eea972d479137e14b917e6519dc Mon Sep 17 00:00:00 2001 From: George Claghorn Date: Mon, 5 Nov 2018 12:39:37 -0500 Subject: Only load the AWS SDK when the Amazon ingress is configured --- lib/action_mailbox/engine.rb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/action_mailbox/engine.rb b/lib/action_mailbox/engine.rb index 6a0312c65f..cf438d8f24 100644 --- a/lib/action_mailbox/engine.rb +++ b/lib/action_mailbox/engine.rb @@ -10,10 +10,21 @@ module ActionMailbox initializer "action_mailbox.config" do config.after_initialize do |app| - ActionMailbox.ingress = app.config.action_mailbox.ingress ActionMailbox.logger = app.config.action_mailbox.logger || Rails.logger ActionMailbox.incinerate_after = app.config.action_mailbox.incinerate_after || 30.days end end + + initializer "action_mailbox.ingress" do + config.after_initialize do |app| + if ActionMailbox.ingress = app.config.action_mailbox.ingress.presence + config.to_prepare do + if ingress_controller_class = "ActionMailbox::Ingresses::#{ActionMailbox.ingress.to_s.classify}::InboundEmailsController".safe_constantize + ingress_controller_class.prepare + end + end + end + end + end end end -- cgit v1.2.3 From 6608bf60aad4d13df3b22e66326c1adbf9a51f3d Mon Sep 17 00:00:00 2001 From: George Claghorn Date: Mon, 5 Nov 2018 14:04:05 -0500 Subject: The ingress username is constant --- lib/tasks/ingress.rake | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/tasks/ingress.rake b/lib/tasks/ingress.rake index 051d7a6c94..5a944a113d 100644 --- a/lib/tasks/ingress.rake +++ b/lib/tasks/ingress.rake @@ -8,14 +8,16 @@ namespace :action_mailbox do require "active_support/core_ext/object/blank" require "http" - url, username, password = ENV.values_at("URL", "INGRESS_USERNAME", "INGRESS_PASSWORD") + unless url = ENV["URL"].presence + abort "URL is required" + end - if url.blank? || username.blank? || password.blank? - abort "URL, INGRESS_USERNAME, and INGRESS_PASSWORD are required" + unless password = ENV["INGRESS_PASSWORD"].presence + abort "INGRESS_PASSWORD is required" end begin - response = HTTP.basic_auth(user: username, pass: password) + response = HTTP.basic_auth(user: "actionmailbox", pass: password) .timeout(connect: 1, write: 10, read: 10) .post(url, headers: { "Content-Type" => "message/rfc822", "User-Agent" => "Postfix" }, body: STDIN) -- cgit v1.2.3 From ac7fd0e56886eb134554789e014d2736b95d7042 Mon Sep 17 00:00:00 2001 From: George Claghorn Date: Mon, 5 Nov 2018 14:18:03 -0500 Subject: Always emit enhanced SMTP status codes --- lib/tasks/ingress.rake | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'lib') diff --git a/lib/tasks/ingress.rake b/lib/tasks/ingress.rake index 5a944a113d..510951aa2a 100644 --- a/lib/tasks/ingress.rake +++ b/lib/tasks/ingress.rake @@ -9,31 +9,32 @@ namespace :action_mailbox do require "http" unless url = ENV["URL"].presence - abort "URL is required" + abort "5.3.5 URL is required" end unless password = ENV["INGRESS_PASSWORD"].presence - abort "INGRESS_PASSWORD is required" + abort "5.3.5 INGRESS_PASSWORD is required" end begin response = HTTP.basic_auth(user: "actionmailbox", pass: password) .timeout(connect: 1, write: 10, read: 10) - .post(url, headers: { "Content-Type" => "message/rfc822", "User-Agent" => "Postfix" }, body: STDIN) + .post(url, headers: { "Content-Type" => "message/rfc822", "User-Agent" => ENV.fetch("USER_AGENT", "Postfix") }, body: STDIN) - if response.status.success? + case + when response.status.success? puts "2.0.0 HTTP #{response.status}" - exit 0 + when response.status.unauthorized? + abort "4.7.0 HTTP #{response.status}" + when response.status.unsupported_media_type? + abort "5.6.1 HTTP #{response.status}" else - puts "4.6.0 HTTP #{response.status}" - exit 1 + abort "4.0.0 HTTP #{response.status}" end rescue HTTP::ConnectionError => error - puts "4.4.2 Error connecting to the Postfix ingress: #{error.message}" - exit 1 + abort "4.4.2 Error connecting to the Postfix ingress: #{error.message}" rescue HTTP::TimeoutError - puts "4.4.7 Timed out piping to the Postfix ingress" - exit 1 + abort "4.4.7 Timed out piping to the Postfix ingress" end end end -- cgit v1.2.3