From 64982ae306d43dd39ae9d84eb082c420d96f9c37 Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Wed, 22 Jul 2020 06:30:33 +0200 Subject: [PATCH] smtp: Fix STARTTLS, request HELO once TLS is established (#15032) --- lib/pure/smtp.nim | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/pure/smtp.nim b/lib/pure/smtp.nim index 7d426041d251d..b4266402978e5 100644 --- a/lib/pure/smtp.nim +++ b/lib/pure/smtp.nim @@ -60,6 +60,7 @@ type SmtpBase[SocketType] = ref object sock: SocketType + address: string debug: bool Smtp* = SmtpBase[Socket] @@ -225,15 +226,19 @@ proc checkReply*(smtp: Smtp | AsyncSmtp, reply: string) {.multisync.} = if not line.startswith(reply): await quitExcpt(smtp, "Expected " & reply & " reply, got: " & line) +proc helo*(smtp: Smtp | AsyncSmtp) {.multisync.} = + # Sends the HELO request + await smtp.debugSend("HELO " & smtp.address & "\c\L") + await smtp.checkReply("250") + proc connect*(smtp: Smtp | AsyncSmtp, address: string, port: Port) {.multisync.} = ## Establishes a connection with a SMTP server. ## May fail with ReplyError or with a socket error. + smtp.address = address await smtp.sock.connect(address, port) - await smtp.checkReply("220") - await smtp.debugSend("HELO " & address & "\c\L") - await smtp.checkReply("250") + await smtp.helo() proc startTls*(smtp: Smtp | AsyncSmtp, sslContext: SSLContext = nil) {.multisync.} = ## Put the SMTP connection in TLS (Transport Layer Security) mode. @@ -245,6 +250,7 @@ proc startTls*(smtp: Smtp | AsyncSmtp, sslContext: SSLContext = nil) {.multisync getSSLContext().wrapConnectedSocket(smtp.sock, handshakeAsClient) else: sslContext.wrapConnectedSocket(smtp.sock, handshakeAsClient) + await smtp.helo() else: {.error: "SMTP module compiled without SSL support".}