diff --git a/app/lib/smtp_server/client.rb b/app/lib/smtp_server/client.rb index e38318e..2a70667 100644 --- a/app/lib/smtp_server/client.rb +++ b/app/lib/smtp_server/client.rb @@ -116,18 +116,19 @@ module SMTPServer private def proxy(data) + # inet-protocol, client-ip, proxy-ip, client-port, proxy-port if m = data.match(/\APROXY (.+) (.+) (.+) (.+) (.+)\z/) @ip_address = m[2] check_ip_address @state = :welcome logger&.debug "\e[35mClient identified as #{@ip_address}\e[0m" increment_command_count("PROXY") - "220 #{Postal::Config.postal.smtp_hostname} ESMTP Postal/#{id}" - else - @finished = true - increment_error_count("proxy-error") - "502 Proxy Error" + return "220 #{Postal::Config.postal.smtp_hostname} ESMTP Postal/#{trace_id}" end + + @finished = true + increment_error_count("proxy-error") + "502 Proxy Error" end def quit diff --git a/lib/postal/config_schema.rb b/lib/postal/config_schema.rb index 99d39a3..528e21f 100644 --- a/lib/postal/config_schema.rb +++ b/lib/postal/config_schema.rb @@ -279,7 +279,7 @@ module Postal end boolean :proxy_protocol do - description "Enable proxy protocol for use behind some load balancers" + description "Enable proxy protocol for use behind some load balancers (supports proxy protocol v1 only)" default false end diff --git a/spec/lib/smtp_server/client/proxy_spec.rb b/spec/lib/smtp_server/client/proxy_spec.rb new file mode 100644 index 0000000..7ec633d --- /dev/null +++ b/spec/lib/smtp_server/client/proxy_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require "rails_helper" + +module SMTPServer + + describe Client do + let(:ip_address) { nil } + subject(:client) { described_class.new(ip_address) } + + describe "PROXY" do + context "when the proxy header is sent correctly" do + it "sets the IP address" do + expect(client.handle("PROXY TCP4 1.1.1.1 2.2.2.2 1111 2222")).to eq "220 #{Postal::Config.postal.smtp_hostname} ESMTP Postal/#{client.trace_id}" + expect(client.ip_address).to eq "1.1.1.1" + end + end + + context "when the proxy header is not valid" do + it "returns an error" do + expect(client.handle("PROXY TCP4")).to eq "502 Proxy Error" + expect(client.finished?).to be true + end + end + end + end + +end