fix(smtp-server): fixes proxy protocol

This commit is contained in:
Adam Cooke
2024-03-13 18:16:08 +00:00
parent 144af20b9c
commit 92406129cf
3 changed files with 35 additions and 6 deletions
+4 -3
View File
@@ -116,19 +116,20 @@ module SMTPServer
private private
def proxy(data) def proxy(data)
# inet-protocol, client-ip, proxy-ip, client-port, proxy-port
if m = data.match(/\APROXY (.+) (.+) (.+) (.+) (.+)\z/) if m = data.match(/\APROXY (.+) (.+) (.+) (.+) (.+)\z/)
@ip_address = m[2] @ip_address = m[2]
check_ip_address check_ip_address
@state = :welcome @state = :welcome
logger&.debug "\e[35mClient identified as #{@ip_address}\e[0m" logger&.debug "\e[35mClient identified as #{@ip_address}\e[0m"
increment_command_count("PROXY") increment_command_count("PROXY")
"220 #{Postal::Config.postal.smtp_hostname} ESMTP Postal/#{id}" return "220 #{Postal::Config.postal.smtp_hostname} ESMTP Postal/#{trace_id}"
else end
@finished = true @finished = true
increment_error_count("proxy-error") increment_error_count("proxy-error")
"502 Proxy Error" "502 Proxy Error"
end end
end
def quit def quit
@finished = true @finished = true
+1 -1
View File
@@ -279,7 +279,7 @@ module Postal
end end
boolean :proxy_protocol do 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 default false
end end
+28
View File
@@ -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