Edgewall Software

Ticket #2970: TLS-support.patch

File TLS-support.patch, 1.9 KB (added by eblot, 3 years ago)

Preliminary TLS support for email notifications

  • trac/notification.py

     
    7070         
    7171        If this option is disabled (the default), recipients are put on BCC 
    7272        (''since 0.10'').""") 
     73         
     74    use_tls = BoolOption('notification', 'use_tls', 'false', 
     75        """Use SSL/TLS to send notifications (''since 0.10'').""") 
    7376 
    7477    maxheaderlen = Option('notification', 'maxheaderlen', '76', 
    75         """Maximum length of SMTP headers. (''since 0.10'').""") 
     78        """Maximum length of SMTP headers (''since 0.10'').""") 
    7679 
    7780 
    7881class Notify(object): 
     
    134137    def __init__(self, env): 
    135138        Notify.__init__(self, env) 
    136139 
     140        self._use_tls = self.env.config.getbool('notification', 'use_tls') 
    137141        self._init_pref_encoding() 
    138142        # Get the email addresses of all known users 
    139143        self.email_map = {} 
     
    251255 
    252256    def begin_send(self): 
    253257        self.server = smtplib.SMTP(self.smtp_server, self.smtp_port) 
     258        # self.server.set_debuglevel(True) 
     259        if self._use_tls: 
     260            self.server.ehlo() 
     261            if not self.server.esmtp_features.has_key('starttls'): 
     262                raise TracError, "TLS enabled but server does not support TLS" 
     263            self.server.starttls() 
     264            self.server.ehlo() 
    254265        if self.user_name: 
    255266            self.server.login(self.user_name, self.password) 
    256267 
     
    328339        self.server.sendmail(msg['From'], recipients, msgtext) 
    329340 
    330341    def finish_send(self): 
    331         self.server.quit() 
     342        if self._use_tls: 
     343            # avoid false failure detection when the server closes 
     344            # the SMTP connection with TLS enabled 
     345            import socket 
     346            try: 
     347                self.server.quit() 
     348            except socket.sslerror: 
     349                pass 
     350        else: 
     351            self.server.quit()