From 151358566aa7534ee3df50ac931d51a0c6cc2212 Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Fri, 21 Dec 2012 10:55:29 -0500 Subject: [PATCH 1/4] Windows resize to fit contents on different operating systems --- bitmessagemain.py | 4 +- help.py | 26 +++++++------ help.ui | 89 ++++++++++++++++++++++----------------------- newaddressdialog.py | 21 ++++++----- newaddressdialog.ui | 4 +- 5 files changed, 75 insertions(+), 69 deletions(-) diff --git a/bitmessagemain.py b/bitmessagemain.py index 8430139c..195e0114 100644 --- a/bitmessagemain.py +++ b/bitmessagemain.py @@ -815,7 +815,7 @@ class receiveDataThread(QThread): if ackDataValidThusFar: print 'ackData is valid. Will process it.' #self.data = self.data[:self.payloadLength+24] + ackData + self.data[self.payloadLength+24:] - self.ackDataThatWeHaveYetToSend.append(ackData) #When we have processed all data + self.ackDataThatWeHaveYetToSend.append(ackData) #When we have processed all data, the processData function will pop the ackData out and process it as if it is a message received from our peer. #print 'self.data after:', repr(self.data) '''if ackData[4:16] == 'msg\x00\x00\x00\x00\x00\x00\x00\x00\x00': inventoryHash = calculateInventoryHash(ackData[24:]) @@ -2125,6 +2125,7 @@ class helpDialog(QtGui.QDialog): self.ui.setupUi(self) self.parent = parent self.ui.labelHelpURI.setOpenExternalLinks(True) + QtGui.QWidget.resize(self,QtGui.QWidget.sizeHint(self)) class aboutDialog(QtGui.QDialog): def __init__(self,parent): @@ -2226,6 +2227,7 @@ class NewAddressDialog(QtGui.QDialog): #print self.parent.ui.tableWidgetYourIdentities.item(row-1,1).text() self.ui.comboBoxExisting.addItem(self.parent.ui.tableWidgetYourIdentities.item(row-1,1).text()) row += 1 + #QtGui.QWidget.resize(self,QtGui.QWidget.sizeHint(self)) diff --git a/help.py b/help.py index f2267b5e..1124ff7d 100644 --- a/help.py +++ b/help.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'help.ui' # -# Created: Mon Nov 19 12:25:18 2012 +# Created: Wed Dec 19 15:53:53 2012 # by: PyQt4 UI code generator 4.9.4 # # WARNING! All changes made in this file will be lost! @@ -17,19 +17,23 @@ except AttributeError: class Ui_helpDialog(object): def setupUi(self, helpDialog): helpDialog.setObjectName(_fromUtf8("helpDialog")) - helpDialog.resize(335, 170) + helpDialog.resize(335, 96) + self.formLayout = QtGui.QFormLayout(helpDialog) + self.formLayout.setObjectName(_fromUtf8("formLayout")) + self.labelHelpURI = QtGui.QLabel(helpDialog) + self.labelHelpURI.setObjectName(_fromUtf8("labelHelpURI")) + self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.labelHelpURI) + self.label = QtGui.QLabel(helpDialog) + self.label.setWordWrap(True) + self.label.setObjectName(_fromUtf8("label")) + self.formLayout.setWidget(0, QtGui.QFormLayout.SpanningRole, self.label) + spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.formLayout.setItem(2, QtGui.QFormLayout.LabelRole, spacerItem) self.buttonBox = QtGui.QDialogButtonBox(helpDialog) - self.buttonBox.setGeometry(QtCore.QRect(30, 120, 281, 32)) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) - self.label = QtGui.QLabel(helpDialog) - self.label.setGeometry(QtCore.QRect(30, 20, 291, 51)) - self.label.setWordWrap(True) - self.label.setObjectName(_fromUtf8("label")) - self.labelHelpURI = QtGui.QLabel(helpDialog) - self.labelHelpURI.setGeometry(QtCore.QRect(30, 70, 301, 21)) - self.labelHelpURI.setObjectName(_fromUtf8("labelHelpURI")) + self.formLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.buttonBox) self.retranslateUi(helpDialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), helpDialog.accept) @@ -38,6 +42,6 @@ class Ui_helpDialog(object): def retranslateUi(self, helpDialog): helpDialog.setWindowTitle(QtGui.QApplication.translate("helpDialog", "Help", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("helpDialog", "As Bitmessage is a collaborative project, help can be found online in the Bitmessage Wiki:", None, QtGui.QApplication.UnicodeUTF8)) self.labelHelpURI.setText(QtGui.QApplication.translate("helpDialog", "http://Bitmessage.org/wiki/PyBitmessage_Help", None, QtGui.QApplication.UnicodeUTF8)) + self.label.setText(QtGui.QApplication.translate("helpDialog", "As Bitmessage is a collaborative project, help can be found online in the Bitmessage Wiki:", None, QtGui.QApplication.UnicodeUTF8)) diff --git a/help.ui b/help.ui index f5062c20..e53e3ff9 100644 --- a/help.ui +++ b/help.ui @@ -7,57 +7,54 @@ 0 0 335 - 170 + 96 Help - - - - 30 - 120 - 281 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Ok - - - - - - 30 - 20 - 291 - 51 - - - - As Bitmessage is a collaborative project, help can be found online in the Bitmessage Wiki: - - - true - - - - - - 30 - 70 - 301 - 21 - - - - <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a> - - + + + + + <a href="http://Bitmessage.org/wiki/PyBitmessage_Help">http://Bitmessage.org/wiki/PyBitmessage_Help</a> + + + + + + + As Bitmessage is a collaborative project, help can be found online in the Bitmessage Wiki: + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + + diff --git a/newaddressdialog.py b/newaddressdialog.py index beb48a48..053c83fa 100644 --- a/newaddressdialog.py +++ b/newaddressdialog.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'newaddressdialog.ui' # -# Created: Tue Sep 25 16:40:04 2012 +# Created: Wed Dec 19 15:55:07 2012 # by: PyQt4 UI code generator 4.9.4 # # WARNING! All changes made in this file will be lost! @@ -17,39 +17,42 @@ except AttributeError: class Ui_NewAddressDialog(object): def setupUi(self, NewAddressDialog): NewAddressDialog.setObjectName(_fromUtf8("NewAddressDialog")) - NewAddressDialog.resize(368, 257) + NewAddressDialog.resize(383, 258) self.buttonBox = QtGui.QDialogButtonBox(NewAddressDialog) self.buttonBox.setGeometry(QtCore.QRect(160, 220, 201, 32)) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.label = QtGui.QLabel(NewAddressDialog) - self.label.setGeometry(QtCore.QRect(10, 10, 351, 31)) + self.label.setGeometry(QtCore.QRect(10, 0, 361, 41)) + self.label.setAlignment(QtCore.Qt.AlignBottom|QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft) self.label.setWordWrap(True) self.label.setObjectName(_fromUtf8("label")) self.label_2 = QtGui.QLabel(NewAddressDialog) self.label_2.setGeometry(QtCore.QRect(20, 50, 301, 20)) self.label_2.setObjectName(_fromUtf8("label_2")) self.newaddresslabel = QtGui.QLineEdit(NewAddressDialog) - self.newaddresslabel.setGeometry(QtCore.QRect(20, 70, 341, 20)) + self.newaddresslabel.setGeometry(QtCore.QRect(20, 70, 351, 20)) self.newaddresslabel.setObjectName(_fromUtf8("newaddresslabel")) self.radioButtonMostAvailable = QtGui.QRadioButton(NewAddressDialog) self.radioButtonMostAvailable.setGeometry(QtCore.QRect(20, 110, 401, 16)) self.radioButtonMostAvailable.setChecked(True) self.radioButtonMostAvailable.setObjectName(_fromUtf8("radioButtonMostAvailable")) self.radioButtonExisting = QtGui.QRadioButton(NewAddressDialog) - self.radioButtonExisting.setGeometry(QtCore.QRect(20, 150, 271, 18)) + self.radioButtonExisting.setGeometry(QtCore.QRect(20, 150, 351, 18)) self.radioButtonExisting.setChecked(False) self.radioButtonExisting.setObjectName(_fromUtf8("radioButtonExisting")) self.label_3 = QtGui.QLabel(NewAddressDialog) - self.label_3.setGeometry(QtCore.QRect(33, 123, 331, 21)) + self.label_3.setGeometry(QtCore.QRect(35, 127, 351, 20)) + self.label_3.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.label_3.setObjectName(_fromUtf8("label_3")) self.label_4 = QtGui.QLabel(NewAddressDialog) - self.label_4.setGeometry(QtCore.QRect(37, 167, 341, 16)) + self.label_4.setGeometry(QtCore.QRect(37, 167, 351, 21)) + self.label_4.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.label_4.setObjectName(_fromUtf8("label_4")) self.comboBoxExisting = QtGui.QComboBox(NewAddressDialog) self.comboBoxExisting.setEnabled(False) - self.comboBoxExisting.setGeometry(QtCore.QRect(40, 190, 321, 22)) + self.comboBoxExisting.setGeometry(QtCore.QRect(40, 190, 331, 22)) self.comboBoxExisting.setEditable(True) self.comboBoxExisting.setObjectName(_fromUtf8("comboBoxExisting")) @@ -61,7 +64,7 @@ class Ui_NewAddressDialog(object): def retranslateUi(self, NewAddressDialog): NewAddressDialog.setWindowTitle(QtGui.QApplication.translate("NewAddressDialog", "Create new Address", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("NewAddressDialog", "Here you may generate as many addresses as you like. Indeed, creating many addresses is encouraged.", None, QtGui.QApplication.UnicodeUTF8)) + self.label.setText(QtGui.QApplication.translate("NewAddressDialog", "Here you may generate as many addresses as you like. Indeed, creating and abandoning addresses is encouraged.", None, QtGui.QApplication.UnicodeUTF8)) self.label_2.setText(QtGui.QApplication.translate("NewAddressDialog", "Label (not shown to anyone except you)", None, QtGui.QApplication.UnicodeUTF8)) self.radioButtonMostAvailable.setText(QtGui.QApplication.translate("NewAddressDialog", "Use the most available stream", None, QtGui.QApplication.UnicodeUTF8)) self.radioButtonExisting.setText(QtGui.QApplication.translate("NewAddressDialog", "Use the same stream as an existing address", None, QtGui.QApplication.UnicodeUTF8)) diff --git a/newaddressdialog.ui b/newaddressdialog.ui index 40186c40..c53340ec 100644 --- a/newaddressdialog.ui +++ b/newaddressdialog.ui @@ -6,8 +6,8 @@ 0 0 - 384 - 257 + 383 + 258 From afccad292520c8be1924e31cf35e816721520e44 Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Fri, 4 Jan 2013 17:21:33 -0500 Subject: [PATCH 2/4] various small changes --- bitmessagemain.py | 62 ++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/bitmessagemain.py b/bitmessagemain.py index 1bd4a2a0..8feac795 100644 --- a/bitmessagemain.py +++ b/bitmessagemain.py @@ -411,7 +411,7 @@ class receiveDataThread(QThread): self.receivedgetbiginv = True sqlLock.acquire() #Select all hashes which are younger than two days old and in this stream. - t = (int(time.time())-172800,self.streamNumber) + t = (int(time.time())-maximumAgeOfObjectsThatIAdvertiseToOthers,self.streamNumber) sqlSubmitQueue.put('''SELECT hash FROM inventory WHERE receivedtime>? and streamnumber=?''') sqlSubmitQueue.put(t) queryreturn = sqlReturnQueue.get() @@ -424,7 +424,7 @@ class receiveDataThread(QThread): #print 'bigInvList:', bigInvList for hash, storedValue in inventory.items(): objectType, streamNumber, payload, receivedTime = storedValue - if streamNumber == self.streamNumber and receivedTime > int(time.time())-172800: + if streamNumber == self.streamNumber and receivedTime > int(time.time())-maximumAgeOfObjectsThatIAdvertiseToOthers: bigInvList[hash] = 0 numberOfObjectsInInvMessage = 0 payload = '' @@ -890,6 +890,9 @@ class receiveDataThread(QThread): bitfieldBehaviors = self.data[readPosition:readPosition+4] readPosition += 4 #for the bitfield of behaviors and features addressVersion, varintLength = decodeVarint(self.data[readPosition:readPosition+10]) + if addressVersion >= 2: + 'This version of Bitmessgae cannot handle version', addressVersion,'addresses.' + return readPosition += varintLength streamNumber, varintLength = decodeVarint(self.data[readPosition:readPosition+10]) readPosition += varintLength @@ -930,6 +933,13 @@ class receiveDataThread(QThread): if not self.isProofOfWorkSufficient(): print 'Proof of work in getpubkey message insufficient.' return + embeddedTime, = unpack('>I',self.data[32:36]) + if embeddedTime > int(time.time())+10800: + print 'The time in this getpubkey message is too new. Ignoring it. Time:', embeddedTime + return + if embeddedTime < int(time.time())-maximumAgeOfAnObjectThatIAmWillingToAccept: + print 'The time in this getpubkey message is too old. Ignoring it. Time:', embeddedTime + return inventoryLock.acquire() inventoryHash = calculateInventoryHash(self.data[24:self.payloadLength+24]) if inventoryHash in inventory: @@ -942,25 +952,23 @@ class receiveDataThread(QThread): return objectType = 'pubkeyrequest' - inventory[inventoryHash] = (objectType, self.streamNumber, self.data[24:self.payloadLength+24], int(time.time())) + inventory[inventoryHash] = (objectType, self.streamNumber, self.data[24:self.payloadLength+24], embeddedTime) inventoryLock.release() #Now let us make sure that the getpubkey request isn't too old or with a fake (future) time. - embeddedTime, = unpack('>I',self.data[32:36]) - if embeddedTime > int(time.time())+10800: - print 'The time in this getpubkey message is too new. Ignoring it. Time:', embeddedTime - return - if embeddedTime < int(time.time())-maximumAgeOfAnObjectThatIAmWillingToAccept: - print 'The time in this getpubkey message is too old. Ignoring it. Time:', embeddedTime - return + addressVersionNumber, addressVersionLength = decodeVarint(self.data[36:42]) - if addressVersionNumber > 1: - print 'The addressVersionNumber of the pubkey is too high. Can\'t understand. Ignoring it.' - return streamNumber, streamNumberLength = decodeVarint(self.data[36+addressVersionLength:42+addressVersionLength]) if streamNumber <> self.streamNumber: print 'The streamNumber', streamNumber, 'doesn\'t match our stream number:', self.streamNumber return + + #This getpubkey request is valid so far. Forward to peers. + broadcastToSendDataQueues((self.streamNumber,'send',self.data[:self.payloadLength+24])) + + if addressVersionNumber > 1: + print 'The addressVersionNumber of the pubkey is too high. Can\'t understand. Ignoring it.' + return if self.data[36+addressVersionLength+streamNumberLength:56+addressVersionLength+streamNumberLength] in myAddressHashes: print 'Found getpubkey requested hash in my list of hashes.' #check to see whether we have already calculated the nonce and transmitted this key before @@ -1000,12 +1008,15 @@ class receiveDataThread(QThread): sqlSubmitQueue.put(t) queryreturn = sqlReturnQueue.get() - #Now that we have the key either from getting it earlier or making it and storing it ourselves... + #Now that we have the full pubkey message ready either from making it just now or making it earlier, we can send it out. t = (self.data[36+addressVersionLength+streamNumberLength:56+addressVersionLength+streamNumberLength],) #this prevents SQL injection - sqlSubmitQueue.put('SELECT * FROM pubkeys WHERE hash=?') + sqlSubmitQueue.put('''SELECT * FROM pubkeys WHERE hash=? AND havecorrectnonce=1''') sqlSubmitQueue.put(t) queryreturn = sqlReturnQueue.get() - + if queryreturn == []: + sys.stderr.write('Error: pubkey which we just put in our pubkey database suddenly is not there. Is the database malfunctioning?') + sqlLock.release() + return for row in queryreturn: hash, havecorrectnonce, payload, timeLastRequested = row if timeLastRequested < int(time.time())+604800: #if the last time anyone asked about this hash was this week, extend the time. @@ -1022,11 +1033,11 @@ class receiveDataThread(QThread): self.broadcastinv(inventoryHash) else: - print 'Hash in getpubkey is not mine.' + print 'Hash in getpubkey request is not for any of my keys.' #..but lets see if we have it stored from when it came in from someone else. t = (self.data[36+addressVersionLength+streamNumberLength:56+addressVersionLength+streamNumberLength],) #this prevents SQL injection sqlLock.acquire() - sqlSubmitQueue.put('''SELECT hash, time FROM pubkeys WHERE hash=? AND havecorrectnonce='True' ''') + sqlSubmitQueue.put('''SELECT hash, transmitdata, time FROM pubkeys WHERE hash=? AND havecorrectnonce=1''') sqlSubmitQueue.put(t) queryreturn = sqlReturnQueue.get() sqlLock.release() @@ -1038,17 +1049,14 @@ class receiveDataThread(QThread): hash, timeLastRequested = row if timeLastRequested < int(time.time())+604800: #if the last time anyone asked about this hash was this week, extend the time. t = (int(time.time())+604800,hash) - sqlSubmitQueue.put('''UPDATE pubkeys set time=? WHERE hash=?''') + sqlSubmitQueue.put('''UPDATE pubkeys set time=? WHERE hash=? ''') sqlSubmitQueue.put(t) queryreturn = sqlReturnQueue.get() - inventoryHash = calculateInventoryHash(self.data[24:self.payloadLength+24]) + inventoryHash = calculateInventoryHash(transmitdata) objectType = 'pubkey' - inventory[inventoryHash] = (objectType, self.streamNumber, self.data[24:self.payloadLength+24], int(time.time())) + inventory[inventoryHash] = (objectType, self.streamNumber, transmitdata, int(time.time())) self.broadcastinv(inventoryHash) - else: - #We don't have it. We'll need to forward the getpubkey request to our peers. - print 'We don\' have the public key. Forwarding getpubkey message to peers.' - broadcastToSendDataQueues((self.streamNumber,'send',self.data[:self.payloadLength+24])) + #We have received an inv message def recinv(self): @@ -1611,7 +1619,7 @@ class sqlThread(QThread): self.cur.execute( '''CREATE TABLE whitelist (label text, address text, enabled bool)''' ) self.cur.execute( '''CREATE TABLE pubkeys (hash blob, havecorrectnonce bool, transmitdata blob, time blob, UNIQUE(hash, havecorrectnonce, transmitdata) ON CONFLICT REPLACE)''' ) self.cur.execute( '''CREATE TABLE inventory (hash blob, objecttype text, streamnumber int, payload blob, receivedtime integer, UNIQUE(hash) ON CONFLICT REPLACE)''' ) - self.cur.execute( '''CREATE TABLE knownnodes (timelastseen int, stream int, services blob, host blob, port blob, UNIQUE(host) ON CONFLICT REPLACE)''' ) #This table isn't used in the program yet but I have a feeling that we'll need it. + self.cur.execute( '''CREATE TABLE knownnodes (timelastseen int, stream int, services blob, host blob, port blob, UNIQUE(host, stream, port) ON CONFLICT REPLACE)''' ) #This table isn't used in the program yet but I have a feeling that we'll need it. self.conn.commit() print 'Created messages database file' @@ -1895,6 +1903,7 @@ class singleWorker(QThread): sqlLock.release() for row in queryreturn: toaddress, fromaddress, subject, message, ackdata = row + ackdataForWhichImWatching[ackdata] = 0 status,addressVersionNumber,toStreamNumber,hash = decodeAddress(toaddress) #if hash == toRipe: self.emit(SIGNAL("updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"),ackdata,'Doing work necessary to send the message.') @@ -2786,7 +2795,6 @@ class MyForm(QtGui.QMainWindow): for i in range(4): #This will make 32 bytes of random data. random.seed() ackdata += pack('>Q',random.randrange(1, 18446744073709551615)) - ackdataForWhichImWatching[ackdata] = 0 sqlLock.acquire() t = ('',toAddress,ripe,fromAddress,subject,message,ackdata,int(time.time()),'findingpubkey',1,1,'sent') sqlSubmitQueue.put('''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?)''') From c65238d3d25c0fe7be48a83fd12f662143000d07 Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Fri, 4 Jan 2013 17:26:27 -0500 Subject: [PATCH 3/4] various smaller changes --- bitmessagemain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitmessagemain.py b/bitmessagemain.py index 8feac795..486f1834 100644 --- a/bitmessagemain.py +++ b/bitmessagemain.py @@ -1046,7 +1046,7 @@ class receiveDataThread(QThread): print 'we have the public key. sending it.' #We have it. Let's send it. for row in queryreturn: - hash, timeLastRequested = row + hash, transmitdata, timeLastRequested = row if timeLastRequested < int(time.time())+604800: #if the last time anyone asked about this hash was this week, extend the time. t = (int(time.time())+604800,hash) sqlSubmitQueue.put('''UPDATE pubkeys set time=? WHERE hash=? ''') From fda4b497797387388aab9afb9afa07bc877dbe27 Mon Sep 17 00:00:00 2001 From: Jonathan Warren Date: Fri, 4 Jan 2013 17:29:20 -0500 Subject: [PATCH 4/4] increment version number --- bitmessagemain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitmessagemain.py b/bitmessagemain.py index 486f1834..88c8b1f9 100644 --- a/bitmessagemain.py +++ b/bitmessagemain.py @@ -5,7 +5,7 @@ #Right now, PyBitmessage only support connecting to stream 1. It doesn't yet contain logic to expand into further streams. -softwareVersion = '0.1.4' +softwareVersion = '0.1.5' verbose = 2 maximumAgeOfAnObjectThatIAmWillingToAccept = 216000 #Equals two days and 12 hours. lengthOfTimeToLeaveObjectsInInventory = 237600 #Equals two days and 18 hours. This should be longer than maximumAgeOfAnObjectThatIAmWillingToAccept so that we don't process messages twice.