diff --git a/src/api.py b/src/api.py index 2e134a64..efbdd43f 100644 --- a/src/api.py +++ b/src/api.py @@ -1040,45 +1040,6 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): }) return json.dumps(data, indent=4, separators=(',', ': ')) - def HandleDisseminatePreEncryptedMsg(self, params): - # The device issuing this command to PyBitmessage supplies a msg - # object that has already been encrypted but which still needs the POW - # to be done. PyBitmessage accepts this msg object and sends it out - # to the rest of the Bitmessage network as if it had generated - # the message itself. Please do not yet add this to the api doc. - if len(params) != 3: - raise APIError(0, 'I need 3 parameter!') - encryptedPayload, requiredAverageProofOfWorkNonceTrialsPerByte, \ - requiredPayloadLengthExtraBytes = params - encryptedPayload = self._decode(encryptedPayload, "hex") - # Let us do the POW and attach it to the front - target = 2**64 / ( - (len(encryptedPayload) + requiredPayloadLengthExtraBytes + 8) - * requiredAverageProofOfWorkNonceTrialsPerByte) - with shared.printLock: - print '(For msg message via API) Doing proof of work. Total required difficulty:', float(requiredAverageProofOfWorkNonceTrialsPerByte) / defaults.networkDefaultProofOfWorkNonceTrialsPerByte, 'Required small message difficulty:', float(requiredPayloadLengthExtraBytes) / defaults.networkDefaultPayloadLengthExtraBytes - powStartTime = time.time() - initialHash = hashlib.sha512(encryptedPayload).digest() - trialValue, nonce = proofofwork.run(target, initialHash) - with shared.printLock: - print '(For msg message via API) Found proof of work', trialValue, 'Nonce:', nonce - try: - print 'POW took', int(time.time() - powStartTime), 'seconds.', nonce / (time.time() - powStartTime), 'nonce trials per second.' - except: - pass - encryptedPayload = pack('>Q', nonce) + encryptedPayload - toStreamNumber = decodeVarint(encryptedPayload[16:26])[0] - inventoryHash = calculateInventoryHash(encryptedPayload) - objectType = 2 - TTL = 2.5 * 24 * 60 * 60 - Inventory()[inventoryHash] = ( - objectType, toStreamNumber, encryptedPayload, - int(time.time()) + TTL, '' - ) - with shared.printLock: - print 'Broadcasting inv for msg(API disseminatePreEncryptedMsg command):', hexlify(inventoryHash) - queues.invQueue.put((toStreamNumber, inventoryHash)) - def HandleTrashSentMessageByAckDAta(self, params): # This API method should only be used when msgid is not available if len(params) == 0: @@ -1087,89 +1048,6 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): sqlExecute("UPDATE sent SET folder='trash' WHERE ackdata=?", ackdata) return 'Trashed sent message (assuming message existed).' - def HandleDissimatePubKey(self, params): - # The device issuing this command to PyBitmessage supplies a pubkey - # object to be disseminated to the rest of the Bitmessage network. - # PyBitmessage accepts this pubkey object and sends it out to the rest - # of the Bitmessage network as if it had generated the pubkey object - # itself. Please do not yet add this to the api doc. - if len(params) != 1: - raise APIError(0, 'I need 1 parameter!') - payload, = params - payload = self._decode(payload, "hex") - - # Let us do the POW - target = 2 ** 64 / ( - (len(payload) + defaults.networkDefaultPayloadLengthExtraBytes - + 8) * defaults.networkDefaultProofOfWorkNonceTrialsPerByte) - print '(For pubkey message via API) Doing proof of work...' - initialHash = hashlib.sha512(payload).digest() - trialValue, nonce = proofofwork.run(target, initialHash) - print '(For pubkey message via API) Found proof of work', trialValue, 'Nonce:', nonce - payload = pack('>Q', nonce) + payload - - pubkeyReadPosition = 8 # bypass the nonce - if payload[pubkeyReadPosition:pubkeyReadPosition+4] == \ - '\x00\x00\x00\x00': # if this pubkey uses 8 byte time - pubkeyReadPosition += 8 - else: - pubkeyReadPosition += 4 - addressVersion, addressVersionLength = decodeVarint( - payload[pubkeyReadPosition:pubkeyReadPosition+10]) - pubkeyReadPosition += addressVersionLength - pubkeyStreamNumber = decodeVarint( - payload[pubkeyReadPosition:pubkeyReadPosition+10])[0] - inventoryHash = calculateInventoryHash(payload) - objectType = 1 # TODO: support v4 pubkeys - TTL = 28 * 24 * 60 * 60 - Inventory()[inventoryHash] = ( - objectType, pubkeyStreamNumber, payload, int(time.time()) + TTL, '' - ) - with shared.printLock: - print 'broadcasting inv within API command disseminatePubkey with hash:', hexlify(inventoryHash) - queues.invQueue.put((pubkeyStreamNumber, inventoryHash)) - - def HandleGetMessageDataByDestinationHash(self, params): - # Method will eventually be used by a particular Android app to - # select relevant messages. Do not yet add this to the api - # doc. - if len(params) != 1: - raise APIError(0, 'I need 1 parameter!') - requestedHash, = params - if len(requestedHash) != 32: - raise APIError( - 19, 'The length of hash should be 32 bytes (encoded in hex' - ' thus 64 characters).') - requestedHash = self._decode(requestedHash, "hex") - - # This is not a particularly commonly used API function. Before we - # use it we'll need to fill out a field in our inventory database - # which is blank by default (first20bytesofencryptedmessage). - queryreturn = sqlQuery( - "SELECT hash, payload FROM inventory WHERE tag = ''" - " and objecttype = 2") - with SqlBulkExecute() as sql: - for row in queryreturn: - hash01, payload = row - readPosition = 16 # Nonce length + time length - # Stream Number length - readPosition += decodeVarint( - payload[readPosition:readPosition+10])[1] - t = (payload[readPosition:readPosition+32], hash01) - sql.execute("UPDATE inventory SET tag=? WHERE hash=?", *t) - - queryreturn = sqlQuery( - "SELECT payload FROM inventory WHERE tag = ?", requestedHash) - data = '{"receivedMessageDatas":[' - for row in queryreturn: - payload, = row - if len(data) > 25: - data += ',' - data += json.dumps( - {'data': hexlify(payload)}, indent=4, separators=(',', ': ')) - data += ']}' - return data - def HandleDisseminateRawObject(self, arguments): if len(arguments) != 1: raise APIError(0, "1 argument needed") @@ -1398,12 +1276,6 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): handlers['addSubscription'] = HandleAddSubscription handlers['deleteSubscription'] = HandleDeleteSubscription handlers['listSubscriptions'] = ListSubscriptions - handlers['disseminatePreEncryptedMsg'] = HandleDisseminatePreEncryptedMsg - handlers['disseminatePubkey'] = HandleDissimatePubKey - handlers['getMessageDataByDestinationHash'] = \ - HandleGetMessageDataByDestinationHash - handlers['getMessageDataByDestinationTag'] = \ - HandleGetMessageDataByDestinationHash handlers["disseminateRawObject"] = HandleDisseminateRawObject handlers["getRawObject"] = HandleGetRawObject handlers["listRawObjects"] = HandleListRawObjects diff --git a/src/protocol.py b/src/protocol.py index a43cf6a9..4aa6facd 100644 --- a/src/protocol.py +++ b/src/protocol.py @@ -417,10 +417,10 @@ def checkAndShareObjectWithPeers(payload): expiryTime, objectType = unpack(">QI", payload[readPosition: readPosition + 12]) readPosition += 12 - version, readLength = decodeVarint(payload[readPosition: readPosition + 8]) + version, readLength = decodeVarint(payload[readPosition: readPosition + 9]) readPosition += readLength - stream, readLength = decodeVarint(payload[readPosition: readPosition + 8]) + stream, readLength = decodeVarint(payload[readPosition: readPosition + 9]) readPosition += readLength except: logger.info("Error parsing object header")