Commit 399fdf8

Michelle DSouza <midsouza@cisco.com>
2019-03-08 20:36:48
Implementing TLS server
1 parent 5b46f15
lib/minbox/cli.rb
@@ -2,6 +2,7 @@ require 'thor'
 require 'mail'
 
 require 'minbox'
+require 'minbox/secure_server'
 
 module Minbox
   module Cli
@@ -17,7 +18,9 @@ module Minbox
           body "#{Time.now} This is a test message."
         end
         require 'net/smtp'
-        Net::SMTP.start(host, port) do |smtp|
+        smtp = Net::SMTP.new(host, port)
+        smtp.enable_starttls
+        smtp.start do |smtp|
           smtp.send_message(mail.to_s, 'me+1@example.org', 'them+1@example.com')
           smtp.send_message(mail.to_s, 'me+2@example.org', 'them+2@example.com')
         end
@@ -32,6 +35,17 @@ module Minbox
         end
       end
 
+      method_option :output, type: :array, default: ['stdout']
+      desc 'secure_server <HOST> <PORT>', 'SMTP secure server'
+      def secure_server(host = 'localhost', port = '25')
+        # publisher = Publisher.from(options[:output])
+        SecureServer.new(port).listen do |socket|
+          puts "HELLLLLLLOOOOO"
+          read_line = socket.gets
+          puts read_line
+        end
+      end
+
       desc 'version', 'Display the current version'
       def version
         say Minbox::VERSION
lib/minbox/client.rb
@@ -35,6 +35,7 @@ module Minbox
     def quit
       write "221 Bye"
       close
+      @server.downgrade
     end
 
     def data(line, &block)
@@ -61,6 +62,7 @@ module Minbox
       _ehlo, _client_domain = line.split(" ")
       write "250-#{host}"
       #write "250 AUTH PLAIN LOGIN"
+      write "250 STARTTLS"
       write "250 OK"
     end
 
@@ -70,7 +72,16 @@ module Minbox
     end
 
     def start_tls
-      write "502 TLS not available"
+      write "220 Ready to start TLS"
+      ssl_context = OpenSSL::SSL::SSLContext.new()
+      ssl_context.cert = OpenSSL::X509::Certificate.new(File.open("server.pem"))
+      ssl_context.key = OpenSSL::PKey::RSA.new(File.open("server.pem"))
+      ssl_context.ssl_version = :SSLv23
+      ssl_socket = OpenSSL::SSL::SSLSocket.new(@socket, ssl_context)
+      # ssl_socket.sync_close = true
+      # ssl_socket.connect
+      @socket = ssl_socket
+      # write "502 TLS not available"
     end
 
     def reset
lib/minbox/secure_server.rb
@@ -0,0 +1,18 @@
+module Minbox
+  class SecureServer
+    
+    def initialize(port)
+      server = TCPServer.new(port)
+      sslContext = OpenSSL::SSL::SSLContext.new
+      sslContext.cert = OpenSSL::X509::Certificate.new(File.open("server.pem"))
+      sslContext.key = OpenSSL::PKey::RSA.new(File.open("server.pem"))
+      @sslServer = OpenSSL::SSL::SSLServer.new(server, sslContext)
+    end
+
+    def listen
+      loop do 
+        yield @sslServer.accept
+      end
+    end
+  end
+end
lib/minbox/server.rb
@@ -10,7 +10,7 @@ module Minbox
 
     def listen!(&block)
       logger.debug("Starting server on port #{port}...")
-      @server = TCPServer.new(port.to_i)
+      @server = @original_server = TCPServer.new(port.to_i)
       logger.debug("Server started!")
 
       loop do
.gitignore
@@ -6,6 +6,7 @@
 /pkg/
 /spec/reports/
 /tmp/
+server.pem
 
 # rspec failure tracking
 .rspec_status
.ruby-version
@@ -0,0 +1,1 @@
+2.6.1