Skip to content

Commit 8a1835e

Browse files
committed
Api fix HandleDisseminatePreEncryptedMsg
- PoW target formula correction - correctly decode expiration time / TTL, object type and destination stream
1 parent 3fb6ada commit 8a1835e

1 file changed

Lines changed: 24 additions & 11 deletions

File tree

src/api.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
import xmlrpclib
7171
from binascii import hexlify, unhexlify
7272
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer
73-
from struct import pack
73+
from struct import pack, unpack
7474

7575
import defaults
7676
import helper_inbox
@@ -1275,7 +1275,7 @@ def ListSubscriptions(self):
12751275
return {'subscriptions': data}
12761276

12771277
@command('disseminatePreEncryptedMsg')
1278-
def HandleDisseminatePreEncryptedMsg(
1278+
def HandleDisseminatePreEncryptedMsg( # pylint: disable=too-many-locals
12791279
self, encryptedPayload, requiredAverageProofOfWorkNonceTrialsPerByte,
12801280
requiredPayloadLengthExtraBytes):
12811281
"""Handle a request to disseminate an encrypted message"""
@@ -1286,13 +1286,22 @@ def HandleDisseminatePreEncryptedMsg(
12861286
# to the rest of the Bitmessage network as if it had generated
12871287
# the message itself. Please do not yet add this to the api doc.
12881288
encryptedPayload = self._decode(encryptedPayload, "hex")
1289+
expiresTime = unpack('>Q', encryptedPayload[0:8])[0]
1290+
objectType = unpack('>I', encryptedPayload[8:12])[0]
1291+
TTL = expiresTime - time.time() + 300 # a bit of extra padding
12891292
# Let us do the POW and attach it to the front
12901293
target = 2**64 / (
1291-
(
1292-
len(encryptedPayload)
1293-
+ requiredPayloadLengthExtraBytes
1294-
+ 8
1295-
) * requiredAverageProofOfWorkNonceTrialsPerByte)
1294+
requiredAverageProofOfWorkNonceTrialsPerByte * (
1295+
len(encryptedPayload) + 8
1296+
+ requiredPayloadLengthExtraBytes + ((
1297+
TTL * (
1298+
len(encryptedPayload) + 8
1299+
+ requiredPayloadLengthExtraBytes
1300+
)) / (2 ** 16))
1301+
))
1302+
logger.debug("expiresTime: %s", expiresTime)
1303+
logger.debug("TTL: %s", TTL)
1304+
logger.debug("objectType: %s", objectType)
12961305
logger.info(
12971306
'(For msg message via API) Doing proof of work. Total required'
12981307
' difficulty: %s\nRequired small message difficulty: %s',
@@ -1311,18 +1320,22 @@ def HandleDisseminatePreEncryptedMsg(
13111320
nonce / (time.time() - powStartTime)
13121321
)
13131322
encryptedPayload = pack('>Q', nonce) + encryptedPayload
1314-
toStreamNumber = decodeVarint(encryptedPayload[16:26])[0]
1323+
parserPos = 20
1324+
_, objectVersionLength = decodeVarint(
1325+
encryptedPayload[parserPos:parserPos + 10])
1326+
parserPos += objectVersionLength
1327+
toStreamNumber, _ = decodeVarint(
1328+
encryptedPayload[parserPos:parserPos + 10])
13151329
inventoryHash = calculateInventoryHash(encryptedPayload)
1316-
objectType = 2
1317-
TTL = 2.5 * 24 * 60 * 60
13181330
Inventory()[inventoryHash] = (
13191331
objectType, toStreamNumber, encryptedPayload,
1320-
int(time.time()) + TTL, ''
1332+
expiresTime, ''
13211333
)
13221334
logger.info(
13231335
'Broadcasting inv for msg(API disseminatePreEncryptedMsg'
13241336
' command): %s', hexlify(inventoryHash))
13251337
queues.invQueue.put((toStreamNumber, inventoryHash))
1338+
return hexlify(inventoryHash)
13261339

13271340
@command('trashSentMessageByAckData')
13281341
def HandleTrashSentMessageByAckDAta(self, ackdata):

0 commit comments

Comments
 (0)