diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 68234f08..86eefc7b 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -1757,6 +1757,10 @@ class MyForm(QtGui.QMainWindow): self.settingsDialogInstance.ui.lineEditPOP3Port.text())) shared.config.set('bitmessagesettings', 'pop3ssl', str( self.settingsDialogInstance.ui.checkBoxEnablePOP3SSL.isChecked())) + shared.config.set('bitmessagesettings', 'stripmessageheadersenable', str( + self.settingsDialogInstance.ui.checkBoxStripMessageHeaders.isChecked())) + shared.config.set('bitmessagesettings', 'stripmessageheaders', str( + self.settingsDialogInstance.ui.lineEditMessageHeadersToStrip.text())) if self.settingsDialogInstance.sslCertFile is None: shared.config.remove_option('bitmessagesettings', 'certfile') else: @@ -2728,6 +2732,15 @@ class settingsDialog(QtGui.QDialog): shared.config.getboolean('bitmessagesettings', 'showtraynotifications')) self.ui.checkBoxStartInTray.setChecked( shared.config.getboolean('bitmessagesettings', 'startintray')) + try: + self.ui.checkBoxStripMessageHeaders.setChecked( + shared.config.getboolean('bitmessagesettings', 'stripmessageheadersenable')) + self.ui.lineEditMessageHeadersToStrip.setText( + shared.config.get('bitmessagesettings', 'stripmessageheaders')) + except: + self.ui.checkBoxStripMessageHeaders.setChecked(True) + self.ui.lineEditMessageHeadersToStrip.setText('Message-ID, User-Agent') + if shared.appdata == '': self.ui.checkBoxPortableMode.setChecked(True) if 'darwin' in sys.platform: @@ -2869,6 +2882,9 @@ class settingsDialog(QtGui.QDialog): "clicked()"), self.click_FindSSLCertificate) QtCore.QObject.connect(self.ui.pushButtonFindSSLKeyfile, QtCore.SIGNAL( "clicked()"), self.click_FindSSLKeyfile) + QtCore.QObject.connect(self.ui.checkBoxStripMessageHeaders, QtCore.SIGNAL( + "clicked()"), self.click_StripMessageHeaders) + self.click_StripMessageHeaders() QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self)) @@ -2879,6 +2895,9 @@ class settingsDialog(QtGui.QDialog): QtGui.QMessageBox.information(self, 'SSL Files', _translate( "Settings", "Because you have enabled SSL on either SMTP or POP3 servers, you must specify valid SSL Certificate and Key files before continuing."), QMessageBox.Ok) + def click_StripMessageHeaders(self): + self.ui.lineEditMessageHeadersToStrip.setEnabled(self.ui.checkBoxStripMessageHeaders.isChecked()) + def configurePushButtonFindSSLCerficiate(self, fn): self.ui.pushButtonFindSSLCertificate.setText('Find SSL Certificate...') try: diff --git a/src/bitmessageqt/settings.py b/src/bitmessageqt/settings.py index f66e3037..fbbe5d91 100644 --- a/src/bitmessageqt/settings.py +++ b/src/bitmessageqt/settings.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'settings.ui' # -# Created: Sat Jul 06 18:24:20 2013 +# Created: Wed Jul 10 16:19:56 2013 # by: PyQt4 UI code generator 4.10.1 # # WARNING! All changes made in this file will be lost! @@ -26,7 +26,7 @@ except AttributeError: class Ui_settingsDialog(object): def setupUi(self, settingsDialog): settingsDialog.setObjectName(_fromUtf8("settingsDialog")) - settingsDialog.resize(623, 343) + settingsDialog.resize(623, 406) self.gridLayout = QtGui.QGridLayout(settingsDialog) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.buttonBox = QtGui.QDialogButtonBox(settingsDialog) @@ -354,6 +354,19 @@ class Ui_settingsDialog(object): self.horizontalLayout_5.addWidget(self.lineEditEmailAddress) self.gridLayout_9.addLayout(self.horizontalLayout_5, 1, 0, 1, 2) self.gridLayout_8.addWidget(self.groupBox_3, 7, 0, 1, 7) + self.groupBox_4 = QtGui.QGroupBox(self.tab_3) + self.groupBox_4.setObjectName(_fromUtf8("groupBox_4")) + self.gridLayout_10 = QtGui.QGridLayout(self.groupBox_4) + self.gridLayout_10.setObjectName(_fromUtf8("gridLayout_10")) + self.checkBoxStripMessageHeaders = QtGui.QCheckBox(self.groupBox_4) + self.checkBoxStripMessageHeaders.setChecked(True) + self.checkBoxStripMessageHeaders.setTristate(False) + self.checkBoxStripMessageHeaders.setObjectName(_fromUtf8("checkBoxStripMessageHeaders")) + self.gridLayout_10.addWidget(self.checkBoxStripMessageHeaders, 0, 0, 1, 1) + self.lineEditMessageHeadersToStrip = QtGui.QLineEdit(self.groupBox_4) + self.lineEditMessageHeadersToStrip.setObjectName(_fromUtf8("lineEditMessageHeadersToStrip")) + self.gridLayout_10.addWidget(self.lineEditMessageHeadersToStrip, 1, 0, 1, 1) + self.gridLayout_8.addWidget(self.groupBox_4, 5, 0, 1, 7) self.tabWidgetSettings.addTab(self.tab_3, _fromUtf8("")) self.gridLayout.addWidget(self.tabWidgetSettings, 0, 0, 1, 1) @@ -426,5 +439,8 @@ class Ui_settingsDialog(object): self.labelAccountStatus.setText(_translate("settingsDialog", "Account Inaccessible via SMTP/POP3. Set a password to allow access.", None)) self.label_18.setText(_translate("settingsDialog", "E-Mail Address for this Identity:", None)) self.lineEditEmailAddress.setText(_translate("settingsDialog", "fsdpffffffffffffffffffffffffffffffffffffffffffffffasdpofiasjdf", None)) + self.groupBox_4.setTitle(_translate("settingsDialog", "Mail Content", None)) + self.checkBoxStripMessageHeaders.setText(_translate("settingsDialog", "Strip these non-anonymizing message meaders from outgoing messages (comma-separated list):", None)) + self.lineEditMessageHeadersToStrip.setText(_translate("settingsDialog", "User-Agent, Message-ID", None)) self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tab_3), _translate("settingsDialog", "SMTP && POP3", None)) diff --git a/src/bitmessageqt/settings.ui b/src/bitmessageqt/settings.ui index 925d40ed..3d99a74c 100644 --- a/src/bitmessageqt/settings.ui +++ b/src/bitmessageqt/settings.ui @@ -7,7 +7,7 @@ 0 0 623 - 343 + 406 @@ -823,6 +823,35 @@ + + + + Mail Content + + + + + + Strip these non-anonymizing message meaders from outgoing messages (comma-separated list): + + + true + + + false + + + + + + + User-Agent, Message-ID + + + + + + diff --git a/src/class_smtpServer.py b/src/class_smtpServer.py index 52c7ba7a..3d3afa67 100644 --- a/src/class_smtpServer.py +++ b/src/class_smtpServer.py @@ -333,6 +333,25 @@ class bitmessageSMTPServer(smtpd.SMTPServer): sock = ssl.wrap_socket(sock, server_side=True, certfile=self.certfile, keyfile=self.keyfile, ssl_version=ssl.PROTOCOL_SSLv23) bitmessageSMTPChannel(self, sock, peer_address) + @staticmethod + def stripMessageHeaders(message): + try: + if not shared.config.getboolean('bitmessagesettings', 'stripmessageheadersenable'): + return + except: + pass + + try: + headersToStrip = shared.config.get('bitmessagesettings', 'stripmessageheaders') + except: + headersToStrip = "Message-ID, User-Agent" + + headersToStrip = [x.strip() for x in headersToStrip.split(',') if len(x.strip()) > 0] + print(headersToStrip) + for h in headersToStrip: + if h in message: + del message[h] + def process_message(self, peer, address, rcpttos, data): #print("Peer", peer) #print("Mail From", address) @@ -344,12 +363,13 @@ class bitmessageSMTPServer(smtpd.SMTPServer): message = parser.Parser().parsestr(data) message['X-Bitmessage-Sending-Version'] = shared.softwareVersion - print(message) + bitmessageSMTPServer.stripMessageHeaders(message) fp = StringIO() gen = generator.Generator(fp, mangle_from_=False, maxheaderlen=128) gen.flatten(message) message_as_text = fp.getvalue() + print(message_as_text) checksum = hashlib.sha256(message_as_text).digest()[:2] checksum = (ord(checksum[0]) << 8) | ord(checksum[1])