@@ -158,6 +158,43 @@ def test_starttls_stripping
158158 assert_equal ( CA_FILE , imap . ssl_ctx . ca_file )
159159 assert_equal ( OpenSSL ::SSL ::VERIFY_PEER , imap . ssl_ctx . verify_mode )
160160 end
161+
162+ def test_starttls_stripping_ok_sent_before_response
163+ # to coordinate between threads (better than sleep)
164+ server_to_client , client_to_server = Queue . new , Queue . new
165+ imap = nil
166+ server = create_tcp_server
167+ port = server . addr [ 1 ]
168+ start_server do
169+ sock = server . accept
170+ begin
171+ sock . print ( "* OK test server\r \n " )
172+ assert_equal :send_malicious_response , client_to_server . pop
173+ sock . print ( "RUBY0001 OK hahaha, fooled you!\r \n " )
174+ server_to_client << :malicious_response_sent
175+ sock . gets
176+ ensure
177+ sock . close
178+ server . close
179+ end
180+ end
181+ begin
182+ imap = Net ::IMAP . new ( "localhost" , :port => port )
183+ client_to_server << :send_malicious_response
184+ assert_equal :malicious_response_sent , server_to_client . pop
185+ sleep 0.010 # to be sure the network buffers have flushed, etc
186+ assert_raise ( Net ::IMAP ::InvalidResponseError ) do
187+ imap . starttls ( :ca_file => CA_FILE )
188+ end
189+ assert imap . disconnected?
190+ ensure
191+ imap . disconnect if imap && !imap . disconnected?
192+ end
193+ assert_equal false , imap . tls_verified?
194+ assert_equal ( { ca_file : CA_FILE } , imap . ssl_ctx_params )
195+ assert_equal ( CA_FILE , imap . ssl_ctx . ca_file )
196+ assert_equal ( OpenSSL ::SSL ::VERIFY_PEER , imap . ssl_ctx . verify_mode )
197+ end
161198 end
162199
163200 def start_server
0 commit comments