tag 926900 patch
thanks

The attached patch fixes the issue for me

Le 26/01/24 à 10:38, Laurent Bigonville a écrit :
When looking at the documentation of smtplib (the python library used here), it says:
An SMTP_SSL instance behaves exactly the same as instances of SMTP.
SMTP_SSL*should be used for situations where SSL is required from the beginning of the connection and using starttls() is not appropriate*.
If host is not specified, the local host is used. If port is zero, the standard 
SMTP-over-SSL port (465) is used.

So that means that SMTP_SSL is used for connections where SSL is present from the start and not when STARTTLS is used to upgrade the connection to a secure one.

The documentation of reportbug says: smtptls:  Enables TLS encryption for the SMTP connection, using STARTTLS. This setting is ignored if you connect to port 465, in which case SSL/TLS will always be used.

So either the documentation is wrong, of the code is.

The following python code works:

>>> smtp = smtplib.SMTP('mail-submit.debian.org',587)
>>> smtp.ehlo()
(250, b'stravinsky.debian.org Hello eriador.bigon.be 
[2a02:a03f:65c5:3301:a912:aba9:d92d:4965]\nSIZE 
104857600\n8BITMIME\nCHUNKING\nSTARTTLS\nSMTPUTF8\nHELP')
>>> smtp.starttls()
(220, b'TLS go ahead')
>>> smtp.quit()
(221, b'stravinsky.debian.org closing connection')
>>>
While this is not:

>>> smtplib.SMTP_SSL('mail-submit.debian.org',587)
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "/usr/lib/python3.11/smtplib.py", line 1050, in __init__
     SMTP.__init__(self, host, port, local_hostname, timeout,
   File "/usr/lib/python3.11/smtplib.py", line 255, in __init__
     (code, msg) = self.connect(host, port)
                   ^^^^^^^^^^^^^^^^^^^^^^^^
   File "/usr/lib/python3.11/smtplib.py", line 341, in connect
     self.sock = self._get_socket(host, port, self.timeout)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/usr/lib/python3.11/smtplib.py", line 1057, in _get_socket
     new_socket = self.context.wrap_socket(new_socket,
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/usr/lib/python3.11/ssl.py", line 517, in wrap_socket
     return self.sslsocket_class._create(
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/usr/lib/python3.11/ssl.py", line 1108, in _create
     self.do_handshake()
   File "/usr/lib/python3.11/ssl.py", line 1383, in do_handshake
     self._sslobj.do_handshake()
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1006)
>>>
From 19b99e6c66c5febbcf590846cf29f824bc1c1440 Mon Sep 17 00:00:00 2001
From: Laurent Bigonville <bi...@debian.org>
Date: Fri, 26 Jan 2024 13:56:09 +0100
Subject: [PATCH] Fix issue when sending mails using SSL/STARTTLS

The hostname passed to smtplib should not contain the port, this
hostname is used to verify the SSL certificate.

Closes: #926900
---
 reportbug/submit.py | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/reportbug/submit.py b/reportbug/submit.py
index 0daaad4..94a30bf 100644
--- a/reportbug/submit.py
+++ b/reportbug/submit.py
@@ -446,6 +446,11 @@ def send_report(body, attachments, mua, fromaddr, sendto, ccaddr, bccaddr,
         tryagain = True
         refused = None
         retry = 0
+        _smtphost = smtphost.split(':')[0]
+        try:
+            smtpport = smtphost.split(':')[1]
+        except IndexError:
+            smtpport = 25
         while tryagain:
             tryagain = False
             ewrite("Connecting to %s via SMTP...\n", smtphost)
@@ -453,14 +458,14 @@ def send_report(body, attachments, mua, fromaddr, sendto, ccaddr, bccaddr,
                 conn = None
                 # if we're using reportbug.debian.org, send mail to
                 # submit
-                if smtphost.lower() == 'reportbug.debian.org':
-                    conn = smtplib.SMTP(smtphost, 587)
-                elif smtphost.endswith(':465'):
+                if _smtphost.lower() == 'reportbug.debian.org':
+                    conn = smtplib.SMTP(_smtphost, 587)
+                elif smtpport == 465:
                     # ignore smtptls setting since port 465 implies SSL
                     smtptls = None
-                    conn = smtplib.SMTP_SSL(smtphost)
+                    conn = smtplib.SMTP_SSL(_smtphost, 465)
                 else:
-                    conn = smtplib.SMTP(smtphost)
+                    conn = smtplib.SMTP(_smtphost, smtpport)
                 response = conn.ehlo()
                 if not (200 <= response[0] <= 299):
                     conn.helo()
-- 
2.43.0

Reply via email to