@@ -75,6 +75,20 @@ def test_imaps_post_connection_check
7575 end
7676
7777 if defined? ( OpenSSL ::SSL )
78+ def test_starttls_unknown_ca
79+ imap = nil
80+ ex = nil
81+ starttls_test do |port |
82+ imap = Net ::IMAP . new ( "localhost" , port : port )
83+ begin
84+ imap . starttls
85+ rescue => ex
86+ end
87+ imap
88+ end
89+ assert_kind_of ( OpenSSL ::SSL ::SSLError , ex )
90+ end
91+
7892 def test_starttls
7993 imap = nil
8094 starttls_test do |port |
@@ -99,6 +113,40 @@ def test_starttls_stripping
99113 imap
100114 end
101115 end
116+
117+ def test_starttls_stripping_ok_sent_before_response
118+ # to coordinate between threads (better than sleep)
119+ server_to_client , client_to_server = Queue . new , Queue . new
120+ imap = nil
121+ server = create_tcp_server
122+ port = server . addr [ 1 ]
123+ start_server do
124+ sock = server . accept
125+ begin
126+ sock . print ( "* OK test server\r \n " )
127+ assert_equal :send_malicious_response , client_to_server . pop
128+ sock . print ( "RUBY0001 OK hahaha, fooled you!\r \n " )
129+ server_to_client << :malicious_response_sent
130+ sock . gets
131+ ensure
132+ sock . close
133+ server . close
134+ end
135+ end
136+ begin
137+ imap = Net ::IMAP . new ( "localhost" , :port => port )
138+ client_to_server << :send_malicious_response
139+ assert_equal :malicious_response_sent , server_to_client . pop
140+ sleep 0.010 # to be sure the network buffers have flushed, etc
141+ assert_raise ( Net ::IMAP ::InvalidResponseError ) do
142+ imap . starttls ( :ca_file => CA_FILE )
143+ end
144+ assert imap . disconnected?
145+ ensure
146+ imap . disconnect if imap && !imap . disconnected?
147+ end
148+ assert imap . disconnected?
149+ end
102150 end
103151
104152 def start_server
@@ -1004,6 +1052,7 @@ def starttls_test
10041052 sock . gets
10051053 sock . print ( "* BYE terminating connection\r \n " )
10061054 sock . print ( "RUBY0002 OK LOGOUT completed\r \n " )
1055+ rescue OpenSSL ::SSL ::SSLError
10071056 ensure
10081057 sock . close
10091058 server . close
0 commit comments