Commit 7edb25a

mokha <mokha@cisco.com>
2019-03-09 22:12:24
use server ssl context to upgrade tcp socket.
1 parent 056c1e5
Changed files (2)
lib/minbox/client.rb
@@ -1,12 +1,11 @@
 module Minbox
   class Client
-    attr_reader :host, :socket, :logger
+    attr_reader :server, :socket, :logger
 
-    def initialize(host, socket, logger, tls = false)
-      @host = host
+    def initialize(server, socket, logger)
+      @server = server
       @logger = logger
       @socket = socket
-      @tls = tls
     end
 
     def handle(&block)
@@ -63,20 +62,28 @@ module Minbox
 
     def ehlo(line)
       _ehlo, _client_domain = line.split(" ")
-      write "250-#{host}"
+      write "250-#{server.host}"
       #write "250 AUTH PLAIN LOGIN"
       write "250-ENHANCEDSTATUSCODES"
-      write "250 STARTTLS" if @tls
+      write "250 STARTTLS" if server.tls?
       write "250 OK"
     end
 
     def helo(line)
       _ehlo, _client_domain = line.split(" ")
-      write "250 #{host}"
+      write "250 #{server.host}"
     end
 
     def start_tls
       write "220 Ready to start TLS"
+
+      @original_socket = @socket
+      @socket = OpenSSL::SSL::SSLSocket.new(@original_socket, server.ssl_context)
+      @socket.sync_close = true
+      #begin
+      puts @socket.accept.inspect
+      #rescue OpenSSL::SSL::SSLError => e
+      #end
     end
 
     def reset
lib/minbox/server.rb
@@ -9,10 +9,14 @@ module Minbox
       @tls = tls
     end
 
+    def tls?
+      @tls
+    end
+
     def listen!(&block)
       logger.debug("Starting server on port #{port}...")
       @server = TCPServer.new(port.to_i)
-      @server = upgrade(@server) if @tls
+      @server = upgrade(@server) if tls?
       logger.debug("Server started!")
 
       loop do
@@ -24,7 +28,7 @@ module Minbox
 
     def handle(socket, &block)
       logger.debug("client connected: #{socket.inspect}")
-      Client.new(host, socket, logger, @tls).handle(&block)
+      Client.new(self, socket, logger).handle(&block)
     end
 
     def shutdown!
@@ -66,11 +70,14 @@ module Minbox
     end
 
     def ssl_context(key = OpenSSL::PKey::RSA.new(2048))
-      ssl_context = OpenSSL::SSL::SSLContext.new
-      ssl_context.cert = certificate_for(key)
-      ssl_context.key = key
-      ssl_context.ssl_version = :SSLv23
-      ssl_context
+      @ssl_context ||=
+        begin
+          ssl_context = OpenSSL::SSL::SSLContext.new
+          ssl_context.cert = certificate_for(key)
+          ssl_context.key = key
+          ssl_context.ssl_version = :SSLv23
+          ssl_context
+        end
     end
   end
 end