2005-01-21 03:15:56 -05:00
|
|
|
require "net/imap"
|
|
|
|
require "test/unit"
|
|
|
|
|
|
|
|
class IMAPTest < Test::Unit::TestCase
|
2007-12-22 10:50:43 -05:00
|
|
|
CA_FILE = File.expand_path("cacert.pem", File.dirname(__FILE__))
|
|
|
|
SERVER_KEY = File.expand_path("server.key", File.dirname(__FILE__))
|
|
|
|
SERVER_CERT = File.expand_path("server.crt", File.dirname(__FILE__))
|
|
|
|
|
2005-01-21 03:15:56 -05:00
|
|
|
def test_encode_utf7
|
2007-12-22 03:00:04 -05:00
|
|
|
utf8 = "\357\274\241\357\274\242\357\274\243".force_encoding("UTF-8")
|
|
|
|
s = Net::IMAP.encode_utf7(utf8)
|
|
|
|
assert_equal("&,yH,Iv8j-".force_encoding("UTF-8"), s)
|
2005-01-21 03:15:56 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_decode_utf7
|
|
|
|
s = Net::IMAP.decode_utf7("&,yH,Iv8j-")
|
2007-12-22 03:00:04 -05:00
|
|
|
utf8 = "\357\274\241\357\274\242\357\274\243".force_encoding("UTF-8")
|
|
|
|
assert_equal(utf8, s)
|
2005-01-21 03:15:56 -05:00
|
|
|
end
|
2007-12-22 10:50:43 -05:00
|
|
|
|
|
|
|
def test_imaps_unknown_ca
|
2007-12-30 15:58:31 -05:00
|
|
|
if defined?(OpenSSL)
|
|
|
|
assert_raise(OpenSSL::SSL::SSLError) do
|
|
|
|
imaps_test do |port|
|
|
|
|
Net::IMAP.new("localhost",
|
|
|
|
:port => port,
|
|
|
|
:ssl => true)
|
|
|
|
end
|
2007-12-22 10:50:43 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_imaps_with_ca_file
|
2007-12-30 15:58:31 -05:00
|
|
|
if defined?(OpenSSL)
|
|
|
|
assert_nothing_raised do
|
|
|
|
imaps_test do |port|
|
|
|
|
Net::IMAP.new("localhost",
|
|
|
|
:port => port,
|
|
|
|
:ssl => { :ca_file => CA_FILE })
|
|
|
|
end
|
2007-12-22 10:50:43 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_imaps_verify_none
|
2007-12-30 15:58:31 -05:00
|
|
|
if defined?(OpenSSL)
|
|
|
|
assert_nothing_raised do
|
|
|
|
imaps_test do |port|
|
|
|
|
Net::IMAP.new("localhost",
|
|
|
|
:port => port,
|
|
|
|
:ssl => { :verify_mode => OpenSSL::SSL::VERIFY_NONE })
|
|
|
|
end
|
2007-12-22 10:50:43 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_imaps_post_connection_check
|
2007-12-30 15:58:31 -05:00
|
|
|
if defined?(OpenSSL)
|
|
|
|
assert_raise(OpenSSL::SSL::SSLError) do
|
|
|
|
imaps_test do |port|
|
|
|
|
Net::IMAP.new("127.0.0.1",
|
|
|
|
:port => port,
|
|
|
|
:ssl => { :ca_file => CA_FILE })
|
|
|
|
end
|
2007-12-22 10:50:43 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_starttls
|
2008-05-05 13:18:09 -04:00
|
|
|
imap = nil
|
2007-12-30 15:58:31 -05:00
|
|
|
if defined?(OpenSSL)
|
|
|
|
starttls_test do |port|
|
|
|
|
imap = Net::IMAP.new("localhost", :port => port)
|
|
|
|
imap.starttls(:ca_file => CA_FILE)
|
|
|
|
imap
|
|
|
|
end
|
2007-12-22 10:50:43 -05:00
|
|
|
end
|
2008-05-05 13:18:09 -04:00
|
|
|
ensure
|
|
|
|
if imap && !imap.disconnected?
|
|
|
|
imap.disconnect
|
|
|
|
end
|
2007-12-22 10:50:43 -05:00
|
|
|
end
|
|
|
|
|
2008-05-21 13:47:33 -04:00
|
|
|
def test_unexpected_eof
|
|
|
|
server = TCPServer.new(0)
|
|
|
|
port = server.addr[1]
|
|
|
|
Thread.start do
|
|
|
|
begin
|
|
|
|
sock = server.accept
|
|
|
|
begin
|
|
|
|
sock.print("* OK test server\r\n")
|
|
|
|
sock.gets
|
|
|
|
# sock.print("* BYE terminating connection\r\n")
|
|
|
|
# sock.print("RUBY0001 OK LOGOUT completed\r\n")
|
|
|
|
ensure
|
|
|
|
sock.close
|
|
|
|
end
|
|
|
|
rescue
|
|
|
|
end
|
|
|
|
end
|
|
|
|
begin
|
|
|
|
begin
|
|
|
|
imap = Net::IMAP.new("localhost", :port => port)
|
|
|
|
assert_raise(EOFError) do
|
|
|
|
imap.logout
|
|
|
|
end
|
|
|
|
ensure
|
|
|
|
imap.disconnect if imap
|
|
|
|
end
|
|
|
|
ensure
|
|
|
|
server.close
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2007-12-22 10:50:43 -05:00
|
|
|
private
|
|
|
|
|
|
|
|
def imaps_test
|
|
|
|
server = TCPServer.new(0)
|
|
|
|
port = server.addr[1]
|
|
|
|
ctx = OpenSSL::SSL::SSLContext.new
|
|
|
|
ctx.ca_file = CA_FILE
|
|
|
|
ctx.key = File.open(SERVER_KEY) { |f|
|
|
|
|
OpenSSL::PKey::RSA.new(f)
|
|
|
|
}
|
|
|
|
ctx.cert = File.open(SERVER_CERT) { |f|
|
|
|
|
OpenSSL::X509::Certificate.new(f)
|
|
|
|
}
|
|
|
|
ssl_server = OpenSSL::SSL::SSLServer.new(server, ctx)
|
|
|
|
Thread.start do
|
|
|
|
begin
|
|
|
|
sock = ssl_server.accept
|
|
|
|
begin
|
|
|
|
sock.print("* OK test server\r\n")
|
|
|
|
sock.gets
|
|
|
|
sock.print("* BYE terminating connection\r\n")
|
|
|
|
sock.print("RUBY0001 OK LOGOUT completed\r\n")
|
|
|
|
ensure
|
|
|
|
sock.close
|
|
|
|
end
|
|
|
|
rescue
|
|
|
|
end
|
|
|
|
end
|
|
|
|
begin
|
2008-05-05 13:18:09 -04:00
|
|
|
begin
|
|
|
|
imap = yield(port)
|
|
|
|
imap.logout
|
|
|
|
ensure
|
|
|
|
imap.disconnect if imap
|
|
|
|
end
|
2007-12-22 10:50:43 -05:00
|
|
|
ensure
|
|
|
|
ssl_server.close
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def starttls_test
|
|
|
|
server = TCPServer.new(0)
|
|
|
|
port = server.addr[1]
|
|
|
|
Thread.start do
|
|
|
|
begin
|
|
|
|
sock = server.accept
|
|
|
|
sock.print("* OK test server\r\n")
|
|
|
|
sock.gets
|
|
|
|
sock.print("RUBY0001 OK completed\r\n")
|
|
|
|
ctx = OpenSSL::SSL::SSLContext.new
|
|
|
|
ctx.ca_file = CA_FILE
|
|
|
|
ctx.key = File.open(SERVER_KEY) { |f|
|
|
|
|
OpenSSL::PKey::RSA.new(f)
|
|
|
|
}
|
|
|
|
ctx.cert = File.open(SERVER_CERT) { |f|
|
|
|
|
OpenSSL::X509::Certificate.new(f)
|
|
|
|
}
|
|
|
|
sock = OpenSSL::SSL::SSLSocket.new(sock, ctx)
|
|
|
|
begin
|
|
|
|
sock.accept
|
|
|
|
sock.gets
|
|
|
|
sock.print("* BYE terminating connection\r\n")
|
|
|
|
sock.print("RUBY0002 OK LOGOUT completed\r\n")
|
|
|
|
ensure
|
|
|
|
sock.close
|
|
|
|
end
|
|
|
|
rescue
|
|
|
|
end
|
|
|
|
end
|
|
|
|
begin
|
2008-05-05 13:18:09 -04:00
|
|
|
begin
|
|
|
|
imap = yield(port)
|
|
|
|
imap.logout
|
|
|
|
ensure
|
|
|
|
imap.disconnect if imap
|
|
|
|
end
|
2007-12-22 10:50:43 -05:00
|
|
|
ensure
|
|
|
|
server.close
|
|
|
|
end
|
|
|
|
end
|
2005-01-21 03:15:56 -05:00
|
|
|
end
|