[前][次][番号順一覧][スレッド一覧]

ruby-changes:47417

From: usa <ko1@a...>
Date: Wed, 9 Aug 2017 17:11:03 +0900 (JST)
Subject: [ruby-changes:47417] usa:r59533 (ruby_2_3): merge revision(s) 56576, 56623: [Backport #12678] [Backport #13429]

usa	2017-08-09 17:10:56 +0900 (Wed, 09 Aug 2017)

  New Revision: 59533

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=59533

  Log:
    merge revision(s) 56576,56623: [Backport #12678] [Backport #13429]
    
    * lib/net/smtp.rb (tlsconnect): support timeout for TLS handshake.
      [ruby-core:76893] [Bug #12678]
    
    * lib/net/protocol.rb (ssl_socket_connect): new method to implement
      timeout for TLS handshake.
    
    * lib/net/http.rb (connect): use Net::Protocol#ssl_socket_connect.
    
    * test/net/smtp/test_smtp.rb (test_tls_connect, test_tls_connect):
      use Socket.tcp_server_sockets in case localhost is resolved to ::1.

  Modified directories:
    branches/ruby_2_3/
  Modified files:
    branches/ruby_2_3/ChangeLog
    branches/ruby_2_3/lib/net/http.rb
    branches/ruby_2_3/lib/net/protocol.rb
    branches/ruby_2_3/lib/net/smtp.rb
    branches/ruby_2_3/test/net/smtp/test_smtp.rb
    branches/ruby_2_3/test/net/smtp/test_ssl_socket.rb
    branches/ruby_2_3/version.h
Index: ruby_2_3/lib/net/http.rb
===================================================================
--- ruby_2_3/lib/net/http.rb	(revision 59532)
+++ ruby_2_3/lib/net/http.rb	(revision 59533)
@@ -925,21 +925,7 @@ module Net   #:nodoc: https://github.com/ruby/ruby/blob/trunk/ruby_2_3/lib/net/http.rb#L925
              Process.clock_gettime(Process::CLOCK_REALTIME) < @ssl_session.time.to_f + @ssl_session.timeout
             s.session = @ssl_session if @ssl_session
           end
-          if timeout = @open_timeout
-            while true
-              raise Net::OpenTimeout if timeout <= 0
-              start = Process.clock_gettime Process::CLOCK_MONOTONIC
-              # to_io is required because SSLSocket doesn't have wait_readable yet
-              case s.connect_nonblock(exception: false)
-              when :wait_readable; s.to_io.wait_readable(timeout)
-              when :wait_writable; s.to_io.wait_writable(timeout)
-              else; break
-              end
-              timeout -= Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
-            end
-          else
-            s.connect
-          end
+          ssl_socket_connect(s, @open_timeout)
           if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE
             s.post_connection_check(@address)
           end
Index: ruby_2_3/lib/net/protocol.rb
===================================================================
--- ruby_2_3/lib/net/protocol.rb	(revision 59532)
+++ ruby_2_3/lib/net/protocol.rb	(revision 59533)
@@ -34,6 +34,24 @@ module Net # :nodoc: https://github.com/ruby/ruby/blob/trunk/ruby_2_3/lib/net/protocol.rb#L34
         end
       End
     end
+
+    def ssl_socket_connect(s, timeout)
+      if timeout
+        while true
+          raise Net::OpenTimeout if timeout <= 0
+          start = Process.clock_gettime Process::CLOCK_MONOTONIC
+          # to_io is required because SSLSocket doesn't have wait_readable yet
+          case s.connect_nonblock(exception: false)
+          when :wait_readable; s.to_io.wait_readable(timeout)
+          when :wait_writable; s.to_io.wait_writable(timeout)
+          else; break
+          end
+          timeout -= Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
+        end
+      else
+        s.connect
+      end
+    end
   end
 
 
Index: ruby_2_3/lib/net/smtp.rb
===================================================================
--- ruby_2_3/lib/net/smtp.rb	(revision 59532)
+++ ruby_2_3/lib/net/smtp.rb	(revision 59533)
@@ -170,7 +170,7 @@ module Net https://github.com/ruby/ruby/blob/trunk/ruby_2_3/lib/net/smtp.rb#L170
   #     Net::SMTP.start('your.smtp.server', 25, 'mail.from.domain',
   #                     'Your Account', 'Your Password', :cram_md5)
   #
-  class SMTP
+  class SMTP < Protocol
 
     Revision = %q$Revision$.split[1]
 
@@ -584,7 +584,7 @@ module Net https://github.com/ruby/ruby/blob/trunk/ruby_2_3/lib/net/smtp.rb#L584
       s = ssl_socket(s, @ssl_context)
       logging "TLS connection started"
       s.sync_close = true
-      s.connect
+      ssl_socket_connect(s, @open_timeout)
       if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE
         s.post_connection_check(@address)
       end
Index: ruby_2_3/version.h
===================================================================
--- ruby_2_3/version.h	(revision 59532)
+++ ruby_2_3/version.h	(revision 59533)
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/version.h#L1
 #define RUBY_VERSION "2.3.5"
 #define RUBY_RELEASE_DATE "2017-08-09"
-#define RUBY_PATCHLEVEL 345
+#define RUBY_PATCHLEVEL 346
 
 #define RUBY_RELEASE_YEAR 2017
 #define RUBY_RELEASE_MONTH 8
Index: ruby_2_3/test/net/smtp/test_smtp.rb
===================================================================
--- ruby_2_3/test/net/smtp/test_smtp.rb	(revision 59532)
+++ ruby_2_3/test/net/smtp/test_smtp.rb	(revision 59533)
@@ -5,6 +5,10 @@ require 'test/unit' https://github.com/ruby/ruby/blob/trunk/ruby_2_3/test/net/smtp/test_smtp.rb#L5
 
 module Net
   class TestSMTP < Test::Unit::TestCase
+    CA_FILE = File.expand_path("../imap/cacert.pem", __dir__)
+    SERVER_KEY = File.expand_path("../imap/server.key", __dir__)
+    SERVER_CERT = File.expand_path("../imap/server.crt", __dir__)
+
     class FakeSocket
       attr_reader :write_io
 
@@ -98,5 +102,72 @@ module Net https://github.com/ruby/ruby/blob/trunk/ruby_2_3/test/net/smtp/test_smtp.rb#L102
         smtp.rcptto("foo\r\nbar")
       end
     end
+
+    def test_tls_connect
+      servers = Socket.tcp_server_sockets("localhost", 0)
+      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)
+      }
+      begin
+        sock = nil
+        Thread.start do
+          s = accept(servers)
+          sock = OpenSSL::SSL::SSLSocket.new(s, ctx)
+          sock.sync_close = true
+          sock.accept
+          sock.write("220 localhost Service ready\r\n")
+          sock.gets
+          sock.write("250 localhost\r\n")
+          sock.gets
+          sock.write("221 localhost Service closing transmission channel\r\n")
+        end
+        smtp = Net::SMTP.new("localhost", servers[0].local_address.ip_port)
+        smtp.enable_tls
+        smtp.open_timeout = 0.1
+        smtp.start do
+        end
+      ensure
+        sock.close if sock
+        servers.each(&:close)
+      end
+    end
+
+    def test_tls_connect_timeout
+      servers = Socket.tcp_server_sockets("localhost", 0)
+      begin
+        sock = nil
+        Thread.start do
+          sock = accept(servers)
+        end
+        smtp = Net::SMTP.new("localhost", servers[0].local_address.ip_port)
+        smtp.enable_tls
+        smtp.open_timeout = 0.1
+        assert_raise(Net::OpenTimeout) do
+          smtp.start do
+          end
+        end
+      ensure
+        sock.close if sock
+        servers.each(&:close)
+      end
+    end
+
+    private
+
+    def accept(servers)
+      loop do
+        readable, = IO.select(servers.map(&:to_io))
+        readable.each do |r|
+          sock, addr = r.accept_nonblock(exception: false)
+          next if sock == :wait_readable
+          return sock
+        end
+      end
+    end
   end
 end
Index: ruby_2_3/test/net/smtp/test_ssl_socket.rb
===================================================================
--- ruby_2_3/test/net/smtp/test_ssl_socket.rb	(revision 59532)
+++ ruby_2_3/test/net/smtp/test_ssl_socket.rb	(revision 59533)
@@ -7,6 +7,11 @@ module Net https://github.com/ruby/ruby/blob/trunk/ruby_2_3/test/net/smtp/test_ssl_socket.rb#L7
     class MySMTP < SMTP
       attr_accessor :fake_tcp, :fake_ssl
 
+      def initialize(*args)
+        super(*args)
+        @open_timeout = nil
+      end
+
       def tcp_socket address, port
         fake_tcp
       end
Index: ruby_2_3/ChangeLog
===================================================================
--- ruby_2_3/ChangeLog	(revision 59532)
+++ ruby_2_3/ChangeLog	(revision 59533)
@@ -1,3 +1,18 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/ChangeLog#L1
+Wed Aug  9 17:10:27 2017  Shugo Maeda  <shugo@r...>
+
+	* test/net/smtp/test_smtp.rb (test_tls_connect, test_tls_connect):
+	  use Socket.tcp_server_sockets in case localhost is resolved to ::1.
+
+Wed Aug  9 17:10:27 2017  Shugo Maeda  <shugo@r...>
+
+	* lib/net/smtp.rb (tlsconnect): support timeout for TLS handshake.
+	  [ruby-core:76893] [Bug #12678]
+
+	* lib/net/protocol.rb (ssl_socket_connect): new method to implement
+	  timeout for TLS handshake.
+
+	* lib/net/http.rb (connect): use Net::Protocol#ssl_socket_connect.
+
 Fri Jul  7 10:58:10 2017  Eric Wong  <e@8...>
 
 	This backport of r58812 is necessary to ease backporting r59028,
Index: ruby_2_3
===================================================================
--- ruby_2_3	(revision 59532)
+++ ruby_2_3	(revision 59533)

Property changes on: ruby_2_3
___________________________________________________________________
Modified: svn:mergeinfo
## -0,0 +0,1 ##
   Merged /trunk:r56576

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]