2015-12-16 00:07:31 -05:00
|
|
|
# frozen_string_literal: false
|
2010-12-22 16:37:13 -05:00
|
|
|
require 'net/smtp'
|
2015-06-01 22:18:44 -04:00
|
|
|
require 'test/unit'
|
2010-12-22 16:37:13 -05:00
|
|
|
|
|
|
|
module Net
|
2015-06-01 22:18:44 -04:00
|
|
|
class TestSSLSocket < Test::Unit::TestCase
|
2010-12-22 16:37:13 -05:00
|
|
|
class MySMTP < SMTP
|
|
|
|
attr_accessor :fake_tcp, :fake_ssl
|
|
|
|
|
2016-11-05 02:47:36 -04:00
|
|
|
def initialize(*args)
|
|
|
|
super(*args)
|
|
|
|
@open_timeout = nil
|
|
|
|
end
|
|
|
|
|
2010-12-22 16:37:13 -05:00
|
|
|
def tcp_socket address, port
|
|
|
|
fake_tcp
|
|
|
|
end
|
|
|
|
|
|
|
|
def ssl_socket socket, context
|
|
|
|
fake_ssl
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-01-14 22:01:19 -05:00
|
|
|
require 'stringio'
|
2010-12-22 16:37:13 -05:00
|
|
|
class SSLSocket < StringIO
|
|
|
|
attr_accessor :sync_close, :connected, :closed
|
|
|
|
|
|
|
|
def initialize(*args)
|
|
|
|
@connected = false
|
|
|
|
@closed = true
|
|
|
|
super
|
|
|
|
end
|
|
|
|
|
|
|
|
def connect
|
|
|
|
self.connected = true
|
|
|
|
self.closed = false
|
|
|
|
end
|
|
|
|
|
|
|
|
def close
|
|
|
|
self.closed = true
|
|
|
|
end
|
|
|
|
|
|
|
|
def post_connection_check omg
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_ssl_socket_close_on_post_connection_check_fail
|
|
|
|
tcp_socket = StringIO.new success_response
|
|
|
|
|
|
|
|
ssl_socket = SSLSocket.new.extend Module.new {
|
|
|
|
def post_connection_check omg
|
|
|
|
raise OpenSSL::SSL::SSLError, 'hostname was not match with the server certificate'
|
|
|
|
end
|
|
|
|
}
|
|
|
|
|
|
|
|
connection = MySMTP.new('localhost', 25)
|
|
|
|
connection.enable_starttls_auto
|
|
|
|
connection.fake_tcp = tcp_socket
|
|
|
|
connection.fake_ssl = ssl_socket
|
|
|
|
|
2015-06-01 22:18:44 -04:00
|
|
|
assert_raise(OpenSSL::SSL::SSLError) do
|
2010-12-22 16:37:13 -05:00
|
|
|
connection.start
|
|
|
|
end
|
|
|
|
assert_equal true, ssl_socket.closed
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_ssl_socket_open_on_post_connection_check_success
|
|
|
|
tcp_socket = StringIO.new success_response
|
|
|
|
|
|
|
|
ssl_socket = SSLSocket.new success_response
|
|
|
|
|
|
|
|
connection = MySMTP.new('localhost', 25)
|
|
|
|
connection.enable_starttls_auto
|
|
|
|
connection.fake_tcp = tcp_socket
|
|
|
|
connection.fake_ssl = ssl_socket
|
|
|
|
|
|
|
|
connection.start
|
|
|
|
assert_equal false, ssl_socket.closed
|
|
|
|
end
|
|
|
|
|
|
|
|
def success_response
|
|
|
|
[
|
|
|
|
'220 smtp.example.com ESMTP Postfix',
|
|
|
|
"250-ubuntu-desktop",
|
|
|
|
"250-PIPELINING",
|
|
|
|
"250-SIZE 10240000",
|
|
|
|
"250-VRFY",
|
|
|
|
"250-ETRN",
|
|
|
|
"250-STARTTLS",
|
|
|
|
"250-ENHANCEDSTATUSCODES",
|
|
|
|
"250-8BITMIME",
|
|
|
|
"250 DSN",
|
|
|
|
"220 2.0.0 Ready to start TLS",
|
|
|
|
].join("\r\n") + "\r\n"
|
|
|
|
end
|
|
|
|
end
|
2011-01-14 22:01:19 -05:00
|
|
|
end if defined?(OpenSSL)
|