Strip message headers that could possibly lead to loss of anonymity

This commit is contained in:
Chuck 2013-07-10 17:00:26 +07:00
parent cb7618f1b6
commit 6eea004723
4 changed files with 88 additions and 4 deletions

View File

@ -1757,6 +1757,10 @@ class MyForm(QtGui.QMainWindow):
self.settingsDialogInstance.ui.lineEditPOP3Port.text())) self.settingsDialogInstance.ui.lineEditPOP3Port.text()))
shared.config.set('bitmessagesettings', 'pop3ssl', str( shared.config.set('bitmessagesettings', 'pop3ssl', str(
self.settingsDialogInstance.ui.checkBoxEnablePOP3SSL.isChecked())) 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: if self.settingsDialogInstance.sslCertFile is None:
shared.config.remove_option('bitmessagesettings', 'certfile') shared.config.remove_option('bitmessagesettings', 'certfile')
else: else:
@ -2728,6 +2732,15 @@ class settingsDialog(QtGui.QDialog):
shared.config.getboolean('bitmessagesettings', 'showtraynotifications')) shared.config.getboolean('bitmessagesettings', 'showtraynotifications'))
self.ui.checkBoxStartInTray.setChecked( self.ui.checkBoxStartInTray.setChecked(
shared.config.getboolean('bitmessagesettings', 'startintray')) 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 == '': if shared.appdata == '':
self.ui.checkBoxPortableMode.setChecked(True) self.ui.checkBoxPortableMode.setChecked(True)
if 'darwin' in sys.platform: if 'darwin' in sys.platform:
@ -2869,6 +2882,9 @@ class settingsDialog(QtGui.QDialog):
"clicked()"), self.click_FindSSLCertificate) "clicked()"), self.click_FindSSLCertificate)
QtCore.QObject.connect(self.ui.pushButtonFindSSLKeyfile, QtCore.SIGNAL( QtCore.QObject.connect(self.ui.pushButtonFindSSLKeyfile, QtCore.SIGNAL(
"clicked()"), self.click_FindSSLKeyfile) "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)) QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self))
@ -2879,6 +2895,9 @@ class settingsDialog(QtGui.QDialog):
QtGui.QMessageBox.information(self, 'SSL Files', _translate( 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) "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): def configurePushButtonFindSSLCerficiate(self, fn):
self.ui.pushButtonFindSSLCertificate.setText('Find SSL Certificate...') self.ui.pushButtonFindSSLCertificate.setText('Find SSL Certificate...')
try: try:

View File

@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'settings.ui' # 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 # by: PyQt4 UI code generator 4.10.1
# #
# WARNING! All changes made in this file will be lost! # WARNING! All changes made in this file will be lost!
@ -26,7 +26,7 @@ except AttributeError:
class Ui_settingsDialog(object): class Ui_settingsDialog(object):
def setupUi(self, settingsDialog): def setupUi(self, settingsDialog):
settingsDialog.setObjectName(_fromUtf8("settingsDialog")) settingsDialog.setObjectName(_fromUtf8("settingsDialog"))
settingsDialog.resize(623, 343) settingsDialog.resize(623, 406)
self.gridLayout = QtGui.QGridLayout(settingsDialog) self.gridLayout = QtGui.QGridLayout(settingsDialog)
self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.buttonBox = QtGui.QDialogButtonBox(settingsDialog) self.buttonBox = QtGui.QDialogButtonBox(settingsDialog)
@ -354,6 +354,19 @@ class Ui_settingsDialog(object):
self.horizontalLayout_5.addWidget(self.lineEditEmailAddress) self.horizontalLayout_5.addWidget(self.lineEditEmailAddress)
self.gridLayout_9.addLayout(self.horizontalLayout_5, 1, 0, 1, 2) self.gridLayout_9.addLayout(self.horizontalLayout_5, 1, 0, 1, 2)
self.gridLayout_8.addWidget(self.groupBox_3, 7, 0, 1, 7) 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.tabWidgetSettings.addTab(self.tab_3, _fromUtf8(""))
self.gridLayout.addWidget(self.tabWidgetSettings, 0, 0, 1, 1) 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.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.label_18.setText(_translate("settingsDialog", "E-Mail Address for this Identity:", None))
self.lineEditEmailAddress.setText(_translate("settingsDialog", "fsdpffffffffffffffffffffffffffffffffffffffffffffffasdpofiasjdf", 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)) self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tab_3), _translate("settingsDialog", "SMTP && POP3", None))

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>623</width> <width>623</width>
<height>343</height> <height>406</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -823,6 +823,35 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="5" column="0" colspan="7">
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>Mail Content</string>
</property>
<layout class="QGridLayout" name="gridLayout_10">
<item row="0" column="0">
<widget class="QCheckBox" name="checkBoxStripMessageHeaders">
<property name="text">
<string>Strip these non-anonymizing message meaders from outgoing messages (comma-separated list):</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="tristate">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLineEdit" name="lineEditMessageHeadersToStrip">
<property name="text">
<string>User-Agent, Message-ID</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>

View File

@ -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) sock = ssl.wrap_socket(sock, server_side=True, certfile=self.certfile, keyfile=self.keyfile, ssl_version=ssl.PROTOCOL_SSLv23)
bitmessageSMTPChannel(self, sock, peer_address) 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): def process_message(self, peer, address, rcpttos, data):
#print("Peer", peer) #print("Peer", peer)
#print("Mail From", address) #print("Mail From", address)
@ -344,12 +363,13 @@ class bitmessageSMTPServer(smtpd.SMTPServer):
message = parser.Parser().parsestr(data) message = parser.Parser().parsestr(data)
message['X-Bitmessage-Sending-Version'] = shared.softwareVersion message['X-Bitmessage-Sending-Version'] = shared.softwareVersion
print(message)
bitmessageSMTPServer.stripMessageHeaders(message)
fp = StringIO() fp = StringIO()
gen = generator.Generator(fp, mangle_from_=False, maxheaderlen=128) gen = generator.Generator(fp, mangle_from_=False, maxheaderlen=128)
gen.flatten(message) gen.flatten(message)
message_as_text = fp.getvalue() message_as_text = fp.getvalue()
print(message_as_text)
checksum = hashlib.sha256(message_as_text).digest()[:2] checksum = hashlib.sha256(message_as_text).digest()[:2]
checksum = (ord(checksum[0]) << 8) | ord(checksum[1]) checksum = (ord(checksum[0]) << 8) | ord(checksum[1])