7070import xmlrpclib
7171from binascii import hexlify , unhexlify
7272from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler , SimpleXMLRPCServer
73- from struct import pack
73+ from struct import pack , unpack
7474
7575import defaults
7676import 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\n Required 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