diff --git a/src/bitmessagemain.py b/src/bitmessagemain.py index dc6615ee..0848fd2d 100644 --- a/src/bitmessagemain.py +++ b/src/bitmessagemain.py @@ -734,11 +734,15 @@ if __name__ == "__main__": singleCleanerThread.daemon = True # close the main program even if there are threads left singleCleanerThread.start() - # Start the SMTP server - smtpServer = bitmessageSMTPServer() - - # And the POP3 server... - pop3Server = bitmessagePOP3Server(debug=True) + # Start the SMTP and POP3 server if necessary + smtpServer = None + pop3Server = None + try: + if shared.config.get('bitmessagesettings', 'smtppop3enable') == 'true': + smtpServer = bitmessageSMTPServer() + pop3Server = bitmessagePOP3Server(debug=True) + except: + pass # And finally launch asyncore asyncoreThread = asyncoreThread() diff --git a/src/class_pop3Server.py b/src/class_pop3Server.py index f1ff54da..d49a7f7f 100644 --- a/src/class_pop3Server.py +++ b/src/class_pop3Server.py @@ -2,6 +2,7 @@ from collections import deque import asyncore import shared import socket +import ssl import sys from addresses import * @@ -227,6 +228,12 @@ class bitmessagePOP3Server(asyncore.dispatcher): self.debug = debug pop3port = shared.config.getint('bitmessagesettings', 'pop3port') + + self.ssl = shared.config.getboolean('bitmessagesettings', 'pop3ssl') + if self.ssl: + self.keyfile = shared.config.get('bitmessagesettings', 'keyfile') + self.certfile = shared.config.get('bitmessagesettings', 'certfile') + self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.bind(('127.0.0.1', pop3port)) self.listen(10) @@ -237,6 +244,8 @@ class bitmessagePOP3Server(asyncore.dispatcher): def handle_accept(self): sock, peer_address = self.accept() + if self.ssl: + sock = ssl.wrap_socket(sock, server_side=True, certfile=self.certfile, keyfile=self.keyfile, ssl_version=ssl.PROTOCOL_SSLv23) _ = bitmessagePOP3Connection(sock, peer_address, debug=self.debug) diff --git a/src/class_smtpServer.py b/src/class_smtpServer.py index 641941c9..7c7e3f17 100644 --- a/src/class_smtpServer.py +++ b/src/class_smtpServer.py @@ -1,6 +1,7 @@ from pyelliptic.openssl import OpenSSL import shared import smtpd +import ssl import time from addresses import * @@ -10,12 +11,26 @@ class bitmessageSMTPServer(smtpd.SMTPServer): def __init__(self): # TODO - move to separate file/class smtpport = shared.config.getint('bitmessagesettings', 'smtpport') - smtpd.SMTPServer.__init__(self, ('127.0.0.1', smtpport), None) + self.ssl = shared.config.getboolean('bitmessagesettings', 'smtpssl') + if self.ssl: + self.keyfile = shared.config.get('bitmessagesettings', 'keyfile') + self.certfile = shared.config.get('bitmessagesettings', 'certfile') + + smtpd.SMTPServer.__init__(self, ('127.0.0.1', smtpport), None) shared.printLock.acquire() print "SMTP server started" shared.printLock.release() + def handle_accept(self): + # Override SMTPServer's handle_accept so that we can start an SSL connection. + if not self.ssl: + return smtpd.SMTPServer.handle_accept(self) + + sock, peer_address = self.accept() + sock = ssl.wrap_socket(sock, server_side=True, certfile=self.certfile, keyfile=self.keyfile, ssl_version=ssl.PROTOCOL_SSLv23) + channel = smtpd.SMTPChannel(self, sock, peer_address) + def process_message(self, peer, mailfrom, rcpttos, data): #print("Peer", peer) #print("Mail From", mailfrom) diff --git a/src/helper_startup.py b/src/helper_startup.py index d58f90fa..43625ffa 100644 --- a/src/helper_startup.py +++ b/src/helper_startup.py @@ -28,8 +28,11 @@ def loadConfig(): shared.config.add_section('bitmessagesettings') shared.config.set('bitmessagesettings', 'settingsversion', '6') shared.config.set('bitmessagesettings', 'port', '8444') + shared.config.set('bitmessagesettings', 'smtppop3enable', 'false') shared.config.set('bitmessagesettings', 'smtpport', '10025') + shared.config.set('bitmessagesettings', 'smtpssl', 'false') shared.config.set('bitmessagesettings', 'pop3port', '10110') + shared.config.set('bitmessagesettings', 'pop3ssl', 'false') shared.config.set( 'bitmessagesettings', 'timeformat', '%%a, %%d %%b %%Y %%I:%%M %%p') shared.config.set('bitmessagesettings', 'blackwhitelist', 'black')