Addresses can be configured not to send acks
Manually by specifying "dontsendack" = true in the address section
This commit is contained in:
parent
4c8ba431e5
commit
a727847e55
|
@ -17,6 +17,7 @@ import helper_inbox
|
||||||
from helper_generic import addDataPadding
|
from helper_generic import addDataPadding
|
||||||
from helper_threading import *
|
from helper_threading import *
|
||||||
import l10n
|
import l10n
|
||||||
|
from protocol import *
|
||||||
|
|
||||||
# This thread, of which there is only one, does the heavy lifting:
|
# This thread, of which there is only one, does the heavy lifting:
|
||||||
# calculating POWs.
|
# calculating POWs.
|
||||||
|
@ -121,7 +122,7 @@ class singleWorker(threading.Thread, StoppableThread):
|
||||||
payload += '\x00\x00\x00\x01' # object type: pubkey
|
payload += '\x00\x00\x00\x01' # object type: pubkey
|
||||||
payload += encodeVarint(addressVersionNumber) # Address version number
|
payload += encodeVarint(addressVersionNumber) # Address version number
|
||||||
payload += encodeVarint(streamNumber)
|
payload += encodeVarint(streamNumber)
|
||||||
payload += '\x00\x00\x00\x01' # bitfield of features supported by me (see the wiki).
|
payload += getBitfield(myAddress) # bitfield of features supported by me (see the wiki).
|
||||||
|
|
||||||
try:
|
try:
|
||||||
privSigningKeyBase58 = shared.config.get(
|
privSigningKeyBase58 = shared.config.get(
|
||||||
|
@ -202,7 +203,7 @@ class singleWorker(threading.Thread, StoppableThread):
|
||||||
payload += '\x00\x00\x00\x01' # object type: pubkey
|
payload += '\x00\x00\x00\x01' # object type: pubkey
|
||||||
payload += encodeVarint(addressVersionNumber) # Address version number
|
payload += encodeVarint(addressVersionNumber) # Address version number
|
||||||
payload += encodeVarint(streamNumber)
|
payload += encodeVarint(streamNumber)
|
||||||
payload += '\x00\x00\x00\x01' # bitfield of features supported by me (see the wiki).
|
payload += getBitfield(myAddress) # bitfield of features supported by me (see the wiki).
|
||||||
|
|
||||||
try:
|
try:
|
||||||
privSigningKeyBase58 = shared.config.get(
|
privSigningKeyBase58 = shared.config.get(
|
||||||
|
@ -281,8 +282,7 @@ class singleWorker(threading.Thread, StoppableThread):
|
||||||
payload += '\x00\x00\x00\x01' # object type: pubkey
|
payload += '\x00\x00\x00\x01' # object type: pubkey
|
||||||
payload += encodeVarint(addressVersionNumber) # Address version number
|
payload += encodeVarint(addressVersionNumber) # Address version number
|
||||||
payload += encodeVarint(streamNumber)
|
payload += encodeVarint(streamNumber)
|
||||||
|
dataToEncrypt = getBitfield(myAddress)
|
||||||
dataToEncrypt = '\x00\x00\x00\x01' # bitfield of features supported by me (see the wiki).
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
privSigningKeyBase58 = shared.config.get(
|
privSigningKeyBase58 = shared.config.get(
|
||||||
|
@ -410,7 +410,7 @@ class singleWorker(threading.Thread, StoppableThread):
|
||||||
|
|
||||||
dataToEncrypt = encodeVarint(addressVersionNumber)
|
dataToEncrypt = encodeVarint(addressVersionNumber)
|
||||||
dataToEncrypt += encodeVarint(streamNumber)
|
dataToEncrypt += encodeVarint(streamNumber)
|
||||||
dataToEncrypt += '\x00\x00\x00\x01' # behavior bitfield
|
dataToEncrypt += getBitfield(fromaddress) # behavior bitfield
|
||||||
dataToEncrypt += pubSigningKey[1:]
|
dataToEncrypt += pubSigningKey[1:]
|
||||||
dataToEncrypt += pubEncryptionKey[1:]
|
dataToEncrypt += pubEncryptionKey[1:]
|
||||||
if addressVersionNumber >= 3:
|
if addressVersionNumber >= 3:
|
||||||
|
@ -686,7 +686,7 @@ class singleWorker(threading.Thread, StoppableThread):
|
||||||
else: # if we are sending a message to ourselves or a chan..
|
else: # if we are sending a message to ourselves or a chan..
|
||||||
logger.info('Sending a message.')
|
logger.info('Sending a message.')
|
||||||
logger.debug('First 150 characters of message: ' + repr(message[:150]))
|
logger.debug('First 150 characters of message: ' + repr(message[:150]))
|
||||||
behaviorBitfield = '\x00\x00\x00\x01'
|
behaviorBitfield = getBitfield(fromaddress)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
privEncryptionKeyBase58 = shared.config.get(
|
privEncryptionKeyBase58 = shared.config.get(
|
||||||
|
@ -707,7 +707,7 @@ class singleWorker(threading.Thread, StoppableThread):
|
||||||
# Now we can start to assemble our message.
|
# Now we can start to assemble our message.
|
||||||
payload = encodeVarint(fromAddressVersionNumber)
|
payload = encodeVarint(fromAddressVersionNumber)
|
||||||
payload += encodeVarint(fromStreamNumber)
|
payload += encodeVarint(fromStreamNumber)
|
||||||
payload += '\x00\x00\x00\x01' # Bitfield of features and behaviors that can be expected from me. (See https://bitmessage.org/wiki/Protocol_specification#Pubkey_bitfield_features )
|
payload += getBitfield(fromaddress) # Bitfield of features and behaviors that can be expected from me. (See https://bitmessage.org/wiki/Protocol_specification#Pubkey_bitfield_features )
|
||||||
|
|
||||||
# We need to convert our private keys to public keys in order
|
# We need to convert our private keys to public keys in order
|
||||||
# to include them.
|
# to include them.
|
||||||
|
@ -760,7 +760,7 @@ class singleWorker(threading.Thread, StoppableThread):
|
||||||
if shared.config.has_section(toaddress):
|
if shared.config.has_section(toaddress):
|
||||||
logger.info('Not bothering to include ackdata because we are sending to ourselves or a chan.')
|
logger.info('Not bothering to include ackdata because we are sending to ourselves or a chan.')
|
||||||
fullAckPayload = ''
|
fullAckPayload = ''
|
||||||
elif not shared.isBitSetWithinBitfield(behaviorBitfield,31):
|
elif not checkBitfield(behaviorBitfield, shared.BITFIELD_DOESACK):
|
||||||
logger.info('Not bothering to include ackdata because the receiver said that they won\'t relay it anyway.')
|
logger.info('Not bothering to include ackdata because the receiver said that they won\'t relay it anyway.')
|
||||||
fullAckPayload = ''
|
fullAckPayload = ''
|
||||||
else:
|
else:
|
||||||
|
@ -811,7 +811,7 @@ class singleWorker(threading.Thread, StoppableThread):
|
||||||
shared.inventory[inventoryHash] = (
|
shared.inventory[inventoryHash] = (
|
||||||
objectType, toStreamNumber, encryptedPayload, embeddedTime, '')
|
objectType, toStreamNumber, encryptedPayload, embeddedTime, '')
|
||||||
shared.inventorySets[toStreamNumber].add(inventoryHash)
|
shared.inventorySets[toStreamNumber].add(inventoryHash)
|
||||||
if shared.config.has_section(toaddress):
|
if shared.config.has_section(toaddress) or shared.safeConfigGetBoolean(toaddress, 'dontsendack'):
|
||||||
shared.UISignalQueue.put(('updateSentItemStatusByAckdata', (ackdata, tr.translateText("MainWindow", "Message sent. Sent on %1").arg(l10n.formatTimestamp()))))
|
shared.UISignalQueue.put(('updateSentItemStatusByAckdata', (ackdata, tr.translateText("MainWindow", "Message sent. Sent on %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
|
||||||
|
@ -821,7 +821,7 @@ class singleWorker(threading.Thread, StoppableThread):
|
||||||
toStreamNumber, 'advertiseobject', inventoryHash))
|
toStreamNumber, 'advertiseobject', inventoryHash))
|
||||||
|
|
||||||
# Update the sent message in the sent table with the necessary information.
|
# Update the sent message in the sent table with the necessary information.
|
||||||
if shared.config.has_section(toaddress):
|
if shared.config.has_section(toaddress) or not checkBitfield(behaviorBitfield, shared.BITFIELD_DOESACK):
|
||||||
newStatus = 'msgsentnoackexpected'
|
newStatus = 'msgsentnoackexpected'
|
||||||
else:
|
else:
|
||||||
newStatus = 'msgsent'
|
newStatus = 'msgsent'
|
||||||
|
|
14
src/protocol.py
Normal file
14
src/protocol.py
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import struct
|
||||||
|
import shared
|
||||||
|
|
||||||
|
def getBitfield(address):
|
||||||
|
# bitfield of features supported by me (see the wiki).
|
||||||
|
bitfield = 0
|
||||||
|
# send ack
|
||||||
|
if not shared.safeConfigGetBoolean(address, 'dontsendack'):
|
||||||
|
bitfield |= shared.BITFIELD_DOESACK
|
||||||
|
return struct.pack('>I', bitfield)
|
||||||
|
|
||||||
|
def checkBitfield(bitfieldBinary, flags):
|
||||||
|
bitfield, = struct.unpack('>I', bitfieldBinary)
|
||||||
|
return (bitfield & flags) == flags
|
|
@ -132,6 +132,9 @@ Header = Struct('!L12sL4s')
|
||||||
NODE_NETWORK = 1
|
NODE_NETWORK = 1
|
||||||
NODE_SSL = 2
|
NODE_SSL = 2
|
||||||
|
|
||||||
|
#Bitfield flags
|
||||||
|
BITFIELD_DOESACK = 1
|
||||||
|
|
||||||
#Create a packet
|
#Create a packet
|
||||||
def CreatePacket(command, payload=''):
|
def CreatePacket(command, payload=''):
|
||||||
payload_length = len(payload)
|
payload_length = len(payload)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user