Porting bitmessageqt to Qt5 #1389
|
@ -144,11 +144,10 @@ class objectProcessor(threading.Thread):
|
||||||
" WHERE ackdata=?", int(time.time()), data[readPosition:])
|
" WHERE ackdata=?", int(time.time()), data[readPosition:])
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
data[readPosition:],
|
data[readPosition:], _translate(
|
||||||
_translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Acknowledgement of the message received %1"
|
"Acknowledgement of the message received {0}"
|
||||||
).arg(l10n.formatTimestamp()))
|
).format(l10n.formatTimestamp()))
|
||||||
))
|
))
|
||||||
else:
|
else:
|
||||||
logger.debug('This object is not an acknowledgement bound for me.')
|
logger.debug('This object is not an acknowledgement bound for me.')
|
||||||
|
|
|
@ -12,6 +12,8 @@ from binascii import hexlify, unhexlify
|
||||||
from struct import pack
|
from struct import pack
|
||||||
from subprocess import call # nosec
|
from subprocess import call # nosec
|
||||||
|
|
||||||
|
from six.moves import configparser, queue
|
||||||
|
|
||||||
import defaults
|
import defaults
|
||||||
import helper_inbox
|
import helper_inbox
|
||||||
import helper_msgcoding
|
import helper_msgcoding
|
||||||
|
@ -24,15 +26,13 @@ import protocol
|
||||||
import queues
|
import queues
|
||||||
import shared
|
import shared
|
||||||
import state
|
import state
|
||||||
import tr
|
|
||||||
from addresses import (
|
from addresses import (
|
||||||
calculateInventoryHash, decodeAddress, decodeVarint, encodeVarint
|
calculateInventoryHash, decodeAddress, decodeVarint, encodeVarint)
|
||||||
)
|
|
||||||
from bmconfigparser import BMConfigParser
|
from bmconfigparser import BMConfigParser
|
||||||
from helper_sql import sqlExecute, sqlQuery
|
from helper_sql import sqlExecute, sqlQuery
|
||||||
from inventory import Inventory
|
from inventory import Inventory
|
||||||
from network import knownnodes, StoppableThread
|
from network import knownnodes, StoppableThread
|
||||||
from six.moves import configparser, queue
|
from tr import _translate
|
||||||
|
|
||||||
|
|
||||||
def sizeof_fmt(num, suffix='h/s'):
|
def sizeof_fmt(num, suffix='h/s'):
|
||||||
|
@ -216,9 +216,8 @@ class singleWorker(StoppableThread):
|
||||||
return privSigningKeyHex, privEncryptionKeyHex, \
|
return privSigningKeyHex, privEncryptionKeyHex, \
|
||||||
pubSigningKey, pubEncryptionKey
|
pubSigningKey, pubEncryptionKey
|
||||||
|
|
||||||
def _doPOWDefaults(self, payload, TTL,
|
def _doPOWDefaults(
|
||||||
log_prefix='',
|
self, payload, TTL, log_prefix='', log_time=False):
|
||||||
log_time=False):
|
|
||||||
target = 2 ** 64 / (
|
target = 2 ** 64 / (
|
||||||
defaults.networkDefaultProofOfWorkNonceTrialsPerByte * (
|
defaults.networkDefaultProofOfWorkNonceTrialsPerByte * (
|
||||||
len(payload) + 8
|
len(payload) + 8
|
||||||
|
@ -244,14 +243,16 @@ class singleWorker(StoppableThread):
|
||||||
'PoW took %.1f seconds, speed %s.',
|
'PoW took %.1f seconds, speed %s.',
|
||||||
delta, sizeof_fmt(nonce / delta)
|
delta, sizeof_fmt(nonce / delta)
|
||||||
)
|
)
|
||||||
except: # noqa:E722 # NameError
|
except NameError:
|
||||||
self.logger.warning("Proof of Work exception")
|
self.logger.warning("Proof of Work exception")
|
||||||
payload = pack('>Q', nonce) + payload
|
payload = pack('>Q', nonce) + payload
|
||||||
return payload
|
return payload
|
||||||
|
|
||||||
def doPOWForMyV2Pubkey(self, adressHash):
|
def doPOWForMyV2Pubkey(self, adressHash):
|
||||||
""" This function also broadcasts out the pubkey
|
"""
|
||||||
message once it is done with the POW"""
|
This function also broadcasts out the pubkey message once it is
|
||||||
|
done with the POW
|
||||||
|
"""
|
||||||
# Look up my stream number based on my address hash
|
# Look up my stream number based on my address hash
|
||||||
myAddress = shared.myAddressesByHash[adressHash]
|
myAddress = shared.myAddressesByHash[adressHash]
|
||||||
# status
|
# status
|
||||||
|
@ -311,9 +312,10 @@ class singleWorker(StoppableThread):
|
||||||
|
|
||||||
def sendOutOrStoreMyV3Pubkey(self, adressHash):
|
def sendOutOrStoreMyV3Pubkey(self, adressHash):
|
||||||
"""
|
"""
|
||||||
If this isn't a chan address, this function assembles the pubkey data, does the necessary POW and sends it out.
|
If this isn't a chan address, this function assembles the pubkey
|
||||||
If it *is* a chan then it assembles the pubkey and stores is in the pubkey table so that we can send messages
|
data, does the necessary POW and sends it out.
|
||||||
to "ourselves".
|
If it *is* a chan then it assembles the pubkey and stores it in
|
||||||
|
the pubkey table so that we can send messages to "ourselves".
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
myAddress = shared.myAddressesByHash[adressHash]
|
myAddress = shared.myAddressesByHash[adressHash]
|
||||||
|
@ -399,9 +401,10 @@ class singleWorker(StoppableThread):
|
||||||
|
|
||||||
def sendOutOrStoreMyV4Pubkey(self, myAddress):
|
def sendOutOrStoreMyV4Pubkey(self, myAddress):
|
||||||
"""
|
"""
|
||||||
It doesn't send directly anymore. It put is to a queue for another thread to send at an appropriate time,
|
It doesn't send directly anymore. It put is to a queue for
|
||||||
whereas in the past it directly appended it to the outgoing buffer, I think. Same with all the other methods in
|
another thread to send at an appropriate time, whereas in the
|
||||||
this class.
|
past it directly appended it to the outgoing buffer, I think.
|
||||||
|
Same with all the other methods in this class.
|
||||||
"""
|
"""
|
||||||
if not BMConfigParser().has_section(myAddress):
|
if not BMConfigParser().has_section(myAddress):
|
||||||
# The address has been deleted.
|
# The address has been deleted.
|
||||||
|
@ -530,7 +533,10 @@ class singleWorker(StoppableThread):
|
||||||
queues.invQueue.put((streamNumber, inventoryHash))
|
queues.invQueue.put((streamNumber, inventoryHash))
|
||||||
|
|
||||||
def sendBroadcast(self):
|
def sendBroadcast(self):
|
||||||
"""Send a broadcast-type object (assemble the object, perform PoW and put it to the inv announcement queue)"""
|
"""
|
||||||
|
Send a broadcast-type object (assemble the object, perform PoW
|
||||||
|
and put it to the inv announcement queue)
|
||||||
|
"""
|
||||||
# Reset just in case
|
# Reset just in case
|
||||||
sqlExecute(
|
sqlExecute(
|
||||||
'''UPDATE sent SET status='broadcastqueued' '''
|
'''UPDATE sent SET status='broadcastqueued' '''
|
||||||
|
@ -562,8 +568,7 @@ class singleWorker(StoppableThread):
|
||||||
self.logger.warning("Section or Option did not found: %s", err)
|
self.logger.warning("Section or Option did not found: %s", err)
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Error! Could not find sender address"
|
"Error! Could not find sender address"
|
||||||
" (your address) in the keys.dat file."))
|
" (your address) in the keys.dat file."))
|
||||||
|
@ -577,7 +582,7 @@ class singleWorker(StoppableThread):
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata,
|
||||||
tr._translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Error, can't send."))
|
"Error, can't send."))
|
||||||
))
|
))
|
||||||
|
@ -666,8 +671,7 @@ class singleWorker(StoppableThread):
|
||||||
|
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Doing work necessary to send broadcast..."))
|
"Doing work necessary to send broadcast..."))
|
||||||
))
|
))
|
||||||
|
@ -699,11 +703,9 @@ class singleWorker(StoppableThread):
|
||||||
|
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
"MainWindow", "Broadcast sent on {0}"
|
||||||
"MainWindow",
|
).format(l10n.formatTimestamp()))
|
||||||
"Broadcast sent on %1"
|
|
||||||
).arg(l10n.formatTimestamp()))
|
|
||||||
))
|
))
|
||||||
|
|
||||||
# Update the status of the message in the 'sent' table to have
|
# Update the status of the message in the 'sent' table to have
|
||||||
|
@ -715,7 +717,10 @@ class singleWorker(StoppableThread):
|
||||||
)
|
)
|
||||||
|
|
||||||
def sendMsg(self):
|
def sendMsg(self):
|
||||||
"""Send a message-type object (assemble the object, perform PoW and put it to the inv announcement queue)"""
|
"""
|
||||||
|
Send a message-type object (assemble the object, perform PoW
|
||||||
|
and put it to the inv announcement queue)
|
||||||
|
"""
|
||||||
# pylint: disable=too-many-nested-blocks
|
# pylint: disable=too-many-nested-blocks
|
||||||
# Reset just in case
|
# Reset just in case
|
||||||
sqlExecute(
|
sqlExecute(
|
||||||
|
@ -811,8 +816,7 @@ class singleWorker(StoppableThread):
|
||||||
)
|
)
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByToAddress', (
|
'updateSentItemStatusByToAddress', (
|
||||||
toaddress,
|
toaddress, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Encryption key was requested earlier."))
|
"Encryption key was requested earlier."))
|
||||||
))
|
))
|
||||||
|
@ -884,8 +888,7 @@ class singleWorker(StoppableThread):
|
||||||
)
|
)
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByToAddress', (
|
'updateSentItemStatusByToAddress', (
|
||||||
toaddress,
|
toaddress, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Sending a request for the"
|
"Sending a request for the"
|
||||||
" recipient\'s encryption key."))
|
" recipient\'s encryption key."))
|
||||||
|
@ -909,8 +912,7 @@ class singleWorker(StoppableThread):
|
||||||
state.ackdataForWhichImWatching[ackdata] = 0
|
state.ackdataForWhichImWatching[ackdata] = 0
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Looking up the receiver\'s public key"))
|
"Looking up the receiver\'s public key"))
|
||||||
))
|
))
|
||||||
|
@ -967,15 +969,14 @@ class singleWorker(StoppableThread):
|
||||||
)
|
)
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Problem: Destination is a mobile"
|
"Problem: Destination is a mobile"
|
||||||
" device who requests that the"
|
" device who requests that the"
|
||||||
" destination be included in the"
|
" destination be included in the"
|
||||||
" message but this is disallowed in"
|
" message but this is disallowed in"
|
||||||
" your settings. %1"
|
" your settings. {0}"
|
||||||
).arg(l10n.formatTimestamp()))
|
).format(l10n.formatTimestamp()))
|
||||||
))
|
))
|
||||||
# if the human changes their setting and then
|
# if the human changes their setting and then
|
||||||
# sends another message or restarts their client,
|
# sends another message or restarts their client,
|
||||||
|
@ -998,8 +999,7 @@ class singleWorker(StoppableThread):
|
||||||
defaults.networkDefaultPayloadLengthExtraBytes
|
defaults.networkDefaultPayloadLengthExtraBytes
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Doing work necessary to send message.\n"
|
"Doing work necessary to send message.\n"
|
||||||
"There is no required difficulty for"
|
"There is no required difficulty for"
|
||||||
|
@ -1031,32 +1031,19 @@ class singleWorker(StoppableThread):
|
||||||
requiredAverageProofOfWorkNonceTrialsPerByte,
|
requiredAverageProofOfWorkNonceTrialsPerByte,
|
||||||
requiredPayloadLengthExtraBytes
|
requiredPayloadLengthExtraBytes
|
||||||
)
|
)
|
||||||
|
queues.UISignalQueue.put((
|
||||||
queues.UISignalQueue.put(
|
'updateSentItemStatusByAckdata', (
|
||||||
(
|
ackdata, _translate(
|
||||||
'updateSentItemStatusByAckdata',
|
"MainWindow",
|
||||||
(
|
"Doing work necessary to send message.\n"
|
||||||
ackdata,
|
"Receiver\'s required difficulty: {0} and {1}"
|
||||||
tr._translate(
|
).format(
|
||||||
"MainWindow",
|
float(requiredAverageProofOfWorkNonceTrialsPerByte)
|
||||||
"Doing work necessary to send message.\n"
|
/ defaults.networkDefaultProofOfWorkNonceTrialsPerByte,
|
||||||
"Receiver\'s required difficulty: %1"
|
float(requiredPayloadLengthExtraBytes)
|
||||||
" and %2"
|
/ defaults.networkDefaultPayloadLengthExtraBytes
|
||||||
).arg(
|
))
|
||||||
str(
|
))
|
||||||
float(requiredAverageProofOfWorkNonceTrialsPerByte)
|
|
||||||
/ defaults.networkDefaultProofOfWorkNonceTrialsPerByte
|
|
||||||
)
|
|
||||||
).arg(
|
|
||||||
str(
|
|
||||||
float(requiredPayloadLengthExtraBytes)
|
|
||||||
/ defaults.networkDefaultPayloadLengthExtraBytes
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if status != 'forcepow':
|
if status != 'forcepow':
|
||||||
maxacceptablenoncetrialsperbyte = BMConfigParser().getint(
|
maxacceptablenoncetrialsperbyte = BMConfigParser().getint(
|
||||||
'bitmessagesettings', 'maxacceptablenoncetrialsperbyte')
|
'bitmessagesettings', 'maxacceptablenoncetrialsperbyte')
|
||||||
|
@ -1076,18 +1063,19 @@ class singleWorker(StoppableThread):
|
||||||
ackdata)
|
ackdata)
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Problem: The work demanded by"
|
"Problem: The work demanded by the"
|
||||||
" the recipient (%1 and %2) is"
|
" recipient ({0} and {1}) is more"
|
||||||
" more difficult than you are"
|
" difficult than you are willing"
|
||||||
" willing to do. %3"
|
" to do. {2}"
|
||||||
).arg(str(float(requiredAverageProofOfWorkNonceTrialsPerByte)
|
).format(
|
||||||
/ defaults.networkDefaultProofOfWorkNonceTrialsPerByte)
|
float(requiredAverageProofOfWorkNonceTrialsPerByte)
|
||||||
).arg(str(float(requiredPayloadLengthExtraBytes)
|
/ defaults.networkDefaultProofOfWorkNonceTrialsPerByte,
|
||||||
/ defaults.networkDefaultPayloadLengthExtraBytes)
|
float(requiredPayloadLengthExtraBytes)
|
||||||
).arg(l10n.formatTimestamp()))))
|
/ defaults.networkDefaultPayloadLengthExtraBytes,
|
||||||
|
l10n.formatTimestamp()))
|
||||||
|
))
|
||||||
continue
|
continue
|
||||||
else: # if we are sending a message to ourselves or a chan..
|
else: # if we are sending a message to ourselves or a chan..
|
||||||
self.logger.info('Sending a message.')
|
self.logger.info('Sending a message.')
|
||||||
|
@ -1101,15 +1089,14 @@ class singleWorker(StoppableThread):
|
||||||
except (configparser.NoSectionError, configparser.NoOptionError) as err:
|
except (configparser.NoSectionError, configparser.NoOptionError) as err:
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Problem: You are trying to send a"
|
"Problem: You are trying to send a"
|
||||||
" message to yourself or a chan but your"
|
" message to yourself or a chan but your"
|
||||||
" encryption key could not be found in"
|
" encryption key could not be found in"
|
||||||
" the keys.dat file. Could not encrypt"
|
" the keys.dat file. Could not encrypt"
|
||||||
" message. %1"
|
" message. {0}"
|
||||||
).arg(l10n.formatTimestamp()))
|
).format(l10n.formatTimestamp()))
|
||||||
))
|
))
|
||||||
self.logger.error(
|
self.logger.error(
|
||||||
'Error within sendMsg. Could not read the keys'
|
'Error within sendMsg. Could not read the keys'
|
||||||
|
@ -1126,8 +1113,7 @@ class singleWorker(StoppableThread):
|
||||||
defaults.networkDefaultPayloadLengthExtraBytes
|
defaults.networkDefaultPayloadLengthExtraBytes
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Doing work necessary to send message."))
|
"Doing work necessary to send message."))
|
||||||
))
|
))
|
||||||
|
@ -1150,8 +1136,7 @@ class singleWorker(StoppableThread):
|
||||||
self.logger.warning("Section or Option did not found: %s", err)
|
self.logger.warning("Section or Option did not found: %s", err)
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Error! Could not find sender address"
|
"Error! Could not find sender address"
|
||||||
" (your address) in the keys.dat file."))
|
" (your address) in the keys.dat file."))
|
||||||
|
@ -1165,7 +1150,7 @@ class singleWorker(StoppableThread):
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata,
|
||||||
tr._translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Error, can't send."))
|
"Error, can't send."))
|
||||||
))
|
))
|
||||||
|
@ -1217,8 +1202,7 @@ class singleWorker(StoppableThread):
|
||||||
# The fullAckPayload is a normal msg protocol message
|
# The fullAckPayload is a normal msg protocol message
|
||||||
# with the proof of work already completed that the
|
# with the proof of work already completed that the
|
||||||
# receiver of this message can easily send out.
|
# receiver of this message can easily send out.
|
||||||
fullAckPayload = self.generateFullAckMessage(
|
fullAckPayload = self.generateFullAckMessage(ackdata, TTL)
|
||||||
ackdata, toStreamNumber, TTL)
|
|
||||||
payload += encodeVarint(len(fullAckPayload))
|
payload += encodeVarint(len(fullAckPayload))
|
||||||
payload += fullAckPayload
|
payload += fullAckPayload
|
||||||
dataToSign = pack('>Q', embeddedTime) + '\x00\x00\x00\x02' + \
|
dataToSign = pack('>Q', embeddedTime) + '\x00\x00\x00\x02' + \
|
||||||
|
@ -1240,12 +1224,11 @@ class singleWorker(StoppableThread):
|
||||||
)
|
)
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Problem: The recipient\'s encryption key is"
|
"Problem: The recipient\'s encryption key is"
|
||||||
" no good. Could not encrypt message. %1"
|
" no good. Could not encrypt message. {0}"
|
||||||
).arg(l10n.formatTimestamp()))
|
).format(l10n.formatTimestamp()))
|
||||||
))
|
))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -1309,21 +1292,19 @@ class singleWorker(StoppableThread):
|
||||||
not protocol.checkBitfield(behaviorBitfield, protocol.BITFIELD_DOESACK):
|
not protocol.checkBitfield(behaviorBitfield, protocol.BITFIELD_DOESACK):
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
"MainWindow", "Message sent. Sent at {0}"
|
||||||
"MainWindow",
|
).format(l10n.formatTimestamp()))
|
||||||
"Message sent. Sent at %1"
|
))
|
||||||
).arg(l10n.formatTimestamp()))))
|
|
||||||
else:
|
else:
|
||||||
# not sending to a chan or one of my addresses
|
# not sending to a chan or one of my addresses
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Message sent. Waiting for acknowledgement."
|
"Message sent. Waiting for acknowledgement."
|
||||||
" Sent on %1"
|
" Sent on {0}"
|
||||||
).arg(l10n.formatTimestamp()))
|
).format(l10n.formatTimestamp()))
|
||||||
))
|
))
|
||||||
self.logger.info(
|
self.logger.info(
|
||||||
'Broadcasting inv for my msg(within sendmsg function): %s',
|
'Broadcasting inv for my msg(within sendmsg function): %s',
|
||||||
|
@ -1451,8 +1432,7 @@ class singleWorker(StoppableThread):
|
||||||
queues.UISignalQueue.put(('updateStatusBar', statusbar))
|
queues.UISignalQueue.put(('updateStatusBar', statusbar))
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByToAddress', (
|
'updateSentItemStatusByToAddress', (
|
||||||
toAddress,
|
toAddress, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Doing work necessary to request encryption key."))
|
"Doing work necessary to request encryption key."))
|
||||||
))
|
))
|
||||||
|
@ -1476,30 +1456,31 @@ class singleWorker(StoppableThread):
|
||||||
int(time.time()), retryNumber + 1, sleeptill, toAddress)
|
int(time.time()), retryNumber + 1, sleeptill, toAddress)
|
||||||
|
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateStatusBar',
|
'updateStatusBar', _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Broadcasting the public key request. This program will"
|
"Broadcasting the public key request. This program will"
|
||||||
" auto-retry if they are offline.")
|
" auto-retry if they are offline.")
|
||||||
))
|
))
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByToAddress', (
|
'updateSentItemStatusByToAddress', (
|
||||||
toAddress,
|
toAddress, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Sending public key request. Waiting for reply."
|
"Sending public key request. Waiting for reply."
|
||||||
" Requested at %1"
|
" Requested at {0}"
|
||||||
).arg(l10n.formatTimestamp()))
|
).format(l10n.formatTimestamp()))
|
||||||
))
|
))
|
||||||
|
|
||||||
def generateFullAckMessage(self, ackdata, _, TTL):
|
def generateFullAckMessage(self, ackdata, TTL):
|
||||||
"""
|
"""Create ACK packet"""
|
||||||
It might be perfectly fine to just use the same TTL for the ackdata that we use for the message. But I would
|
# It might be perfectly fine to just use the same TTL for
|
||||||
rather it be more difficult for attackers to associate ackData with the associated msg object. However, users
|
# the ackdata that we use for the message. But I would rather
|
||||||
would want the TTL of the acknowledgement to be about the same as they set for the message itself. So let's set
|
# it be more difficult for attackers to associate ackData with
|
||||||
the TTL of the acknowledgement to be in one of three 'buckets': 1 hour, 7 days, or 28 days, whichever is
|
# the associated msg object. However, users would want the TTL
|
||||||
relatively close to what the user specified.
|
# of the acknowledgement to be about the same as they set
|
||||||
"""
|
# for the message itself. So let's set the TTL of the
|
||||||
|
# acknowledgement to be in one of three 'buckets': 1 hour, 7
|
||||||
|
# days, or 28 days, whichever is relatively close to what the
|
||||||
|
# user specified.
|
||||||
if TTL < 24 * 60 * 60: # 1 day
|
if TTL < 24 * 60 * 60: # 1 day
|
||||||
TTL = 24 * 60 * 60 # 1 day
|
TTL = 24 * 60 * 60 # 1 day
|
||||||
elif TTL < 7 * 24 * 60 * 60: # 1 week
|
elif TTL < 7 * 24 * 60 * 60: # 1 week
|
||||||
|
|
127
src/namecoin.py
127
src/namecoin.py
|
@ -1,7 +1,7 @@
|
||||||
"""
|
"""
|
||||||
Namecoin queries
|
Namecoin queries
|
||||||
"""
|
"""
|
||||||
# pylint: disable=too-many-branches,protected-access
|
# pylint: disable=too-many-branches
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
import httplib
|
import httplib
|
||||||
|
@ -14,14 +14,14 @@ import defaults
|
||||||
from addresses import decodeAddress
|
from addresses import decodeAddress
|
||||||
from bmconfigparser import BMConfigParser
|
from bmconfigparser import BMConfigParser
|
||||||
from debug import logger
|
from debug import logger
|
||||||
from tr import _translate # translate
|
from tr import _translate
|
||||||
|
|
||||||
|
|
||||||
configSection = "bitmessagesettings"
|
configSection = "bitmessagesettings"
|
||||||
|
|
||||||
|
|
||||||
class RPCError(Exception):
|
class RPCError(Exception):
|
||||||
"""Error thrown when the RPC call returns an error."""
|
"""Error thrown when the RPC call returns an error."""
|
||||||
|
|
||||||
error = None
|
error = None
|
||||||
|
|
||||||
def __init__(self, data):
|
def __init__(self, data):
|
||||||
|
@ -29,7 +29,7 @@ class RPCError(Exception):
|
||||||
self.error = data
|
self.error = data
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "{0}: {1}".format(type(self).__name__, self.error)
|
return '{0}: {1}'.format(type(self).__name__, self.error)
|
||||||
|
|
||||||
|
|
||||||
class namecoinConnection(object):
|
class namecoinConnection(object):
|
||||||
|
@ -46,20 +46,18 @@ class namecoinConnection(object):
|
||||||
|
|
||||||
def __init__(self, options=None):
|
def __init__(self, options=None):
|
||||||
"""
|
"""
|
||||||
Initialise. If options are given, take the connection settings from
|
Initialise. If options are given, take the connection settings from
|
||||||
them instead of loading from the configs. This can be used to test
|
them instead of loading from the configs. This can be used to test
|
||||||
currently entered connection settings in the config dialog without
|
currently entered connection settings in the config dialog without
|
||||||
actually changing the values (yet).
|
actually changing the values (yet).
|
||||||
"""
|
"""
|
||||||
if options is None:
|
if options is None:
|
||||||
self.nmctype = BMConfigParser().get(
|
self.nmctype = BMConfigParser().get(
|
||||||
configSection, "namecoinrpctype")
|
configSection, "namecoinrpctype")
|
||||||
self.host = BMConfigParser().get(
|
self.host = BMConfigParser().get(configSection, "namecoinrpchost")
|
||||||
configSection, "namecoinrpchost")
|
|
||||||
self.port = int(BMConfigParser().get(
|
self.port = int(BMConfigParser().get(
|
||||||
configSection, "namecoinrpcport"))
|
configSection, "namecoinrpcport"))
|
||||||
self.user = BMConfigParser().get(
|
self.user = BMConfigParser().get(configSection, "namecoinrpcuser")
|
||||||
configSection, "namecoinrpcuser")
|
|
||||||
self.password = BMConfigParser().get(
|
self.password = BMConfigParser().get(
|
||||||
configSection, "namecoinrpcpassword")
|
configSection, "namecoinrpcpassword")
|
||||||
else:
|
else:
|
||||||
|
@ -69,14 +67,14 @@ class namecoinConnection(object):
|
||||||
self.user = options["user"]
|
self.user = options["user"]
|
||||||
self.password = options["password"]
|
self.password = options["password"]
|
||||||
|
|
||||||
assert self.nmctype == "namecoind" or self.nmctype == "nmcontrol"
|
assert self.nmctype in ("namecoind", "nmcontrol")
|
||||||
if self.nmctype == "namecoind":
|
if self.nmctype == "namecoind":
|
||||||
self.con = httplib.HTTPConnection(self.host, self.port, timeout=3)
|
self.con = httplib.HTTPConnection(self.host, self.port, timeout=3)
|
||||||
|
|
||||||
def query(self, identity):
|
def query(self, identity):
|
||||||
"""
|
"""
|
||||||
Query for the bitmessage address corresponding to the given identity
|
Query for the bitmessage address corresponding to the given identity
|
||||||
string. If it doesn't contain a slash, id/ is prepended. We return
|
string. If it doesn't contain a slash, id/ is prepended. We return
|
||||||
the result as (Error, Address) pair, where the Error is an error
|
the result as (Error, Address) pair, where the Error is an error
|
||||||
message to display or None in case of success.
|
message to display or None in case of success.
|
||||||
"""
|
"""
|
||||||
|
@ -96,8 +94,8 @@ class namecoinConnection(object):
|
||||||
res = res["reply"]
|
res = res["reply"]
|
||||||
if not res:
|
if not res:
|
||||||
return (_translate(
|
return (_translate(
|
||||||
"MainWindow", "The name %1 was not found."
|
"MainWindow", "The name {0} was not found."
|
||||||
).arg(identity.decode("utf-8", "ignore")), None)
|
).format(identity.decode('utf-8', 'ignore')), None)
|
||||||
else:
|
else:
|
||||||
assert False
|
assert False
|
||||||
except RPCError as exc:
|
except RPCError as exc:
|
||||||
|
@ -107,12 +105,12 @@ class namecoinConnection(object):
|
||||||
else:
|
else:
|
||||||
errmsg = exc.error
|
errmsg = exc.error
|
||||||
return (_translate(
|
return (_translate(
|
||||||
"MainWindow", "The namecoin query failed (%1)"
|
"MainWindow", "The namecoin query failed ({0})"
|
||||||
).arg(errmsg.decode("utf-8", "ignore")), None)
|
).format(errmsg.decode('utf-8', 'ignore')), None)
|
||||||
except AssertionError:
|
except AssertionError:
|
||||||
return (_translate(
|
return (_translate(
|
||||||
"MainWindow", "Unknown namecoin interface type: %1"
|
"MainWindow", "Unknown namecoin interface type: {0}"
|
||||||
).arg(self.nmctype.decode("utf-8", "ignore")), None)
|
).format(self.nmctype.decode('utf-8', 'ignore')), None)
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.exception("Namecoin query exception")
|
logger.exception("Namecoin query exception")
|
||||||
return (_translate(
|
return (_translate(
|
||||||
|
@ -135,12 +133,12 @@ class namecoinConnection(object):
|
||||||
) if valid else (
|
) if valid else (
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"The name %1 has no associated Bitmessage address."
|
"The name {0} has no associated Bitmessage address."
|
||||||
).arg(identity.decode("utf-8", "ignore")), None)
|
).format(identity.decode('utf-8', 'ignore')), None)
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
"""
|
"""
|
||||||
Test the connection settings. This routine tries to query a "getinfo"
|
Test the connection settings. This routine tries to query a "getinfo"
|
||||||
command, and builds either an error message or a success message with
|
command, and builds either an error message or a success message with
|
||||||
some info from it.
|
some info from it.
|
||||||
"""
|
"""
|
||||||
|
@ -160,44 +158,36 @@ class namecoinConnection(object):
|
||||||
versStr = "0.%d.%d" % (v1, v2)
|
versStr = "0.%d.%d" % (v1, v2)
|
||||||
else:
|
else:
|
||||||
versStr = "0.%d.%d.%d" % (v1, v2, v3)
|
versStr = "0.%d.%d.%d" % (v1, v2, v3)
|
||||||
message = (
|
return (
|
||||||
"success",
|
'success', _translate(
|
||||||
_translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Success! Namecoind version %1 running.").arg(
|
"Success! Namecoind version {0} running."
|
||||||
versStr.decode("utf-8", "ignore")))
|
).format(versStr.decode('utf-8', 'ignore'))
|
||||||
|
)
|
||||||
|
|
||||||
elif self.nmctype == "nmcontrol":
|
elif self.nmctype == "nmcontrol":
|
||||||
res = self.callRPC("data", ["status"])
|
res = self.callRPC("data", ["status"])
|
||||||
prefix = "Plugin data running"
|
prefix = "Plugin data running"
|
||||||
if ("reply" in res) and res["reply"][:len(prefix)] == prefix:
|
if ("reply" in res) and res["reply"][:len(prefix)] == prefix:
|
||||||
return (
|
return (
|
||||||
"success",
|
'success', _translate(
|
||||||
_translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Success! NMControll is up and running."
|
"Success! NMControll is up and running.")
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.error("Unexpected nmcontrol reply: %s", res)
|
logger.error("Unexpected nmcontrol reply: %s", res)
|
||||||
message = (
|
return (
|
||||||
"failed",
|
'failed', _translate(
|
||||||
_translate(
|
"MainWindow", "Couldn\'t understand NMControl.")
|
||||||
"MainWindow",
|
|
||||||
"Couldn\'t understand NMControl."
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
sys.exit("Unsupported Namecoin type")
|
sys.exit("Unsupported Namecoin type")
|
||||||
|
|
||||||
return message
|
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.info("Namecoin connection test failure")
|
logger.info("Namecoin connection test failure")
|
||||||
return (
|
return (
|
||||||
"failed",
|
'failed', _translate(
|
||||||
_translate(
|
|
||||||
"MainWindow", "The connection to namecoin failed.")
|
"MainWindow", "The connection to namecoin failed.")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -245,26 +235,24 @@ class namecoinConnection(object):
|
||||||
"Authorization", "Basic %s" % base64.b64encode(authstr))
|
"Authorization", "Basic %s" % base64.b64encode(authstr))
|
||||||
self.con.endheaders()
|
self.con.endheaders()
|
||||||
self.con.send(data)
|
self.con.send(data)
|
||||||
|
try:
|
||||||
|
resp = self.con.getresponse()
|
||||||
|
result = resp.read()
|
||||||
|
if resp.status != 200:
|
||||||
|
raise Exception(
|
||||||
|
"Namecoin returned status %i: %s" %
|
||||||
|
(resp.status, resp.reason))
|
||||||
|
except: # noqa:E722
|
||||||
|
logger.info("HTTP receive error")
|
||||||
except: # noqa:E722
|
except: # noqa:E722
|
||||||
logger.info("HTTP connection error")
|
logger.info("HTTP connection error")
|
||||||
return None
|
|
||||||
|
|
||||||
try:
|
|
||||||
resp = self.con.getresponse()
|
|
||||||
result = resp.read()
|
|
||||||
if resp.status != 200:
|
|
||||||
raise Exception(
|
|
||||||
"Namecoin returned status"
|
|
||||||
" %i: %s" % (resp.status, resp.reason))
|
|
||||||
except: # noqa:E722
|
|
||||||
logger.info("HTTP receive error")
|
|
||||||
return None
|
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def queryServer(self, data):
|
def queryServer(self, data):
|
||||||
"""Helper routine sending data to the RPC "
|
"""
|
||||||
"server and returning the result."""
|
Helper routine sending data to the RPC server and returning the result.
|
||||||
|
"""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
@ -296,23 +284,24 @@ def lookupNamecoinFolder():
|
||||||
"""
|
"""
|
||||||
|
|
||||||
app = "namecoin"
|
app = "namecoin"
|
||||||
from os import path, environ
|
|
||||||
if sys.platform == "darwin":
|
if sys.platform == "darwin":
|
||||||
if "HOME" in environ:
|
try:
|
||||||
dataFolder = path.join(os.environ["HOME"],
|
dataFolder = os.path.join(
|
||||||
"Library/Application Support/", app) + "/"
|
os.getenv("HOME"), "Library/Application Support/", app)
|
||||||
else:
|
except TypeError: # getenv is None
|
||||||
sys.exit(
|
sys.exit(
|
||||||
"Could not find home folder, please report this message"
|
"Could not find home folder, please report this message"
|
||||||
" and your OS X version to the BitMessage Github."
|
" and your OS X version to the BitMessage Github."
|
||||||
)
|
) # TODO: remove exits from utility modules
|
||||||
|
|
||||||
elif "win32" in sys.platform or "win64" in sys.platform:
|
dataFolder = (
|
||||||
dataFolder = path.join(environ["APPDATA"], app) + "\\"
|
os.path.join(os.getenv("APPDATA"), app)
|
||||||
else:
|
if sys.platform.startswith('win') else
|
||||||
dataFolder = path.join(environ["HOME"], ".%s" % app) + "/"
|
os.path.join(os.getenv("HOME"), ".%s" % app)
|
||||||
|
)
|
||||||
|
|
||||||
return dataFolder
|
return dataFolder + os.path.sep
|
||||||
|
|
||||||
|
|
||||||
def ensureNamecoinOptions():
|
def ensureNamecoinOptions():
|
||||||
|
@ -357,8 +346,8 @@ def ensureNamecoinOptions():
|
||||||
nmc.close()
|
nmc.close()
|
||||||
except IOError:
|
except IOError:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
"%s unreadable or missing, Namecoin support deactivated",
|
"%s unreadable or missing, Namecoin support deactivated", nmcConfig
|
||||||
nmcConfig)
|
)
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.warning("Error processing namecoin.conf", exc_info=True)
|
logger.warning("Error processing namecoin.conf", exc_info=True)
|
||||||
|
|
||||||
|
@ -370,5 +359,5 @@ def ensureNamecoinOptions():
|
||||||
|
|
||||||
# Set default port now, possibly to found value.
|
# Set default port now, possibly to found value.
|
||||||
if not hasPort:
|
if not hasPort:
|
||||||
BMConfigParser().set(configSection, "namecoinrpcport",
|
BMConfigParser().set(
|
||||||
defaults.namecoinDefaultRpcPort)
|
configSection, "namecoinrpcport", defaults.namecoinDefaultRpcPort)
|
||||||
|
|
|
@ -138,9 +138,10 @@ class TCPConnection(BMProto, TLSDispatcher):
|
||||||
'updateStatusBar',
|
'updateStatusBar',
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"The time on your computer, %1, may be wrong. "
|
"The time on your computer, {0}, may be wrong. "
|
||||||
"Please verify your settings."
|
"Please verify your settings."
|
||||||
).arg(l10n.formatTimestamp())))
|
).format(l10n.formatTimestamp())
|
||||||
|
))
|
||||||
|
|
||||||
def state_connection_fully_established(self):
|
def state_connection_fully_established(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -266,9 +266,12 @@ class uPnPThread(StoppableThread):
|
||||||
with knownnodes.knownNodesLock:
|
with knownnodes.knownNodesLock:
|
||||||
knownnodes.addKnownNode(
|
knownnodes.addKnownNode(
|
||||||
1, self_peer, is_self=True)
|
1, self_peer, is_self=True)
|
||||||
queues.UISignalQueue.put(('updateStatusBar', tr._translate(
|
queues.UISignalQueue.put((
|
||||||
"MainWindow", 'UPnP port mapping established on port %1'
|
'updateStatusBar', tr._translate(
|
||||||
).arg(str(self.extPort))))
|
"MainWindow",
|
||||||
|
"UPnP port mapping established on port {0}"
|
||||||
|
).format(self.extPort)
|
||||||
|
))
|
||||||
break
|
break
|
||||||
except socket.timeout:
|
except socket.timeout:
|
||||||
pass
|
pass
|
||||||
|
|
Reference in New Issue
Block a user